-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
RemoteConfigFeatureFlagToolsViewModelTests.swift
132 lines (102 loc) · 4.32 KB
/
RemoteConfigFeatureFlagToolsViewModelTests.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
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<RemoteConfigFeatures, Never>()
private let updateUserDefaultsWithFeatures = TestObserver<RemoteConfigFeatures, Never>()
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 mockRemoteConfigClient = MockRemoteConfigClient()
|> \.features .~ [
RemoteConfigFeature.blockUsersEnabled.rawValue: true,
RemoteConfigFeature.consentManagementDialogEnabled.rawValue: true,
RemoteConfigFeature.darkModeEnabled.rawValue: true,
RemoteConfigFeature.facebookLoginInterstitialEnabled.rawValue: true,
RemoteConfigFeature.reportThisProjectEnabled.rawValue: true,
RemoteConfigFeature.useOfAIProjectTab.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.blockUsersEnabled.rawValue: false,
RemoteConfigFeature.consentManagementDialogEnabled.rawValue: true,
RemoteConfigFeature.darkModeEnabled.rawValue: false,
RemoteConfigFeature.facebookLoginInterstitialEnabled.rawValue: true,
RemoteConfigFeature.reportThisProjectEnabled.rawValue: false,
RemoteConfigFeature.useOfAIProjectTab.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 testUpdateUserDefaultsWithFeature_FeatureIsEnabled() {
let mockRemoteConfigClient = MockRemoteConfigClient()
|> \.features .~ [
RemoteConfigFeature.consentManagementDialogEnabled.rawValue: false
]
withEnvironment(remoteConfigClient: mockRemoteConfigClient) {
self.vm.inputs.viewDidLoad()
self.scheduler.advance()
self.updateUserDefaultsWithFeatures.assertDidNotEmitValue()
self.vm.inputs.setFeatureAtIndexEnabled(index: 0, isEnabled: true)
self.scheduler.advance()
let (_, isEnabled1) = self.updateUserDefaultsWithFeatures.values[0][0]
XCTAssertTrue(isEnabled1)
}
}
func testUpdateUserDefaultsWithFeatures_ReloadWithData_UserDefaultsIsUpdated() {
let mockRemoteConfigClient = MockRemoteConfigClient()
|> \.features .~ [
RemoteConfigFeature.blockUsersEnabled.rawValue: false
]
withEnvironment(remoteConfigClient: mockRemoteConfigClient, userDefaults: userDefaults) {
self.vm.inputs.viewDidLoad()
self.scheduler.advance()
XCTAssertEqual(
userDefaults
.dictionary(forKey: "com.kickstarter.KeyValueStoreType.remoteConfigFeatureFlags") as? [String: Bool],
nil
)
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.blockUsersEnabled.rawValue: true
]
)
}
/// The value from the remote config client is never mutated
self.reloadWithData.values[0].forEach { _, isEnabled in
XCTAssertFalse(isEnabled)
}
}
}