mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-04-16 06:28:27 +02:00
save button improvement and tests updated
This commit is contained in:
@@ -23,7 +23,8 @@
|
||||
"kind" : "remoteSourceControl",
|
||||
"location" : "https://github.com/matrix-org/matrix-wysiwyg-composer-swift",
|
||||
"state" : {
|
||||
"revision" : "534ee5bae5e8de69ed398937b5edb7b5f21551d2"
|
||||
"revision" : "6927cb878376136c4a03d919b689af8dfbdad080",
|
||||
"version" : "0.19.0"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
@@ -59,20 +59,31 @@ extension ComposerLinkActionViewState {
|
||||
}
|
||||
|
||||
var isSaveButtonDisabled: Bool {
|
||||
guard isValidLink else { return true }
|
||||
guard !bindings.linkUrl.isEmpty else { return true }
|
||||
switch linkAction {
|
||||
case .createWithText: return bindings.text.isEmpty
|
||||
default: return false
|
||||
case .create: return false
|
||||
case .edit: return !bindings.hasEditedUrl
|
||||
}
|
||||
}
|
||||
|
||||
private var isValidLink: Bool {
|
||||
guard let url = URL(string: bindings.linkUrl) else { return false }
|
||||
return UIApplication.shared.canOpenURL(url)
|
||||
}
|
||||
}
|
||||
|
||||
struct ComposerLinkActionBindings {
|
||||
var text: String
|
||||
var linkUrl: String
|
||||
|
||||
private let initialLinkUrl: String
|
||||
fileprivate var hasEditedUrl = false
|
||||
var linkUrl: String {
|
||||
didSet {
|
||||
if !hasEditedUrl && linkUrl != initialLinkUrl {
|
||||
hasEditedUrl = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
init(text: String, linkUrl: String) {
|
||||
self.text = text
|
||||
self.linkUrl = linkUrl
|
||||
self.initialLinkUrl = linkUrl
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,9 +29,7 @@ final class ComposerLinkActionUITests: MockScreenTestCase {
|
||||
let linkTextField = app.textFields["linkTextField"]
|
||||
XCTAssertTrue(linkTextField.exists)
|
||||
linkTextField.tap()
|
||||
linkTextField.typeText("invalid url")
|
||||
XCTAssertFalse(saveButton.isEnabled)
|
||||
linkTextField.clearAndTypeText("https://element.io")
|
||||
linkTextField.clearAndTypeText("element.io")
|
||||
XCTAssertTrue(saveButton.isEnabled)
|
||||
}
|
||||
|
||||
@@ -47,7 +45,7 @@ final class ComposerLinkActionUITests: MockScreenTestCase {
|
||||
let linkTextField = app.textFields["linkTextField"]
|
||||
XCTAssertTrue(linkTextField.exists)
|
||||
linkTextField.tap()
|
||||
linkTextField.typeText("https://element.io")
|
||||
linkTextField.typeText("element.io")
|
||||
XCTAssertFalse(saveButton.isEnabled)
|
||||
textTextField.tap()
|
||||
textTextField.typeText("test")
|
||||
@@ -60,13 +58,15 @@ final class ComposerLinkActionUITests: MockScreenTestCase {
|
||||
XCTAssertTrue(app.buttons[VectorL10n.cancel].exists)
|
||||
let saveButton = app.buttons[VectorL10n.save]
|
||||
XCTAssertTrue(saveButton.exists)
|
||||
XCTAssertTrue(saveButton.isEnabled)
|
||||
XCTAssertFalse(saveButton.isEnabled)
|
||||
XCTAssertFalse(app.textFields["textTextField"].exists)
|
||||
let linkTextField = app.textFields["linkTextField"]
|
||||
XCTAssertTrue(linkTextField.exists)
|
||||
let value = linkTextField.value as? String
|
||||
XCTAssertEqual(value, "https://element.io")
|
||||
linkTextField.clearAndTypeText("invalid url")
|
||||
linkTextField.clearAndTypeText("")
|
||||
XCTAssertFalse(saveButton.isEnabled)
|
||||
linkTextField.clearAndTypeText("matrix.org")
|
||||
XCTAssertTrue(saveButton.isEnabled)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,29 +53,20 @@ final class ComposerLinkActionViewModelTests: XCTestCase {
|
||||
}
|
||||
|
||||
func testEditDefaultState() {
|
||||
let link = "https://element.io"
|
||||
let link = "element.io"
|
||||
setUp(with: .edit(link: link))
|
||||
XCTAssertEqual(context.viewState.bindings.text, "")
|
||||
XCTAssertEqual(context.viewState.bindings.linkUrl, link)
|
||||
XCTAssertFalse(context.viewState.isSaveButtonDisabled)
|
||||
XCTAssertTrue(context.viewState.isSaveButtonDisabled)
|
||||
XCTAssertTrue(context.viewState.shouldDisplayRemoveButton)
|
||||
XCTAssertFalse(context.viewState.shouldDisplayTextField)
|
||||
XCTAssertEqual(context.viewState.title, VectorL10n.wysiwygComposerLinkActionEditTitle)
|
||||
}
|
||||
|
||||
func testUrlValidityCheck() {
|
||||
setUp(with: .create)
|
||||
XCTAssertTrue(context.viewState.isSaveButtonDisabled)
|
||||
context.linkUrl = "invalid url"
|
||||
XCTAssertTrue(context.viewState.isSaveButtonDisabled)
|
||||
context.linkUrl = "https://element.io"
|
||||
XCTAssertFalse(context.viewState.isSaveButtonDisabled)
|
||||
}
|
||||
|
||||
func testTextNotEmptyCheck() {
|
||||
setUp(with: .createWithText)
|
||||
XCTAssertTrue(context.viewState.isSaveButtonDisabled)
|
||||
context.linkUrl = "https://element.io"
|
||||
context.linkUrl = "element.io"
|
||||
XCTAssertTrue(context.viewState.isSaveButtonDisabled)
|
||||
context.text = "text"
|
||||
XCTAssertFalse(context.viewState.isSaveButtonDisabled)
|
||||
@@ -92,7 +83,7 @@ final class ComposerLinkActionViewModelTests: XCTestCase {
|
||||
}
|
||||
|
||||
func testRemoveAction() {
|
||||
setUp(with: .edit(link: "https://element.io"))
|
||||
setUp(with: .edit(link: "element.io"))
|
||||
var result: ComposerLinkActionViewModelResult!
|
||||
viewModel.callback = { value in
|
||||
result = value
|
||||
@@ -107,7 +98,7 @@ final class ComposerLinkActionViewModelTests: XCTestCase {
|
||||
viewModel.callback = { value in
|
||||
result = value
|
||||
}
|
||||
let link = "https://element.io"
|
||||
let link = "element.io"
|
||||
context.linkUrl = link
|
||||
context.send(viewAction: .save)
|
||||
XCTAssertEqual(result, .performOperation(.setLink(urlString: link)))
|
||||
@@ -119,7 +110,7 @@ final class ComposerLinkActionViewModelTests: XCTestCase {
|
||||
viewModel.callback = { value in
|
||||
result = value
|
||||
}
|
||||
let link = "https://element.io"
|
||||
let link = "element.io"
|
||||
context.linkUrl = link
|
||||
let text = "test"
|
||||
context.text = text
|
||||
@@ -128,13 +119,15 @@ final class ComposerLinkActionViewModelTests: XCTestCase {
|
||||
}
|
||||
|
||||
func testSaveActionForEdit() {
|
||||
setUp(with: .edit(link: "https://element.io"))
|
||||
setUp(with: .edit(link: "element.io"))
|
||||
var result: ComposerLinkActionViewModelResult!
|
||||
viewModel.callback = { value in
|
||||
result = value
|
||||
}
|
||||
let link = "https://matrix.org"
|
||||
XCTAssertTrue(context.viewState.isSaveButtonDisabled)
|
||||
let link = "matrix.org"
|
||||
context.linkUrl = link
|
||||
XCTAssertFalse(context.viewState.isSaveButtonDisabled)
|
||||
context.send(viewAction: .save)
|
||||
XCTAssertEqual(result, .performOperation(.setLink(urlString: link)))
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ packages:
|
||||
branch: main
|
||||
WysiwygComposer:
|
||||
url: https://github.com/matrix-org/matrix-wysiwyg-composer-swift
|
||||
revision: 534ee5bae5e8de69ed398937b5edb7b5f21551d2
|
||||
version: 0.19.0
|
||||
DeviceKit:
|
||||
url: https://github.com/devicekit/DeviceKit
|
||||
majorVersion: 4.7.0
|
||||
|
||||
Reference in New Issue
Block a user