summaryrefslogtreecommitdiff
path: root/src/login
diff options
context:
space:
mode:
Diffstat (limited to 'src/login')
-rw-r--r--src/login/history.rs6
-rw-r--r--src/login/routes/login/post.rs10
-rw-r--r--src/login/routes/login/test.rs22
3 files changed, 21 insertions, 17 deletions
diff --git a/src/login/history.rs b/src/login/history.rs
index f8d81bb..daad579 100644
--- a/src/login/history.rs
+++ b/src/login/history.rs
@@ -20,7 +20,6 @@ impl History {
// if this returns a redacted or modified version of the login. If we implement
// renames by redacting the original name, then this should return the edited
// login, not the original, even if that's not how it was "as created.")
- #[cfg(test)]
pub fn as_created(&self) -> Login {
self.login.clone()
}
@@ -30,6 +29,11 @@ impl History {
.filter(Sequence::up_to(resume_point.into()))
.collect()
}
+
+ // Snapshot of this login, as of all events recorded in this history.
+ pub fn as_snapshot(&self) -> Option<Login> {
+ self.events().collect()
+ }
}
// Events interface
diff --git a/src/login/routes/login/post.rs b/src/login/routes/login/post.rs
index e33acad..67eaa6d 100644
--- a/src/login/routes/login/post.rs
+++ b/src/login/routes/login/post.rs
@@ -8,7 +8,7 @@ use crate::{
app::App,
clock::RequestedAt,
error::Internal,
- login::Password,
+ login::{Login, Password},
token::{app, extract::IdentityToken},
};
@@ -17,14 +17,14 @@ pub async fn handler(
RequestedAt(now): RequestedAt,
identity: IdentityToken,
Json(request): Json<Request>,
-) -> Result<(IdentityToken, StatusCode), Error> {
- let token = app
+) -> Result<(IdentityToken, Json<Login>), Error> {
+ let (login, secret) = app
.tokens()
.login(&request.name, &request.password, &now)
.await
.map_err(Error)?;
- let identity = identity.set(token);
- Ok((identity, StatusCode::NO_CONTENT))
+ let identity = identity.set(secret);
+ Ok((identity, Json(login)))
}
#[derive(serde::Deserialize)]
diff --git a/src/login/routes/login/test.rs b/src/login/routes/login/test.rs
index d431612..c94f14c 100644
--- a/src/login/routes/login/test.rs
+++ b/src/login/routes/login/test.rs
@@ -1,7 +1,4 @@
-use axum::{
- extract::{Json, State},
- http::StatusCode,
-};
+use axum::extract::{Json, State};
use super::post;
use crate::{test::fixtures, token::app};
@@ -11,24 +8,24 @@ async fn correct_credentials() {
// Set up the environment
let app = fixtures::scratch_app().await;
- let (name, password) = fixtures::login::create_with_password(&app, &fixtures::now()).await;
+ let (login, password) = fixtures::login::create_with_password(&app, &fixtures::now()).await;
// Call the endpoint
let identity = fixtures::identity::not_logged_in();
let logged_in_at = fixtures::now();
let request = post::Request {
- name: name.clone(),
+ name: login.name.clone(),
password,
};
- let (identity, status) =
+ let (identity, Json(response)) =
post::handler(State(app.clone()), logged_in_at, identity, Json(request))
.await
.expect("logged in with valid credentials");
// Verify the return value's basic structure
- assert_eq!(StatusCode::NO_CONTENT, status);
+ assert_eq!(login, response);
let secret = identity.secret().expect("logged in with valid credentials");
// Verify the semantics
@@ -40,7 +37,7 @@ async fn correct_credentials() {
.await
.expect("identity secret is valid");
- assert_eq!(name, validated_login.name);
+ assert_eq!(login, validated_login);
}
#[tokio::test]
@@ -98,13 +95,16 @@ async fn token_expires() {
// Set up the environment
let app = fixtures::scratch_app().await;
- let (name, password) = fixtures::login::create_with_password(&app, &fixtures::now()).await;
+ let (login, password) = fixtures::login::create_with_password(&app, &fixtures::now()).await;
// Call the endpoint
let logged_in_at = fixtures::ancient();
let identity = fixtures::identity::not_logged_in();
- let request = post::Request { name, password };
+ let request = post::Request {
+ name: login.name.clone(),
+ password,
+ };
let (identity, _) = post::handler(State(app.clone()), logged_in_at, identity, Json(request))
.await
.expect("logged in with valid credentials");