added view in timeline action, added tests

This commit is contained in:
Flavio Alescio
2023-01-27 15:07:32 +01:00
parent 0188075f57
commit 5ea70aacd8
15 changed files with 141 additions and 87 deletions
@@ -20,9 +20,7 @@ import Combine
import MatrixSDK
struct PollHistoryDetailCoordinatorParameters {
let pollHistoryDetails: TimelinePollDetails
let event: MXEvent
let session: MXSession
let room: MXRoom
}
@@ -30,7 +28,6 @@ final class PollHistoryDetailCoordinator: Coordinator, Presentable {
private let parameters: PollHistoryDetailCoordinatorParameters
private let pollHistoryDetailHostingController: UIViewController
private var pollHistoryDetailViewModel: PollHistoryDetailViewModelProtocol
private var cancellables = Set<AnyCancellable>()
private var indicatorPresenter: UserIndicatorTypePresenterProtocol
private var loadingIndicator: UserIndicator?
@@ -40,9 +37,9 @@ final class PollHistoryDetailCoordinator: Coordinator, Presentable {
init(parameters: PollHistoryDetailCoordinatorParameters) throws {
self.parameters = parameters
let timelinePollCoordinator = try TimelinePollCoordinator(parameters: .init(session: parameters.session, room: parameters.room, pollEvent: parameters.event))
let timelinePollCoordinator = try TimelinePollCoordinator(parameters: .init(session: parameters.room.mxSession, room: parameters.room, pollEvent: parameters.event))
let viewModel = PollHistoryDetailViewModel(pollHistoryDetails: parameters.pollHistoryDetails, timelineViewModel: timelinePollCoordinator.viewModel)
let viewModel = PollHistoryDetailViewModel(timelineViewModel: timelinePollCoordinator.viewModel)
let view = PollHistoryDetail(viewModel: viewModel.context)
pollHistoryDetailViewModel = viewModel
@@ -25,7 +25,7 @@ enum MockPollHistoryDetailScreenState: MockScreenState, CaseIterable {
case closedPollEnded
var screenType: Any.Type {
TimelinePollDetails.self
PollHistoryDetail.self
}
var poll: TimelinePollDetails {
@@ -37,7 +37,7 @@ enum MockPollHistoryDetailScreenState: MockScreenState, CaseIterable {
question: "Question",
answerOptions: answerOptions,
closed: self == .closedDisclosed || self == .closedUndisclosed ? true : false,
startDate: .init(),
startDate: .init(timeIntervalSinceReferenceDate: 0),
totalAnswerCount: 20,
type: self == .closedDisclosed || self == .openDisclosed ? .disclosed : .undisclosed,
eventType: self == .closedPollEnded ? .ended : .started,
@@ -49,7 +49,7 @@ enum MockPollHistoryDetailScreenState: MockScreenState, CaseIterable {
var screenView: ([Any], AnyView) {
let viewModel = PollHistoryDetailViewModel(pollHistoryDetails: poll, timelineViewModel: TimelinePollViewModel(timelinePollDetails: poll))
let viewModel = PollHistoryDetailViewModel(timelineViewModel: TimelinePollViewModel(timelinePollDetails: poll))
return ([viewModel], AnyView(PollHistoryDetail(viewModel: viewModel.context)))
}
@@ -32,8 +32,13 @@ enum PollHistoryDetailViewModelResult {
// MARK: View
struct PollHistoryDetailViewState: BindableState {
var poll: TimelinePollDetails
var timelineViewModel: TimelinePollViewModelProtocol
var pollStartDate: Date {
timelineViewModel.context.viewState.poll.startDate
}
var isPollClosed: Bool {
timelineViewModel.context.viewState.poll.closed
}
}
enum PollHistoryDetailViewAction {
@@ -29,8 +29,8 @@ class PollHistoryDetailViewModel: PollHistoryDetailViewModelType, PollHistoryDet
// MARK: - Setup
init(pollHistoryDetails: TimelinePollDetails, timelineViewModel: TimelinePollViewModelProtocol) {
super.init(initialViewState: PollHistoryDetailViewState(poll: pollHistoryDetails, timelineViewModel: timelineViewModel))
init(timelineViewModel: TimelinePollViewModelProtocol) {
super.init(initialViewState: PollHistoryDetailViewState(timelineViewModel: timelineViewModel))
}
// MARK: - Public
@@ -18,21 +18,17 @@ import RiotSwiftUI
import XCTest
class PollHistoryDetailUITests: MockScreenTestCase {
func testPollHistoryDetailPromptRegular() {
let promptType = PollHistoryDetailPromptType.regular
app.goToScreenWithIdentifier(MockPollHistoryDetailScreenState.promptType(promptType).title)
let title = app.staticTexts["title"]
XCTAssert(title.exists)
XCTAssertEqual(title.label, promptType.title)
func testPollHistoryDetailOpenPoll() {
app.goToScreenWithIdentifier(MockPollHistoryDetailScreenState.openDisclosed.title)
XCTAssert(app.staticTexts["Active polls"].exists)
XCTAssert(app.staticTexts["1/1/01"].exists)
XCTAssert(app.buttons["View poll in timeline"].exists)
}
func testPollHistoryDetailPromptUpgrade() {
let promptType = PollHistoryDetailPromptType.upgrade
app.goToScreenWithIdentifier(MockPollHistoryDetailScreenState.promptType(promptType).title)
let title = app.staticTexts["title"]
XCTAssert(title.exists)
XCTAssertEqual(title.label, promptType.title)
func testPollHistoryDetailClosedPoll() {
app.goToScreenWithIdentifier(MockPollHistoryDetailScreenState.closedDisclosed.title)
XCTAssert(app.staticTexts["Past polls"].exists)
XCTAssert(app.staticTexts["1/1/01"].exists)
XCTAssert(app.buttons["View poll in timeline"].exists)
}
}
@@ -27,22 +27,28 @@ class PollHistoryDetailViewModelTests: XCTestCase {
var context: PollHistoryDetailViewModelType.Context!
override func setUpWithError() throws {
viewModel = PollHistoryDetailViewModel(promptType: .regular, initialCount: Constants.counterInitialValue)
let answerOptions = [TimelinePollAnswerOption(id: "1", text: "1", count: 1, winner: false, selected: false),
TimelinePollAnswerOption(id: "2", text: "2", count: 1, winner: false, selected: false),
TimelinePollAnswerOption(id: "3", text: "3", count: 1, winner: false, selected: false)]
let timelinePoll = TimelinePollDetails(id: "poll-id",
question: "Question",
answerOptions: answerOptions,
closed: false,
startDate: .init(),
totalAnswerCount: 3,
type: .disclosed,
eventType: .started,
maxAllowedSelections: 1,
hasBeenEdited: false,
hasDecryptionError: false)
viewModel = PollHistoryDetailViewModel(timelineViewModel: TimelinePollViewModel(timelinePollDetails: timelinePoll))
context = viewModel.context
}
func testInitialState() {
XCTAssertEqual(context.viewState.count, Constants.counterInitialValue)
}
func testCounter() throws {
context.send(viewAction: .incrementCount)
XCTAssertEqual(context.viewState.count, 1)
context.send(viewAction: .incrementCount)
XCTAssertEqual(context.viewState.count, 2)
context.send(viewAction: .decrementCount)
XCTAssertEqual(context.viewState.count, 1)
XCTAssertFalse(context.viewState.isPollClosed)
}
}
@@ -47,41 +47,51 @@ struct PollHistoryDetail: View {
}
private var content: some View {
let timelineViewModel = viewModel.viewState.timelineViewModel
return VStack {
TimelinePollView(viewModel: timelineViewModel.context)
.navigationTitle(navigationTitle)
.navigationBarTitleDisplayMode(.inline)
.navigationBarBackButtonHidden(true)
.navigationBarItems(leading: btnBack)
viewInTimeline
return ScrollView {
VStack(alignment: .leading) {
Text(DateFormatter.pollShortDateFormatter.string(from: viewModel.viewState.pollStartDate))
.foregroundColor(theme.colors.tertiaryContent)
.font(theme.fonts.caption1)
.padding([.top])
TimelinePollView(viewModel: timelineViewModel.context)
.navigationTitle(navigationTitle)
.navigationBarTitleDisplayMode(.inline)
.navigationBarBackButtonHidden(true)
.navigationBarItems(leading: btnBack, trailing: btnDone)
viewInTimeline
}
}
}
private var btnBack : some View {
private var btnBack: some View {
Button(action: {
viewModel.send(viewAction: .dismiss)
}) {
Image(systemName: "xmark") //"chevron.left"
Image(systemName: "chevron.left")
.aspectRatio(contentMode: .fit)
.foregroundColor(theme.colors.accent)
}
}
private var btnDone: some View {
Button {
viewModel.send(viewAction: .dismiss)
} label: {
Text(VectorL10n.done)
}
.accentColor(theme.colors.accent)
}
private var viewInTimeline: some View {
HStack {
Button {
viewModel.send(viewAction: .viewInTimeline)
} label: {
Text(VectorL10n.pollHistoryDetailViewInTimeline)
}
.accentColor(theme.colors.accent)
Spacer()
Button {
viewModel.send(viewAction: .viewInTimeline)
} label: {
Text(VectorL10n.pollHistoryDetailViewInTimeline)
}
.accentColor(theme.colors.accent)
}
private var navigationTitle: String {
let poll = viewModel.viewState.poll
if poll.closed {
if viewModel.viewState.isPollClosed {
return VectorL10n.pollHistoryPastSegmentTitle
} else {
return VectorL10n.pollHistoryActiveSegmentTitle