From 1c567f6c34fe854f38754590419f5895e11713ca Mon Sep 17 00:00:00 2001 From: Josh Heald Date: Thu, 4 Sep 2025 12:48:59 +0100 Subject: [PATCH 01/14] Fix two failing analytics tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When I run tests locally, `sendReceipt_tracks_failure_with_eligible_for_pos_receipt` and `sendReceipt_tracks_success_with_eligible_for_pos_receipt` would always fail on the check for `#expect(analyticsProvider.receivedProperties[indexOfEvent]["eligible_for_pos_receipt”] == {value})`. It’s using index 1, because index 0 was an `order_created` event, which has no properties. That meant that the arrays for properties and events didn’t line up. When we expected index 1, the tests crashed because of the index being out of range. I don’t know yet why these aren’t blocking CI. To fix it, we simply reset the saved events before the `When` in each test. --- .../POS/Controllers/PointOfSaleOrderControllerTests.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift b/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift index bfb76d337d0..8be3ec85afa 100644 --- a/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift +++ b/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift @@ -638,6 +638,7 @@ struct PointOfSaleOrderControllerTests { // We need an existing order before we can send a receipt await sut.syncOrder(for: .init(purchasableItems: [makeItem()]), retryHandler: { }) + analyticsProvider.receivedEvents.removeAll() // When try await sut.sendReceipt(recipientEmail: "test@example.com") @@ -683,6 +684,7 @@ struct PointOfSaleOrderControllerTests { // We need an existing order before we can send a receipt await sut.syncOrder(for: .init(purchasableItems: [makeItem()]), retryHandler: { }) + analyticsProvider.receivedEvents.removeAll() // When do { From c0c889f19a292b57846e7c4b6d5ec51b935aa54d Mon Sep 17 00:00:00 2001 From: Josh Heald Date: Thu, 4 Sep 2025 13:48:37 +0100 Subject: [PATCH 02/14] Prevent cha-ching sound in POSOrderControllerTests --- .../Controllers/PointOfSaleOrderControllerTests.swift | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift b/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift index 8be3ec85afa..8c5db0fba75 100644 --- a/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift +++ b/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift @@ -220,7 +220,8 @@ struct PointOfSaleOrderControllerTests { do { // Given/When let sut = PointOfSaleOrderController(orderService: mockOrderService, - receiptService: mockReceiptService) + receiptService: mockReceiptService, + celebration: MockPaymentCaptureCelebration()) try await sut.collectCashPayment(changeDueAmount: nil) } catch let error as PointOfSaleOrderController.PointOfSaleOrderControllerError { // Then @@ -253,7 +254,8 @@ struct PointOfSaleOrderControllerTests { @Test func collectCashPayment_passes_changeDueAmount_to_order_service() async throws { // Given let sut = PointOfSaleOrderController(orderService: mockOrderService, - receiptService: mockReceiptService) + receiptService: mockReceiptService, + celebration: MockPaymentCaptureCelebration()) let orderItem = OrderItem.fake() let fakeOrder = Order.fake().copy(items: [orderItem]) @@ -600,7 +602,8 @@ struct PointOfSaleOrderControllerTests { let sut = PointOfSaleOrderController(orderService: orderService, receiptService: MockReceiptService(), - analytics: mockAnalytics) + analytics: mockAnalytics, + celebration: MockPaymentCaptureCelebration()) // In order to test the order controller failure we need to succeed first in creating a successful order: let orderItem = OrderItem.fake() From 858dad366ffab6ebfb41fdf7b342667f88dceb1d Mon Sep 17 00:00:00 2001 From: Josh Heald Date: Thu, 4 Sep 2025 14:34:37 +0100 Subject: [PATCH 03/14] Update to fastlane 2.228 --- Gemfile | 2 +- Gemfile.lock | 63 ++++++++++++++++++++++++++++------------------------ 2 files changed, 35 insertions(+), 30 deletions(-) diff --git a/Gemfile b/Gemfile index 4b40ce94f86..f0625a89df9 100644 --- a/Gemfile +++ b/Gemfile @@ -9,7 +9,7 @@ end gem 'danger-dangermattic', '~> 1.2' gem 'dotenv' # 2.217.0 includes a fix for Xcode 15 test results parsing in CI -gem 'fastlane', '~> 2.217' +gem 'fastlane', '~> 2.228' gem 'fastlane-plugin-firebase_app_distribution', '~> 0.10' gem 'fastlane-plugin-sentry', '~> 1.0' # This comment avoids typing to switch to a development version for testing. diff --git a/Gemfile.lock b/Gemfile.lock index befe6479747..b3e005ed3d9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -23,24 +23,27 @@ GEM artifactory (3.0.17) ast (2.4.2) atomos (0.1.3) - aws-eventstream (1.3.0) - aws-partitions (1.1029.0) - aws-sdk-core (3.214.1) + aws-eventstream (1.4.0) + aws-partitions (1.1154.0) + aws-sdk-core (3.232.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) aws-sigv4 (~> 1.9) + base64 + bigdecimal jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.96.0) - aws-sdk-core (~> 3, >= 3.210.0) + logger + aws-sdk-kms (1.112.0) + aws-sdk-core (~> 3, >= 3.231.0) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.176.1) - aws-sdk-core (~> 3, >= 3.210.0) + aws-sdk-s3 (1.198.0) + aws-sdk-core (~> 3, >= 3.231.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) - aws-sigv4 (1.10.1) + aws-sigv4 (1.12.1) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) - base64 (0.2.0) + base64 (0.3.0) benchmark (0.4.1) bigdecimal (3.2.2) buildkit (1.6.1) @@ -85,7 +88,7 @@ GEM rubocop (~> 1.0) declarative (0.0.20) diffy (3.4.4) - digest-crc (0.6.5) + digest-crc (0.7.0) rake (>= 12.0.0, < 14.0.0) domain_name (0.6.20240107) dotenv (2.8.1) @@ -108,12 +111,12 @@ GEM faraday (>= 0.8.0) http-cookie (~> 1.0.0) faraday-em_http (1.0.0) - faraday-em_synchrony (1.0.0) + faraday-em_synchrony (1.0.1) faraday-excon (1.1.0) faraday-http-cache (2.5.1) faraday (>= 0.8) faraday-httpclient (1.0.1) - faraday-multipart (1.1.0) + faraday-multipart (1.1.1) multipart-post (~> 2.0) faraday-net_http (1.0.2) faraday-net_http_persistent (1.2.0) @@ -122,8 +125,8 @@ GEM faraday-retry (1.0.3) faraday_middleware (1.2.1) faraday (~> 1.0) - fastimage (2.3.1) - fastlane (2.226.0) + fastimage (2.4.0) + fastlane (2.228.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) @@ -163,7 +166,7 @@ GEM tty-spinner (>= 0.8.0, < 1.0.0) word_wrap (~> 1.0.0) xcodeproj (>= 1.13.0, < 2.0.0) - xcpretty (~> 0.4.0) + xcpretty (~> 0.4.1) xcpretty-travis-formatter (>= 0.0.3, < 2.0.0) fastlane-plugin-firebase_app_distribution (0.10.0) google-apis-firebaseappdistribution_v1 (~> 0.3.0) @@ -213,12 +216,12 @@ GEM google-apis-core (>= 0.11.0, < 2.a) google-apis-storage_v1 (0.31.0) google-apis-core (>= 0.11.0, < 2.a) - google-cloud-core (1.7.1) + google-cloud-core (1.8.0) google-cloud-env (>= 1.0, < 3.a) google-cloud-errors (~> 1.0) google-cloud-env (1.6.0) faraday (>= 0.17.3, < 3.0) - google-cloud-errors (1.4.0) + google-cloud-errors (1.5.0) google-cloud-storage (1.47.0) addressable (~> 2.8) digest-crc (~> 0.4) @@ -236,13 +239,14 @@ GEM highline (2.0.3) http-cookie (1.0.8) domain_name (~> 0.5) - httpclient (2.8.3) + httpclient (2.9.0) + mutex_m i18n (1.14.7) concurrent-ruby (~> 1.0) java-properties (0.3.0) jmespath (1.6.2) - json (2.9.1) - jwt (2.10.1) + json (2.13.2) + jwt (2.10.2) base64 kramdown (2.5.1) rexml (>= 3.3.9) @@ -254,11 +258,12 @@ GEM mini_mime (1.1.5) mini_portile2 (2.8.9) minitest (5.25.5) - multi_json (1.15.0) + multi_json (1.17.0) multipart-post (2.4.1) + mutex_m (0.3.0) nanaimo (0.4.0) nap (1.1.0) - naturally (2.2.1) + naturally (2.3.0) nkf (0.2.0) nokogiri (1.18.8) mini_portile2 (~> 2.8.2) @@ -281,7 +286,7 @@ GEM highline (>= 1.6) options (~> 2.3.0) pstore (0.1.3) - public_suffix (4.0.7) + public_suffix (6.0.2) racc (1.8.1) rainbow (3.1.1) rake (12.3.3) @@ -294,7 +299,7 @@ GEM trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) retriable (3.1.2) - rexml (3.4.0) + rexml (3.4.2) rmagick (4.3.0) rouge (3.28.0) rubocop (1.68.0) @@ -313,16 +318,16 @@ GEM rubocop (~> 1.0) ruby-progressbar (1.13.0) ruby2_keywords (0.0.5) - rubyzip (2.3.2) + rubyzip (2.4.1) sawyer (0.9.2) addressable (>= 2.3.5) faraday (>= 0.17.3, < 3) securerandom (0.4.1) security (0.1.5) - signet (0.19.0) + signet (0.21.0) addressable (~> 2.8) faraday (>= 0.17.5, < 3.a) - jwt (>= 1.5, < 3.0) + jwt (>= 1.5, < 4.0) multi_json (~> 1.10) simctl (1.6.10) CFPropertyList @@ -352,7 +357,7 @@ GEM colored2 (~> 3.1) nanaimo (~> 0.4.0) rexml (>= 3.3.6, < 4.0) - xcpretty (0.4.0) + xcpretty (0.4.1) rouge (~> 3.28.0) xcpretty-travis-formatter (1.0.1) xcpretty (~> 0.2, >= 0.0.7) @@ -366,7 +371,7 @@ PLATFORMS DEPENDENCIES danger-dangermattic (~> 1.2) dotenv - fastlane (~> 2.217) + fastlane (~> 2.228) fastlane-plugin-firebase_app_distribution (~> 0.10) fastlane-plugin-sentry (~> 1.0) fastlane-plugin-wpmreleasetoolkit (~> 13.3, >= 13.3.1) From 7716d31afe288fa79775e877761d5fbe4521b5b9 Mon Sep 17 00:00:00 2001 From: Josh Heald Date: Thu, 4 Sep 2025 14:41:38 +0100 Subject: [PATCH 04/14] Newline to force tests to run --- .../POS/Controllers/PointOfSaleOrderControllerTests.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift b/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift index 8c5db0fba75..956b0e527cd 100644 --- a/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift +++ b/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift @@ -817,6 +817,7 @@ struct PointOfSaleOrderControllerTests { analytics: ServiceLocator.analytics, featureFlagService: mockFeatureFlagService, pluginsService: mockPluginsService) + mockOrderService.orderToReturn = Order.fake() // We need an existing order before we can update its email, and send a receipt: From 8191f9aa08c4041c070b57714b941c46a7cea294 Mon Sep 17 00:00:00 2001 From: Josh Heald Date: Thu, 4 Sep 2025 15:22:55 +0100 Subject: [PATCH 05/14] Print statements for debugging on CI --- .../POS/Controllers/PointOfSaleOrderControllerTests.swift | 6 ++++++ .../POS/Models/PointOfSaleAggregateModelTests.swift | 1 + 2 files changed, 7 insertions(+) diff --git a/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift b/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift index 956b0e527cd..efde54393b7 100644 --- a/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift +++ b/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift @@ -648,6 +648,9 @@ struct PointOfSaleOrderControllerTests { // Then let indexOfEvent = try #require(analyticsProvider.receivedEvents.firstIndex(where: { $0 == "receipt_email_success" })) + print(indexOfEvent) + print(analyticsProvider.receivedEvents) + print(analyticsProvider.receivedProperties) #expect(analyticsProvider.receivedProperties[indexOfEvent]["eligible_for_pos_receipt"] as? Bool == true) } @@ -663,6 +666,9 @@ struct PointOfSaleOrderControllerTests { } catch { // Then let indexOfEvent = try #require(analyticsProvider.receivedEvents.firstIndex(where: { $0 == "receipt_email_failed" })) + print(indexOfEvent) + print(analyticsProvider.receivedEvents) + print(analyticsProvider.receivedProperties) #expect(analyticsProvider.receivedProperties[indexOfEvent]["eligible_for_pos_receipt"] == nil) } } diff --git a/WooCommerce/WooCommerceTests/POS/Models/PointOfSaleAggregateModelTests.swift b/WooCommerce/WooCommerceTests/POS/Models/PointOfSaleAggregateModelTests.swift index ec9f4bbbbb7..b22e7b1a232 100644 --- a/WooCommerce/WooCommerceTests/POS/Models/PointOfSaleAggregateModelTests.swift +++ b/WooCommerce/WooCommerceTests/POS/Models/PointOfSaleAggregateModelTests.swift @@ -906,6 +906,7 @@ struct PointOfSaleAggregateModelTests { await sut.startCashPayment() // Then + print(analyticsProvider.receivedEvents) #expect(mockAnalyticsProvider.receivedEvents.first(where: { $0 == "cash_payment_tapped" }) != nil) } } From 1aad5735dc1dbe184892a6690724c64fbe2de36c Mon Sep 17 00:00:00 2001 From: Josh Heald Date: Thu, 4 Sep 2025 16:11:52 +0100 Subject: [PATCH 06/14] Debugging additions for eligibility --- .../Classes/POS/Controllers/PointOfSaleOrderController.swift | 1 + .../POS/Controllers/PointOfSaleOrderControllerTests.swift | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/WooCommerce/Classes/POS/Controllers/PointOfSaleOrderController.swift b/WooCommerce/Classes/POS/Controllers/PointOfSaleOrderController.swift index 091d09a5476..df8ecfebb63 100644 --- a/WooCommerce/Classes/POS/Controllers/PointOfSaleOrderController.swift +++ b/WooCommerce/Classes/POS/Controllers/PointOfSaleOrderController.swift @@ -125,6 +125,7 @@ protocol PointOfSaleOrderControllerProtocol { minimumVersion: POSReceiptEligibilityConstants.wcPluginMinimumVersion, siteID: order.siteID ) + print("POS receipt eligibility: \(posReceiptEligibility)") } else { posReceiptEligibility = false } diff --git a/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift b/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift index efde54393b7..afaad8708a8 100644 --- a/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift +++ b/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift @@ -629,7 +629,7 @@ struct PointOfSaleOrderControllerTests { let mockPluginsService = MockPluginsService() mockPluginsService.setMockPlugin(.wooCommerce, systemPlugin: SystemPlugin.fake().copy(plugin: "woocommerce/woocommerce.php", - version: "10.0.0-dev", + version: "10.0.0", active: true)) let sut = PointOfSaleOrderController(orderService: orderService, @@ -644,6 +644,7 @@ struct PointOfSaleOrderControllerTests { analyticsProvider.receivedEvents.removeAll() // When + print("Plugin state: \(String(describing: mockPluginsService.loadPluginInStorage(siteID: 1, plugin: .wooCommerce, isActive: true)))") try await sut.sendReceipt(recipientEmail: "test@example.com") // Then From 3c00a145e7fcb8a4692023b9b7ffbffc0e163fdb Mon Sep 17 00:00:00 2001 From: Josh Heald Date: Thu, 4 Sep 2025 16:12:06 +0100 Subject: [PATCH 07/14] Force feature flag state --- .../Controllers/PointOfSaleOrderControllerTests.swift | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift b/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift index afaad8708a8..82b2211a524 100644 --- a/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift +++ b/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift @@ -632,9 +632,13 @@ struct PointOfSaleOrderControllerTests { version: "10.0.0", active: true)) + let mockFeatureFlagService = MockFeatureFlagService() + mockFeatureFlagService.isFeatureFlagEnabledReturnValue[.pointOfSaleReceipts] = true + let sut = PointOfSaleOrderController(orderService: orderService, receiptService: receiptService, analytics: analytics, + featureFlagService: mockFeatureFlagService pluginsService: mockPluginsService) let order = Order.fake() orderService.orderToReturn = order @@ -657,9 +661,12 @@ struct PointOfSaleOrderControllerTests { @Test func sendReceipt_without_order_tracks_failure_without_eligible_for_pos_receipt() async throws { // Given + let mockFeatureFlagService = MockFeatureFlagService() + mockFeatureFlagService.isFeatureFlagEnabledReturnValue[.pointOfSaleReceipts] = true let sut = PointOfSaleOrderController(orderService: orderService, receiptService: receiptService, - analytics: analytics) + analytics: analytics, + featureFlagService: mockFeatureFlagService) // When do { From 30ed96055877d37031acc9252a43e8ca41004356 Mon Sep 17 00:00:00 2001 From: Josh Heald Date: Thu, 4 Sep 2025 16:47:39 +0100 Subject: [PATCH 08/14] Comma fix --- .../POS/Controllers/PointOfSaleOrderControllerTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift b/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift index 82b2211a524..004dead765e 100644 --- a/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift +++ b/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift @@ -638,7 +638,7 @@ struct PointOfSaleOrderControllerTests { let sut = PointOfSaleOrderController(orderService: orderService, receiptService: receiptService, analytics: analytics, - featureFlagService: mockFeatureFlagService + featureFlagService: mockFeatureFlagService, pluginsService: mockPluginsService) let order = Order.fake() orderService.orderToReturn = order From 8405d9a4d0b647ba8398985279a9f9b284c57bed Mon Sep 17 00:00:00 2001 From: Josh Heald Date: Thu, 4 Sep 2025 17:20:52 +0100 Subject: [PATCH 09/14] Use mock feature flag service in all receipt tests --- .../PointOfSaleOrderControllerTests.swift | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift b/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift index 004dead765e..02fc2fa0935 100644 --- a/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift +++ b/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift @@ -182,8 +182,11 @@ struct PointOfSaleOrderControllerTests { @Test func sendReceipt_when_there_is_no_order_then_will_not_trigger() async throws { // Given + let mockFeatureFlagService = MockFeatureFlagService() + mockFeatureFlagService.isFeatureFlagEnabledReturnValue[.pointOfSaleReceipts] = true let sut = PointOfSaleOrderController(orderService: mockOrderService, - receiptService: mockReceiptService) + receiptService: mockReceiptService, + featureFlagService: mockFeatureFlagService) let email = "test@example.com" // When @@ -199,8 +202,11 @@ struct PointOfSaleOrderControllerTests { @Test func sendReceipt_calls_both_updateOrder_and_sendReceipt() async throws { // Given + let mockFeatureFlagService = MockFeatureFlagService() + mockFeatureFlagService.isFeatureFlagEnabledReturnValue[.pointOfSaleReceipts] = true let sut = PointOfSaleOrderController(orderService: mockOrderService, - receiptService: mockReceiptService) + receiptService: mockReceiptService, + featureFlagService: mockFeatureFlagService) let order = Order.fake() let recipientEmail = "test@fake.com" mockOrderService.orderToReturn = order @@ -689,9 +695,12 @@ struct PointOfSaleOrderControllerTests { version: "10.0.0-dev", active: true)) + let mockFeatureFlagService = MockFeatureFlagService() + mockFeatureFlagService.isFeatureFlagEnabledReturnValue[.pointOfSaleReceipts] = true let sut = PointOfSaleOrderController(orderService: orderService, receiptService: receiptService, analytics: analytics, + featureFlagService: mockFeatureFlagService, pluginsService: mockPluginsService) receiptService.sendReceiptResult = .failure(DotcomError.unknown(code: "test_error", message: "Test error")) From c114e6935e95ffc810fe68f7bb989e185fd9e3d9 Mon Sep 17 00:00:00 2001 From: Josh Heald Date: Thu, 4 Sep 2025 17:23:29 +0100 Subject: [PATCH 10/14] Revert "Newline to force tests to run" This reverts commit 7716d31afe288fa79775e877761d5fbe4521b5b9. --- .../POS/Controllers/PointOfSaleOrderControllerTests.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift b/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift index 02fc2fa0935..7efae943f3f 100644 --- a/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift +++ b/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift @@ -840,7 +840,6 @@ struct PointOfSaleOrderControllerTests { analytics: ServiceLocator.analytics, featureFlagService: mockFeatureFlagService, pluginsService: mockPluginsService) - mockOrderService.orderToReturn = Order.fake() // We need an existing order before we can update its email, and send a receipt: From f58d22db0b50b36106305fc9a794f4819b877295 Mon Sep 17 00:00:00 2001 From: Josh Heald Date: Thu, 4 Sep 2025 17:23:29 +0100 Subject: [PATCH 11/14] Revert "Print statements for debugging on CI" This reverts commit 8191f9aa08c4041c070b57714b941c46a7cea294. --- .../POS/Controllers/PointOfSaleOrderControllerTests.swift | 6 ------ .../POS/Models/PointOfSaleAggregateModelTests.swift | 1 - 2 files changed, 7 deletions(-) diff --git a/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift b/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift index 7efae943f3f..372a97301d7 100644 --- a/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift +++ b/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift @@ -659,9 +659,6 @@ struct PointOfSaleOrderControllerTests { // Then let indexOfEvent = try #require(analyticsProvider.receivedEvents.firstIndex(where: { $0 == "receipt_email_success" })) - print(indexOfEvent) - print(analyticsProvider.receivedEvents) - print(analyticsProvider.receivedProperties) #expect(analyticsProvider.receivedProperties[indexOfEvent]["eligible_for_pos_receipt"] as? Bool == true) } @@ -680,9 +677,6 @@ struct PointOfSaleOrderControllerTests { } catch { // Then let indexOfEvent = try #require(analyticsProvider.receivedEvents.firstIndex(where: { $0 == "receipt_email_failed" })) - print(indexOfEvent) - print(analyticsProvider.receivedEvents) - print(analyticsProvider.receivedProperties) #expect(analyticsProvider.receivedProperties[indexOfEvent]["eligible_for_pos_receipt"] == nil) } } diff --git a/WooCommerce/WooCommerceTests/POS/Models/PointOfSaleAggregateModelTests.swift b/WooCommerce/WooCommerceTests/POS/Models/PointOfSaleAggregateModelTests.swift index b22e7b1a232..ec9f4bbbbb7 100644 --- a/WooCommerce/WooCommerceTests/POS/Models/PointOfSaleAggregateModelTests.swift +++ b/WooCommerce/WooCommerceTests/POS/Models/PointOfSaleAggregateModelTests.swift @@ -906,7 +906,6 @@ struct PointOfSaleAggregateModelTests { await sut.startCashPayment() // Then - print(analyticsProvider.receivedEvents) #expect(mockAnalyticsProvider.receivedEvents.first(where: { $0 == "cash_payment_tapped" }) != nil) } } From 928cf93e5fb0999e2b52d7bc8805da4742917a0e Mon Sep 17 00:00:00 2001 From: Josh Heald Date: Thu, 4 Sep 2025 17:23:29 +0100 Subject: [PATCH 12/14] Revert "Debugging additions for eligibility" This reverts commit 1aad5735dc1dbe184892a6690724c64fbe2de36c. --- .../Classes/POS/Controllers/PointOfSaleOrderController.swift | 1 - .../POS/Controllers/PointOfSaleOrderControllerTests.swift | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/WooCommerce/Classes/POS/Controllers/PointOfSaleOrderController.swift b/WooCommerce/Classes/POS/Controllers/PointOfSaleOrderController.swift index df8ecfebb63..091d09a5476 100644 --- a/WooCommerce/Classes/POS/Controllers/PointOfSaleOrderController.swift +++ b/WooCommerce/Classes/POS/Controllers/PointOfSaleOrderController.swift @@ -125,7 +125,6 @@ protocol PointOfSaleOrderControllerProtocol { minimumVersion: POSReceiptEligibilityConstants.wcPluginMinimumVersion, siteID: order.siteID ) - print("POS receipt eligibility: \(posReceiptEligibility)") } else { posReceiptEligibility = false } diff --git a/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift b/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift index 372a97301d7..025f5880cf0 100644 --- a/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift +++ b/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift @@ -635,7 +635,7 @@ struct PointOfSaleOrderControllerTests { let mockPluginsService = MockPluginsService() mockPluginsService.setMockPlugin(.wooCommerce, systemPlugin: SystemPlugin.fake().copy(plugin: "woocommerce/woocommerce.php", - version: "10.0.0", + version: "10.0.0-dev", active: true)) let mockFeatureFlagService = MockFeatureFlagService() @@ -654,7 +654,6 @@ struct PointOfSaleOrderControllerTests { analyticsProvider.receivedEvents.removeAll() // When - print("Plugin state: \(String(describing: mockPluginsService.loadPluginInStorage(siteID: 1, plugin: .wooCommerce, isActive: true)))") try await sut.sendReceipt(recipientEmail: "test@example.com") // Then From a48f878f8c301d7f9cf11ecfa01d7d6b1f7a282c Mon Sep 17 00:00:00 2001 From: Josh Heald Date: Thu, 4 Sep 2025 17:31:49 +0100 Subject: [PATCH 13/14] Update analytics tests for POS cash payment flow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See 363e0b0 for details – we moved the other event to be for the final step, not starting the flow. --- ...ckPOSCollectOrderPaymentAnalyticsTracker.swift | 3 ++- .../Models/PointOfSaleAggregateModelTests.swift | 15 ++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/WooCommerce/WooCommerceTests/POS/Mocks/MockPOSCollectOrderPaymentAnalyticsTracker.swift b/WooCommerce/WooCommerceTests/POS/Mocks/MockPOSCollectOrderPaymentAnalyticsTracker.swift index c1a14eef099..b60cb69b2a1 100644 --- a/WooCommerce/WooCommerceTests/POS/Mocks/MockPOSCollectOrderPaymentAnalyticsTracker.swift +++ b/WooCommerce/WooCommerceTests/POS/Mocks/MockPOSCollectOrderPaymentAnalyticsTracker.swift @@ -28,8 +28,9 @@ final class MockPOSCollectOrderPaymentAnalyticsTracker: POSCollectOrderPaymentAn // no-op } + var didCallTrackSuccessfulCashPayment = false func trackSuccessfulCashPayment() { - // no-op + didCallTrackSuccessfulCashPayment = true } var connectedReaderModel: String? diff --git a/WooCommerce/WooCommerceTests/POS/Models/PointOfSaleAggregateModelTests.swift b/WooCommerce/WooCommerceTests/POS/Models/PointOfSaleAggregateModelTests.swift index ec9f4bbbbb7..2410f5529ae 100644 --- a/WooCommerce/WooCommerceTests/POS/Models/PointOfSaleAggregateModelTests.swift +++ b/WooCommerce/WooCommerceTests/POS/Models/PointOfSaleAggregateModelTests.swift @@ -906,7 +906,20 @@ struct PointOfSaleAggregateModelTests { await sut.startCashPayment() // Then - #expect(mockAnalyticsProvider.receivedEvents.first(where: { $0 == "cash_payment_tapped" }) != nil) + #expect(mockAnalyticsProvider.receivedEvents.first(where: { $0 == "checkout_cash_payment_tapped" }) != nil) + } + + @Test func collectCashPayment_when_invoked_tracks_expected_event() async throws { + // Given + let analyticsTracker = MockPOSCollectOrderPaymentAnalyticsTracker() + let sut = makePointOfSaleAggregateModel(orderController: orderController, + collectOrderPaymentAnalyticsTracker: analyticsTracker) + + // When + try await sut.collectCashPayment(changeDueAmount: "0.00") + + // Then + #expect(analyticsTracker.didCallTrackSuccessfulCashPayment == true) } } From 94d00e7c0d9661405d437b9af45a38abfcf92b7d Mon Sep 17 00:00:00 2001 From: Josh Heald Date: Fri, 5 Sep 2025 10:14:13 +0100 Subject: [PATCH 14/14] Clear prior-logged properties which could break the tests Co-authored-by: Jaclyn Chen --- .../POS/Controllers/PointOfSaleOrderControllerTests.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift b/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift index 8c5db0fba75..d79ff52a987 100644 --- a/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift +++ b/WooCommerce/WooCommerceTests/POS/Controllers/PointOfSaleOrderControllerTests.swift @@ -642,6 +642,7 @@ struct PointOfSaleOrderControllerTests { // We need an existing order before we can send a receipt await sut.syncOrder(for: .init(purchasableItems: [makeItem()]), retryHandler: { }) analyticsProvider.receivedEvents.removeAll() + analyticsProvider.receivedProperties.removeAll() // When try await sut.sendReceipt(recipientEmail: "test@example.com") @@ -688,6 +689,7 @@ struct PointOfSaleOrderControllerTests { // We need an existing order before we can send a receipt await sut.syncOrder(for: .init(purchasableItems: [makeItem()]), retryHandler: { }) analyticsProvider.receivedEvents.removeAll() + analyticsProvider.receivedProperties.removeAll() // When do {