diff options
| author | Owen Jacobson <owen@grimoire.ca> | 2024-10-24 22:37:22 -0400 |
|---|---|---|
| committer | Owen Jacobson <owen@grimoire.ca> | 2024-10-24 22:37:22 -0400 |
| commit | 0bb17bd01640492db2685e67bacac12dd54a9f59 (patch) | |
| tree | 5c8425b8e6a962e609f82a7b3f2498524d8d6c6f /src/event/routes/test/token.rs | |
| parent | d97f8ac1858fbd46b77b541a612cc37b07fc0b5d (diff) | |
Tests for channel, invite, setup, and message deletion events.
This also found a bug! No live event was being emitted during invite accept. The only way to find out about invites was to reconnect.
Diffstat (limited to 'src/event/routes/test/token.rs')
| -rw-r--r-- | src/event/routes/test/token.rs | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/event/routes/test/token.rs b/src/event/routes/test/token.rs new file mode 100644 index 0000000..a545988 --- /dev/null +++ b/src/event/routes/test/token.rs @@ -0,0 +1,97 @@ +use axum::extract::State; +use axum_extra::extract::Query; +use futures::{future, stream::StreamExt as _}; + +use crate::{ + event::routes::get, + test::fixtures::{self, future::Immediately as _}, +}; + +#[tokio::test] +async fn terminates_on_token_expiry() { + // Set up the environment + + let app = fixtures::scratch_app().await; + let channel = fixtures::channel::create(&app, &fixtures::now()).await; + let sender = fixtures::login::create(&app, &fixtures::now()).await; + + // Subscribe via the endpoint + + let subscriber_creds = fixtures::login::create_with_password(&app, &fixtures::now()).await; + let subscriber = + fixtures::identity::logged_in(&app, &subscriber_creds, &fixtures::ancient()).await; + + let get::Response(events) = + get::handler(State(app.clone()), subscriber, None, Query::default()) + .await + .expect("subscribe never fails"); + + // Verify the resulting stream's behaviour + + app.tokens() + .expire(&fixtures::now()) + .await + .expect("expiring tokens succeeds"); + + // These should not be delivered. + let messages = [ + fixtures::message::send(&app, &channel, &sender, &fixtures::now()).await, + fixtures::message::send(&app, &channel, &sender, &fixtures::now()).await, + fixtures::message::send(&app, &channel, &sender, &fixtures::now()).await, + ]; + + assert!(events + .filter_map(fixtures::message::events) + .filter_map(fixtures::message::sent) + .filter(|event| future::ready(messages.iter().any(|message| &event.message == message))) + .next() + .immediately() + .await + .is_none()); +} + +#[tokio::test] +async fn terminates_on_logout() { + // Set up the environment + + let app = fixtures::scratch_app().await; + let channel = fixtures::channel::create(&app, &fixtures::now()).await; + let sender = fixtures::login::create(&app, &fixtures::now()).await; + + // Subscribe via the endpoint + + let subscriber = fixtures::identity::create(&app, &fixtures::now()).await; + + let get::Response(events) = get::handler( + State(app.clone()), + subscriber.clone(), + None, + Query::default(), + ) + .await + .expect("subscribe never fails"); + + // Verify the resulting stream's behaviour + + app.tokens() + .logout(&subscriber.token) + .await + .expect("expiring tokens succeeds"); + + // These should not be delivered. + + let messages = [ + fixtures::message::send(&app, &channel, &sender, &fixtures::now()).await, + fixtures::message::send(&app, &channel, &sender, &fixtures::now()).await, + fixtures::message::send(&app, &channel, &sender, &fixtures::now()).await, + ]; + + assert!(events + .filter_map(fixtures::message::events) + .filter_map(fixtures::message::sent) + .filter(|event| future::ready(messages.iter().any(|message| &event.message == message))) + .next() + .immediately() + .await + .is_none()); +} |
