import Foundation import ManaCore import Testing @testable import ManaAuthUI @Suite("LoginViewModel") @MainActor struct LoginViewModelTests { @Test("Erfolgreicher Login setzt status auf .idle und cleared das Passwort") func successfulLogin() async throws { let mocked = makeMockedAuth() let model = LoginViewModel(auth: mocked.auth) model.email = "u@x.de" model.password = "Aa-123456789" let access = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1MSIsImV4cCI6MjAwMDAwMDAwMH0.sig" mocked.setHandler { _ in (200, Data(#"{"accessToken":"\#(access)","refreshToken":"r"}"#.utf8)) } await model.submit() #expect(model.status == .idle) #expect(model.password == "") #expect(mocked.auth.status == .signedIn(email: "u@x.de")) } @Test("EMAIL_NOT_VERIFIED schaltet ViewModel auf .emailNotVerified") func emailNotVerifiedPath() async { let mocked = makeMockedAuth() let model = LoginViewModel(auth: mocked.auth) model.email = "u@x.de" model.password = "pw" mocked.setHandler { _ in (403, Data(#"{"error":"EMAIL_NOT_VERIFIED","status":403}"#.utf8)) } await model.submit() if case let .emailNotVerified(email) = model.status { #expect(email == "u@x.de") } else { Issue.record("Expected .emailNotVerified, got \(model.status)") } } @Test("Invalid-Credentials liefert .error mit deutscher Nachricht") func invalidCredentials() async { let mocked = makeMockedAuth() let model = LoginViewModel(auth: mocked.auth) model.email = "u@x.de" model.password = "wrong" mocked.setHandler { _ in (401, Data(#"{"error":"INVALID_CREDENTIALS","status":401}"#.utf8)) } await model.submit() if case let .error(message) = model.status { #expect(message == "Email oder Passwort falsch") } else { Issue.record("Expected .error, got \(model.status)") } } @Test("canSubmit ist false bei leeren Feldern") func canSubmitGuards() { let mocked = makeMockedAuth() let model = LoginViewModel(auth: mocked.auth) #expect(model.canSubmit == false) model.email = "u@x.de" #expect(model.canSubmit == false) model.password = "pw" #expect(model.canSubmit == true) } @Test("resetToIdle bringt Status zurück auf idle") func resetToIdleClearsState() { let mocked = makeMockedAuth() let model = LoginViewModel(auth: mocked.auth) model.email = "u@x.de" model.password = "pw" model.resetToIdle() #expect(model.status == .idle) #expect(model.password == "") } }