summaryrefslogtreecommitdiff
path: root/src/login/routes/test/logout.rs
diff options
context:
space:
mode:
authorOwen Jacobson <owen@grimoire.ca>2024-09-19 01:25:31 -0400
committerOwen Jacobson <owen@grimoire.ca>2024-09-20 23:55:22 -0400
commite5f72711c5a17c5db24e209b14f82d426eceb86e (patch)
tree04865172284c86549dd08d700c21a29c36f54005 /src/login/routes/test/logout.rs
parent0079624488af334817f58e30dbc676d3adde8de6 (diff)
Write tests.
Diffstat (limited to 'src/login/routes/test/logout.rs')
-rw-r--r--src/login/routes/test/logout.rs86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/login/routes/test/logout.rs b/src/login/routes/test/logout.rs
new file mode 100644
index 0000000..003bc8e
--- /dev/null
+++ b/src/login/routes/test/logout.rs
@@ -0,0 +1,86 @@
+use axum::{
+ extract::{Json, State},
+ http::StatusCode,
+};
+
+use crate::{
+ login::{app, routes},
+ test::fixtures,
+};
+
+#[tokio::test]
+async fn successful() {
+ // Set up the environment
+
+ let app = fixtures::scratch_app().await;
+ let now = fixtures::now();
+ let login = fixtures::login::create_for_login(&app).await;
+ let identity = fixtures::identity::logged_in(&app, &login, &now).await;
+ let secret = fixtures::identity::secret(&identity);
+
+ // Call the endpoint
+
+ let (response_identity, response_status) = routes::on_logout(
+ State(app.clone()),
+ identity.clone(),
+ Json(routes::LogoutRequest {}),
+ )
+ .await
+ .expect("logged out with a valid token");
+
+ // Verify the return value's basic structure
+
+ assert!(response_identity.secret().is_none());
+ assert_eq!(StatusCode::NO_CONTENT, response_status);
+
+ // Verify the semantics
+
+ let error = app
+ .logins()
+ .validate(secret, &now)
+ .await
+ .expect_err("secret is invalid");
+ match error {
+ app::ValidateError::InvalidToken => (), // should be invalid
+ other => panic!("expected ValidateError::InvalidToken, got {other:#}"),
+ }
+}
+
+#[tokio::test]
+async fn no_identity() {
+ // Set up the environment
+
+ let app = fixtures::scratch_app().await;
+
+ // Call the endpoint
+
+ let identity = fixtures::identity::not_logged_in();
+ let (identity, status) =
+ routes::on_logout(State(app), identity, Json(routes::LogoutRequest {}))
+ .await
+ .expect("logged out with no token");
+
+ // Verify the return value's basic structure
+
+ assert!(identity.secret().is_none());
+ assert_eq!(StatusCode::NO_CONTENT, status);
+}
+
+#[tokio::test]
+async fn invalid_token() {
+ // Set up the environment
+
+ let app = fixtures::scratch_app().await;
+
+ // Call the endpoint
+
+ let identity = fixtures::identity::fictitious();
+ let routes::LogoutError(error) =
+ routes::on_logout(State(app), identity, Json(routes::LogoutRequest {}))
+ .await
+ .expect_err("logged out with an invalid token");
+
+ // Verify the return value's basic structure
+
+ fixtures::error::expected!(error, app::ValidateError::InvalidToken);
+}