vector-im/element-ios/issues/5114 - Poll creation screen

- added input toolbar poll creation action.
- reordered input toolbar actions as per designs.
- added multiline text field and extracted common components.
This commit is contained in:
Stefan Ceriu
2021-11-01 16:52:00 +02:00
committed by Stefan Ceriu
parent 01188f593e
commit ba9c40cf2d
50 changed files with 1231 additions and 42 deletions

View File

@@ -0,0 +1,82 @@
// File created from SimpleUserProfileExample
// $ createScreen.sh Room/PollEditForm PollEditForm
//
// Copyright 2021 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import XCTest
import RiotSwiftUI
@available(iOS 14.0, *)
class PollEditFormUITests: XCTestCase {
private var app: XCUIApplication!
override func setUp() {
continueAfterFailure = false
app = XCUIApplication()
app.launch()
app.buttons[MockPollEditFormScreenState.screenStateKeys.first!].tap()
}
func testInitialStateComponents() {
XCTAssert(app.scrollViews.firstMatch.exists)
XCTAssert(app.staticTexts["Create poll"].exists)
XCTAssert(app.staticTexts["Poll question or topic"].exists)
XCTAssert(app.staticTexts["Question or topic"].exists)
XCTAssert(app.staticTexts["Create options"].exists)
XCTAssert(app.textViews.count == 1)
XCTAssert(app.textFields.count == 2)
XCTAssert(app.staticTexts["Option 1"].exists)
XCTAssert(app.staticTexts["Option 2"].exists)
let cancelButton = app.buttons["Cancel"]
XCTAssert(cancelButton.exists)
XCTAssertTrue(cancelButton.isEnabled)
let addOptionButton = app.buttons["Add option"]
XCTAssert(addOptionButton.exists)
XCTAssertTrue(addOptionButton.isEnabled)
let createPollButton = app.buttons["Create poll"]
XCTAssert(createPollButton.exists)
XCTAssertFalse(createPollButton.isEnabled)
}
func testRemoveAddAnswerOptions() {
let deleteAnswerOptionButton = app.buttons["Delete answer option"].firstMatch
XCTAssert(deleteAnswerOptionButton.waitForExistence(timeout: 2.0))
deleteAnswerOptionButton.tap()
XCTAssert(deleteAnswerOptionButton.waitForExistence(timeout: 2.0))
deleteAnswerOptionButton.tap()
let addOptionButton = app.buttons["Add option"]
XCTAssert(addOptionButton.waitForExistence(timeout: 2.0))
XCTAssertTrue(addOptionButton.isEnabled)
for i in 1...3 {
addOptionButton.tap()
XCTAssert(app.staticTexts["Option \(i)"].waitForExistence(timeout: 2.0))
}
}
}

View File

@@ -0,0 +1,123 @@
// File created from SimpleUserProfileExample
// $ createScreen.sh Room/PollEditForm PollEditForm
//
// Copyright 2021 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import XCTest
import Combine
@testable import RiotSwiftUI
@available(iOS 14.0, *)
class PollEditFormViewModelTests: XCTestCase {
var viewModel: PollEditFormViewModel!
var context: PollEditFormViewModelType.Context!
var cancellables = Set<AnyCancellable>()
override func setUpWithError() throws {
viewModel = PollEditFormViewModel()
context = viewModel.context
}
func testInitialState() {
XCTAssertTrue(context.question.text.isEmpty)
XCTAssertFalse(context.viewState.confirmationButtonEnabled)
XCTAssertTrue(context.viewState.addAnswerOptionButtonEnabled)
XCTAssertEqual(context.answerOptions.count, 2)
for answerOption in context.answerOptions {
XCTAssertTrue(answerOption.text.isEmpty)
}
}
func testDeleteAllAnswerOptions() {
while !context.answerOptions.isEmpty {
context.send(viewAction: .deleteAnswerOption(context.answerOptions.first!))
}
XCTAssertEqual(context.answerOptions.count, 0)
XCTAssertFalse(context.viewState.confirmationButtonEnabled)
XCTAssertTrue(context.viewState.addAnswerOptionButtonEnabled)
}
func testAddRemoveAnswerOption() {
context.send(viewAction: .addAnswerOption)
XCTAssertEqual(context.answerOptions.count, 3)
context.send(viewAction: .deleteAnswerOption(context.answerOptions.first!))
XCTAssertEqual(context.answerOptions.count, 2)
}
func testCreateEnabled() {
context.question.text = "Some question"
context.answerOptions[0].text = "First answer"
context.answerOptions[1].text = "Second answer"
XCTAssertTrue(context.viewState.confirmationButtonEnabled)
}
func testReachedMaxAnswerOptions() {
for _ in 0...context.viewState.maxAnswerOptionsCount {
context.send(viewAction: .addAnswerOption)
}
XCTAssertFalse(context.viewState.addAnswerOptionButtonEnabled)
}
func testQuestionMaxLength() {
let question = String(repeating: "S", count: context.question.maxLength + 100)
context.question.text = question
XCTAssertEqual(context.question.text.count, context.question.maxLength)
}
func testAnswerOptionMaxLength() {
let answerOption = String(repeating: "S", count: context.answerOptions[0].maxLength + 100)
context.answerOptions[0].text = answerOption
XCTAssertEqual(context.answerOptions[0].text.count, context.answerOptions[0].maxLength)
}
func testFormCompletion() {
let question = "Some question "
let firstAnswer = "First answer "
let secondAnswer = "Second answer "
let thirdAnswer = " "
viewModel.completion = { result in
if case PollEditFormViewModelResult.create(let resultQuestion, let resultAnswerOptions) = result {
XCTAssertEqual(question.trimmingCharacters(in: .whitespacesAndNewlines), resultQuestion)
// The last answer option should be automatically dropped as it's empty
XCTAssertEqual(resultAnswerOptions.count, 2)
XCTAssertEqual(resultAnswerOptions[0], firstAnswer.trimmingCharacters(in: .whitespacesAndNewlines))
XCTAssertEqual(resultAnswerOptions[1], secondAnswer.trimmingCharacters(in: .whitespacesAndNewlines))
}
}
context.question.text = question
context.answerOptions[0].text = firstAnswer
context.answerOptions[1].text = secondAnswer
context.send(viewAction: .addAnswerOption)
context.answerOptions[2].text = thirdAnswer
context.send(viewAction: .create)
}
}