Add POI category filters, delete item button, and fix itinerary persistence
- Expand POI categories from 5 to 7 (restaurant, bar, coffee, hotel, parking, attraction, entertainment) - Add category filter chips with per-category API calls and caching - Add delete button with confirmation dialog to Edit Item sheet - Fix itinerary items not persisting: use LocalItineraryItem (SwiftData) as primary store with CloudKit sync as secondary, register model in schema Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -109,10 +109,12 @@ struct POICategoryTests {
|
||||
@Test("displayName: returns readable name")
|
||||
func displayName_readable() {
|
||||
#expect(POISearchService.POICategory.restaurant.displayName == "Restaurant")
|
||||
#expect(POISearchService.POICategory.bar.displayName == "Bar")
|
||||
#expect(POISearchService.POICategory.coffee.displayName == "Coffee")
|
||||
#expect(POISearchService.POICategory.hotel.displayName == "Hotel")
|
||||
#expect(POISearchService.POICategory.parking.displayName == "Parking")
|
||||
#expect(POISearchService.POICategory.attraction.displayName == "Attraction")
|
||||
#expect(POISearchService.POICategory.entertainment.displayName == "Entertainment")
|
||||
#expect(POISearchService.POICategory.nightlife.displayName == "Nightlife")
|
||||
#expect(POISearchService.POICategory.museum.displayName == "Museum")
|
||||
}
|
||||
|
||||
// MARK: - Specification Tests: iconName
|
||||
@@ -121,10 +123,12 @@ struct POICategoryTests {
|
||||
@Test("iconName: returns SF Symbol name")
|
||||
func iconName_sfSymbol() {
|
||||
#expect(POISearchService.POICategory.restaurant.iconName == "fork.knife")
|
||||
#expect(POISearchService.POICategory.bar.iconName == "wineglass.fill")
|
||||
#expect(POISearchService.POICategory.coffee.iconName == "cup.and.saucer.fill")
|
||||
#expect(POISearchService.POICategory.hotel.iconName == "bed.double.fill")
|
||||
#expect(POISearchService.POICategory.parking.iconName == "car.fill")
|
||||
#expect(POISearchService.POICategory.attraction.iconName == "star.fill")
|
||||
#expect(POISearchService.POICategory.entertainment.iconName == "theatermasks.fill")
|
||||
#expect(POISearchService.POICategory.nightlife.iconName == "moon.stars.fill")
|
||||
#expect(POISearchService.POICategory.museum.iconName == "building.columns.fill")
|
||||
}
|
||||
|
||||
// MARK: - Specification Tests: searchQuery
|
||||
@@ -133,10 +137,12 @@ struct POICategoryTests {
|
||||
@Test("searchQuery: returns search string")
|
||||
func searchQuery_searchString() {
|
||||
#expect(POISearchService.POICategory.restaurant.searchQuery == "restaurants")
|
||||
#expect(POISearchService.POICategory.bar.searchQuery == "bars")
|
||||
#expect(POISearchService.POICategory.coffee.searchQuery == "coffee shops")
|
||||
#expect(POISearchService.POICategory.hotel.searchQuery == "hotels")
|
||||
#expect(POISearchService.POICategory.parking.searchQuery == "parking")
|
||||
#expect(POISearchService.POICategory.attraction.searchQuery == "tourist attractions")
|
||||
#expect(POISearchService.POICategory.entertainment.searchQuery == "entertainment")
|
||||
#expect(POISearchService.POICategory.nightlife.searchQuery == "bars nightlife")
|
||||
#expect(POISearchService.POICategory.museum.searchQuery == "museums")
|
||||
}
|
||||
|
||||
// MARK: - Invariant Tests
|
||||
@@ -154,12 +160,14 @@ struct POICategoryTests {
|
||||
/// - Invariant: CaseIterable includes all cases
|
||||
@Test("Invariant: CaseIterable includes all cases")
|
||||
func invariant_allCasesIncluded() {
|
||||
#expect(POISearchService.POICategory.allCases.count == 5)
|
||||
#expect(POISearchService.POICategory.allCases.count == 7)
|
||||
#expect(POISearchService.POICategory.allCases.contains(.restaurant))
|
||||
#expect(POISearchService.POICategory.allCases.contains(.bar))
|
||||
#expect(POISearchService.POICategory.allCases.contains(.coffee))
|
||||
#expect(POISearchService.POICategory.allCases.contains(.hotel))
|
||||
#expect(POISearchService.POICategory.allCases.contains(.parking))
|
||||
#expect(POISearchService.POICategory.allCases.contains(.attraction))
|
||||
#expect(POISearchService.POICategory.allCases.contains(.entertainment))
|
||||
#expect(POISearchService.POICategory.allCases.contains(.nightlife))
|
||||
#expect(POISearchService.POICategory.allCases.contains(.museum))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user