From c388c4ea08048f75f877d902dc0a54c0cf29c56f Mon Sep 17 00:00:00 2001 From: NachoSoto Date: Wed, 6 Sep 2023 14:04:42 -0700 Subject: [PATCH 1/2] `Paywalls`: add `PaywallData.revision` This will be used to send it along with the upcoming `PaywallEvent`s. --- RevenueCatUI/Helpers/PaywallData+Default.swift | 4 +++- Sources/Paywalls/PaywallData.swift | 14 +++++++++++--- ...UnrecognizedIconsGeneratesDefaultPaywall.1.json | 1 + ...nizedTemplateNameGeneratesDefaultPaywall.1.json | 1 + ...ecognizedVariableGeneratesDefaultPaywall.1.json | 1 + ...ariableInFeaturesGeneratesDefaultPaywall.1.json | 1 + .../testValidateMissingPaywall.1.json | 1 + .../Networking/Responses/Fixtures/Offerings.json | 3 ++- .../Responses/Fixtures/PaywallData-Sample1.json | 3 ++- .../PaywallData-missing_current_locale.json | 3 ++- .../Fixtures/PaywallData-missing_localization.json | 3 ++- .../Responses/OfferingsDecodingTests.swift | 1 + Tests/UnitTests/Paywalls/PaywallDataTests.swift | 1 + 13 files changed, 29 insertions(+), 8 deletions(-) diff --git a/RevenueCatUI/Helpers/PaywallData+Default.swift b/RevenueCatUI/Helpers/PaywallData+Default.swift index 5f61f02e48..97397b1fc9 100644 --- a/RevenueCatUI/Helpers/PaywallData+Default.swift +++ b/RevenueCatUI/Helpers/PaywallData+Default.swift @@ -40,13 +40,15 @@ extension PaywallData { displayRestorePurchases: true ), localization: Self.localization, - assetBaseURL: Self.defaultTemplateBaseURL + assetBaseURL: Self.defaultTemplateBaseURL, + revision: Self.revisionID ) } static let defaultTemplate: PaywallTemplate = .template2 static let appIconPlaceholder = "revenuecatui_default_paywall_app_icon" + static let revisionID: Int = -1 } diff --git a/Sources/Paywalls/PaywallData.swift b/Sources/Paywalls/PaywallData.swift index 25bbc85d2d..e37889e22c 100644 --- a/Sources/Paywalls/PaywallData.swift +++ b/Sources/Paywalls/PaywallData.swift @@ -31,6 +31,9 @@ public struct PaywallData { /// The base remote URL where assets for this paywall are stored. public var assetBaseURL: URL + /// The revision identifier for this paywall. + public var revision: Int + @EnsureNonEmptyCollectionDecodable internal private(set) var localization: [String: LocalizedConfiguration] @@ -347,12 +350,14 @@ extension PaywallData { templateName: String, config: Configuration, localization: [String: LocalizedConfiguration], - assetBaseURL: URL + assetBaseURL: URL, + revision: Int = 0 ) { self.templateName = templateName self.config = config self.localization = localization self.assetBaseURL = assetBaseURL + self.revision = revision } /// Creates a test ``PaywallData`` with one localization @@ -360,7 +365,8 @@ extension PaywallData { templateName: String, config: Configuration, localization: LocalizedConfiguration, - assetBaseURL: URL + assetBaseURL: URL, + revision: Int = 0 ) { let locale = Locale.current.identifier @@ -368,7 +374,8 @@ extension PaywallData { templateName: templateName, config: config, localization: [locale: localization], - assetBaseURL: assetBaseURL + assetBaseURL: assetBaseURL, + revision: revision ) } @@ -428,6 +435,7 @@ extension PaywallData: Codable { case config case localization = "localizedStrings" case assetBaseURL = "assetBaseUrl" + case revision } } diff --git a/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedIconsGeneratesDefaultPaywall.1.json b/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedIconsGeneratesDefaultPaywall.1.json index ff42eab381..f9ca9e91d2 100644 --- a/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedIconsGeneratesDefaultPaywall.1.json +++ b/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedIconsGeneratesDefaultPaywall.1.json @@ -38,5 +38,6 @@ "title" : "{{ app_name }}" } }, + "revision" : -1, "template_name" : "2" } \ No newline at end of file diff --git a/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedTemplateNameGeneratesDefaultPaywall.1.json b/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedTemplateNameGeneratesDefaultPaywall.1.json index ff42eab381..f9ca9e91d2 100644 --- a/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedTemplateNameGeneratesDefaultPaywall.1.json +++ b/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedTemplateNameGeneratesDefaultPaywall.1.json @@ -38,5 +38,6 @@ "title" : "{{ app_name }}" } }, + "revision" : -1, "template_name" : "2" } \ No newline at end of file diff --git a/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedVariableGeneratesDefaultPaywall.1.json b/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedVariableGeneratesDefaultPaywall.1.json index ff42eab381..f9ca9e91d2 100644 --- a/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedVariableGeneratesDefaultPaywall.1.json +++ b/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedVariableGeneratesDefaultPaywall.1.json @@ -38,5 +38,6 @@ "title" : "{{ app_name }}" } }, + "revision" : -1, "template_name" : "2" } \ No newline at end of file diff --git a/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedVariableInFeaturesGeneratesDefaultPaywall.1.json b/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedVariableInFeaturesGeneratesDefaultPaywall.1.json index ff42eab381..f9ca9e91d2 100644 --- a/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedVariableInFeaturesGeneratesDefaultPaywall.1.json +++ b/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testUnrecognizedVariableInFeaturesGeneratesDefaultPaywall.1.json @@ -38,5 +38,6 @@ "title" : "{{ app_name }}" } }, + "revision" : -1, "template_name" : "2" } \ No newline at end of file diff --git a/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testValidateMissingPaywall.1.json b/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testValidateMissingPaywall.1.json index 1b8fa24b7f..357647319c 100644 --- a/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testValidateMissingPaywall.1.json +++ b/Tests/RevenueCatUITests/Data/__Snapshots__/PaywallDataValidationTests/testValidateMissingPaywall.1.json @@ -38,5 +38,6 @@ "title" : "{{ app_name }}" } }, + "revision" : -1, "template_name" : "2" } \ No newline at end of file diff --git a/Tests/UnitTests/Networking/Responses/Fixtures/Offerings.json b/Tests/UnitTests/Networking/Responses/Fixtures/Offerings.json index 65da9802cf..ff7ffe695b 100644 --- a/Tests/UnitTests/Networking/Responses/Fixtures/Offerings.json +++ b/Tests/UnitTests/Networking/Responses/Fixtures/Offerings.json @@ -84,7 +84,8 @@ "dark": null } }, - "asset_base_url": "https://rc-paywalls.s3.amazonaws.com" + "asset_base_url": "https://rc-paywalls.s3.amazonaws.com", + "revision": 5 } }, { diff --git a/Tests/UnitTests/Networking/Responses/Fixtures/PaywallData-Sample1.json b/Tests/UnitTests/Networking/Responses/Fixtures/PaywallData-Sample1.json index 775471c955..7504d3a227 100644 --- a/Tests/UnitTests/Networking/Responses/Fixtures/PaywallData-Sample1.json +++ b/Tests/UnitTests/Networking/Responses/Fixtures/PaywallData-Sample1.json @@ -69,5 +69,6 @@ } } }, - "asset_base_url": "https://rc-paywalls.s3.amazonaws.com" + "asset_base_url": "https://rc-paywalls.s3.amazonaws.com", + "revision": 7 } diff --git a/Tests/UnitTests/Networking/Responses/Fixtures/PaywallData-missing_current_locale.json b/Tests/UnitTests/Networking/Responses/Fixtures/PaywallData-missing_current_locale.json index 601c505638..1a41fe48cf 100644 --- a/Tests/UnitTests/Networking/Responses/Fixtures/PaywallData-missing_current_locale.json +++ b/Tests/UnitTests/Networking/Responses/Fixtures/PaywallData-missing_current_locale.json @@ -24,5 +24,6 @@ "dark": null } }, - "asset_base_url": "https://rc-paywalls.s3.amazonaws.com" + "asset_base_url": "https://rc-paywalls.s3.amazonaws.com", + "revision": 1 } diff --git a/Tests/UnitTests/Networking/Responses/Fixtures/PaywallData-missing_localization.json b/Tests/UnitTests/Networking/Responses/Fixtures/PaywallData-missing_localization.json index 1c6882a6b4..be1dac183c 100644 --- a/Tests/UnitTests/Networking/Responses/Fixtures/PaywallData-missing_localization.json +++ b/Tests/UnitTests/Networking/Responses/Fixtures/PaywallData-missing_localization.json @@ -15,5 +15,6 @@ "dark": null } }, - "asset_base_url": "https://rc-paywalls.s3.amazonaws.com" + "asset_base_url": "https://rc-paywalls.s3.amazonaws.com", + "revision": 1 } diff --git a/Tests/UnitTests/Networking/Responses/OfferingsDecodingTests.swift b/Tests/UnitTests/Networking/Responses/OfferingsDecodingTests.swift index 0f10c2b2c0..329160c152 100644 --- a/Tests/UnitTests/Networking/Responses/OfferingsDecodingTests.swift +++ b/Tests/UnitTests/Networking/Responses/OfferingsDecodingTests.swift @@ -112,6 +112,7 @@ class OfferingsDecodingTests: BaseHTTPResponseTest { let paywall = try XCTUnwrap(offering.paywall) expect(paywall.templateName) == "1" try expect(paywall.assetBaseURL) == XCTUnwrap(URL(string: "https://rc-paywalls.s3.amazonaws.com")) + expect(paywall.revision) == 5 expect(paywall.config.packages) == ["$rc_monthly", "$rc_annual", "custom_package"] expect(paywall.config.defaultPackage).to(beNil()) diff --git a/Tests/UnitTests/Paywalls/PaywallDataTests.swift b/Tests/UnitTests/Paywalls/PaywallDataTests.swift index 69c3fcf05a..f57b8e0355 100644 --- a/Tests/UnitTests/Paywalls/PaywallDataTests.swift +++ b/Tests/UnitTests/Paywalls/PaywallDataTests.swift @@ -22,6 +22,7 @@ class PaywallDataTests: BaseHTTPResponseTest { expect(paywall.templateName) == "1" expect(paywall.assetBaseURL) == URL(string: "https://rc-paywalls.s3.amazonaws.com")! + expect(paywall.revision) == 7 expect(paywall.config.packages) == ["$rc_monthly", "$rc_annual", "custom_package"] expect(paywall.config.defaultPackage) == "$rc_annual" expect(paywall.config.images) == .init( From c24be7f88a457bb53f17c7a61301f0507db1e865 Mon Sep 17 00:00:00 2001 From: NachoSoto Date: Thu, 7 Sep 2023 08:57:24 -0700 Subject: [PATCH 2/2] Default to 0 and update snapshots --- Sources/Misc/Codable/DefaultDecodable.swift | 6 ++++++ Sources/Paywalls/PaywallData.swift | 14 +++++++++----- .../testCanGetOfferings.1.json | 1 + .../testCanGetOfferings.1.json | 1 + .../PaywallData-missing_current_locale.json | 3 +-- .../Fixtures/PaywallData-missing_localization.json | 3 +-- 6 files changed, 19 insertions(+), 9 deletions(-) diff --git a/Sources/Misc/Codable/DefaultDecodable.swift b/Sources/Misc/Codable/DefaultDecodable.swift index cdbfa4d8ad..67c61cac42 100644 --- a/Sources/Misc/Codable/DefaultDecodable.swift +++ b/Sources/Misc/Codable/DefaultDecodable.swift @@ -199,6 +199,10 @@ enum DefaultDecodable { static var defaultValue: String { "" } } + enum Zero: DefaultValueProvider { + static var defaultValue: Int { 0 } + } + enum EmptyArray: DefaultValueProvider { static var defaultValue: T { [] } } @@ -226,6 +230,7 @@ enum DefaultDecodable { * @DefaultDecodable.EmptyArray var values: [String] * @DefaultDecodable.EmptyDictionary var dictionary: [String: Int] * @DefaultDecodable.Now var date: Date + * @DefaultDecodable.Zero var number: Int * } * ``` */ @@ -237,5 +242,6 @@ extension DefaultDecodable { typealias EmptyArray = DefaultValue> typealias EmptyDictionary = DefaultValue> typealias Now = DefaultValue + typealias Zero = DefaultValue } diff --git a/Sources/Paywalls/PaywallData.swift b/Sources/Paywalls/PaywallData.swift index e37889e22c..564f1afc61 100644 --- a/Sources/Paywalls/PaywallData.swift +++ b/Sources/Paywalls/PaywallData.swift @@ -11,7 +11,7 @@ // // Created by Nacho Soto on 7/10/23. -// swiftlint:disable file_length +// swiftlint:disable file_length identifier_name import Foundation @@ -32,7 +32,13 @@ public struct PaywallData { public var assetBaseURL: URL /// The revision identifier for this paywall. - public var revision: Int + var revision: Int { + get { return self._revision } + set { self._revision = newValue } + } + + @DefaultDecodable.Zero + internal private(set) var _revision: Int = 0 @EnsureNonEmptyCollectionDecodable internal private(set) var localization: [String: LocalizedConfiguration] @@ -63,8 +69,6 @@ public protocol PaywallLocalizedConfiguration { } -// swiftlint:disable identifier_name - extension PaywallData { /// Defines the necessary localized information for a paywall. @@ -435,7 +439,7 @@ extension PaywallData: Codable { case config case localization = "localizedStrings" case assetBaseURL = "assetBaseUrl" - case revision + case _revision = "revision" } } diff --git a/Tests/BackendIntegrationTests/__Snapshots__/LoadShedderIntegrationTests/testCanGetOfferings.1.json b/Tests/BackendIntegrationTests/__Snapshots__/LoadShedderIntegrationTests/testCanGetOfferings.1.json index bd49fb6db3..2520486736 100644 --- a/Tests/BackendIntegrationTests/__Snapshots__/LoadShedderIntegrationTests/testCanGetOfferings.1.json +++ b/Tests/BackendIntegrationTests/__Snapshots__/LoadShedderIntegrationTests/testCanGetOfferings.1.json @@ -56,6 +56,7 @@ "title" : "Ignite your child's curiosity" } }, + "revision" : 1, "template_name" : "1" } }, diff --git a/Tests/BackendIntegrationTests/__Snapshots__/StoreKitIntegrationTests/testCanGetOfferings.1.json b/Tests/BackendIntegrationTests/__Snapshots__/StoreKitIntegrationTests/testCanGetOfferings.1.json index 87b36f4f54..1107850ff8 100644 --- a/Tests/BackendIntegrationTests/__Snapshots__/StoreKitIntegrationTests/testCanGetOfferings.1.json +++ b/Tests/BackendIntegrationTests/__Snapshots__/StoreKitIntegrationTests/testCanGetOfferings.1.json @@ -70,6 +70,7 @@ "title" : "Ignite your child's curiosity" } }, + "revision" : 3, "template_name" : "2" } }, diff --git a/Tests/UnitTests/Networking/Responses/Fixtures/PaywallData-missing_current_locale.json b/Tests/UnitTests/Networking/Responses/Fixtures/PaywallData-missing_current_locale.json index 1a41fe48cf..601c505638 100644 --- a/Tests/UnitTests/Networking/Responses/Fixtures/PaywallData-missing_current_locale.json +++ b/Tests/UnitTests/Networking/Responses/Fixtures/PaywallData-missing_current_locale.json @@ -24,6 +24,5 @@ "dark": null } }, - "asset_base_url": "https://rc-paywalls.s3.amazonaws.com", - "revision": 1 + "asset_base_url": "https://rc-paywalls.s3.amazonaws.com" } diff --git a/Tests/UnitTests/Networking/Responses/Fixtures/PaywallData-missing_localization.json b/Tests/UnitTests/Networking/Responses/Fixtures/PaywallData-missing_localization.json index be1dac183c..1c6882a6b4 100644 --- a/Tests/UnitTests/Networking/Responses/Fixtures/PaywallData-missing_localization.json +++ b/Tests/UnitTests/Networking/Responses/Fixtures/PaywallData-missing_localization.json @@ -15,6 +15,5 @@ "dark": null } }, - "asset_base_url": "https://rc-paywalls.s3.amazonaws.com", - "revision": 1 + "asset_base_url": "https://rc-paywalls.s3.amazonaws.com" }