From 883544bd795678c4e6382ba7bab4476048a319cc Mon Sep 17 00:00:00 2001 From: Qazi Naveed Date: Fri, 10 Apr 2026 16:01:52 +0200 Subject: [PATCH 01/11] test(GiniBankSDK): Add simulator-compatible Skonto UI test using photo gallery PP-2483 --- .../GiniSkontoScreenUITests.swift | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift b/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift index efd7cc3d30..b59c24604b 100644 --- a/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift +++ b/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift @@ -50,6 +50,56 @@ class GiniSkontoScreenUITests: GiniBankSDKExampleUITests { XCTAssertTrue(mainScreen.photoPaymentButton.isHittable) } + + /** + Simulator-compatible variant of `testSkonto`. + Uses the photo gallery instead of the Files app, so no file needs to be + copied to the Files app on the simulator. + + Pre-condition: add the `skonto_past` image (PNG or JPG) to the simulator's + photo library before running this test. The method picks the **last** photo + in the library, so make sure the skonto image is the most recently added one. + */ + func testSkontoUsingGallery() { + //Tap Photopayment button + mainScreen.photoPaymentButton.tap() + //Handle Camera access pop up + mainScreen.handleCameraPermission(answer: true) + //Skip onboarding + onboadingScreen.skipOnboardingScreens() + //Tap Files button to open the upload menu + captureScreen.filesButton.tap() + //Tap Upload photo button to open the photo library picker + captureScreen.uploadPhotoButton.tap() + //Handle photo library permission alert if it appears + mainScreen.handlePhotoPermission(answer: true) + //Select the latest photo from the gallery (skonto_past image) + uploadLatestPhotoFromGallery() + //Wait for ReviewViewController and tap Process to trigger analysis + XCTAssertTrue(reviewScreen.processButton.waitForExistence(timeout: 10)) + reviewScreen.waitForElementToBecomeEnabled(reviewScreen.processButton) + reviewScreen.processButton.tap() + //Wait for analysis screen to finish if it appears + waitForAnalysisIfNeeded() + //Tap Got it button if the edge-case alert is displayed (only shown for expired/today/cash skonto) + if skontoScreen.gotItButton.waitForExistence(timeout: 10) { + skontoScreen.gotItButton.tap() + } + //Assert Skonto confirm button is visible and tap it + XCTAssertTrue(skontoScreen.proceedButton.waitForExistence(timeout: 5)) + skontoScreen.proceedButton.tap() + //Tap Only for this transaction if TransactionDocs bottom sheet appears (skipped if preference already saved) + if transactionDocsScreen.onlyForThisTransaction.waitForExistence(timeout: 5) { + transactionDocsScreen.onlyForThisTransaction.tap() + } + //Tap Done / Send feedback + XCTAssertTrue(mainScreen.sendFeedbackButton.waitForExistence(timeout: 5)) + mainScreen.sendFeedbackButton.tap() + //Assert Photopayment button is displayed + XCTAssertTrue(mainScreen.photoPaymentButton.isHittable) + } + + func testSkontoBackButton() { //Tap Photopayment button mainScreen.photoPaymentButton.tap() From ace5f049112c3ff386af0833cc8bdc1cb27102a1 Mon Sep 17 00:00:00 2001 From: Qazi Naveed Date: Fri, 10 Apr 2026 16:05:40 +0200 Subject: [PATCH 02/11] test(GiniBankSDK): Update docs string PP-2483 --- .../GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift | 3 --- 1 file changed, 3 deletions(-) diff --git a/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift b/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift index b59c24604b..c894e2778f 100644 --- a/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift +++ b/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift @@ -52,9 +52,6 @@ class GiniSkontoScreenUITests: GiniBankSDKExampleUITests { /** - Simulator-compatible variant of `testSkonto`. - Uses the photo gallery instead of the Files app, so no file needs to be - copied to the Files app on the simulator. Pre-condition: add the `skonto_past` image (PNG or JPG) to the simulator's photo library before running this test. The method picks the **last** photo From ac58a02c5d910db342c9dfd701e8bc7aa5bd29bd Mon Sep 17 00:00:00 2001 From: Qazi Naveed Date: Fri, 10 Apr 2026 16:06:24 +0200 Subject: [PATCH 03/11] refactor(GiniBankSDK): Fixed typo PP-2483 --- .../GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift b/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift index c894e2778f..2a195dc490 100644 --- a/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift +++ b/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift @@ -201,7 +201,7 @@ class GiniSkontoScreenUITests: GiniBankSDKExampleUITests { XCTAssertTrue((skontoScreen.skontoSwitch.value != nil), "0") } - func testSkontoHelpButtonbo() { + func testSkontoHelpButton() { //Tap Photopayment button mainScreen.photoPaymentButton.tap() //Handle Camera access pop up From fecb26138a8d2f53e57041627d86002033f9de23 Mon Sep 17 00:00:00 2001 From: Qazi Naveed Date: Fri, 10 Apr 2026 16:31:33 +0200 Subject: [PATCH 04/11] refactor(GiniBankSDKExample): Rename Skonto state test methods for clarity - Rename `testSkontoInFuture` to `testSkontoSwitchEnabledForValidDiscount` - Rename `testSkontoInPast` to `testSkontoSwitchDisabledForExpiredDiscount` - Names now reflect what each test verifies rather than the document state PP-2483 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift b/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift index 2a195dc490..f76b677ef0 100644 --- a/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift +++ b/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift @@ -159,7 +159,7 @@ class GiniSkontoScreenUITests: GiniBankSDKExampleUITests { } - func testSkontoInFuture() { + func testSkontoSwitchEnabledForValidDiscount() { //Tap Photopayment button mainScreen.photoPaymentButton.tap() //Handle Camera access pop up @@ -180,7 +180,7 @@ class GiniSkontoScreenUITests: GiniBankSDKExampleUITests { XCTAssertTrue((skontoScreen.skontoSwitch.value != nil), "1") } - func testSkontoInPast() { + func testSkontoSwitchDisabledForExpiredDiscount() { //Tap Photopayment button mainScreen.photoPaymentButton.tap() //Handle Camera access pop up From ce3c7ad3df944090726e9b33ea991b02494917f0 Mon Sep 17 00:00:00 2001 From: Qazi Naveed Date: Fri, 10 Apr 2026 19:56:50 +0200 Subject: [PATCH 05/11] fix(GiniBankSDKExample): Fix incorrect assertion in Skonto valid discount state test PP-2483 --- .../GiniSkontoScreenUITests.swift | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift b/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift index f76b677ef0..428e540d56 100644 --- a/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift +++ b/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift @@ -174,9 +174,9 @@ class GiniSkontoScreenUITests: GiniBankSDKExampleUITests { mainScreen.tapFileWithName(fileName: TestFixtures.Files.skontoValid) //tap Open button captureScreen.openGalleryButton.tap() - //Assert that Got it button is displayed - XCTAssertTrue(skontoScreen.gotItButton.waitForExistence(timeout: 10)) - //Assert that Switch is disabled + //Assert Skonto screen is shown (Got it button does NOT appear for valid/future skonto) + XCTAssertTrue(skontoScreen.proceedButton.waitForExistence(timeout: 10)) + //Assert that Switch is enabled for valid skonto XCTAssertTrue((skontoScreen.skontoSwitch.value != nil), "1") } @@ -195,9 +195,9 @@ class GiniSkontoScreenUITests: GiniBankSDKExampleUITests { mainScreen.tapFileWithName(fileName: TestFixtures.Files.skontoPast) //tap Open button captureScreen.openGalleryButton.tap() - //Assert that Got it button is displayed + //Assert that Got it button is displayed for expired skonto XCTAssertTrue(skontoScreen.gotItButton.waitForExistence(timeout: 10)) - //Assert that Switch is disabled + //Assert that Switch is disabled for expired skonto XCTAssertTrue((skontoScreen.skontoSwitch.value != nil), "0") } From a0723d50fbef622f57ce28883b56af3c3dbb1b10 Mon Sep 17 00:00:00 2001 From: Qazi Naveed Date: Fri, 10 Apr 2026 20:32:43 +0200 Subject: [PATCH 06/11] refactor(GiniBankSDK): Replace testSkontoUsingGallery with focused gallery upload test PP-2483 --- .../GiniSkontoScreenUITests.swift | 30 ++++++------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift b/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift index 428e540d56..ecb75787fe 100644 --- a/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift +++ b/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift @@ -52,12 +52,14 @@ class GiniSkontoScreenUITests: GiniBankSDKExampleUITests { /** + Verifies the complete Skonto flow is reachable when a document is uploaded via the photo gallery. + This test focuses on the gallery upload path — Skonto state assertions are covered by dedicated state tests. - Pre-condition: add the `skonto_past` image (PNG or JPG) to the simulator's - photo library before running this test. The method picks the **last** photo - in the library, so make sure the skonto image is the most recently added one. + Pre-condition: add the `skonto_valid` image (PNG or JPG) to the simulator's photo library before + running this test. The method picks the **last** photo in the library, so make sure it is the most + recently added one. */ - func testSkontoUsingGallery() { + func testSkontoFullFlowWithDiscountViaGallery() { //Tap Photopayment button mainScreen.photoPaymentButton.tap() //Handle Camera access pop up @@ -70,7 +72,7 @@ class GiniSkontoScreenUITests: GiniBankSDKExampleUITests { captureScreen.uploadPhotoButton.tap() //Handle photo library permission alert if it appears mainScreen.handlePhotoPermission(answer: true) - //Select the latest photo from the gallery (skonto_past image) + //Select the latest photo from the gallery (skonto_valid image) uploadLatestPhotoFromGallery() //Wait for ReviewViewController and tap Process to trigger analysis XCTAssertTrue(reviewScreen.processButton.waitForExistence(timeout: 10)) @@ -78,22 +80,8 @@ class GiniSkontoScreenUITests: GiniBankSDKExampleUITests { reviewScreen.processButton.tap() //Wait for analysis screen to finish if it appears waitForAnalysisIfNeeded() - //Tap Got it button if the edge-case alert is displayed (only shown for expired/today/cash skonto) - if skontoScreen.gotItButton.waitForExistence(timeout: 10) { - skontoScreen.gotItButton.tap() - } - //Assert Skonto confirm button is visible and tap it - XCTAssertTrue(skontoScreen.proceedButton.waitForExistence(timeout: 5)) - skontoScreen.proceedButton.tap() - //Tap Only for this transaction if TransactionDocs bottom sheet appears (skipped if preference already saved) - if transactionDocsScreen.onlyForThisTransaction.waitForExistence(timeout: 5) { - transactionDocsScreen.onlyForThisTransaction.tap() - } - //Tap Done / Send feedback - XCTAssertTrue(mainScreen.sendFeedbackButton.waitForExistence(timeout: 5)) - mainScreen.sendFeedbackButton.tap() - //Assert Photopayment button is displayed - XCTAssertTrue(mainScreen.photoPaymentButton.isHittable) + //Assert Skonto screen appeared — proves gallery upload was processed successfully + XCTAssertTrue(skontoScreen.proceedButton.waitForExistence(timeout: 10)) } From 101743df45922dfcab96a36ac89ec71a24022898 Mon Sep 17 00:00:00 2001 From: Qazi Naveed Date: Fri, 10 Apr 2026 20:44:45 +0200 Subject: [PATCH 07/11] refactor(GiniBankSDK): Replace testSkonto with focused upload file PP-2483 --- .../GiniSkontoScreenUITests.swift | 32 ++++++++----------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift b/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift index ecb75787fe..206677f0c9 100644 --- a/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift +++ b/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniSkontoScreenUITests.swift @@ -19,7 +19,13 @@ class GiniSkontoScreenUITests: GiniBankSDKExampleUITests { "skonto_valid" file with valid skonto */ - func testSkonto() { + /** + Verifies the complete Skonto flow is reachable when a document is uploaded via the Files app. + This test focuses on the Files upload path — Skonto state assertions are covered by dedicated state tests. + + Pre-condition: the `skonto_valid` file must be available in the Files app on the device or simulator. + */ + func testSkontoFullFlowWithDiscountViaFiles() { //Tap Photopayment button mainScreen.photoPaymentButton.tap() //Handle Camera access pop up @@ -28,26 +34,14 @@ class GiniSkontoScreenUITests: GiniBankSDKExampleUITests { onboadingScreen.skipOnboardingScreens() //Tap Files button captureScreen.filesButton.tap() - //Tap Upload photo button + //Tap Upload files button captureScreen.uploadFilesButton.tap() - //tap Skonto document - mainScreen.tapFileWithName(fileName: TestFixtures.Files.skontoPast) - //tap Open button + //Tap valid skonto document + mainScreen.tapFileWithName(fileName: TestFixtures.Files.skontoValid) + //Tap Open button captureScreen.openGalleryButton.tap() - //Assert that Got it button is displayed - XCTAssertTrue(skontoScreen.gotItButton.waitForExistence(timeout: 10)) - //Tap Got it button - skontoScreen.gotItButton.tap() - //Tap Proceed button - skontoScreen.proceedButton.tap() - //Tap Only for this transaction button - XCTAssertTrue(transactionDocsScreen.onlyForThisTransaction.waitForExistence(timeout: 5)) - transactionDocsScreen.onlyForThisTransaction.tap() - //Tap Send feedback and close - XCTAssertTrue(mainScreen.sendFeedbackButton.waitForExistence(timeout: 5)) - mainScreen.sendFeedbackButton.tap() - //Assert Photopayment button is displayed - XCTAssertTrue(mainScreen.photoPaymentButton.isHittable) + //Assert Skonto screen appeared — proves Files upload was processed successfully + XCTAssertTrue(skontoScreen.proceedButton.waitForExistence(timeout: 10)) } From 779c94fde9da47ec4e62e828bafca2f3890ff3b5 Mon Sep 17 00:00:00 2001 From: Qazi Naveed Date: Mon, 13 Apr 2026 14:30:34 +0200 Subject: [PATCH 08/11] test(GiniBankSDK): skip UI tests on CI PP-2483 --- .../GiniBankSDKExampleUITests/GiniBankSDKExampleUITests.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniBankSDKExampleUITests.swift b/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniBankSDKExampleUITests.swift index c6f3cab99f..b4d3c94ac9 100644 --- a/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniBankSDKExampleUITests.swift +++ b/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniBankSDKExampleUITests.swift @@ -30,8 +30,8 @@ class GiniBankSDKExampleUITests: XCTestCase { var isSimulator = false override func setUpWithError() throws { - - if isSimulator { + let isCI = ProcessInfo.processInfo.environment["CI"] != nil + if isSimulator || isCI { throw XCTSkip("Skipping test") } continueAfterFailure = false From d0b076fa7568ef679a07783132a01cbf78b52078 Mon Sep 17 00:00:00 2001 From: Qazi Naveed Date: Mon, 13 Apr 2026 15:57:43 +0200 Subject: [PATCH 09/11] Revert "test(GiniBankSDK): skip UI tests on CI" This reverts commit 779c94fde9da47ec4e62e828bafca2f3890ff3b5. --- .../GiniBankSDKExampleUITests/GiniBankSDKExampleUITests.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniBankSDKExampleUITests.swift b/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniBankSDKExampleUITests.swift index b4d3c94ac9..c6f3cab99f 100644 --- a/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniBankSDKExampleUITests.swift +++ b/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniBankSDKExampleUITests.swift @@ -30,8 +30,8 @@ class GiniBankSDKExampleUITests: XCTestCase { var isSimulator = false override func setUpWithError() throws { - let isCI = ProcessInfo.processInfo.environment["CI"] != nil - if isSimulator || isCI { + + if isSimulator { throw XCTSkip("Skipping test") } continueAfterFailure = false From 8332091a0154194e701dc31176b7d3e218ce8c28 Mon Sep 17 00:00:00 2001 From: Qazi Naveed Date: Mon, 13 Apr 2026 15:58:38 +0200 Subject: [PATCH 10/11] test(GiniBankSDK): skip UI tests on CI via code PP-2483 --- .../GiniBankSDKExampleUITests/GiniBankSDKExampleUITests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniBankSDKExampleUITests.swift b/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniBankSDKExampleUITests.swift index c6f3cab99f..808d5c559a 100644 --- a/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniBankSDKExampleUITests.swift +++ b/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniBankSDKExampleUITests.swift @@ -27,7 +27,7 @@ class GiniBankSDKExampleUITests: XCTestCase { var transactionSummaryScreen: TransactionSummaryScreen! var noResultsScreen: NoResultsScreen! var cxExtractionScreen: CXExtractionScreen! - var isSimulator = false + var isSimulator = true override func setUpWithError() throws { From 2edc9a8b38e12cb749764e3145742a699470c6f1 Mon Sep 17 00:00:00 2001 From: Qazi Naveed Date: Mon, 27 Apr 2026 10:36:18 +0200 Subject: [PATCH 11/11] refactor(GiniBankSDKExampleUITests): Replace isSimulator flag with targetEnvironment compiler directive PP-2483 --- .../GiniBankSDKExampleUITests.swift | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniBankSDKExampleUITests.swift b/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniBankSDKExampleUITests.swift index 808d5c559a..3452f676b4 100644 --- a/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniBankSDKExampleUITests.swift +++ b/BankSDK/GiniBankSDKExample/GiniBankSDKExampleUITests/GiniBankSDKExampleUITests.swift @@ -27,13 +27,11 @@ class GiniBankSDKExampleUITests: XCTestCase { var transactionSummaryScreen: TransactionSummaryScreen! var noResultsScreen: NoResultsScreen! var cxExtractionScreen: CXExtractionScreen! - var isSimulator = true - + override func setUpWithError() throws { - - if isSimulator { - throw XCTSkip("Skipping test") - } + #if targetEnvironment(simulator) + throw XCTSkip("Skipping test on simulator") + #endif continueAfterFailure = false app = XCUIApplication() app.launchArguments = ["-testing"] @@ -58,13 +56,13 @@ class GiniBankSDKExampleUITests: XCTestCase { } override func tearDownWithError() throws { + #if !targetEnvironment(simulator) let screenshot = XCUIScreen.main.screenshot() let attachment = XCTAttachment(screenshot: screenshot) - if !isSimulator { - attachment.lifetime = .deleteOnSuccess - add(attachment) - app.terminate() - } + attachment.lifetime = .deleteOnSuccess + add(attachment) + app.terminate() + #endif } var galleryTitle: String {