summaryrefslogtreecommitdiff
path: root/src/setup/routes
diff options
context:
space:
mode:
authorOwen Jacobson <owen@grimoire.ca>2024-10-24 20:53:40 -0400
committerOwen Jacobson <owen@grimoire.ca>2024-10-24 20:53:40 -0400
commitd97f8ac1858fbd46b77b541a612cc37b07fc0b5d (patch)
tree5d4e318ae0f7ff21de872128b77587c3637e540f /src/setup/routes
parent6321980ac49525d6d56f1fec67f9008e253a9c39 (diff)
Tests for initial setup
Diffstat (limited to 'src/setup/routes')
-rw-r--r--src/setup/routes/mod.rs2
-rw-r--r--src/setup/routes/test.rs69
2 files changed, 71 insertions, 0 deletions
diff --git a/src/setup/routes/mod.rs b/src/setup/routes/mod.rs
index e1e1711..6054983 100644
--- a/src/setup/routes/mod.rs
+++ b/src/setup/routes/mod.rs
@@ -3,6 +3,8 @@ use axum::{routing::post, Router};
use crate::app::App;
mod post;
+#[cfg(test)]
+mod test;
pub fn router() -> Router<App> {
Router::new().route("/api/setup", post(post::handler))
diff --git a/src/setup/routes/test.rs b/src/setup/routes/test.rs
new file mode 100644
index 0000000..f7562ae
--- /dev/null
+++ b/src/setup/routes/test.rs
@@ -0,0 +1,69 @@
+use axum::extract::{Json, State};
+
+use super::post;
+use crate::{setup::app, test::fixtures};
+
+#[tokio::test]
+async fn fresh_instance() {
+ // Set up the environment
+
+ let app = fixtures::scratch_app().await;
+
+ // Call the endpoint
+ let identity = fixtures::cookie::not_logged_in();
+ let (name, password) = fixtures::login::propose();
+ let request = post::Request {
+ name: name.clone(),
+ password: password.clone(),
+ };
+ let (identity, Json(response)) =
+ post::handler(State(app.clone()), fixtures::now(), identity, Json(request))
+ .await
+ .expect("setup in a fresh app succeeds");
+
+ // Verify the response
+
+ assert_eq!(name, response.name);
+
+ // Verify that the issued token is valid
+
+ let secret = identity
+ .secret()
+ .expect("newly-issued identity has a token secret");
+ let (_, login) = app
+ .tokens()
+ .validate(&secret, &fixtures::now())
+ .await
+ .expect("newly-issued identity cookie is valid");
+ assert_eq!(response, login);
+
+ // Verify that the given credentials can log in
+
+ let (login, _) = app
+ .tokens()
+ .login(&name, &password, &fixtures::now())
+ .await
+ .expect("credentials given on signup are valid");
+ assert_eq!(response, login);
+}
+
+#[tokio::test]
+async fn login_exists() {
+ // Set up the environment
+
+ let app = fixtures::scratch_app().await;
+ fixtures::login::create(&app, &fixtures::now()).await;
+
+ // Call the endpoint
+ let identity = fixtures::cookie::not_logged_in();
+ let (name, password) = fixtures::login::propose();
+ let request = post::Request { name, password };
+ let post::Error(error) =
+ post::handler(State(app.clone()), fixtures::now(), identity, Json(request))
+ .await
+ .expect_err("setup in a populated app fails");
+
+ // Verify the response
+
+ assert!(matches!(error, app::Error::SetupCompleted));
+}