From d1b0762adef6f03206a1dd7d65a0c711030475ee Mon Sep 17 00:00:00 2001 From: Scott Clampet <110618242+scottkicks@users.noreply.github.com> Date: Wed, 10 May 2023 08:50:16 -0700 Subject: [PATCH] [MBL-721] Remote Config Local Feature Flags (#1817) * rename OptimizelyFeatureFlagToolsViewModel & OptimizelyFeatureFlagToolsViewController * update RemoteConfigFlagToolsViewModel and Tests to use Remote Config environment instance * update RemoteConfigFeatureFlagToolsViewControllerTests * update naming * comment out tests that will fail due to unavailable obj-c initializer * update viewcontroller tests * more renames * use client method instead of internal vm method that is not needed * remove // from FIXME comment * Delete testOptimizelyFeatureFlagToolsViewController.1.png --- .../Controller/BetaToolsViewController.swift | 8 +- .../testBetaToolsViewController.1.png | Bin 71930 -> 72005 bytes ...yFeatureFlagToolsViewControllerTests.swift | 41 ------ ...mizelyFeatureFlagToolsViewController.1.png | Bin 63430 -> 0 bytes ...onfigFeatureFlagToolsViewController.swift} | 16 +- ...gFeatureFlagToolsViewControllerTests.swift | 38 +++++ ...ConfigFeatureFlagToolsViewController.1.png | Bin 0 -> 37717 bytes Kickstarter.xcodeproj/project.pbxproj | 38 ++--- Library/ViewModels/BetaToolsViewModel.swift | 16 +- .../ViewModels/BetaToolsViewModelTests.swift | 10 +- .../OptimizelyFeatureFlagToolsViewModel.swift | 139 ------------------ ...mizelyFeatureFlagToolsViewModelTests.swift | 124 ---------------- ...emoteConfigFeatureFlagToolsViewModel.swift | 110 ++++++++++++++ ...ConfigFeatureFlagToolsViewModelTests.swift | 118 +++++++++++++++ 14 files changed, 310 insertions(+), 348 deletions(-) delete mode 100644 Kickstarter-iOS/Features/OptimizelyFeatureFlagTools/Controller/OptimizelyFeatureFlagToolsViewControllerTests.swift delete mode 100644 Kickstarter-iOS/Features/OptimizelyFeatureFlagTools/Controller/__Snapshots__/OptimizelyFeatureFlagToolsViewControllerTests/testOptimizelyFeatureFlagToolsViewController.1.png rename Kickstarter-iOS/Features/{OptimizelyFeatureFlagTools/Controller/OptimizelyFeatureFlagToolsViewController.swift => RemoteConfigFeatureFlagTools/Controller/RemoteConfigFeatureFlagToolsViewController.swift} (78%) create mode 100644 Kickstarter-iOS/Features/RemoteConfigFeatureFlagTools/Controller/RemoteConfigFeatureFlagToolsViewControllerTests.swift create mode 100644 Kickstarter-iOS/Features/RemoteConfigFeatureFlagTools/Controller/__Snapshots__/RemoteConfigFeatureFlagToolsViewControllerTests/testRemoteConfigFeatureFlagToolsViewController.1.png delete mode 100644 Library/ViewModels/OptimizelyFeatureFlagToolsViewModel.swift delete mode 100644 Library/ViewModels/OptimizelyFeatureFlagToolsViewModelTests.swift create mode 100644 Library/ViewModels/RemoteConfigFeatureFlagToolsViewModel.swift create mode 100644 Library/ViewModels/RemoteConfigFeatureFlagToolsViewModelTests.swift diff --git a/Kickstarter-iOS/Features/BetaTools/Controller/BetaToolsViewController.swift b/Kickstarter-iOS/Features/BetaTools/Controller/BetaToolsViewController.swift index d9d349b598..f3a5a344ca 100644 --- a/Kickstarter-iOS/Features/BetaTools/Controller/BetaToolsViewController.swift +++ b/Kickstarter-iOS/Features/BetaTools/Controller/BetaToolsViewController.swift @@ -70,10 +70,10 @@ internal final class BetaToolsViewController: UITableViewController { self?.goToConfigFeatureFlagTools() } - self.viewModel.outputs.goToOptimizelyFeatureFlagTools + self.viewModel.outputs.goToRemoteConfigFeatureFlagTools .observeForControllerAction() .observeValues { [weak self] in - self?.goToOptimizelyFeatureFlagTools() + self?.goToRemoteConfigFeatureFlagTools() } self.viewModel.outputs.goToBetaFeedback @@ -165,8 +165,8 @@ internal final class BetaToolsViewController: UITableViewController { self.navigationController?.pushViewController(featureFlagToolsViewController, animated: true) } - private func goToOptimizelyFeatureFlagTools() { - let viewController = OptimizelyFeatureFlagToolsViewController.instantiate() + private func goToRemoteConfigFeatureFlagTools() { + let viewController = RemoteConfigFeatureFlagToolsViewController.instantiate() self.navigationController?.pushViewController(viewController, animated: true) } diff --git a/Kickstarter-iOS/Features/BetaTools/Controller/__Snapshots__/BetaToolsViewControllerTests/testBetaToolsViewController.1.png b/Kickstarter-iOS/Features/BetaTools/Controller/__Snapshots__/BetaToolsViewControllerTests/testBetaToolsViewController.1.png index 4e04f74324a1cf4b443b066bdfd3dc90bcd3d1d9..871439182dd14a76b1ddfa2a5caa809583691c3e 100644 GIT binary patch delta 30296 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 Pz#nZ5ef4}bi-7+Fl%G*5 delta 30166 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 %F0_JgzG8sR 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 Rwc>z(%JTQ+ie#So{ue}H0gV6v diff --git a/Kickstarter-iOS/Features/OptimizelyFeatureFlagTools/Controller/OptimizelyFeatureFlagToolsViewControllerTests.swift b/Kickstarter-iOS/Features/OptimizelyFeatureFlagTools/Controller/OptimizelyFeatureFlagToolsViewControllerTests.swift deleted file mode 100644 index dc7b812204..0000000000 --- a/Kickstarter-iOS/Features/OptimizelyFeatureFlagTools/Controller/OptimizelyFeatureFlagToolsViewControllerTests.swift +++ /dev/null @@ -1,41 +0,0 @@ -@testable import Kickstarter_Framework -@testable import KsApi -@testable import Library -import Prelude -import SnapshotTesting -import UIKit - -final class OptimizelyFeatureFlagToolsViewControllerTests: TestCase { - override func setUp() { - super.setUp() - - AppEnvironment.pushEnvironment(mainBundle: Bundle.framework) - UIView.setAnimationsEnabled(false) - } - - override func tearDown() { - AppEnvironment.popEnvironment() - UIView.setAnimationsEnabled(true) - super.tearDown() - } - - func testOptimizelyFeatureFlagToolsViewController() { - let mockOptimizelyClient = MockOptimizelyClient() - |> \.features .~ [ - OptimizelyFeature.commentFlaggingEnabled.rawValue: false, - OptimizelyFeature.projectPageStoryTabEnabled.rawValue: false, - OptimizelyFeature.paymentSheetEnabled.rawValue: false, - OptimizelyFeature.settingsPaymentSheetEnabled.rawValue: false, - OptimizelyFeature.facebookLoginDeprecationEnabled.rawValue: false, - OptimizelyFeature.consentManagementDialogEnabled.rawValue: false - ] - - withEnvironment(language: .en, mainBundle: MockBundle(), optimizelyClient: mockOptimizelyClient) { - let controller = OptimizelyFeatureFlagToolsViewController.instantiate() - let (parent, _) = traitControllers(device: .phone4_7inch, orientation: .portrait, child: controller) - self.scheduler.run() - - assertSnapshot(matching: parent.view, as: .image(perceptualPrecision: 0.98)) - } - } -} diff --git a/Kickstarter-iOS/Features/OptimizelyFeatureFlagTools/Controller/__Snapshots__/OptimizelyFeatureFlagToolsViewControllerTests/testOptimizelyFeatureFlagToolsViewController.1.png b/Kickstarter-iOS/Features/OptimizelyFeatureFlagTools/Controller/__Snapshots__/OptimizelyFeatureFlagToolsViewControllerTests/testOptimizelyFeatureFlagToolsViewController.1.png deleted file mode 100644 index ceb0832c1c7afa7e9e0031086f9a38807f81c5f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63430 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 OptimizelyFeatureFlagToolsViewController { - return OptimizelyFeatureFlagToolsViewController(style: .plain) + static func instantiate() -> RemoteConfigFeatureFlagToolsViewController { + return RemoteConfigFeatureFlagToolsViewController(style: .plain) } // MARK: - Lifecycle @@ -21,7 +21,7 @@ final class OptimizelyFeatureFlagToolsViewController: UITableViewController { super.viewDidLoad() _ = self - |> \.title .~ "Optimizely Feature flags" + |> \.title .~ "Remote Config Feature flags" _ = self.tableView |> \.tableFooterView .~ UIView(frame: .zero) @@ -57,14 +57,14 @@ final class OptimizelyFeatureFlagToolsViewController: UITableViewController { // MARK: - Private Helpers - private func updateUserDefaults(with _: OptimizelyFeatures) { + private func updateUserDefaults(with _: RemoteConfigFeatures) { self.viewModel.inputs.didUpdateUserDefaults() } } // MARK: - UITableViewDataSource -extension OptimizelyFeatureFlagToolsViewController { +extension RemoteConfigFeatureFlagToolsViewController { override func tableView(_: UITableView, numberOfRowsInSection _: Int) -> Int { return self.features.count } diff --git a/Kickstarter-iOS/Features/RemoteConfigFeatureFlagTools/Controller/RemoteConfigFeatureFlagToolsViewControllerTests.swift b/Kickstarter-iOS/Features/RemoteConfigFeatureFlagTools/Controller/RemoteConfigFeatureFlagToolsViewControllerTests.swift new file mode 100644 index 0000000000..d031ea99be --- /dev/null +++ b/Kickstarter-iOS/Features/RemoteConfigFeatureFlagTools/Controller/RemoteConfigFeatureFlagToolsViewControllerTests.swift @@ -0,0 +1,38 @@ +@testable import Kickstarter_Framework +@testable import KsApi +@testable import Library +import Prelude +import SnapshotTesting +import UIKit + +final class RemoteConfigFeatureFlagToolsViewControllerTests: TestCase { + override func setUp() { + super.setUp() + + AppEnvironment.pushEnvironment(mainBundle: Bundle.framework) + UIView.setAnimationsEnabled(false) + } + + override func tearDown() { + AppEnvironment.popEnvironment() + UIView.setAnimationsEnabled(true) + super.tearDown() + } + + func testRemoteConfigFeatureFlagToolsViewController() { + let mockRemoteConfigClient = MockRemoteConfigClient() + |> \.features .~ [ + RemoteConfigFeature.consentManagementDialogEnabled.rawValue: false, + RemoteConfigFeature.facebookLoginInterstitialEnabled + .rawValue: false + ] + + withEnvironment(language: .en, mainBundle: MockBundle(), remoteConfigClient: mockRemoteConfigClient) { + let controller = RemoteConfigFeatureFlagToolsViewController.instantiate() + let (parent, _) = traitControllers(device: .phone4_7inch, orientation: .portrait, child: controller) + self.scheduler.run() + + assertSnapshot(matching: parent.view, as: .image(perceptualPrecision: 0.98)) + } + } +} diff --git a/Kickstarter-iOS/Features/RemoteConfigFeatureFlagTools/Controller/__Snapshots__/RemoteConfigFeatureFlagToolsViewControllerTests/testRemoteConfigFeatureFlagToolsViewController.1.png b/Kickstarter-iOS/Features/RemoteConfigFeatureFlagTools/Controller/__Snapshots__/RemoteConfigFeatureFlagToolsViewControllerTests/testRemoteConfigFeatureFlagToolsViewController.1.png new file mode 100644 index 0000000000000000000000000000000000000000..948f48480c37c4c80146200d8471a529cc2a6a7f GIT binary patch literal 37717 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 z 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 { get } var goToConfigFeatureFlagTools: Signal<(), Never> { get } - var goToOptimizelyFeatureFlagTools: Signal<(), Never> { get } + var goToRemoteConfigFeatureFlagTools: Signal<(), Never> { get } var goToPushNotificationTools: Signal<(), Never> { get } var logoutWithParams: Signal { get } var reloadWithData: Signal { get } @@ -143,9 +143,9 @@ public final class BetaToolsViewModel: BetaToolsViewModelType, .filter { $0 == BetaToolsRow.debugConfigFeatureFlags } .ignoreValues() - self.goToOptimizelyFeatureFlagTools = self.didSelectBetaToolsRowProperty.signal + self.goToRemoteConfigFeatureFlagTools = self.didSelectBetaToolsRowProperty.signal .skipNil() - .filter { $0 == BetaToolsRow.debugOptimizelyFeatureFlags } + .filter { $0 == BetaToolsRow.debugRemoteConfigFeatureFlags } .ignoreValues() self.showChangeEnvironmentSheetWithSourceViewIndex = self.didSelectBetaToolsRowProperty.signal @@ -198,7 +198,7 @@ public final class BetaToolsViewModel: BetaToolsViewModelType, public let goToBetaFeedback: Signal<(), Never> public let goToConfigFeatureFlagTools: Signal<(), Never> - public let goToOptimizelyFeatureFlagTools: Signal<(), Never> + public let goToRemoteConfigFeatureFlagTools: Signal<(), Never> public let goToPushNotificationTools: Signal<(), Never> public let updateLanguage: Signal public let updateEnvironment: Signal diff --git a/Library/ViewModels/BetaToolsViewModelTests.swift b/Library/ViewModels/BetaToolsViewModelTests.swift index 0e07bccca1..1306acfe79 100644 --- a/Library/ViewModels/BetaToolsViewModelTests.swift +++ b/Library/ViewModels/BetaToolsViewModelTests.swift @@ -11,7 +11,7 @@ final class BetaToolsViewModelTests: TestCase { private let goToBetaFeedback = TestObserver<(), Never>() private let goToFeatureFlagTools = TestObserver<(), Never>() - private let goToOptimizelyFeatureFlagTools = TestObserver<(), Never>() + private let goToRemoteConfigFeatureFlagTools = TestObserver<(), Never>() private let goToPushNotificationTools = TestObserver<(), Never>() private let logoutWithParams = TestObserver() private let reloadWithDataCurrentLanguage = TestObserver() @@ -27,7 +27,7 @@ final class BetaToolsViewModelTests: TestCase { self.vm.outputs.goToBetaFeedback.observe(self.goToBetaFeedback.observer) self.vm.outputs.goToConfigFeatureFlagTools.observe(self.goToFeatureFlagTools.observer) - self.vm.outputs.goToOptimizelyFeatureFlagTools.observe(self.goToOptimizelyFeatureFlagTools.observer) + self.vm.outputs.goToRemoteConfigFeatureFlagTools.observe(self.goToRemoteConfigFeatureFlagTools.observer) self.vm.outputs.goToPushNotificationTools.observe(self.goToPushNotificationTools.observer) self.vm.outputs.logoutWithParams.observe(self.logoutWithParams.observer) self.vm.outputs.reloadWithData.map { $0.0 }.observe(self.reloadWithDataCurrentLanguage.observer) @@ -156,10 +156,10 @@ final class BetaToolsViewModelTests: TestCase { func testGoToOptimizelyFeatureFlags() { self.vm.inputs.viewDidLoad() - self.goToOptimizelyFeatureFlagTools.assertDidNotEmitValue() + self.goToRemoteConfigFeatureFlagTools.assertDidNotEmitValue() - self.vm.inputs.didSelectBetaToolsRow(.debugOptimizelyFeatureFlags) + self.vm.inputs.didSelectBetaToolsRow(.debugRemoteConfigFeatureFlags) - self.goToOptimizelyFeatureFlagTools.assertValueCount(1) + self.goToRemoteConfigFeatureFlagTools.assertValueCount(1) } } diff --git a/Library/ViewModels/OptimizelyFeatureFlagToolsViewModel.swift b/Library/ViewModels/OptimizelyFeatureFlagToolsViewModel.swift deleted file mode 100644 index 741106361b..0000000000 --- a/Library/ViewModels/OptimizelyFeatureFlagToolsViewModel.swift +++ /dev/null @@ -1,139 +0,0 @@ -import Foundation -import KsApi -import Prelude -import ReactiveSwift - -public typealias OptimizelyFeatures = [(OptimizelyFeature, Bool)] - -public protocol OptimizelyFeatureFlagToolsViewModelOutputs { - var reloadWithData: Signal { get } - var updateUserDefaultsWithFeatures: Signal { get } -} - -public protocol OptimizelyFeatureFlagToolsViewModelInputs { - func didUpdateUserDefaults() - func setFeatureAtIndexEnabled(index: Int, isEnabled: Bool) - func viewDidLoad() -} - -public protocol OptimizelyFeatureFlagToolsViewModelType { - var inputs: OptimizelyFeatureFlagToolsViewModelInputs { get } - var outputs: OptimizelyFeatureFlagToolsViewModelOutputs { get } -} - -public final class OptimizelyFeatureFlagToolsViewModel: OptimizelyFeatureFlagToolsViewModelType, - OptimizelyFeatureFlagToolsViewModelInputs, - OptimizelyFeatureFlagToolsViewModelOutputs { - public init() { - let didUpdateUserDefaultsAndUI = self.didUpdateUserDefaultsProperty.signal - .ksr_debounce(.seconds(1), on: AppEnvironment.current.scheduler) - - let features = Signal.merge( - self.viewDidLoadProperty.signal, - didUpdateUserDefaultsAndUI - ) - .map { _ in AppEnvironment.current.optimizelyClient?.allFeatures() } - .skipNil() - - let optimizelyFeatures = features - .map { features in - features.map { feature -> (OptimizelyFeature, Bool) in - let isEnabledFromServer = AppEnvironment.current.optimizelyClient? - .isFeatureEnabled(featureKey: feature.rawValue) ?? false - - let isEnabledFromUserDefaults = getValueFromUserDefaults(for: feature) - - return (feature, isEnabledFromUserDefaults ?? isEnabledFromServer) - } - } - - self.reloadWithData = optimizelyFeatures - - self.updateUserDefaultsWithFeatures = optimizelyFeatures - .takePairWhen(self.setFeatureEnabledAtIndexProperty.signal.skipNil()) - .map(unpack) - .map { features, index, isEnabled -> OptimizelyFeatures? in - let (feature, _) = features[index] - var mutatedFeatures = features - - setValueInUserDefaults(for: feature, and: isEnabled) - - mutatedFeatures[index] = (feature, isEnabled) - return mutatedFeatures - } - .skipNil() - } - - private let setFeatureEnabledAtIndexProperty = MutableProperty<(Int, Bool)?>(nil) - public func setFeatureAtIndexEnabled(index: Int, isEnabled: Bool) { - self.setFeatureEnabledAtIndexProperty.value = (index, isEnabled) - } - - private let didUpdateUserDefaultsProperty = MutableProperty(()) - public func didUpdateUserDefaults() { - self.didUpdateUserDefaultsProperty.value = () - } - - private let viewDidLoadProperty = MutableProperty(()) - public func viewDidLoad() { - self.viewDidLoadProperty.value = () - } - - public let reloadWithData: Signal - public let updateUserDefaultsWithFeatures: Signal - - public var inputs: OptimizelyFeatureFlagToolsViewModelInputs { return self } - public var outputs: OptimizelyFeatureFlagToolsViewModelOutputs { return self } -} - -// MARK: - Private Helpers - -/** Returns the value of the User Defaults key in the AppEnvironment. - */ -private func getValueFromUserDefaults(for feature: OptimizelyFeature) -> Bool? { - switch feature { - case .commentFlaggingEnabled: - return AppEnvironment.current.userDefaults - .optimizelyFeatureFlags[OptimizelyFeature.commentFlaggingEnabled.rawValue] - case .consentManagementDialogEnabled: - return AppEnvironment.current.userDefaults - .optimizelyFeatureFlags[OptimizelyFeature.consentManagementDialogEnabled.rawValue] - case .projectPageStoryTabEnabled: - return AppEnvironment.current.userDefaults - .optimizelyFeatureFlags[OptimizelyFeature.projectPageStoryTabEnabled.rawValue] - case .paymentSheetEnabled: - return AppEnvironment.current.userDefaults - .optimizelyFeatureFlags[OptimizelyFeature.paymentSheetEnabled.rawValue] - case .settingsPaymentSheetEnabled: - return AppEnvironment.current.userDefaults - .optimizelyFeatureFlags[OptimizelyFeature.settingsPaymentSheetEnabled.rawValue] - case .facebookLoginDeprecationEnabled: - return AppEnvironment.current.userDefaults - .optimizelyFeatureFlags[OptimizelyFeature.facebookLoginDeprecationEnabled.rawValue] - } -} - -/** Sets the value for the UserDefaults key in the AppEnvironment. - */ -private func setValueInUserDefaults(for feature: OptimizelyFeature, and value: Bool) { - switch feature { - case .commentFlaggingEnabled: - AppEnvironment.current.userDefaults - .optimizelyFeatureFlags[OptimizelyFeature.commentFlaggingEnabled.rawValue] = value - case .consentManagementDialogEnabled: - AppEnvironment.current.userDefaults - .optimizelyFeatureFlags[OptimizelyFeature.consentManagementDialogEnabled.rawValue] = value - case .projectPageStoryTabEnabled: - AppEnvironment.current.userDefaults - .optimizelyFeatureFlags[OptimizelyFeature.projectPageStoryTabEnabled.rawValue] = value - case .paymentSheetEnabled: - return AppEnvironment.current.userDefaults - .optimizelyFeatureFlags[OptimizelyFeature.paymentSheetEnabled.rawValue] = value - case .settingsPaymentSheetEnabled: - return AppEnvironment.current.userDefaults - .optimizelyFeatureFlags[OptimizelyFeature.settingsPaymentSheetEnabled.rawValue] = value - case .facebookLoginDeprecationEnabled: - return AppEnvironment.current.userDefaults - .optimizelyFeatureFlags[OptimizelyFeature.facebookLoginDeprecationEnabled.rawValue] = value - } -} diff --git a/Library/ViewModels/OptimizelyFeatureFlagToolsViewModelTests.swift b/Library/ViewModels/OptimizelyFeatureFlagToolsViewModelTests.swift deleted file mode 100644 index 6d8b74557a..0000000000 --- a/Library/ViewModels/OptimizelyFeatureFlagToolsViewModelTests.swift +++ /dev/null @@ -1,124 +0,0 @@ -import Foundation -@testable import KsApi -@testable import Library -import Prelude -import ReactiveExtensions_TestHelpers -import ReactiveSwift -import XCTest - -final class OptimizelyFlagToolsViewModelTests: TestCase { - private let vm: OptimizelyFeatureFlagToolsViewModelType = OptimizelyFeatureFlagToolsViewModel() - - private let reloadWithData = TestObserver() - private let updateUserDefaultsWithFeatures = TestObserver() - - override func setUp() { - super.setUp() - - self.vm.outputs.reloadWithData.observe(self.reloadWithData.observer) - self.vm.outputs.updateUserDefaultsWithFeatures.observe(self.updateUserDefaultsWithFeatures.observer) - } - - func testReloadWithData_AllFeaturesEnabled() { - let mockOptimizelyClient = MockOptimizelyClient() - |> \.features .~ [ - OptimizelyFeature.commentFlaggingEnabled.rawValue: true, - OptimizelyFeature.consentManagementDialogEnabled.rawValue: true, - OptimizelyFeature.projectPageStoryTabEnabled.rawValue: true, - OptimizelyFeature.paymentSheetEnabled.rawValue: true, - OptimizelyFeature.settingsPaymentSheetEnabled.rawValue: true, - OptimizelyFeature.facebookLoginDeprecationEnabled.rawValue: true - ] - - withEnvironment(optimizelyClient: mockOptimizelyClient) { - self.vm.inputs.viewDidLoad() - - self.reloadWithData.values.forEach { featureTuples in - featureTuples.forEach { feature, isEnabled in - let isEnabledOnClient = mockOptimizelyClient.features[feature.rawValue] - - XCTAssertEqual(isEnabled, isEnabledOnClient) - } - } - } - } - - func testReloadWithData_FeaturesEnabledAndDisabled() { - let mockOptimizelyClient = MockOptimizelyClient() - |> \.features .~ [ - OptimizelyFeature.commentFlaggingEnabled.rawValue: false, - OptimizelyFeature.consentManagementDialogEnabled.rawValue: false, - OptimizelyFeature.projectPageStoryTabEnabled.rawValue: false, - OptimizelyFeature.paymentSheetEnabled.rawValue: false, - OptimizelyFeature.settingsPaymentSheetEnabled.rawValue: false, - OptimizelyFeature.facebookLoginDeprecationEnabled.rawValue: false - ] - - withEnvironment(optimizelyClient: mockOptimizelyClient) { - self.vm.inputs.viewDidLoad() - - self.reloadWithData.values.forEach { featureTuples in - featureTuples.forEach { feature, isEnabled in - let isEnabledOnClient = mockOptimizelyClient.features[feature.rawValue] - - XCTAssertEqual(isEnabled, isEnabledOnClient) - } - } - } - } - - func testUpdateUserDefaultsWithFeatures_FeaturesAreEnabled() { - let mockOptimizelyClient = MockOptimizelyClient() - |> \.features .~ [ - OptimizelyFeature.commentFlaggingEnabled.rawValue: false - ] - - withEnvironment(optimizelyClient: mockOptimizelyClient) { - self.vm.inputs.viewDidLoad() - - self.scheduler.advance() - - self.vm.inputs.setFeatureAtIndexEnabled(index: 0, isEnabled: true) - - self.scheduler.advance() - - let (_, isEnabled0) = self.updateUserDefaultsWithFeatures.values[0][0] - - XCTAssertTrue(isEnabled0) - } - } - - func testUpdateUserDefaultsWithFeatures_ReloadWithData_UserDefaultsIsUpdated() { - let mockOptimizelyClient = MockOptimizelyClient() - |> \.features .~ [ - OptimizelyFeature.commentFlaggingEnabled.rawValue: false - ] - - withEnvironment(optimizelyClient: mockOptimizelyClient, userDefaults: userDefaults) { - self.vm.inputs.viewDidLoad() - - self.scheduler.advance() - - self.vm.inputs.setFeatureAtIndexEnabled(index: 0, isEnabled: true) - - self.scheduler.advance() - - self.vm.inputs.didUpdateUserDefaults() - - self.scheduler.advance() - - XCTAssertEqual( - userDefaults - .dictionary(forKey: "com.kickstarter.KeyValueStoreType.optimizelyFeatureFlags") as? [String: Bool], - [ - OptimizelyFeature.commentFlaggingEnabled.rawValue: true - ] - ) - } - - /// The value from the optimizely client is never mutated - self.reloadWithData.values[0].forEach { _, isEnabled in - XCTAssertFalse(isEnabled) - } - } -} diff --git a/Library/ViewModels/RemoteConfigFeatureFlagToolsViewModel.swift b/Library/ViewModels/RemoteConfigFeatureFlagToolsViewModel.swift new file mode 100644 index 0000000000..eaf961e726 --- /dev/null +++ b/Library/ViewModels/RemoteConfigFeatureFlagToolsViewModel.swift @@ -0,0 +1,110 @@ +import Foundation +import KsApi +import Prelude +import ReactiveSwift + +public typealias RemoteConfigFeatures = [(RemoteConfigFeature, Bool)] + +public protocol RemoteConfigFeatureFlagToolsViewModelOutputs { + var reloadWithData: Signal { get } + var updateUserDefaultsWithFeatures: Signal { get } +} + +public protocol RemoteConfigFeatureFlagToolsViewModelInputs { + func didUpdateUserDefaults() + func setFeatureAtIndexEnabled(index: Int, isEnabled: Bool) + func viewDidLoad() +} + +public protocol RemoteConfigFeatureFlagToolsViewModelType { + var inputs: RemoteConfigFeatureFlagToolsViewModelInputs { get } + var outputs: RemoteConfigFeatureFlagToolsViewModelOutputs { get } +} + +public final class RemoteConfigFeatureFlagToolsViewModel: RemoteConfigFeatureFlagToolsViewModelType, + RemoteConfigFeatureFlagToolsViewModelInputs, + RemoteConfigFeatureFlagToolsViewModelOutputs { + public init() { + let didUpdateUserDefaultsAndUI = self.didUpdateUserDefaultsProperty.signal + .ksr_debounce(.seconds(1), on: AppEnvironment.current.scheduler) + + let features = Signal.merge( + self.viewDidLoadProperty.signal, + didUpdateUserDefaultsAndUI + ) + .map { _ in AppEnvironment.current.remoteConfigClient?.allFeatures() } + .skipNil() + + let remoteConfigFeatures = features + .map { features in + features.map { feature -> (RemoteConfigFeature, Bool) in + (feature, AppEnvironment.current.remoteConfigClient?.isFeatureEnabled(featureKey: feature) ?? false) + } + } + + self.reloadWithData = remoteConfigFeatures + + self.updateUserDefaultsWithFeatures = remoteConfigFeatures + .takePairWhen(self.setFeatureEnabledAtIndexProperty.signal.skipNil()) + .map(unpack) + .map { features, index, isEnabled -> RemoteConfigFeatures? in + let (feature, _) = features[index] + var mutatedFeatures = features + + setValueInUserDefaults(for: feature, and: isEnabled) + + mutatedFeatures[index] = (feature, isEnabled) + return mutatedFeatures + } + .skipNil() + } + + private let setFeatureEnabledAtIndexProperty = MutableProperty<(Int, Bool)?>(nil) + public func setFeatureAtIndexEnabled(index: Int, isEnabled: Bool) { + self.setFeatureEnabledAtIndexProperty.value = (index, isEnabled) + } + + private let didUpdateUserDefaultsProperty = MutableProperty(()) + public func didUpdateUserDefaults() { + self.didUpdateUserDefaultsProperty.value = () + } + + private let viewDidLoadProperty = MutableProperty(()) + public func viewDidLoad() { + self.viewDidLoadProperty.value = () + } + + public let reloadWithData: Signal + public let updateUserDefaultsWithFeatures: Signal + + public var inputs: RemoteConfigFeatureFlagToolsViewModelInputs { return self } + public var outputs: RemoteConfigFeatureFlagToolsViewModelOutputs { return self } +} + +// MARK: - Private Helpers + +/** Returns the value of the User Defaults key in the AppEnvironment. + */ +private func getValueFromUserDefaults(for feature: RemoteConfigFeature) -> Bool? { + switch feature { + case .consentManagementDialogEnabled: + return AppEnvironment.current.userDefaults + .remoteConfigFeatureFlags[RemoteConfigFeature.consentManagementDialogEnabled.rawValue] + case .facebookLoginInterstitialEnabled: + return AppEnvironment.current.userDefaults + .remoteConfigFeatureFlags[RemoteConfigFeature.facebookLoginInterstitialEnabled.rawValue] + } +} + +/** Sets the value for the UserDefaults key in the AppEnvironment. + */ +private func setValueInUserDefaults(for feature: RemoteConfigFeature, and value: Bool) { + switch feature { + case .consentManagementDialogEnabled: + AppEnvironment.current.userDefaults + .remoteConfigFeatureFlags[RemoteConfigFeature.consentManagementDialogEnabled.rawValue] = value + case .facebookLoginInterstitialEnabled: + return AppEnvironment.current.userDefaults + .remoteConfigFeatureFlags[RemoteConfigFeature.facebookLoginInterstitialEnabled.rawValue] = value + } +} diff --git a/Library/ViewModels/RemoteConfigFeatureFlagToolsViewModelTests.swift b/Library/ViewModels/RemoteConfigFeatureFlagToolsViewModelTests.swift new file mode 100644 index 0000000000..b58ea37b2d --- /dev/null +++ b/Library/ViewModels/RemoteConfigFeatureFlagToolsViewModelTests.swift @@ -0,0 +1,118 @@ +import Foundation +@testable import KsApi +@testable import Library +import Prelude +import ReactiveExtensions_TestHelpers +import ReactiveSwift +import XCTest + +final class RemoteConfigFlagToolsViewModelTests: TestCase { + private let vm: RemoteConfigFeatureFlagToolsViewModelType = RemoteConfigFeatureFlagToolsViewModel() + + private let reloadWithData = TestObserver() + private let updateUserDefaultsWithFeatures = TestObserver() + + override func setUp() { + super.setUp() + + self.vm.outputs.reloadWithData.observe(self.reloadWithData.observer) + self.vm.outputs.updateUserDefaultsWithFeatures.observe(self.updateUserDefaultsWithFeatures.observer) + } + + /** FIXME: RemoteConfigValue is not initializing because its' OBJC intiliazer is not available + func testReloadWithData_AllFeaturesEnabled() { + let mockRemoteConfigClient = MockRemoteConfigClient() + |> \.features .~ [ + RemoteConfigFeature.consentManagementDialogEnabled.rawValue: true, + RemoteConfigFeature.facebookLoginInterstitialEnabled.rawValue: true + ] + + withEnvironment(remoteConfigClient: mockRemoteConfigClient) { + self.vm.inputs.viewDidLoad() + + self.reloadWithData.values.forEach { featureTuples in + featureTuples.forEach { feature, isEnabled in + let isEnabledOnClient = mockRemoteConfigClient.features[feature.rawValue] + + XCTAssertEqual(isEnabled, isEnabledOnClient) + } + } + } + } + + func testReloadWithData_FeaturesEnabledAndDisabled() { + let mockRemoteConfigClient = MockRemoteConfigClient() + |> \.features .~ [ + RemoteConfigFeature.consentManagementDialogEnabled.rawValue: true, + RemoteConfigFeature.facebookLoginInterstitialEnabled.rawValue: false + ] + + withEnvironment(remoteConfigClient: mockRemoteConfigClient) { + self.vm.inputs.viewDidLoad() + + self.reloadWithData.values.forEach { featureTuples in + featureTuples.forEach { feature, isEnabled in + let isEnabledOnClient = mockRemoteConfigClient.features[feature.rawValue] + + XCTAssertEqual(isEnabled, isEnabledOnClient) + } + } + } + } + */ + + func testUpdateUserDefaultsWithFeatures_FeaturesAreEnabled() { + let mockRemoteConfigClient = MockRemoteConfigClient() + |> \.features .~ [ + RemoteConfigFeature.consentManagementDialogEnabled.rawValue: false + ] + + withEnvironment(remoteConfigClient: mockRemoteConfigClient) { + self.vm.inputs.viewDidLoad() + + self.scheduler.advance() + + self.vm.inputs.setFeatureAtIndexEnabled(index: 0, isEnabled: true) + + self.scheduler.advance() + + let (_, isEnabled0) = self.updateUserDefaultsWithFeatures.values[0][0] + + XCTAssertTrue(isEnabled0) + } + } + + func testUpdateUserDefaultsWithFeatures_ReloadWithData_UserDefaultsIsUpdated() { + let mockRemoteConfigClient = MockRemoteConfigClient() + |> \.features .~ [ + RemoteConfigFeature.consentManagementDialogEnabled.rawValue: false + ] + + withEnvironment(remoteConfigClient: mockRemoteConfigClient, userDefaults: userDefaults) { + self.vm.inputs.viewDidLoad() + + self.scheduler.advance() + + self.vm.inputs.setFeatureAtIndexEnabled(index: 0, isEnabled: true) + + self.scheduler.advance() + + self.vm.inputs.didUpdateUserDefaults() + + self.scheduler.advance() + + XCTAssertEqual( + userDefaults + .dictionary(forKey: "com.kickstarter.KeyValueStoreType.remoteConfigFeatureFlags") as? [String: Bool], + [ + RemoteConfigFeature.consentManagementDialogEnabled.rawValue: true + ] + ) + } + + /// The value from the remote config client is never mutated + self.reloadWithData.values[0].forEach { _, isEnabled in + XCTAssertFalse(isEnabled) + } + } +}