189 lines
6.4 KiB
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")
|
|
}
|
|
}
|