//! Kayıt politikası: REGISTRATION=invite_only (varsayılan). mod common; use axum::http::{Method, StatusCode}; use common::TestApp; use kakeibo::config::RegistrationMode; use serde_json::json; async fn new_household_allowed(app: &TestApp) -> bool { let (st, body, _) = app .send(Method::GET, "/auth/registration", None, None) .await; assert_eq!(st, StatusCode::OK); body["new_household_allowed"].as_bool().unwrap() } #[tokio::test] async fn invite_only_allows_first_household_then_only_invites() { let app = TestApp::with_registration(RegistrationMode::InviteOnly).await; // Boş sistem: ilk kurulum serbest assert!(new_household_allowed(&app).await); let owner = app.register("Sahip", None).await; // Artık yeni hane kurulamaz (arayüz bilgisi + API zorunluluğu) assert!(!new_household_allowed(&app).await); let (st, body, _) = app .send( Method::POST, "/auth/register", None, Some( json!({ "name": "Yabancı", "email": "yabanci@test.com", "password": "sifre12345" }), ), ) .await; assert_eq!(st, StatusCode::FORBIDDEN); assert_eq!(body["error"]["code"], "registration_closed"); // Davetle katılım serbest let (_, inv) = app.post("/household/invites", &owner, json!({})).await; let member = app .register("Es", Some(inv["code"].as_str().unwrap())) .await; assert_eq!(member.household_id, owner.household_id); // Geçersiz davet kodu yine 400 (politika hatası değil) let (st, _, _) = app .send( Method::POST, "/auth/register", None, Some(json!({ "name": "X", "email": "x@test.com", "password": "sifre12345", "invite_code": "ZZZZZZZZ" })), ) .await; assert_eq!(st, StatusCode::BAD_REQUEST); app.cleanup().await; } #[tokio::test] async fn open_mode_allows_many_households() { let app = TestApp::with_registration(RegistrationMode::Open).await; let a = app.register("A", None).await; let b = app.register("B", None).await; assert_ne!(a.household_id, b.household_id); assert!(new_household_allowed(&app).await); app.cleanup().await; }