From 45a26ac63799a553730f6191ea9d8bdc01bb330d Mon Sep 17 00:00:00 2001 From: iamgabrielma Date: Thu, 23 Jan 2025 08:43:16 +0100 Subject: [PATCH 1/2] Validate empty cash user input as zero --- .../ViewHelpers/CollectCashViewHelper.swift | 4 +- .../CollectCashViewHelperTests.swift | 55 +++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/WooCommerce/Classes/POS/ViewHelpers/CollectCashViewHelper.swift b/WooCommerce/Classes/POS/ViewHelpers/CollectCashViewHelper.swift index 5c64de135c7..79ca11c6b2e 100644 --- a/WooCommerce/Classes/POS/ViewHelpers/CollectCashViewHelper.swift +++ b/WooCommerce/Classes/POS/ViewHelpers/CollectCashViewHelper.swift @@ -36,8 +36,10 @@ final class CollectCashViewHelper { func validateAmountOnSubmit(orderTotal: String, textFieldAmountInput: String, onError: (String) -> Void) -> Bool { + let userInput = textFieldAmountInput.isEmpty ? "0" : textFieldAmountInput + guard let orderDecimal = parseCurrency(orderTotal), - let inputDecimal = parseCurrency(textFieldAmountInput) else { + let inputDecimal = parseCurrency(userInput) else { onError(Localization.failedToCollectCashPayment) return false } diff --git a/WooCommerce/WooCommerceTests/POS/ViewModels/CollectCashViewHelperTests.swift b/WooCommerce/WooCommerceTests/POS/ViewModels/CollectCashViewHelperTests.swift index fa2ecbc2033..a6561bb7e8e 100644 --- a/WooCommerce/WooCommerceTests/POS/ViewModels/CollectCashViewHelperTests.swift +++ b/WooCommerce/WooCommerceTests/POS/ViewModels/CollectCashViewHelperTests.swift @@ -207,4 +207,59 @@ struct CollectCashViewHelperTests { #expect(result == false) #expect(capturedErrorMessage == expectedErrorMessage) } + + @Test func validateAmountOnSubmit_when_input_is_empty_then_returns_true() { + // Given + let orderTotal = "$0.00" + let inputAmount = "" + + // When + let result = sut.validateAmountOnSubmit( + orderTotal: orderTotal, + textFieldAmountInput: inputAmount, + onError: { _ in }) + + // Then + #expect(result == true) + } + + @Test func validateAmountOnSubmit_when_orderTotal_is_empty_then_returns_false_with_expected_error_message() { + // Given + let orderTotal = "" + let inputAmount = "" + let expectedErrorMessage = "Error trying to process payment. Try again." + var capturedErrorMessage: String? + + // When + let result = sut.validateAmountOnSubmit( + orderTotal: orderTotal, + textFieldAmountInput: inputAmount, + onError: { error in + capturedErrorMessage = error + }) + + // Then + #expect(result == false) + #expect(capturedErrorMessage == expectedErrorMessage) + } + + @Test func validateAmountOnSubmit_when_inputDecimal_is_empty_and_less_than_orderTotal_then_returns_false_with_expected_error_message() { + // Given + let orderTotal = "$1.00" + let inputAmount = "" + let expectedErrorMessage = "Amount must be more or equal to total." + var capturedErrorMessage: String? + + // When + let result = sut.validateAmountOnSubmit( + orderTotal: orderTotal, + textFieldAmountInput: inputAmount, + onError: { error in + capturedErrorMessage = error + }) + + // Then + #expect(result == false) + #expect(capturedErrorMessage == expectedErrorMessage) + } } From 29b3990e37903911b2ba9eae2d428b5fed8bc7e3 Mon Sep 17 00:00:00 2001 From: iamgabrielma Date: Thu, 23 Jan 2025 10:13:17 +0100 Subject: [PATCH 2/2] switch logic to handle most common case first --- WooCommerce/Classes/POS/ViewHelpers/CollectCashViewHelper.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WooCommerce/Classes/POS/ViewHelpers/CollectCashViewHelper.swift b/WooCommerce/Classes/POS/ViewHelpers/CollectCashViewHelper.swift index 79ca11c6b2e..a80717b45a1 100644 --- a/WooCommerce/Classes/POS/ViewHelpers/CollectCashViewHelper.swift +++ b/WooCommerce/Classes/POS/ViewHelpers/CollectCashViewHelper.swift @@ -36,7 +36,7 @@ final class CollectCashViewHelper { func validateAmountOnSubmit(orderTotal: String, textFieldAmountInput: String, onError: (String) -> Void) -> Bool { - let userInput = textFieldAmountInput.isEmpty ? "0" : textFieldAmountInput + let userInput = textFieldAmountInput.isNotEmpty ? textFieldAmountInput : "0" guard let orderDecimal = parseCurrency(orderTotal), let inputDecimal = parseCurrency(userInput) else {