import Foundation import ManaCore import Testing @testable import ManaAuthUI @Suite("SignUpViewModel") @MainActor struct SignUpViewModelTests { @Test("Registrierung ohne Tokens → awaitingVerification") func awaitsVerification() async { let mocked = makeMockedAuth() let model = SignUpViewModel(auth: mocked.auth) model.email = "new@x.de" model.password = "Aa-123456789" mocked.setHandler { _ in (200, Data(#"{"user":{"id":"u1","email":"new@x.de"}}"#.utf8)) } await model.submit() if case let .awaitingVerification(email) = model.status { #expect(email == "new@x.de") } else { Issue.record("Expected .awaitingVerification, got \(model.status)") } #expect(model.password == "") } @Test("Registrierung mit Tokens → signedIn") func registersAndSignsIn() async { let mocked = makeMockedAuth() let model = SignUpViewModel(auth: mocked.auth) model.email = "new@x.de" model.password = "Aa-123456789" let access = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1MSIsImV4cCI6MjAwMDAwMDAwMH0.sig" mocked.setHandler { _ in (200, Data(#""" {"user":{"id":"u1","email":"new@x.de"},"accessToken":"\#(access)","refreshToken":"r"} """#.utf8)) } await model.submit() #expect(model.status == .signedIn) } @Test("Email-Konflikt liefert lokalisierte Fehlermeldung") func emailConflict() async { let mocked = makeMockedAuth() let model = SignUpViewModel(auth: mocked.auth) model.email = "old@x.de" model.password = "Aa-123456789" mocked.setHandler { _ in (409, Data(#"{"error":"EMAIL_ALREADY_REGISTERED","status":409}"#.utf8)) } await model.submit() if case let .error(message) = model.status { #expect(message == "Diese Email ist bereits registriert.") } else { Issue.record("Expected .error, got \(model.status)") } } @Test("passwordHint warnt bei zu kurzem Passwort") func passwordHint() { let model = SignUpViewModel(auth: makeMockedAuth().auth) model.password = "" #expect(model.passwordHint == nil) model.password = "kurz" #expect(model.passwordHint == "Passwort muss mindestens 8 Zeichen lang sein.") model.password = "lang-genug" #expect(model.passwordHint == nil) } @Test("submit mit zu kurzem Passwort macht keinen Server-Call") func submitGuardsShortPassword() async { let mocked = makeMockedAuth() let model = SignUpViewModel(auth: mocked.auth) model.email = "u@x.de" model.password = "kurz" mocked.setHandler { _ in Issue.record("Server darf nicht aufgerufen werden") return (500, Data()) } await model.submit() if case let .error(message) = model.status { #expect(message == "Passwort muss mindestens 8 Zeichen lang sein.") } else { Issue.record("Expected .error, got \(model.status)") } } }