ManaPasswordStrength (reine Heuristik: Laenge + Zeichenklassen, keine externe Lib) + ManaPasswordStrengthView (segmentierte Anzeige, blendet bei leerem Feld aus, .weak via brand.error). Eingebunden unter den newPassword-Feldern in ManaSignUpView und ManaResetPasswordView. 7 Unit-Tests gegen die Bewertungslogik. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
44 lines
1.4 KiB
Swift
44 lines
1.4 KiB
Swift
import Testing
|
|
@testable import ManaAuthUI
|
|
|
|
@Suite("Passwortstärke-Heuristik")
|
|
struct PasswordStrengthTests {
|
|
@Test("Leeres Passwort liefert nil (nichts anzeigen)")
|
|
func emptyIsNil() {
|
|
#expect(ManaPasswordStrength.evaluate("") == nil)
|
|
}
|
|
|
|
@Test("Unter Mindestlänge immer schwach, egal wie komplex")
|
|
func tooShortIsWeak() {
|
|
#expect(ManaPasswordStrength.evaluate("Ab1!") == .weak)
|
|
#expect(ManaPasswordStrength.evaluate("aB3$x") == .weak)
|
|
}
|
|
|
|
@Test("Genau Mindestlänge, nur Kleinbuchstaben = schwach")
|
|
func minLengthLowercaseOnlyIsWeak() {
|
|
#expect(ManaPasswordStrength.evaluate("abcdefgh") == .weak)
|
|
}
|
|
|
|
@Test("Mittel: Mindestlänge + eine Zeichenklasse mehr")
|
|
func fair() {
|
|
// 8 Zeichen + Ziffer → score 2 → mittel
|
|
#expect(ManaPasswordStrength.evaluate("abcdefg1") == .fair)
|
|
}
|
|
|
|
@Test("Gut: mehrere Zeichenklassen")
|
|
func good() {
|
|
// 8 Zeichen + Groß/Klein + Ziffer → score 3 → gut
|
|
#expect(ManaPasswordStrength.evaluate("Abcdefg1") == .good)
|
|
}
|
|
|
|
@Test("Stark: lang + alle Zeichenklassen")
|
|
func strong() {
|
|
// ≥12 + Groß/Klein + Ziffer + Symbol → score 5 → stark
|
|
#expect(ManaPasswordStrength.evaluate("Abcdefgh123!") == .strong)
|
|
}
|
|
|
|
@Test("Eigene Mindestlänge wird respektiert")
|
|
func customMinLength() {
|
|
#expect(ManaPasswordStrength.evaluate("abcdef", minLength: 10) == .weak)
|
|
}
|
|
}
|