From 4de0f9f665d28e1e326ac334a6d899806827a983 Mon Sep 17 00:00:00 2001 From: Lennart <18233294+lennart-k@users.noreply.github.com> Date: Wed, 31 Dec 2025 01:55:49 +0100 Subject: [PATCH] add basic addressbook import test --- .../carddav/addressbook_import.rs | 68 +++++++++++++++++++ src/integration_tests/carddav/mod.rs | 1 + ...carddav__addressbook_import__get_body.snap | 13 ++++ ...ddav__addressbook_import__import_body.snap | 5 ++ 4 files changed, 87 insertions(+) create mode 100644 src/integration_tests/carddav/addressbook_import.rs create mode 100644 src/integration_tests/carddav/snapshots/rustical__integration_tests__carddav__addressbook_import__get_body.snap create mode 100644 src/integration_tests/carddav/snapshots/rustical__integration_tests__carddav__addressbook_import__import_body.snap diff --git a/src/integration_tests/carddav/addressbook_import.rs b/src/integration_tests/carddav/addressbook_import.rs new file mode 100644 index 0000000..28054a3 --- /dev/null +++ b/src/integration_tests/carddav/addressbook_import.rs @@ -0,0 +1,68 @@ +use crate::integration_tests::{ResponseExtractString, get_app}; +use axum::body::Body; +use axum::extract::Request; +use headers::{Authorization, HeaderMapExt}; +use http::StatusCode; +use rstest::rstest; +use rustical_store_sqlite::tests::{TestStoreContext, test_store_context}; +use tower::ServiceExt; + +#[rstest] +#[tokio::test] +async fn test_import( + #[from(test_store_context)] + #[future] + context: TestStoreContext, +) { + let context = context.await; + let app = get_app(context.clone()); + let addr_store = context.addr_store; + + let (principal, addr_id) = ("user", "contacts"); + let url = format!("/carddav/principal/{principal}/{addr_id}"); + + let request_template = || { + Request::builder() + .method("IMPORT") + .uri(&url) + .body(Body::from( + r"BEGIN:VCARD +VERSION:4.0 +FN:Simon Perreault +N:Perreault;Simon;;;ing. jr,M.Sc. +BDAY:--0203 +GENDER:M +EMAIL;TYPE=work:simon.perreault@viagenie.ca +END:VCARD", + )) + .unwrap() + }; + + // Try without authentication + let request = request_template(); + let response = app.clone().oneshot(request).await.unwrap(); + assert_eq!(response.status(), StatusCode::UNAUTHORIZED); + + // Try with correct credentials + let mut request = request_template(); + request + .headers_mut() + .typed_insert(Authorization::basic("user", "pass")); + let response = app.clone().oneshot(request).await.unwrap(); + assert_eq!(response.status(), StatusCode::OK); + let body = response.extract_string().await; + insta::assert_snapshot!("import_body", body); + + let mut request = Request::builder() + .method("GET") + .uri(&url) + .body(Body::empty()) + .unwrap(); + request + .headers_mut() + .typed_insert(Authorization::basic("user", "pass")); + let response = app.clone().oneshot(request).await.unwrap(); + assert_eq!(response.status(), StatusCode::OK); + let body = response.extract_string().await; + insta::assert_snapshot!("get_body", body); +} diff --git a/src/integration_tests/carddav/mod.rs b/src/integration_tests/carddav/mod.rs index 520d11f..d4be4c8 100644 --- a/src/integration_tests/carddav/mod.rs +++ b/src/integration_tests/carddav/mod.rs @@ -8,6 +8,7 @@ use rustical_store_sqlite::tests::{TestStoreContext, test_store_context}; use tower::ServiceExt; mod addressbook; +mod addressbook_import; #[rstest] #[tokio::test] diff --git a/src/integration_tests/carddav/snapshots/rustical__integration_tests__carddav__addressbook_import__get_body.snap b/src/integration_tests/carddav/snapshots/rustical__integration_tests__carddav__addressbook_import__get_body.snap new file mode 100644 index 0000000..ac68d01 --- /dev/null +++ b/src/integration_tests/carddav/snapshots/rustical__integration_tests__carddav__addressbook_import__get_body.snap @@ -0,0 +1,13 @@ +--- +source: src/integration_tests/carddav/addressbook_import.rs +expression: body +--- +BEGIN:VCARD +VERSION:4.0 +FN:Simon Perreault +N:Perreault;Simon;;;ing. jr,M.Sc. +BDAY:--0203 +GENDER:M +EMAIL;TYPE=work:simon.perreault@viagenie.ca +UID:42ed1bd7-8538-45fb-917d-872e2466a7ce +END:VCARD diff --git a/src/integration_tests/carddav/snapshots/rustical__integration_tests__carddav__addressbook_import__import_body.snap b/src/integration_tests/carddav/snapshots/rustical__integration_tests__carddav__addressbook_import__import_body.snap new file mode 100644 index 0000000..252904c --- /dev/null +++ b/src/integration_tests/carddav/snapshots/rustical__integration_tests__carddav__addressbook_import__import_body.snap @@ -0,0 +1,5 @@ +--- +source: src/integration_tests/carddav/addressbook_import.rs +expression: body +--- +