use axum::extract::State; use axum_extra::extract::Query; use futures::{future, stream::StreamExt as _}; use crate::{ event::routes::get, test::fixtures::{self, future::Expect as _}, }; #[tokio::test] async fn accepting_invite() { // Set up the environment let app = fixtures::scratch_app().await; let issuer = fixtures::login::create(&app, &fixtures::now()).await; let invite = fixtures::invite::issue(&app, &issuer, &fixtures::now()).await; let resume_point = fixtures::boot::resume_point(&app).await; // Subscribe let subscriber = fixtures::identity::create(&app, &fixtures::now()).await; let get::Response(events) = get::handler( State(app.clone()), subscriber, None, Query(get::QueryParams { resume_point }), ) .await .expect("subscribe never fails"); // Accept the invite let (name, password) = fixtures::login::propose(); let (joiner, _) = app .invites() .accept(&invite.id, &name, &password, &fixtures::now()) .await .expect("accepting an invite succeeds"); // Expect a login created event let _ = events .filter_map(fixtures::event::login) .filter_map(fixtures::event::login::created) .filter(|event| future::ready(event.login == joiner)) .next() .expect_some("a login created event is sent") .await; } #[tokio::test] async fn previously_accepted_invite() { // Set up the environment let app = fixtures::scratch_app().await; let issuer = fixtures::login::create(&app, &fixtures::now()).await; let invite = fixtures::invite::issue(&app, &issuer, &fixtures::now()).await; let resume_point = fixtures::boot::resume_point(&app).await; // Accept the invite let (name, password) = fixtures::login::propose(); let (joiner, _) = app .invites() .accept(&invite.id, &name, &password, &fixtures::now()) .await .expect("accepting an invite succeeds"); // Subscribe let subscriber = fixtures::identity::create(&app, &fixtures::now()).await; let get::Response(events) = get::handler( State(app.clone()), subscriber, None, Query(get::QueryParams { resume_point }), ) .await .expect("subscribe never fails"); // Expect a login created event let _ = events .filter_map(fixtures::event::login) .filter_map(fixtures::event::login::created) .filter(|event| future::ready(event.login == joiner)) .next() .expect_some("a login created event is sent") .await; }