summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorOwen Jacobson <owen@grimoire.ca>2025-08-24 03:32:21 -0400
committerOwen Jacobson <owen@grimoire.ca>2025-08-24 04:51:24 -0400
commitc1d688146956a23366c8e076328bb53351b999b5 (patch)
tree3ec84ed38448b2179a76241e69a5a2994bf7a2c9 /src
parent53944ef14af4d37c08464cb1bb9f3a8f09277194 (diff)
Define a canonical "empty" response.
This is a bit tidier and easier to assert on than returning a bare HTTP status code, but is otherwise interchangeable with it.
Diffstat (limited to 'src')
-rw-r--r--src/empty.rs11
-rw-r--r--src/lib.rs1
-rw-r--r--src/user/handlers/logout/mod.rs6
-rw-r--r--src/user/handlers/logout/test.rs13
4 files changed, 19 insertions, 12 deletions
diff --git a/src/empty.rs b/src/empty.rs
new file mode 100644
index 0000000..2c66051
--- /dev/null
+++ b/src/empty.rs
@@ -0,0 +1,11 @@
+use axum::http::StatusCode;
+use axum::response::{IntoResponse, Response};
+
+#[derive(Debug)]
+pub struct Empty;
+
+impl IntoResponse for Empty {
+ fn into_response(self) -> Response {
+ StatusCode::NO_CONTENT.into_response()
+ }
+}
diff --git a/src/lib.rs b/src/lib.rs
index 2d385cc..b3299d7 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -9,6 +9,7 @@ pub mod cli;
mod clock;
mod conversation;
mod db;
+mod empty;
mod error;
mod event;
mod expire;
diff --git a/src/user/handlers/logout/mod.rs b/src/user/handlers/logout/mod.rs
index 45a376a..4450e4c 100644
--- a/src/user/handlers/logout/mod.rs
+++ b/src/user/handlers/logout/mod.rs
@@ -1,12 +1,12 @@
use axum::{
extract::{Json, State},
- http::StatusCode,
response::{IntoResponse, Response},
};
use crate::{
app::App,
clock::RequestedAt,
+ empty::Empty,
error::{Internal, Unauthorized},
token::{app, extract::IdentityCookie},
};
@@ -19,14 +19,14 @@ pub async fn handler(
RequestedAt(now): RequestedAt,
identity: IdentityCookie,
Json(_): Json<Request>,
-) -> Result<(IdentityCookie, StatusCode), Error> {
+) -> Result<(IdentityCookie, Empty), Error> {
if let Some(secret) = identity.secret() {
let (token, _) = app.tokens().validate(&secret, &now).await?;
app.tokens().logout(&token).await?;
}
let identity = identity.clear();
- Ok((identity, StatusCode::NO_CONTENT))
+ Ok((identity, Empty))
}
// This forces the only valid request to be `{}`, and not the infinite
diff --git a/src/user/handlers/logout/test.rs b/src/user/handlers/logout/test.rs
index 8dc4636..7151ddf 100644
--- a/src/user/handlers/logout/test.rs
+++ b/src/user/handlers/logout/test.rs
@@ -1,9 +1,6 @@
-use axum::{
- extract::{Json, State},
- http::StatusCode,
-};
+use axum::extract::{Json, State};
-use crate::{test::fixtures, token::app};
+use crate::{empty::Empty, test::fixtures, token::app};
#[tokio::test]
async fn successful() {
@@ -17,7 +14,7 @@ async fn successful() {
// Call the endpoint
- let (response_identity, response_status) = super::handler(
+ let (response_identity, Empty) = super::handler(
State(app.clone()),
fixtures::now(),
identity.clone(),
@@ -29,7 +26,6 @@ async fn successful() {
// 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
@@ -49,14 +45,13 @@ async fn no_identity() {
// Call the endpoint
let identity = fixtures::cookie::not_logged_in();
- let (identity, status) = super::handler(State(app), fixtures::now(), identity, Json::default())
+ let (identity, Empty) = super::handler(State(app), fixtures::now(), identity, Json::default())
.await
.expect("logged out with no token succeeds");
// Verify the return value's basic structure
assert!(identity.secret().is_none());
- assert_eq!(StatusCode::NO_CONTENT, status);
}
#[tokio::test]