Skip to content

Commit

Permalink
[MBL-671] Corrected Search State of Prelaunch Cells (#1804)
Browse files Browse the repository at this point in the history
* corrected search state of prelaunch pages

* prelaunch project search state tests
  • Loading branch information
msadoon committed Mar 27, 2023
1 parent ad7b971 commit d1cd72e
Show file tree
Hide file tree
Showing 17 changed files with 123 additions and 1 deletion.
Expand Up @@ -32,6 +32,9 @@ internal final class BackerDashboardProjectCell: UITableViewCell, ValueCell {
self.projectNameLabel.rac.attributedText = self.viewModel.outputs.projectTitleText
self.projectImageView.rac.ksr_imageUrl = self.viewModel.outputs.photoURL
self.progressBarView.rac.backgroundColor = self.viewModel.outputs.progressBarColor
self.progressBarView.rac.hidden = self.viewModel.outputs.prelaunchProject
self.progressStaticView.rac.hidden = self.viewModel.outputs.prelaunchProject
self.percentFundedLabel.rac.hidden = self.viewModel.outputs.prelaunchProject
self.savedIconImageView.rac.hidden = self.viewModel.outputs.savedIconIsHidden

self.viewModel.outputs.progress
Expand Down
Expand Up @@ -107,6 +107,40 @@ internal final class SearchViewContollerTests: TestCase {
}
}

func testView_PrelaunchProject_InSearch_Success() {
let project = (1...10).map {
.cosmicSurgery
|> Project.lens.id .~ $0
|> Project.lens.photo.full .~ ""
|> Project.lens.photo.med .~ ""
|> Project.lens.displayPrelaunch .~ true
}

let discoveryResponse = .template
|> DiscoveryEnvelope.lens.projects .~ project

combos(Language.allLanguages, [Device.phone5_8inch, Device.pad])
.forEach { language, device in
withEnvironment(
apiService: MockService(fetchDiscoveryResponse: discoveryResponse), language: language
) {
let controller = Storyboard.Search.instantiate(SearchViewController.self)
controller.viewWillAppear(true)
let (parent, _) = traitControllers(device: device, orientation: .portrait, child: controller)

controller.viewModel.inputs.searchTextChanged("abcdefgh")

self.scheduler.run()

assertSnapshot(
matching: parent.view,
as: .image(perceptualPrecision: 0.98),
named: "lang_\(language)_device_\(device)"
)
}
}
}

func testScrollToTop() {
let controller = ActivitiesViewController.instantiate()

Expand Down
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Expand Up @@ -103,6 +103,9 @@ internal final class MostPopularSearchProjectCell: UITableViewCell, ValueCell {
self.progressBarView.rac.backgroundColor = self.viewModel.outputs.progressBarColor
self.projectImageView.rac.ksr_imageUrl = self.viewModel.outputs.projectImageUrl
self.projectNameLabel.rac.attributedText = self.viewModel.outputs.projectName
self.statsStackView.rac.hidden = self.viewModel.outputs.prelaunchProject
self.progressBarView.rac.hidden = self.viewModel.outputs.prelaunchProject
self.metadataIconImageView.rac.hidden = self.viewModel.outputs.prelaunchProject

self.viewModel.outputs.progress
.observeForUI()
Expand Down
30 changes: 29 additions & 1 deletion Library/ViewModels/BackerDashboardProjectCellViewModel.swift
Expand Up @@ -35,6 +35,9 @@ public protocol BackerDashboardProjectCellViewModelOutputs {

/// Emits a boolean when the saved icon is hidden or not.
var savedIconIsHidden: Signal<Bool, Never> { get }

/// Emits to hide information about pledging when project is prelaunch
var prelaunchProject: Signal<Bool, Never> { get }
}

public protocol BackerDashboardProjectCellViewModelType {
Expand All @@ -57,13 +60,19 @@ public final class BackerDashboardProjectCellViewModel: BackerDashboardProjectCe

self.metadataText = project.map(metadataString(for:))

self.metadataIconIsHidden = project.map { $0.state != .live }
self.metadataIconIsHidden = project.map { project in
guard !isProjectPrelaunch(project) else { return true }

return project.state != .live
}

self.percentFundedText = project.map(percentFundedString(for:))

self.progressBarColor = project.map(progressBarColorForProject)

self.savedIconIsHidden = project.map { $0.personalization.isStarred != .some(true) }

self.prelaunchProject = project.map(isProjectPrelaunch)
}

fileprivate let projectProperty = MutableProperty<Project?>(nil)
Expand All @@ -79,13 +88,16 @@ public final class BackerDashboardProjectCellViewModel: BackerDashboardProjectCe
public let progress: Signal<Float, Never>
public let progressBarColor: Signal<UIColor, Never>
public let projectTitleText: Signal<NSAttributedString, Never>
public let prelaunchProject: Signal<Bool, Never>
public let savedIconIsHidden: Signal<Bool, Never>

public var inputs: BackerDashboardProjectCellViewModelInputs { return self }
public var outputs: BackerDashboardProjectCellViewModelOutputs { return self }
}

private func metadataString(for project: Project) -> String {
guard !isProjectPrelaunch(project) else { return Strings.Coming_soon() }

switch project.state {
case .live:
guard let deadline = project.dates.deadline else {
Expand Down Expand Up @@ -126,6 +138,10 @@ private func progressBarColorForProject(_ project: Project) -> UIColor {
}

private func metadataBackgroundColorForProject(_ project: Project) -> UIColor {
guard !isProjectPrelaunch(project) else {
return .ksr_create_700
}

switch project.state {
case .live, .successful:
return .ksr_create_700
Expand Down Expand Up @@ -163,3 +179,15 @@ private func stateString(for project: Project) -> String {
return ""
}
}

private func isProjectPrelaunch(_ project: Project) -> Bool {
switch (project.displayPrelaunch, project.dates.launchedAt, project.prelaunchActivated) {
case (.some(true), _, _),
(_, _, .some(true)):
return true
case let (_, .some(timeValue), _):
return timeValue <= 0
default:
return false
}
}
16 changes: 16 additions & 0 deletions Library/ViewModels/BackerDashboardProjectCellViewModelTests.swift
Expand Up @@ -10,6 +10,7 @@ internal final class BackerDashboardProjectCellViewModelTests: TestCase {

private let metadataIconIsHidden = TestObserver<Bool, Never>()
private let metadataText = TestObserver<String, Never>()
private let prelaunchProject = TestObserver<Bool, Never>()
private let percentFundedText = TestObserver<String, Never>()
private let photoURL = TestObserver<String, Never>()
private let progress = TestObserver<Float, Never>()
Expand All @@ -24,6 +25,7 @@ internal final class BackerDashboardProjectCellViewModelTests: TestCase {
self.vm.outputs.percentFundedText.map { $0.string }.observe(self.percentFundedText.observer)
self.vm.outputs.photoURL.map { $0?.absoluteString ?? "" }.observe(self.photoURL.observer)
self.vm.outputs.progress.observe(self.progress.observer)
self.vm.outputs.prelaunchProject.observe(self.prelaunchProject.observer)
self.vm.outputs.progressBarColor.observe(self.progressBarColor.observer)
self.vm.outputs.projectTitleText.map { $0.string }.observe(self.projectTitleText.observer)
self.vm.outputs.savedIconIsHidden.observe(self.savedIconIsHidden.observer)
Expand Down Expand Up @@ -107,4 +109,18 @@ internal final class BackerDashboardProjectCellViewModelTests: TestCase {
self.projectTitleText.assertValues(["Best of Lazy Bathtub Cat"])
self.savedIconIsHidden.assertValues([false])
}

func testProjectData_Prelaunch() {
let project = .template
|> Project.lens.name .~ "Best of Lazy Bathtub Cat"
|> Project.lens.photo.full .~ "http://www.lazybathtubcat.com/vespa.jpg"
|> Project.lens.displayPrelaunch .~ true
|> Project.lens.personalization.isStarred .~ true

self.prelaunchProject.assertDidNotEmitValue()

self.vm.inputs.configureWith(project: project)

self.prelaunchProject.assertValues([true])
}
}
22 changes: 22 additions & 0 deletions Library/ViewModels/MostPopularSearchProjectCellViewModel.swift
Expand Up @@ -25,6 +25,9 @@ public protocol MostPopularSearchProjectCellViewModelOutputs {

/// Emits project name to be displayed.
var projectName: Signal<NSAttributedString, Never> { get }

/// Emits to hide information about pledging when project is prelaunch
var prelaunchProject: Signal<Bool, Never> { get }
}

public protocol MostPopularSearchProjectCellViewModelType {
Expand All @@ -48,6 +51,8 @@ public final class MostPopularSearchProjectCellViewModel: MostPopularSearchProje
self.percentFundedText = project.map(percentFundedString(for:))

self.metadataText = project.map(metadataString(for:))

self.prelaunchProject = project.map(isProjectPrelaunch)
}

fileprivate let projectProperty = MutableProperty<Project?>(nil)
Expand All @@ -61,12 +66,27 @@ public final class MostPopularSearchProjectCellViewModel: MostPopularSearchProje
public let progressBarColor: Signal<UIColor, Never>
public let projectImageUrl: Signal<URL?, Never>
public let projectName: Signal<NSAttributedString, Never>
public let prelaunchProject: Signal<Bool, Never>

public var inputs: MostPopularSearchProjectCellViewModelInputs { return self }
public var outputs: MostPopularSearchProjectCellViewModelOutputs { return self }
}

private func isProjectPrelaunch(_ project: Project) -> Bool {
switch (project.displayPrelaunch, project.dates.launchedAt, project.prelaunchActivated) {
case (.some(true), _, _),
(_, _, .some(true)):
return true
case let (_, .some(timeValue), _):
return timeValue <= 0
default:
return false
}
}

private func metadataString(for project: Project) -> String {
guard !isProjectPrelaunch(project) else { return Strings.Coming_soon() }

switch project.state {
case .live:
guard let deadline = project.dates.deadline else {
Expand Down Expand Up @@ -99,6 +119,8 @@ private func percentFundedString(for project: Project) -> NSAttributedString {
}

private func progressBarColorForProject(_ project: Project) -> UIColor {
guard !isProjectPrelaunch(project) else { return .ksr_create_700 }

switch project.state {
case .live, .successful:
return .ksr_create_700
Expand Down
Expand Up @@ -10,6 +10,7 @@ internal final class MostPopularSearchProjectCellViewModelTests: TestCase {
private let metadataText = TestObserver<String, Never>()
private let percentFundedText = TestObserver<String, Never>()
private let progress = TestObserver<Float, Never>()
private let prelaunchProject = TestObserver<Bool, Never>()
private let progressBarColor = TestObserver<UIColor, Never>()
private let projectImageUrl = TestObserver<String, Never>()
private let projectName = TestObserver<String, Never>()
Expand All @@ -22,6 +23,7 @@ internal final class MostPopularSearchProjectCellViewModelTests: TestCase {
self.vm.outputs.progressBarColor.observe(self.progressBarColor.observer)
self.vm.outputs.projectImageUrl.map { $0?.absoluteString ?? "" }.observe(self.projectImageUrl.observer)
self.vm.outputs.projectName.map { $0.string }.observe(self.projectName.observer)
self.vm.outputs.prelaunchProject.observe(self.prelaunchProject.observer)
}

func testProjectData_Live() {
Expand Down Expand Up @@ -87,4 +89,18 @@ internal final class MostPopularSearchProjectCellViewModelTests: TestCase {
self.projectImageUrl.assertValues(["http://wwww.cosmicsurgery.com/theproject.jpg"])
self.projectName.assertValues(["Cosmic Surgery"])
}

func testProjectData_Prelaunch() {
let project = .template
|> Project.lens.name .~ "Best of Lazy Bathtub Cat"
|> Project.lens.photo.full .~ "http://www.lazybathtubcat.com/vespa.jpg"
|> Project.lens.displayPrelaunch .~ true
|> Project.lens.personalization.isStarred .~ true

self.prelaunchProject.assertDidNotEmitValue()

self.vm.inputs.configureWith(project: project)

self.prelaunchProject.assertValues([true])
}
}

0 comments on commit d1cd72e

Please sign in to comment.