diff --git a/nahbar/nahbarTests/NahbarPersonalityTests.swift b/nahbar/nahbarTests/NahbarPersonalityTests.swift index 8559ec9..262da42 100644 --- a/nahbar/nahbarTests/NahbarPersonalityTests.swift +++ b/nahbar/nahbarTests/NahbarPersonalityTests.swift @@ -598,22 +598,20 @@ struct NotificationCopyTests { } } -// MARK: - OnboardingStep – Regressionswächter (nach Quiz-Erweiterung) +// MARK: - OnboardingStep – Regressionswächter -@Suite("OnboardingStep – RawValues (Quiz-Erweiterung)") +@Suite("OnboardingStep – RawValues") struct OnboardingStepQuizTests { - @Test("RawValues sind aufsteigend 0–4") + @Test("RawValues sind aufsteigend 0–2") @MainActor func rawValuesSequential() { #expect(OnboardingStep.profile.rawValue == 0) - #expect(OnboardingStep.quiz.rawValue == 1) - #expect(OnboardingStep.contacts.rawValue == 2) - #expect(OnboardingStep.tour.rawValue == 3) - #expect(OnboardingStep.complete.rawValue == 4) + #expect(OnboardingStep.contacts.rawValue == 1) + #expect(OnboardingStep.complete.rawValue == 2) } - @Test("allCases enthält genau 5 Schritte") - @MainActor func allCasesCountIsFive() { - #expect(OnboardingStep.allCases.count == 5) + @Test("allCases enthält genau 3 Schritte") + @MainActor func allCasesCountIsThree() { + #expect(OnboardingStep.allCases.count == 3) } } diff --git a/nahbar/nahbarTests/Tour/TourCatalogTests.swift b/nahbar/nahbarTests/Tour/TourCatalogTests.swift index 2647b02..ddb97da 100644 --- a/nahbar/nahbarTests/Tour/TourCatalogTests.swift +++ b/nahbar/nahbarTests/Tour/TourCatalogTests.swift @@ -62,6 +62,47 @@ struct TourCatalogTests { } } +// MARK: - TourStep Target Tests + +@Suite("TourCatalog – Step-Targets") +struct TourStepTargetTests { + + @Test("Onboarding-Step 4 (Index 3) targetet .addMomentButton") + func step4TargetsAddMomentButton() { + let steps = TourCatalog.onboarding.steps + #expect(steps.count > 3) + #expect(steps[3].target == .addMomentButton) + } + + @Test("Onboarding-Step 5 (Index 4) targetet .addTodoButton") + func step5TargetsAddTodoButton() { + let steps = TourCatalog.onboarding.steps + #expect(steps.count > 4) + #expect(steps[4].target == .addTodoButton) + } + + @Test("Schritte mit addMomentButton und addTodoButton haben CardPosition .below") + func momentAndTodoStepsAreBelow() { + let steps = TourCatalog.onboarding.steps + let momentStep = steps.first { $0.target == .addMomentButton } + let todoStep = steps.first { $0.target == .addTodoButton } + #expect(momentStep?.preferredCardPosition == .below) + #expect(todoStep?.preferredCardPosition == .below) + } + + @Test("Genau ein Step targetet .addMomentButton") + func exactlyOneAddMomentStep() { + let count = TourCatalog.onboarding.steps.filter { $0.target == .addMomentButton }.count + #expect(count == 1) + } + + @Test("Genau ein Step targetet .addTodoButton") + func exactlyOneAddTodoStep() { + let count = TourCatalog.onboarding.steps.filter { $0.target == .addTodoButton }.count + #expect(count == 1) + } +} + // MARK: - Tour Model Tests @Suite("Tour – Preconditions") diff --git a/nahbar/nahbarTests/Tour/TourTargetIDTests.swift b/nahbar/nahbarTests/Tour/TourTargetIDTests.swift new file mode 100644 index 0000000..ea35153 --- /dev/null +++ b/nahbar/nahbarTests/Tour/TourTargetIDTests.swift @@ -0,0 +1,52 @@ +import Foundation +import Testing +@testable import nahbar + +// MARK: - TourTargetID Tests + +@Suite("TourTargetID – Vollständigkeit") +struct TourTargetIDTests { + + @Test("Alle 10 erwarteten Cases sind vorhanden") + func allCasesCount() { + #expect(TourTargetID.allCases.count == 10) + } + + @Test("Alle rawValues sind nicht leer") + func allRawValuesNonEmpty() { + for target in TourTargetID.allCases { + #expect(!target.rawValue.isEmpty, "rawValue für \(target) ist leer") + } + } + + @Test("Alle rawValues sind eindeutig") + func allRawValuesUnique() { + let rawValues = TourTargetID.allCases.map { $0.rawValue } + #expect(Set(rawValues).count == rawValues.count) + } + + @Test("addMomentButton hat den korrekten rawValue") + func addMomentButtonRawValue() { + #expect(TourTargetID.addMomentButton.rawValue == "addMomentButton") + } + + @Test("addTodoButton hat den korrekten rawValue") + func addTodoButtonRawValue() { + #expect(TourTargetID.addTodoButton.rawValue == "addTodoButton") + } + + @Test("addContactButton ist im CaseIterable enthalten") + func addContactButtonPresent() { + #expect(TourTargetID.allCases.contains(.addContactButton)) + } + + @Test("addMomentButton ist im CaseIterable enthalten") + func addMomentButtonPresent() { + #expect(TourTargetID.allCases.contains(.addMomentButton)) + } + + @Test("addTodoButton ist im CaseIterable enthalten") + func addTodoButtonPresent() { + #expect(TourTargetID.allCases.contains(.addTodoButton)) + } +} diff --git a/nahbar/nahbarTests/UserProfileStoreTests.swift b/nahbar/nahbarTests/UserProfileStoreTests.swift index b16b75b..77fcccd 100644 --- a/nahbar/nahbarTests/UserProfileStoreTests.swift +++ b/nahbar/nahbarTests/UserProfileStoreTests.swift @@ -186,6 +186,57 @@ struct UserProfileStoreNewFieldsTests { } } +// MARK: - Vorname-Extraktion (Begrüßungslogik) + +@Suite("TodayView – Vorname-Extraktion") +struct GreetingFirstNameTests { + + // Spiegelt die Logik aus TodayView.greeting wider: + // profileStore.name.split(separator: " ").first.map(String.init) ?? "" + private func firstName(from name: String) -> String { + name.split(separator: " ").first.map(String.init) ?? "" + } + + @Test("Vorname aus vollem Namen") + func firstNameFromFullName() { + #expect(firstName(from: "Max Mustermann") == "Max") + } + + @Test("Vorname aus dreiteiligem Namen") + func firstNameFromThreeWordName() { + #expect(firstName(from: "Anna Maria Schmidt") == "Anna") + } + + @Test("Einzelner Name → dieser selbst als Vorname") + func firstNameFromSingleWord() { + #expect(firstName(from: "Max") == "Max") + } + + @Test("Leerer Name → leerer Vorname") + func firstNameFromEmptyString() { + #expect(firstName(from: "").isEmpty) + } + + @Test("Nur Leerzeichen → leerer Vorname") + func firstNameFromWhitespaceOnly() { + #expect(firstName(from: " ").isEmpty) + } + + @Test("Begrüßung mit Vorname enthält Komma und Punkt") + func greetingFormatWithName() { + let first = firstName(from: "Max Mustermann") + let greeting = "Guten Tag, \(first)." + #expect(greeting == "Guten Tag, Max.") + } + + @Test("Begrüßung ohne Name endet mit Punkt (kein Komma)") + func greetingFormatWithoutName() { + let first = firstName(from: "") + let greeting = first.isEmpty ? "Guten Tag." : "Guten Tag, \(first)." + #expect(greeting == "Guten Tag.") + } +} + // MARK: - Vorlieben-Nudge Anzeigelogik @Suite("IchView – Vorlieben-Nudge Sichtbarkeit")