BusinessCard/BusinessCardTests/BusinessCardTests.swift

189 lines
6.4 KiB
Swift

import Testing
import SwiftData
@testable import BusinessCard
struct BusinessCardTests {
@Test func vCardPayloadIncludesFields() async throws {
let container = try ModelContainer(for: BusinessCard.self, Contact.self)
let context = container.mainContext
let card = BusinessCard(
displayName: "Test User",
role: "Developer",
company: "Test Corp",
email: "test@example.com",
phone: "+1 555 123 4567",
website: "example.com",
location: "San Francisco, CA"
)
context.insert(card)
#expect(card.vCardPayload.contains("BEGIN:VCARD"))
#expect(card.vCardPayload.contains("FN:\(card.displayName)"))
#expect(card.vCardPayload.contains("ORG:\(card.company)"))
#expect(card.vCardPayload.contains("EMAIL;TYPE=work:\(card.email)"))
#expect(card.vCardPayload.contains("TEL;TYPE=work:\(card.phone)"))
}
@Test @MainActor func defaultCardSelectionUpdatesCards() async throws {
let container = try ModelContainer(for: BusinessCard.self, Contact.self)
let context = container.mainContext
BusinessCard.createSamples(in: context)
try context.save()
let store = CardStore(modelContext: context)
let newDefault = store.cards[1]
store.setDefaultCard(newDefault)
#expect(store.selectedCardID == newDefault.id)
#expect(store.cards.filter { $0.isDefault }.count == 1)
#expect(store.cards.first { $0.isDefault }?.id == newDefault.id)
}
@Test @MainActor func contactsSearchFiltersByNameOrCompany() async throws {
let container = try ModelContainer(for: BusinessCard.self, Contact.self)
let context = container.mainContext
let contact1 = Contact(name: "John Doe", role: "Developer", company: "Global Bank")
let contact2 = Contact(name: "Jane Smith", role: "Designer", company: "Tech Corp")
context.insert(contact1)
context.insert(contact2)
try context.save()
let store = ContactsStore(modelContext: context)
store.searchQuery = "Global"
#expect(store.visibleContacts.count == 1)
#expect(store.visibleContacts.first?.company == "Global Bank")
}
@Test @MainActor func addCardIncreasesCardCount() async throws {
let container = try ModelContainer(for: BusinessCard.self, Contact.self)
let context = container.mainContext
let store = CardStore(modelContext: context)
let initialCount = store.cards.count
let newCard = BusinessCard(
displayName: "New User",
role: "Manager",
company: "New Corp"
)
store.addCard(newCard)
#expect(store.cards.count == initialCount + 1)
#expect(store.selectedCardID == newCard.id)
}
@Test @MainActor func deleteCardRemovesFromStore() async throws {
let container = try ModelContainer(for: BusinessCard.self, Contact.self)
let context = container.mainContext
BusinessCard.createSamples(in: context)
try context.save()
let store = CardStore(modelContext: context)
let initialCount = store.cards.count
let cardToDelete = store.cards.last!
store.deleteCard(cardToDelete)
#expect(store.cards.count == initialCount - 1)
#expect(!store.cards.contains(where: { $0.id == cardToDelete.id }))
}
@Test @MainActor func updateCardChangesProperties() async throws {
let container = try ModelContainer(for: BusinessCard.self, Contact.self)
let context = container.mainContext
let card = BusinessCard(
displayName: "Original Name",
role: "Original Role",
company: "Original Company"
)
context.insert(card)
try context.save()
let store = CardStore(modelContext: context)
card.displayName = "Updated Name"
card.role = "Updated Role"
store.updateCard(card)
let updatedCard = store.cards.first(where: { $0.id == card.id })
#expect(updatedCard?.displayName == "Updated Name")
#expect(updatedCard?.role == "Updated Role")
}
@Test @MainActor func recordShareCreatesContact() async throws {
let container = try ModelContainer(for: BusinessCard.self, Contact.self)
let context = container.mainContext
let store = ContactsStore(modelContext: context)
let initialCount = store.contacts.count
store.recordShare(
for: "New Contact",
role: "CEO",
company: "Partner Inc",
cardLabel: "Work"
)
#expect(store.contacts.count == initialCount + 1)
#expect(store.contacts.first?.name == "New Contact")
}
@Test @MainActor func recordShareUpdatesExistingContact() async throws {
let container = try ModelContainer(for: BusinessCard.self, Contact.self)
let context = container.mainContext
let existingContact = Contact(
name: "Existing Contact",
role: "Manager",
company: "Partner Inc",
cardLabel: "Personal"
)
context.insert(existingContact)
try context.save()
let store = ContactsStore(modelContext: context)
let initialCount = store.contacts.count
store.recordShare(
for: "Existing Contact",
role: "Manager",
company: "Partner Inc",
cardLabel: "Work"
)
#expect(store.contacts.count == initialCount)
let updated = store.contacts.first(where: { $0.name == "Existing Contact" })
#expect(updated?.cardLabel == "Work")
}
@Test func themeAssignmentWorks() async throws {
let card = BusinessCard()
card.theme = .midnight
#expect(card.themeName == "Midnight")
#expect(card.theme.name == "Midnight")
card.theme = .ocean
#expect(card.themeName == "Ocean")
}
@Test func layoutStyleAssignmentWorks() async throws {
let card = BusinessCard()
card.layoutStyle = .split
#expect(card.layoutStyleRawValue == "split")
#expect(card.layoutStyle == .split)
card.layoutStyle = .photo
#expect(card.layoutStyleRawValue == "photo")
}
}