Skip to content

Commit 4debedf

Browse files
MBL-2806: Clean up secret rewards feature flag (#2629)
* MBL-2806: Clean up secret rewards feature flag * Delete two feature-flag off tests that aren't relevant any more * Move a little code out of ProjectPageViewModel to make swiftlint a little happier * Fix swiftformat error
1 parent 22774ff commit 4debedf

File tree

6 files changed

+37
-139
lines changed

6 files changed

+37
-139
lines changed

Library/RemoteConfig/RemoteConfigFeature+Helpers.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,3 @@ public func featureRewardShipmentTrackingEnabled() -> Bool {
4242
public func featureSimilarProjectsCarouselEnabled() -> Bool {
4343
featureEnabled(feature: .similarProjectsCarousel)
4444
}
45-
46-
public func featureSecretRewardsEnabled() -> Bool {
47-
featureEnabled(feature: .secretRewards)
48-
}

Library/RemoteConfig/RemoteConfigFeature.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ public enum RemoteConfigFeature: String, CaseIterable {
88
case pledgeOverTime = "pledge_over_time"
99
case rewardShipmentTracking = "reward_shipment_tracking"
1010
case similarProjectsCarousel = "similar_projects_carousel"
11-
case secretRewards = "secret_rewards"
1211
}
1312

1413
extension RemoteConfigFeature: CustomStringConvertible {
@@ -21,7 +20,6 @@ extension RemoteConfigFeature: CustomStringConvertible {
2120
case .pledgeOverTime: return "Pledge Over Time"
2221
case .rewardShipmentTracking: return "Reward Shipment Tracking"
2322
case .similarProjectsCarousel: return "Similar Projects Carousel"
24-
case .secretRewards: return "Secret Rewards"
2523
}
2624
}
2725
}

Library/ViewModels/ProjectPageViewModel.swift

Lines changed: 2 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -958,7 +958,7 @@ private func fetchProject(
958958
let projectAndBackingProducer = projectAndBackingIdProducer
959959
.switchMap { projectPamphletData -> SignalProducer<Project, ErrorEnvelope> in
960960
guard let backingId = projectPamphletData.backingId else {
961-
return addUserToSecretRewardGroupIfNeeded(
961+
return RewardsUseCase.addUserToSecretRewardGroupIfNeeded(
962962
project: projectPamphletData.project,
963963
secretRewardToken: secretRewardToken
964964
)
@@ -976,7 +976,7 @@ private func fetchProject(
976976
// INFO: Seems like in the `fetchBacking` call we nil out the chosen currency set by `fetchProject` b/c the query for backing doesn't have `me { chosenCurrency }`, so its' being included here.
977977
|> Project.lens.stats.userCurrency .~ projectPamphletData.project.stats.userCurrency
978978

979-
return addUserToSecretRewardGroupIfNeeded(
979+
return RewardsUseCase.addUserToSecretRewardGroupIfNeeded(
980980
project: updatedProjectWithBacking,
981981
secretRewardToken: secretRewardToken
982982
)
@@ -993,35 +993,6 @@ private func fetchProject(
993993
return projectAndBackingProducer
994994
}
995995

996-
// TODO: Consider relocating this logic to `RewardsUseCase` to consolidate secret reward handling.
997-
// Ticket: [MBL-2478](https://kickstarter.atlassian.net/browse/MBL-2478)
998-
//
999-
/// Attempts to add the user to the secret reward group if logged in and a valid token is present.
1000-
/// - Returns: `true` if the GraphQL mutation `addUserToSecretRewardGroup` was triggered successfully.
1001-
/// `false` if the user is not logged in or the token is missing/empty, thus skipping the mutation.
1002-
private func addUserToSecretRewardGroupIfNeeded(
1003-
project: Project,
1004-
secretRewardToken: String?
1005-
) -> SignalProducer<Bool, ErrorEnvelope> {
1006-
let isUserLoggedIn = AppEnvironment.current.currentUser != nil
1007-
1008-
guard featureSecretRewardsEnabled(), isUserLoggedIn, let secretRewardToken = secretRewardToken,
1009-
!secretRewardToken.isEmpty else {
1010-
return SignalProducer(value: false)
1011-
}
1012-
1013-
let input = AddUserToSecretRewardGroupInput(
1014-
projectId: project.graphID,
1015-
secretRewardToken: secretRewardToken
1016-
)
1017-
return AppEnvironment.current.apiService
1018-
.addUserToSecretRewardGroup(input: input)
1019-
.ksr_delay(AppEnvironment.current.apiDelayInterval, on: AppEnvironment.current.scheduler)
1020-
.switchMap { _ -> SignalProducer<Bool, ErrorEnvelope> in
1021-
SignalProducer(value: true)
1022-
}
1023-
}
1024-
1025996
private func fetchProjectRewards(project: Project) -> SignalProducer<Project, ErrorEnvelope> {
1026997
return AppEnvironment.current.apiService
1027998
.fetchProjectRewards(projectId: project.id)

Library/ViewModels/ProjectPageViewModelTests.swift

Lines changed: 1 addition & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -993,16 +993,10 @@ final class ProjectPageViewModelTests: TestCase {
993993
}
994994

995995
func testSecretRewards_GoToLogin() {
996-
let mockConfigClient = MockRemoteConfigClient()
997-
mockConfigClient.features = [
998-
RemoteConfigFeature.secretRewards.rawValue: true
999-
]
1000-
1001996
withEnvironment(
1002997
config: .template,
1003998
currentUser: nil,
1004-
mainBundle: self.releaseBundle,
1005-
remoteConfigClient: mockConfigClient
999+
mainBundle: self.releaseBundle
10061000
) {
10071001
let project = Project.template
10081002

@@ -1023,34 +1017,6 @@ final class ProjectPageViewModelTests: TestCase {
10231017
}
10241018
}
10251019

1026-
func testSecretRewards_GoToReward_WhenFeatureFlagOff() {
1027-
let mockConfigClient = MockRemoteConfigClient()
1028-
mockConfigClient.features = [
1029-
RemoteConfigFeature.secretRewards.rawValue: false
1030-
]
1031-
1032-
withEnvironment(
1033-
config: .template,
1034-
currentUser: nil,
1035-
mainBundle: self.releaseBundle,
1036-
remoteConfigClient: mockConfigClient
1037-
) {
1038-
let project = Project.template
1039-
1040-
self.configureInitialState(.left(project), secretRewardToken: "secret-reward-token")
1041-
1042-
self.goToRewardsProject.assertDidNotEmitValue()
1043-
self.goToRewardsRefTag.assertDidNotEmitValue()
1044-
self.goToLoginWithIntent.assertDidNotEmitValue()
1045-
1046-
self.vm.inputs.pledgeCTAButtonTapped(with: .pledge)
1047-
1048-
self.goToRewardsProject.assertValues([project], "Tapping 'Back this project' emits the project")
1049-
self.goToRewardsRefTag.assertValues([.discovery], "Tapping 'Back this project' emits the refTag")
1050-
self.goToLoginWithIntent.assertDidNotEmitValue()
1051-
}
1052-
}
1053-
10541020
func testUpdateWatchProjectWithPrelaunchState() {
10551021
withEnvironment(config: .template, mainBundle: self.releaseBundle) {
10561022
let project = Project.template

Library/ViewModels/RewardsUseCase.swift

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,7 @@ public final class RewardsUseCase: RewardsUseCaseType, RewardsUseCaseOutputs {
4444
let requiresLoginForSecretRewards = isSecretReward
4545
.combineLatest(with: isLoggedIn)
4646
.compactMap { isSecretReward, isLoggedIn -> Bool in
47-
guard featureSecretRewardsEnabled() else { return false }
48-
49-
return isSecretReward && !isLoggedIn
47+
isSecretReward && !isLoggedIn
5048
}
5149

5250
self.goToRewards = requiresLoginForSecretRewards
@@ -64,6 +62,35 @@ public final class RewardsUseCase: RewardsUseCaseType, RewardsUseCaseOutputs {
6462
}
6563
}
6664

65+
// MARK: Utilities
66+
67+
/// Attempts to add the user to the secret reward group if logged in and a valid token is present.
68+
/// - Returns: `true` if the GraphQL mutation `addUserToSecretRewardGroup` was triggered successfully.
69+
/// `false` if the user is not logged in or the token is missing/empty, thus skipping the mutation.
70+
static func addUserToSecretRewardGroupIfNeeded(
71+
project: Project,
72+
secretRewardToken: String?
73+
) -> SignalProducer<Bool, ErrorEnvelope> {
74+
let isUserLoggedIn = AppEnvironment.current.currentUser != nil
75+
76+
guard isUserLoggedIn,
77+
let secretRewardToken = secretRewardToken,
78+
!secretRewardToken.isEmpty else {
79+
return SignalProducer(value: false)
80+
}
81+
82+
let input = AddUserToSecretRewardGroupInput(
83+
projectId: project.graphID,
84+
secretRewardToken: secretRewardToken
85+
)
86+
return AppEnvironment.current.apiService
87+
.addUserToSecretRewardGroup(input: input)
88+
.ksr_delay(AppEnvironment.current.apiDelayInterval, on: AppEnvironment.current.scheduler)
89+
.switchMap { _ -> SignalProducer<Bool, ErrorEnvelope> in
90+
SignalProducer(value: true)
91+
}
92+
}
93+
6794
// MARK: Properties
6895

6996
public var goToLoginWithIntent: ReactiveSwift.Signal<LoginIntent, Never>

Library/ViewModels/RewardsUseCaseTests.swift

Lines changed: 4 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,7 @@ final class RewardsUseCaseTests: TestCase {
3333
}
3434

3535
func test_goToRewards_whenUserIsLoggedOut_andNoSecretRewardToken() {
36-
let mockConfigClient = MockRemoteConfigClient()
37-
mockConfigClient.features = [
38-
RemoteConfigFeature.secretRewards.rawValue: true
39-
]
40-
41-
withEnvironment(currentUser: nil, remoteConfigClient: mockConfigClient) {
36+
withEnvironment(currentUser: nil) {
4237
self.secretRewardTokenObserver.send(value: nil)
4338

4439
self.goToLoginWithIntent.assertDidNotEmitValue()
@@ -52,12 +47,7 @@ final class RewardsUseCaseTests: TestCase {
5247
}
5348

5449
func test_goToRewards_whenUserIsLoggedIn_andNoSecretRewardToken() {
55-
let mockConfigClient = MockRemoteConfigClient()
56-
mockConfigClient.features = [
57-
RemoteConfigFeature.secretRewards.rawValue: true
58-
]
59-
60-
withEnvironment(currentUser: .template, remoteConfigClient: mockConfigClient) {
50+
withEnvironment(currentUser: .template) {
6151
self.secretRewardTokenObserver.send(value: nil)
6252

6353
self.goToLoginWithIntent.assertDidNotEmitValue()
@@ -71,12 +61,7 @@ final class RewardsUseCaseTests: TestCase {
7161
}
7262

7363
func test_goToRewards_whenUserIsLoggedIn_andHasSecretRewardToken() {
74-
let mockConfigClient = MockRemoteConfigClient()
75-
mockConfigClient.features = [
76-
RemoteConfigFeature.secretRewards.rawValue: true
77-
]
78-
79-
withEnvironment(currentUser: .template, remoteConfigClient: mockConfigClient) {
64+
withEnvironment(currentUser: .template) {
8065
self.secretRewardTokenObserver.send(value: "secret-reward-token")
8166

8267
self.goToLoginWithIntent.assertDidNotEmitValue()
@@ -90,12 +75,7 @@ final class RewardsUseCaseTests: TestCase {
9075
}
9176

9277
func test_goToLogin_whenUserIsLoggedOut_andHasSecretRewardToken() {
93-
let mockConfigClient = MockRemoteConfigClient()
94-
mockConfigClient.features = [
95-
RemoteConfigFeature.secretRewards.rawValue: true
96-
]
97-
98-
withEnvironment(currentUser: nil, remoteConfigClient: mockConfigClient) {
78+
withEnvironment(currentUser: nil) {
9979
self.secretRewardTokenObserver.send(value: "secret-reward-token")
10080

10181
self.goToLoginWithIntent.assertDidNotEmitValue()
@@ -107,44 +87,4 @@ final class RewardsUseCaseTests: TestCase {
10787
self.goToRewards.assertDidNotEmitValue()
10888
}
10989
}
110-
111-
// MARK: - Feature flag Off
112-
113-
func test_goToRewards_whenUserIsLoggedIn_andHasSecretRewardToken_FeatureFlagOff() {
114-
let mockConfigClient = MockRemoteConfigClient()
115-
mockConfigClient.features = [
116-
RemoteConfigFeature.secretRewards.rawValue: false
117-
]
118-
119-
withEnvironment(currentUser: .template, remoteConfigClient: mockConfigClient) {
120-
self.secretRewardTokenObserver.send(value: "secret-reward-token")
121-
122-
self.goToLoginWithIntent.assertDidNotEmitValue()
123-
self.goToRewards.assertDidNotEmitValue()
124-
125-
self.goToRewardsTappedObserver.send(value: ())
126-
127-
self.goToLoginWithIntent.assertDidNotEmitValue()
128-
self.goToRewards.assertDidEmitValue()
129-
}
130-
}
131-
132-
func test_goToRewards_whenUserIsLoggedOut_andHasSecretRewardToken_FeatureFlagOff() {
133-
let mockConfigClient = MockRemoteConfigClient()
134-
mockConfigClient.features = [
135-
RemoteConfigFeature.secretRewards.rawValue: false
136-
]
137-
138-
withEnvironment(currentUser: nil, remoteConfigClient: mockConfigClient) {
139-
self.secretRewardTokenObserver.send(value: "secret-reward-token")
140-
141-
self.goToLoginWithIntent.assertDidNotEmitValue()
142-
self.goToRewards.assertDidNotEmitValue()
143-
144-
self.goToRewardsTappedObserver.send(value: ())
145-
146-
self.goToLoginWithIntent.assertDidNotEmitValue()
147-
self.goToRewards.assertDidEmitValue()
148-
}
149-
}
15090
}

0 commit comments

Comments
 (0)