diff options
Diffstat (limited to 'src/tests.rs')
| -rw-r--r-- | src/tests.rs | 61 |
1 files changed, 38 insertions, 23 deletions
diff --git a/src/tests.rs b/src/tests.rs index 5b21352..d2ee143 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -128,6 +128,10 @@ async fn create_rejects_bad_bodies(pool: PgPool) { measurement("2026-10-14T12:00:00Z", "Waist", -1.0, "Centimeter"), StatusCode::UNPROCESSABLE_ENTITY, ), + ( + measurement("2026-10-14T12:00:00", "Waist", 80.0, "Centimeter"), + StatusCode::UNPROCESSABLE_ENTITY, + ), ("not json".to_owned(), StatusCode::BAD_REQUEST), ]; for (body, expected) in cases { @@ -207,30 +211,38 @@ async fn list_limit_applies_after_ordering(pool: PgPool) { } #[sqlx::test] -async fn list_single_date_includes_the_whole_day(pool: PgPool) { +async fn list_bounds_are_half_open(pool: PgPool) { let app = router(pool); seed(&app).await; - let (status, rows) = get_json(&app, "/measurements?date=2026-10-15").await; + let uri = "/measurements?from=2026-10-15T00:00:00Z&to=2026-10-16T08:00:00Z"; + let (status, rows) = get_json(&app, uri).await; assert_eq!(status, StatusCode::OK); assert_eq!(values(&rows), [2.0, 3.0]); } #[sqlx::test] -async fn list_ranges_are_inclusive_of_both_days(pool: PgPool) { +async fn list_filters_by_utc_timestamps(pool: PgPool) { let app = router(pool); seed(&app).await; let cases = [ - ("/measurements?from=2026-10-15", vec![2.0, 3.0, 4.0]), - ("/measurements?to=2026-10-14", vec![1.0]), ( - "/measurements?from=2026-10-14&to=2026-10-15", - vec![1.0, 2.0, 3.0], + "/measurements?from=2026-10-15T00:00:00Z", + vec![2.0, 3.0, 4.0], + ), + ("/measurements?to=2026-10-15T00:00:00Z", vec![1.0]), + ( + "/measurements?from=2026-10-14T15:00:00Z&to=2026-10-15T15:00:00Z", + vec![2.0], + ), + ( + "/measurements?from=2026-10-15T09:00:00%2B09:00", + vec![2.0, 3.0, 4.0], ), ( - "/measurements?from=2026-10-15&to=2026-10-15", - vec![2.0, 3.0], + "/measurements?from=2026-10-15T00:00:00Z&to=2026-10-15T00:00:00Z", + vec![], ), - ("/measurements?from=2030-01-01", vec![]), + ("/measurements?from=2030-01-01T00:00:00Z", vec![]), ]; for (uri, expected) in cases { let (status, rows) = get_json(&app, uri).await; @@ -244,12 +256,15 @@ async fn list_combines_filters_with_order_and_limit(pool: PgPool) { let app = router(pool); seed(&app).await; let cases = [ - ("/measurements?from=2026-10-15&limit=1", vec![2.0]), + ("/measurements?from=2026-10-15T00:00:00Z&limit=1", vec![2.0]), ( - "/measurements?from=2026-10-15&order=desc&limit=2", + "/measurements?from=2026-10-15T00:00:00Z&order=desc&limit=2", vec![4.0, 3.0], ), - ("/measurements?date=2026-10-15&order=desc", vec![3.0, 2.0]), + ( + "/measurements?from=2026-10-15T00:00:00Z&to=2026-10-16T00:00:00Z&order=desc", + vec![3.0, 2.0], + ), ]; for (uri, expected) in cases { let (status, rows) = get_json(&app, uri).await; @@ -265,11 +280,12 @@ async fn list_rejects_bad_queries(pool: PgPool) { "/measurements?limit=0", "/measurements?limit=-1", "/measurements?order=sideways", - "/measurements?date=bad", "/measurements?from=bad", - "/measurements?date=2026-10-15&from=2026-10-14", - "/measurements?date=2026-10-15&to=2026-10-16", - "/measurements?from=2026-10-16&to=2026-10-14", + "/measurements?from=2026-10-15", + "/measurements?to=2026-10-15T00:00:00", + "/measurements?from=2026-10-15T09:00:00+09:00", + "/measurements?date=2026-10-15", + "/measurements?from=2026-10-16T00:00:00Z&to=2026-10-14T00:00:00Z", ]; for uri in uris { let (status, _) = get_json(&app, uri).await; @@ -395,7 +411,7 @@ async fn errors_have_a_json_body(pool: PgPool) { ), ( Method::GET, - "/measurements?date=bad".to_owned(), + "/measurements?from=bad".to_owned(), None, StatusCode::BAD_REQUEST, ), @@ -440,11 +456,7 @@ async fn error_messages_explain_the_problem(pool: PgPool) { let cases = [ ("/measurements?limit=0", "limit must be positive"), ( - "/measurements?date=2026-10-15&from=2026-10-14", - "date can't be combined with from or to", - ), - ( - "/measurements?from=2026-10-16&to=2026-10-14", + "/measurements?from=2026-10-16T00:00:00Z&to=2026-10-14T00:00:00Z", "from must not be after to", ), ]; @@ -452,6 +464,9 @@ async fn error_messages_explain_the_problem(pool: PgPool) { let (_, body) = get_json(&app, uri).await; assert_eq!(body["error"], message, "{uri}"); } + let (_, body) = get_json(&app, "/measurements?date=2026-10-15").await; + let message = body["error"].as_str().unwrap(); + assert!(message.contains("unknown field `date`"), "{message}"); let body = measurement("2026-10-14T12:00:00Z", "Waist", 80.0, "Kilogram"); let (_, _, body) = send(&app, Method::POST, "/measurements", Some(body)).await; let message = body["error"].as_str().unwrap(); |
