diff --git a/Storage/Storage.xcodeproj/project.pbxproj b/Storage/Storage.xcodeproj/project.pbxproj index d044b95feb4..3fb185e5b61 100644 --- a/Storage/Storage.xcodeproj/project.pbxproj +++ b/Storage/Storage.xcodeproj/project.pbxproj @@ -178,6 +178,8 @@ CC2C030C262DCC6900928C9C /* ShippingLabelPaymentMethod+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC2C0308262DCC6900928C9C /* ShippingLabelPaymentMethod+CoreDataProperties.swift */; }; CC6A054328770933002C144E /* OrderMetaData+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC6A054128770933002C144E /* OrderMetaData+CoreDataClass.swift */; }; CC6A054428770933002C144E /* OrderMetaData+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC6A054228770933002C144E /* OrderMetaData+CoreDataProperties.swift */; }; + CC80E406294B33C200D5FF45 /* SiteSummaryStats+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC80E405294B33C100D5FF45 /* SiteSummaryStats+CoreDataClass.swift */; }; + CC80E408294B33F100D5FF45 /* SiteSummaryStats+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC80E407294B33F100D5FF45 /* SiteSummaryStats+CoreDataProperties.swift */; }; CCBEBD4027C68E660010C96F /* FeatureIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCBEBD3F27C68E660010C96F /* FeatureIcon.swift */; }; CCD2E70725DE9AAA00BD975D /* WooCommerceModelV45toV46.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = CCD2E70625DE9AAA00BD975D /* WooCommerceModelV45toV46.xcmappingmodel */; }; CE12FBE32220515600C59248 /* WooCommerceModelV9toV10.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = CE12FBE22220515600C59248 /* WooCommerceModelV9toV10.xcmappingmodel */; }; @@ -433,6 +435,9 @@ CC6A05402877012B002C144E /* Model 71.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Model 71.xcdatamodel"; sourceTree = ""; }; CC6A054128770933002C144E /* OrderMetaData+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OrderMetaData+CoreDataClass.swift"; sourceTree = ""; }; CC6A054228770933002C144E /* OrderMetaData+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OrderMetaData+CoreDataProperties.swift"; sourceTree = ""; }; + CC80E3FA294B30D700D5FF45 /* Model 80.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Model 80.xcdatamodel"; sourceTree = ""; }; + CC80E405294B33C100D5FF45 /* SiteSummaryStats+CoreDataClass.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SiteSummaryStats+CoreDataClass.swift"; sourceTree = ""; }; + CC80E407294B33F100D5FF45 /* SiteSummaryStats+CoreDataProperties.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SiteSummaryStats+CoreDataProperties.swift"; sourceTree = ""; }; CCA1D60B29477F5E00B40560 /* Model 79.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "Model 79.xcdatamodel"; sourceTree = ""; }; CCBEBD3F27C68E660010C96F /* FeatureIcon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeatureIcon.swift; sourceTree = ""; }; CCD2E70625DE9AAA00BD975D /* WooCommerceModelV45toV46.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = WooCommerceModelV45toV46.xcmappingmodel; sourceTree = ""; }; @@ -670,6 +675,8 @@ D8FBFF5222D66A06006E3336 /* OrderStatsV4Totals+CoreDataProperties.swift */, D8FBFF5322D66A06006E3336 /* OrderStatsV4+CoreDataClass.swift */, D8FBFF5422D66A06006E3336 /* OrderStatsV4+CoreDataProperties.swift */, + CC80E405294B33C100D5FF45 /* SiteSummaryStats+CoreDataClass.swift */, + CC80E407294B33F100D5FF45 /* SiteSummaryStats+CoreDataProperties.swift */, 7471A510216CF0FD00219F7E /* SiteVisitStats+CoreDataClass.swift */, 7471A513216CF0FE00219F7E /* SiteVisitStats+CoreDataProperties.swift */, 7471A512216CF0FE00219F7E /* SiteVisitStatsItem+CoreDataClass.swift */, @@ -1234,6 +1241,7 @@ AE93BE90272C0E9F001B55EA /* GeneralStoreSettings.swift in Sources */, 031C1EA227AD3AFE00298699 /* WCPayCharge+CoreDataProperties.swift in Sources */, D87F61552265AA900031A13B /* PListFileStorage.swift in Sources */, + CC80E406294B33C200D5FF45 /* SiteSummaryStats+CoreDataClass.swift in Sources */, B5B914C620EFF03500F2F832 /* Site+CoreDataProperties.swift in Sources */, 45E462072684BCEE00011BF2 /* StateOfACountry+CoreDataClass.swift in Sources */, CC6A054328770933002C144E /* OrderMetaData+CoreDataClass.swift in Sources */, @@ -1309,6 +1317,7 @@ 028296F3237D404F00E84012 /* ProductVariation+CoreDataProperties.swift in Sources */, 5772842325BF465A0092FB2C /* NSPersistentStoreCoordinator+PersistentStoreCoordinatorProtocol.swift in Sources */, 077F39C4269F1F4600ABEADC /* SystemPlugin+CoreDataClass.swift in Sources */, + CC80E408294B33F100D5FF45 /* SiteSummaryStats+CoreDataProperties.swift in Sources */, B54CA5C920A4C17800F38CD1 /* NSObject+Storage.swift in Sources */, 6889089D28F66DED0081A07E /* CustomerSearchResult+CoreDataClass.swift in Sources */, 7471A516216CF0FE00219F7E /* SiteVisitStatsItem+CoreDataClass.swift in Sources */, @@ -1817,6 +1826,7 @@ DEC51AA4275B41BE009F3DF4 /* WooCommerce.xcdatamodeld */ = { isa = XCVersionGroup; children = ( + CC80E3FA294B30D700D5FF45 /* Model 80.xcdatamodel */, CCA1D60B29477F5E00B40560 /* Model 79.xcdatamodel */, CCF3209E2927EBEE002114B1 /* Model 78.xcdatamodel */, AE7DF9FA2919023100C4D1ED /* Model 77.xcdatamodel */, @@ -1897,7 +1907,7 @@ DEC51ADE275B41BE009F3DF4 /* Model 47.xcdatamodel */, DEC51ADF275B41BE009F3DF4 /* Model 19.xcdatamodel */, ); - currentVersion = CCA1D60B29477F5E00B40560 /* Model 79.xcdatamodel */; + currentVersion = CC80E3FA294B30D700D5FF45 /* Model 80.xcdatamodel */; path = WooCommerce.xcdatamodeld; sourceTree = ""; versionGroupType = wrapper.xcdatamodel; diff --git a/Storage/Storage/Model/MIGRATIONS.md b/Storage/Storage/Model/MIGRATIONS.md index 4f72daf1d03..fc82ed5c423 100644 --- a/Storage/Storage/Model/MIGRATIONS.md +++ b/Storage/Storage/Model/MIGRATIONS.md @@ -2,6 +2,10 @@ This file documents changes in the WCiOS Storage data model. Please explain any changes to the data model as well as any custom migrations. +## Model 80 (Release 11.7.0.0) +- @rachelmcr 2022-12-15 + - Added `SiteSummaryStats` entity. + ## Model 79 (Release 11.7.0.0) - @rachelmcr 2022-12-12 - Added `views` attribute to `SiteVisitStatsItem` entity. diff --git a/Storage/Storage/Model/SiteSummaryStats+CoreDataClass.swift b/Storage/Storage/Model/SiteSummaryStats+CoreDataClass.swift new file mode 100644 index 00000000000..e7ef24a1187 --- /dev/null +++ b/Storage/Storage/Model/SiteSummaryStats+CoreDataClass.swift @@ -0,0 +1,7 @@ +import Foundation +import CoreData + +@objc(SiteSummaryStats) +public class SiteSummaryStats: NSManagedObject { + +} diff --git a/Storage/Storage/Model/SiteSummaryStats+CoreDataProperties.swift b/Storage/Storage/Model/SiteSummaryStats+CoreDataProperties.swift new file mode 100644 index 00000000000..f2d90facbf2 --- /dev/null +++ b/Storage/Storage/Model/SiteSummaryStats+CoreDataProperties.swift @@ -0,0 +1,21 @@ +import Foundation +import CoreData + + +extension SiteSummaryStats { + + @nonobjc public class func fetchRequest() -> NSFetchRequest { + return NSFetchRequest(entityName: "SiteSummaryStats") + } + + @NSManaged public var siteID: Int64 + @NSManaged public var period: String + @NSManaged public var date: String + @NSManaged public var visitors: Int64 + @NSManaged public var views: Int64 + +} + +extension SiteSummaryStats: Identifiable { + +} diff --git a/Storage/Storage/Model/WooCommerce.xcdatamodeld/.xccurrentversion b/Storage/Storage/Model/WooCommerce.xcdatamodeld/.xccurrentversion index c0a627929f0..ab7eb804e01 100644 --- a/Storage/Storage/Model/WooCommerce.xcdatamodeld/.xccurrentversion +++ b/Storage/Storage/Model/WooCommerce.xcdatamodeld/.xccurrentversion @@ -3,6 +3,6 @@ _XCCurrentVersionName - Model 79.xcdatamodel + Model 80.xcdatamodel diff --git a/Storage/Storage/Model/WooCommerce.xcdatamodeld/Model 80.xcdatamodel/contents b/Storage/Storage/Model/WooCommerce.xcdatamodeld/Model 80.xcdatamodel/contents new file mode 100644 index 00000000000..f58ed118ee5 --- /dev/null +++ b/Storage/Storage/Model/WooCommerce.xcdatamodeld/Model 80.xcdatamodel/contents @@ -0,0 +1,847 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Storage/StorageTests/CoreData/MigrationTests.swift b/Storage/StorageTests/CoreData/MigrationTests.swift index 7395d4579b6..9a6a441cde1 100644 --- a/Storage/StorageTests/CoreData/MigrationTests.swift +++ b/Storage/StorageTests/CoreData/MigrationTests.swift @@ -1552,6 +1552,30 @@ final class MigrationTests: XCTestCase { let newViewsCount = try XCTUnwrap(migratedSiteVisitStatsItem.value(forKey: "views") as? Int) XCTAssertEqual(newViewsCount, viewsCount) } + + func test_migrating_from_79_to_80_enables_creating_new_SiteSummaryStats_entity() throws { + // Given + let sourceContainer = try startPersistentContainer("Model 79") + let sourceContext = sourceContainer.viewContext + + try sourceContext.save() + + // Confidence Check. This entity should not exist in Model 79 + XCTAssertNil(NSEntityDescription.entity(forEntityName: "SiteSummaryStats", in: sourceContext)) + + // When + let targetContainer = try migrate(sourceContainer, to: "Model 80") + let targetContext = targetContainer.viewContext + + // Then + XCTAssertEqual(try targetContext.count(entityName: "SiteSummaryStats"), 0) + + let summaryStats = insertSiteSummaryStats(to: targetContext) + let insertedStats = try XCTUnwrap(targetContext.firstObject(ofType: SiteSummaryStats.self)) + + XCTAssertEqual(try targetContext.count(entityName: "SiteSummaryStats"), 1) + XCTAssertEqual(insertedStats, summaryStats) + } } // MARK: - Persistent Store Setup and Migrations @@ -1963,6 +1987,16 @@ private extension MigrationTests { ]) } + @discardableResult + func insertSiteSummaryStats(to context: NSManagedObjectContext) -> NSManagedObject { + context.insert(entityName: "SiteSummaryStats", properties: [ + "date": "2022-12-15", + "period": "day", + "visitors": 3, + "views": 9 + ]) + } + @discardableResult func insertSiteVisitStats(to context: NSManagedObjectContext) -> NSManagedObject { context.insert(entityName: "SiteVisitStats", properties: [ diff --git a/Yosemite/YosemiteTests/Stores/StatsStoreV4Tests.swift b/Yosemite/YosemiteTests/Stores/StatsStoreV4Tests.swift index 18cea650d0c..1a72a686a53 100644 --- a/Yosemite/YosemiteTests/Stores/StatsStoreV4Tests.swift +++ b/Yosemite/YosemiteTests/Stores/StatsStoreV4Tests.swift @@ -514,7 +514,7 @@ final class StatsStoreV4Tests: XCTestCase { network.simulateResponse(requestUrlSuffix: "sites/\(sampleSiteID)/stats/summary/", filename: "site-summary-stats") // When - let result: Result = waitFor { promise in + let result: Result = waitFor { promise in let action = StatsActionV4.retrieveSiteSummaryStats(siteID: self.sampleSiteID, period: .day, quantity: 1, @@ -563,7 +563,7 @@ final class StatsStoreV4Tests: XCTestCase { network.simulateResponse(requestUrlSuffix: "sites/\(sampleSiteID)/stats/visits/", filename: "site-visits-quarter") // When - let result: Result = waitFor { promise in + let result: Result = waitFor { promise in let action = StatsActionV4.retrieveSiteSummaryStats(siteID: self.sampleSiteID, period: .month, quantity: 3, @@ -587,7 +587,7 @@ final class StatsStoreV4Tests: XCTestCase { network.simulateResponse(requestUrlSuffix: "sites/\(sampleSiteID)/stats/summary/", filename: "generic_error") // When - let result: Result = waitFor { promise in + let result: Result = waitFor { promise in let action = StatsActionV4.retrieveSiteSummaryStats(siteID: self.sampleSiteID, period: .day, quantity: 1, @@ -608,7 +608,7 @@ final class StatsStoreV4Tests: XCTestCase { let store = StatsStoreV4(dispatcher: dispatcher, storageManager: storageManager, network: network) // When - let result: Result = waitFor { promise in + let result: Result = waitFor { promise in let action = StatsActionV4.retrieveSiteSummaryStats(siteID: self.sampleSiteID, period: .day, quantity: 1,