feat(kayıt): yeni hane kaydı yalnızca davetle (REGISTRATION=invite_only)
- REGISTRATION ortam değişkeni: invite_only (varsayılan) | open - invite_only: ilk hane serbest, sonrasında yalnızca davet koduyla katılım - Backend'de zorunlu: 403 registration_closed; GET /api/auth/registration - Kayıt ekranı: kayıt kapalıyken yalnızca davet kodu ve açıklama - Entegrasyon testleri: kayıt politikası (2) - Prettier ayarı eklendi (proje stiliyle uyumlu), kaynaklar biçimlendirildi Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -11,7 +11,11 @@ use axum::{
|
||||
http::{Method, Request, StatusCode, header},
|
||||
};
|
||||
use http_body_util::BodyExt;
|
||||
use kakeibo::{config::Config, db, routes, state::AppState};
|
||||
use kakeibo::{
|
||||
config::{Config, RegistrationMode},
|
||||
db, routes,
|
||||
state::AppState,
|
||||
};
|
||||
use mongodb::Database;
|
||||
use serde_json::{Value, json};
|
||||
use tower::ServiceExt;
|
||||
@@ -29,7 +33,12 @@ pub struct Session {
|
||||
}
|
||||
|
||||
impl TestApp {
|
||||
/// Kayıt açık (birden fazla hane gerektiren testler için).
|
||||
pub async fn new() -> Self {
|
||||
Self::with_registration(RegistrationMode::Open).await
|
||||
}
|
||||
|
||||
pub async fn with_registration(registration: RegistrationMode) -> Self {
|
||||
dotenvy::dotenv().ok();
|
||||
let uri = std::env::var("MONGODB_URI")
|
||||
.expect("MONGODB_URI tanımlı değil (.env dosyasını kontrol edin)");
|
||||
@@ -46,6 +55,7 @@ impl TestApp {
|
||||
jwt_secret: "test-jwt-secret-en-az-32-karakter-olmali!!".into(),
|
||||
app_url: "http://localhost".into(),
|
||||
port: 0,
|
||||
registration,
|
||||
};
|
||||
let router = routes::router(AppState::new(db.clone(), config));
|
||||
Self { router, db }
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
//! 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;
|
||||
}
|
||||
Reference in New Issue
Block a user