Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

View backing when project has ended #804

Merged
merged 6 commits into from
Aug 16, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,12 @@ final class RewardsCollectionViewController: UICollectionViewController {
self?.goToDeprecatedPledge(project: project, reward: reward, refTag: refTag)
}

self.viewModel.outputs.goToViewBacking
.observeForControllerAction()
.observeValues { [weak self] project, user in
self?.goToViewBacking(project: project, user: user)
}

self.viewModel.outputs.rewardsCollectionViewFooterIsHidden
.observeForUI()
.observeValues { [weak self] isHidden in
Expand Down Expand Up @@ -235,6 +241,12 @@ final class RewardsCollectionViewController: UICollectionViewController {
self.navigationController?.pushViewController(pledgeViewController, animated: true)
}

private func goToViewBacking(project: Project, user: User?) {
let backingViewController = BackingViewController.configuredWith(project: project, backer: user)

self.navigationController?.pushViewController(backingViewController, animated: true)
}

private func goToDeprecatedPledge(project: Project, reward: Reward, refTag _: RefTag?) {
let pledgeViewController = DeprecatedRewardPledgeViewController
.configuredWith(
Expand All @@ -251,8 +263,6 @@ final class RewardsCollectionViewController: UICollectionViewController {
}
}

// MARK: - Functions

// MARK: - UICollectionViewDelegate

extension RewardsCollectionViewController {
Expand Down
19 changes: 19 additions & 0 deletions Library/ViewModels/RewardsCollectionViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public protocol RewardsCollectionViewModelOutputs {
var flashScrollIndicators: Signal<Void, Never> { get }
var goToDeprecatedPledge: Signal<PledgeData, Never> { get }
var goToPledge: Signal<PledgeData, Never> { get }
var goToViewBacking: Signal<(Project, User?), Never> { get }
var navigationBarShadowImageHidden: Signal<Bool, Never> { get }
var reloadDataWithValues: Signal<[(Project, Either<Reward, Backing>)], Never> { get }
var rewardsCollectionViewFooterIsHidden: Signal<Bool, Never> { get }
Expand Down Expand Up @@ -73,10 +74,27 @@ public final class RewardsCollectionViewModel: RewardsCollectionViewModelType,
selectedRewardFromId,
refTag
)
.filter { arg in
let (project, _, _) = arg
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you probably did this to help the compiler but i'm sure it'll also compile as .filter { project, _, _ in ... }


return project.state == .live
}
.map { project, reward, refTag in
PledgeData(project: project, reward: reward, refTag: refTag)
}

let goToViewBacking = project
.takePairWhen(selectedRewardFromId)
.filter { project, reward -> Bool in
project.state != .live && userIsBacking(reward: reward, inProject: project)
}
.map(first)

self.goToViewBacking = goToViewBacking
.map { project in
(project, AppEnvironment.current.currentUser)
}

self.goToPledge = goToPledge
.filter { _ in featureNativeCheckoutPledgeViewEnabled() }

Expand Down Expand Up @@ -135,6 +153,7 @@ public final class RewardsCollectionViewModel: RewardsCollectionViewModelType,
public let flashScrollIndicators: Signal<Void, Never>
public let goToDeprecatedPledge: Signal<PledgeData, Never>
public let goToPledge: Signal<PledgeData, Never>
public let goToViewBacking: Signal<(Project, User?), Never>
public let navigationBarShadowImageHidden: Signal<Bool, Never>
public let reloadDataWithValues: Signal<[(Project, Either<Reward, Backing>)], Never>
public let rewardsCollectionViewFooterIsHidden: Signal<Bool, Never>
Expand Down
116 changes: 116 additions & 0 deletions Library/ViewModels/RewardsCollectionViewModelTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ final class RewardsCollectionViewModelTests: TestCase {
private let goToPledgeProject = TestObserver<Project, Never>()
private let goToPledgeRefTag = TestObserver<RefTag?, Never>()
private let goToPledgeReward = TestObserver<Reward, Never>()
private let goToViewBackingProject = TestObserver<Project, Never>()
private let goToViewBackingUser = TestObserver<User?, Never>()
private let navigationBarShadowImageHidden = TestObserver<Bool, Never>()
private let reloadDataWithValues = TestObserver<[(Project, Either<Reward, Backing>)], Never>()
private let reloadDataWithValuesProject = TestObserver<[Project], Never>()
Expand All @@ -35,6 +37,8 @@ final class RewardsCollectionViewModelTests: TestCase {
self.vm.outputs.goToPledge.map { $0.project }.observe(self.goToPledgeProject.observer)
self.vm.outputs.goToPledge.map { $0.reward }.observe(self.goToPledgeReward.observer)
self.vm.outputs.goToPledge.map { $0.refTag }.observe(self.goToPledgeRefTag.observer)
self.vm.outputs.goToViewBacking.map(first).observe(self.goToViewBackingProject.observer)
self.vm.outputs.goToViewBacking.map(second).observe(self.goToViewBackingUser.observer)
self.vm.outputs.navigationBarShadowImageHidden.observe(self.navigationBarShadowImageHidden.observer)
self.vm.outputs.reloadDataWithValues.observe(self.reloadDataWithValues.observer)
self.vm.outputs.reloadDataWithValues.map { $0.map { $0.0 } }
Expand Down Expand Up @@ -89,6 +93,8 @@ final class RewardsCollectionViewModelTests: TestCase {
self.goToPledgeProject.assertValues([project])
self.goToPledgeReward.assertValues([project.rewards[0]])
self.goToPledgeRefTag.assertValues([.activity])
self.goToViewBackingUser.assertDidNotEmitValue()
self.goToViewBackingProject.assertDidNotEmitValue()
XCTAssertEqual(self.vm.outputs.selectedReward(), project.rewards[0])

let lastCardRewardId = project.rewards.last!.id
Expand All @@ -102,6 +108,8 @@ final class RewardsCollectionViewModelTests: TestCase {
self.goToPledgeProject.assertValues([project, project])
self.goToPledgeReward.assertValues([project.rewards[0], project.rewards[endIndex - 1]])
self.goToPledgeRefTag.assertValues([.activity, .activity])
self.goToViewBackingUser.assertDidNotEmitValue()
self.goToViewBackingProject.assertDidNotEmitValue()
XCTAssertEqual(self.vm.outputs.selectedReward(), project.rewards[endIndex - 1])
}
}
Expand Down Expand Up @@ -129,6 +137,8 @@ final class RewardsCollectionViewModelTests: TestCase {
self.goToPledgeProject.assertDidNotEmitValue()
self.goToPledgeReward.assertDidNotEmitValue()
self.goToPledgeRefTag.assertDidNotEmitValue()
self.goToViewBackingUser.assertDidNotEmitValue()
self.goToViewBackingProject.assertDidNotEmitValue()
XCTAssertEqual(self.vm.outputs.selectedReward(), project.rewards[0])

let lastCardRewardId = project.rewards.last!.id
Expand All @@ -142,6 +152,8 @@ final class RewardsCollectionViewModelTests: TestCase {
self.goToPledgeProject.assertDidNotEmitValue()
self.goToPledgeReward.assertDidNotEmitValue()
self.goToPledgeRefTag.assertDidNotEmitValue()
self.goToViewBackingUser.assertDidNotEmitValue()
self.goToViewBackingProject.assertDidNotEmitValue()
XCTAssertEqual(self.vm.outputs.selectedReward(), project.rewards[endIndex - 1])
}

Expand Down Expand Up @@ -207,4 +219,108 @@ final class RewardsCollectionViewModelTests: TestCase {

self.navigationBarShadowImageHidden.assertValues([true, true, false, false])
}

func testRewardSelected_NonBacking_ProjectEnded() {
let project = Project.cosmicSurgery
|> Project.lens.state .~ .successful
|> Project.lens.personalization.backing .~ nil
|> Project.lens.personalization.isBacking .~ nil

let reward = project.rewards.first!

withEnvironment {
self.goToPledgeProject.assertDidNotEmitValue()
self.goToDeprecatedPledgeProject.assertDidNotEmitValue()
self.goToViewBackingProject.assertDidNotEmitValue()

self.vm.inputs.configure(with: project, refTag: nil)
self.vm.inputs.viewDidLoad()
self.vm.inputs.viewWillAppear()
self.vm.inputs.viewDidAppear()

self.vm.inputs.rewardSelected(with: reward.id)

self.goToPledgeProject.assertDidNotEmitValue()
self.goToDeprecatedPledgeProject.assertDidNotEmitValue()
self.goToViewBackingProject.assertDidNotEmitValue()
}
}

func testRewardSelected_Backing_WithReward_ProjectEnded() {
let reward = Project.cosmicSurgery.rewards.first!
let backing = Backing.template
|> Backing.lens.reward .~ reward
|> Backing.lens.rewardId .~ reward.id

let project = Project.cosmicSurgery
|> Project.lens.state .~ .successful
|> Project.lens.personalization.backing .~ backing
|> Project.lens.personalization.isBacking .~ true

let user = User.template

withEnvironment(currentUser: user) {
self.goToPledgeProject.assertDidNotEmitValue()
self.goToDeprecatedPledgeProject.assertDidNotEmitValue()
self.goToViewBackingProject.assertDidNotEmitValue()

self.vm.inputs.configure(with: project, refTag: nil)
self.vm.inputs.viewDidLoad()
self.vm.inputs.viewWillAppear()
self.vm.inputs.viewDidAppear()

self.vm.inputs.rewardSelected(with: 123)

self.goToPledgeProject.assertDidNotEmitValue()
self.goToDeprecatedPledgeProject.assertDidNotEmitValue()
self.goToViewBackingProject.assertDidNotEmitValue()

self.vm.inputs.rewardSelected(with: reward.id)

self.goToPledgeProject.assertDidNotEmitValue()
self.goToDeprecatedPledgeProject.assertDidNotEmitValue()

self.goToViewBackingProject.assertValues([project])
self.goToViewBackingUser.assertValues([user])
}
}

func testRewardSelected_Backing_NoReward_ProjectEnded() {
let backing = Backing.template
|> Backing.lens.reward .~ .noReward
|> Backing.lens.rewardId .~ nil

let project = Project.template
|> Project.lens.rewards .~ [Reward.noReward, Reward.template]
|> Project.lens.state .~ .successful
|> Project.lens.personalization.backing .~ backing
|> Project.lens.personalization.isBacking .~ true

let user = User.template

withEnvironment(currentUser: user) {
self.goToPledgeProject.assertDidNotEmitValue()
self.goToDeprecatedPledgeProject.assertDidNotEmitValue()
self.goToViewBackingProject.assertDidNotEmitValue()

self.vm.inputs.configure(with: project, refTag: nil)
self.vm.inputs.viewDidLoad()
self.vm.inputs.viewWillAppear()
self.vm.inputs.viewDidAppear()

self.vm.inputs.rewardSelected(with: 123)

self.goToPledgeProject.assertDidNotEmitValue()
self.goToDeprecatedPledgeProject.assertDidNotEmitValue()
self.goToViewBackingProject.assertDidNotEmitValue()

self.vm.inputs.rewardSelected(with: Reward.noReward.id)

self.goToPledgeProject.assertDidNotEmitValue()
self.goToDeprecatedPledgeProject.assertDidNotEmitValue()

self.goToViewBackingProject.assertValues([project])
self.goToViewBackingUser.assertValues([user])
}
}
}