diff --git a/.github/workflows/build_test_upload.yml b/.github/workflows/build_test_upload.yml index a7ce05900e..93dc79ee97 100644 --- a/.github/workflows/build_test_upload.yml +++ b/.github/workflows/build_test_upload.yml @@ -4,30 +4,17 @@ on: pull_request: types: - opened - - edited - synchronize concurrency: - group: ${{ github.ref }} + group: ${{ github.ref }}-tests cancel-in-progress: true jobs: - danger: - runs-on: ubuntu-latest - name: "Run Danger" - steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - name: Danger - uses: docker://ghcr.io/danger/danger-swift-with-swiftlint@sha256:ed07386a85f1328619b49e3cfd737ffce351fcd2620d858cfc997d7e3e401b59 #v3.15.0 - with: - args: --failOnErrors --no-publish-check --remove-previous-comments - env: - GITHUB_TOKEN: ${{ github.token }} - unit-test: - needs: danger + debug-app-unit-tests: runs-on: macos-13-large timeout-minutes: 30 - name: "Unit Tests" + name: "Debug App - Unit Tests" steps: - name: Git - Checkout uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 @@ -62,11 +49,10 @@ jobs: MATCH_KEYCHAIN_NAME: ${{ secrets.MATCH_KEYCHAIN_NAME }} MATCH_KEYCHAIN_PASSWORD: ${{ secrets.MATCH_KEYCHAIN_PASSWORD }} SOURCE_BRANCH: ${{ github.head_ref }} - spm-build: - needs: unit-test - runs-on: macos-13 + sdk-unit-tests: + runs-on: macos-13-large timeout-minutes: 20 - name: "Build app with SPM Integration" + name: "SDK - Unit Tests" steps: - name: Cancel previous jobs uses: styfle/cancel-workflow-action@85880fa0301c86cca9da44039ee3bb12d3bedbfa # v0.12.1 @@ -79,7 +65,7 @@ jobs: - name: Select Xcode Version uses: maxim-lobanov/setup-xcode@60606e260d2fc5762a71e64e74b2174e8ea3c8bd # v1.6.0 with: - xcode-version: '14.3.1' + xcode-version: '15.2' - name: Install SSH key uses: shimataro/ssh-key-action@d4fffb50872869abe2d9a9098a6d9c5aa7d16be4 #v2.7.0 with: @@ -95,7 +81,7 @@ jobs: bundler-cache: true - name: Build SPM App run: | - bundle exec fastlane build_spm + bundle exec fastlane test_spm env: MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} MATCH_GIT_PRIVATE_KEY: ${{ secrets.SSH_KEY }} @@ -105,7 +91,9 @@ jobs: MATCH_KEYCHAIN_PASSWORD: ${{ secrets.MATCH_KEYCHAIN_PASSWORD }} SOURCE_BRANCH: ${{ github.head_ref }} build-and-upload-to-appetize: - needs: unit-test + needs: + - debug-app-unit-tests + - sdk-unit-tests runs-on: macos-13 timeout-minutes: 45 name: "Build and upload app to Appetize" diff --git a/.github/workflows/danger.yml b/.github/workflows/danger.yml new file mode 100644 index 0000000000..b1b6a934b7 --- /dev/null +++ b/.github/workflows/danger.yml @@ -0,0 +1,25 @@ +name: Danger + +on: + pull_request: + types: + - opened + - edited + - synchronize + +concurrency: + group: ${{ github.ref }}-danger + cancel-in-progress: true + +jobs: + danger: + runs-on: ubuntu-latest + name: "Run Danger" + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Danger + uses: docker://ghcr.io/danger/danger-swift-with-swiftlint@sha256:ed07386a85f1328619b49e3cfd737ffce351fcd2620d858cfc997d7e3e401b59 #v3.15.0 + with: + args: --failOnErrors --no-publish-check --remove-previous-comments + env: + GITHUB_TOKEN: ${{ github.token }} \ No newline at end of file diff --git a/.github/workflows/pod_lint.yml b/.github/workflows/pod_lint.yml index 896c4d1546..621a5778a3 100644 --- a/.github/workflows/pod_lint.yml +++ b/.github/workflows/pod_lint.yml @@ -4,7 +4,6 @@ on: pull_request: types: - opened - - edited - synchronize jobs: diff --git a/.github/workflows/sonarcloud.yml b/.github/workflows/sonarcloud.yml index cc99929e26..97ca09687f 100644 --- a/.github/workflows/sonarcloud.yml +++ b/.github/workflows/sonarcloud.yml @@ -1,10 +1,12 @@ name: Sonarcloud + on: push: branches: - master pull_request: types: [opened, synchronize, reopened] + jobs: sonarcloud: name: SonarCloud diff --git a/.swiftpm/xcode/xcshareddata/xcschemes/PrimerSDKTests.xcscheme b/.swiftpm/xcode/xcshareddata/xcschemes/PrimerSDKTests.xcscheme new file mode 100644 index 0000000000..a026ae7f37 --- /dev/null +++ b/.swiftpm/xcode/xcshareddata/xcschemes/PrimerSDKTests.xcscheme @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Dangerfile.swift b/Dangerfile.swift index 58bce0626a..3e315247a4 100644 --- a/Dangerfile.swift +++ b/Dangerfile.swift @@ -9,7 +9,7 @@ let allCreatedAndModifiedFiles = danger.git.modifiedFiles + danger.git.createdFi let sdkEditedFiles = allCreatedAndModifiedFiles .filter { $0.name != "Dangerfile.swift" } .filter { !$0.hasPrefix("Debug App/") } - + .filter { !$0.hasPrefix("Tests/") } // You can use these functions to send feedback: // message("Highlight something in the table") // warn("Something pretty bad, but not important enough to fail the build") diff --git a/Debug App/Podfile.lock b/Debug App/Podfile.lock index aedd9a9a6b..0a336365d9 100644 --- a/Debug App/Podfile.lock +++ b/Debug App/Podfile.lock @@ -4,9 +4,9 @@ PODS: - PrimerIPay88MYSDK (0.1.7) - PrimerKlarnaSDK (1.1.1) - PrimerNolPaySDK (1.0.1) - - PrimerSDK (2.26.1): - - PrimerSDK/Core (= 2.26.1) - - PrimerSDK/Core (2.26.1) + - PrimerSDK (2.26.2): + - PrimerSDK/Core (= 2.26.2) + - PrimerSDK/Core (2.26.2) DEPENDENCIES: - IQKeyboardManagerSwift @@ -34,7 +34,7 @@ SPEC CHECKSUMS: PrimerIPay88MYSDK: 436ee0be7e2c97e4e81456ccddee20175e9e3c4d PrimerKlarnaSDK: 564105170cc7b467bf95c31851813ea41c468f8b PrimerNolPaySDK: 08b140ed39b378a0b33b4f8746544a402175c0cc - PrimerSDK: 713186fdff6edb8c769b0d7fe67171b762c62437 + PrimerSDK: 31a56fb3a0d12210e55a8c5af8b9382e7cffdc83 PODFILE CHECKSUM: 4070d0f559c86f4414e465a26e3de7b095420546 diff --git a/Debug App/Primer.io Debug App SPM.xcodeproj/project.pbxproj b/Debug App/Primer.io Debug App SPM.xcodeproj/project.pbxproj index 97c4100a7b..82cb62e269 100644 --- a/Debug App/Primer.io Debug App SPM.xcodeproj/project.pbxproj +++ b/Debug App/Primer.io Debug App SPM.xcodeproj/project.pbxproj @@ -83,8 +83,6 @@ 1B8CB5A11A44AA9F3D7FE356 /* UserInterfaceModuleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInterfaceModuleTests.swift; sourceTree = ""; }; 1D05E65C196E6715D7D8B0C6 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Main.strings; sourceTree = ""; }; 1F23211288F9B61390C0BF8D /* Pods_Debug_App_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Debug_App_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F4E35F809D3FAF4354D5B05 /* URLSessionStackTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLSessionStackTests.swift; sourceTree = ""; }; - 1F79B50111AC4161CFB1EFE8 /* ApayaTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApayaTests.swift; sourceTree = ""; }; 229849A3DBE0858EE90673B9 /* CreateClientToken.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateClientToken.swift; sourceTree = ""; }; 25FD540BEA16ABBDFE7DE182 /* PayPalService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PayPalService.swift; sourceTree = ""; }; 2A328E38DA586FFE0ED2894B /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Main.strings; sourceTree = ""; }; @@ -145,7 +143,6 @@ A1604A656AF654D7422A2A5E /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Main.strings; sourceTree = ""; }; A6AEF11B151368BF993C3EA9 /* TestScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestScenario.swift; sourceTree = ""; }; AD381E7E16D01D8D743232F7 /* ThemeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeTests.swift; sourceTree = ""; }; - AF07D2421252EA2AE5C2FC4F /* AnalyticsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsTests.swift; sourceTree = ""; }; B18D7E7738BF86467B0F1465 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; B1FD8065D40A2D691F643F3B /* UIViewController+API.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+API.swift"; sourceTree = ""; }; B266F9E1651BD20E45DCCF68 /* PrimerRawRetailerDataTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrimerRawRetailerDataTests.swift; sourceTree = ""; }; @@ -176,7 +173,6 @@ E63F5C5C1FD2F3E6CB02EC5A /* HeadlessUniversalCheckoutTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlessUniversalCheckoutTests.swift; sourceTree = ""; }; E7640DB186F9638C2F556F77 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Main.strings; sourceTree = ""; }; E8DE1E4FB055B60582977315 /* Networking.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Networking.swift; sourceTree = ""; }; - E90441E821B5FE76643B62A6 /* AnalyticsTests+Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AnalyticsTests+Constants.swift"; sourceTree = ""; }; E9899972360BCA5992CEE5BC /* PrimerBancontactCardDataManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrimerBancontactCardDataManagerTests.swift; sourceTree = ""; }; EB6C18F747AEC20B8C63164C /* Pods_Debug_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Debug_App.framework; sourceTree = BUILT_PRODUCTS_DIR; }; EEB1E1B37192BF739461AFF1 /* PrimerRawCardDataManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrimerRawCardDataManagerTests.swift; sourceTree = ""; }; @@ -267,7 +263,6 @@ 2F23D3C9CC9CBC1B95329B1C /* Network */ = { isa = PBXGroup; children = ( - 1F4E35F809D3FAF4354D5B05 /* URLSessionStackTests.swift */, ); path = Network; sourceTree = ""; @@ -429,7 +424,6 @@ D83EED4C1249B62B908781B0 /* Data Models */ = { isa = PBXGroup; children = ( - 1F79B50111AC4161CFB1EFE8 /* ApayaTests.swift */, 31CFA93A373A7DB78DA77283 /* ApplePayTests.swift */, 5F8DC3341BDBB9AEDBE8D6DD /* DecodedClientToken.swift */, 7A5E6F7A9C12C69CB66032E3 /* IPay88Tests.swift */, @@ -447,7 +441,6 @@ D99811C39E1808A948623732 /* Unit Tests */ = { isa = PBXGroup; children = ( - E1A2F78003351E14426E0B36 /* Analytics */, D83EED4C1249B62B908781B0 /* Data Models */, 626776D8EFEF24D5C5A36307 /* Extensions */, A95565BDB7031F41ECD023D7 /* Helpers */, @@ -511,15 +504,6 @@ path = FormWithRedirect; sourceTree = ""; }; - E1A2F78003351E14426E0B36 /* Analytics */ = { - isa = PBXGroup; - children = ( - AF07D2421252EA2AE5C2FC4F /* AnalyticsTests.swift */, - E90441E821B5FE76643B62A6 /* AnalyticsTests+Constants.swift */, - ); - path = Analytics; - sourceTree = ""; - }; E4C8DBB82E4149A7C4D26467 /* Mocks */ = { isa = PBXGroup; children = ( diff --git a/Debug App/Primer.io Debug App.xcodeproj/project.pbxproj b/Debug App/Primer.io Debug App.xcodeproj/project.pbxproj index 15f6cffc10..c0c496cca9 100644 --- a/Debug App/Primer.io Debug App.xcodeproj/project.pbxproj +++ b/Debug App/Primer.io Debug App.xcodeproj/project.pbxproj @@ -7,145 +7,55 @@ objects = { /* Begin PBXBuildFile section */ - 0402B7B62AFBBA7200B02C75 /* CardNetworkTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0402B7B52AFBBA7200B02C75 /* CardNetworkTests.swift */; }; - 0402B7B82AFBBC2200B02C75 /* ApplePayUtilsTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0402B7B72AFBBC2200B02C75 /* ApplePayUtilsTest.swift */; }; 041295AA2AB9E25D00A4F243 /* MerchantHeadlessCheckoutNolPayViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 041295A92AB9E25D00A4F243 /* MerchantHeadlessCheckoutNolPayViewController.swift */; }; - 041295AD2AB9E2C100A4F243 /* PrimerHeadlessNolPayManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 041295AB2AB9E2A900A4F243 /* PrimerHeadlessNolPayManagerTests.swift */; }; - 041F52092ADE92A300A1D702 /* ListCardNetworksEndpointTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 041F52082ADE92A300A1D702 /* ListCardNetworksEndpointTests.swift */; }; - 04236A9B2B7D2EA50041EC11 /* JWTFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04236A9A2B7D2EA50041EC11 /* JWTFactory.swift */; }; - 042ED15D2AF010500027833F /* CardValidationServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 042ED15C2AF010500027833F /* CardValidationServiceTests.swift */; }; - 042ED1622AF0F5600027833F /* MockBINDataAPIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 042ED1612AF0F5600027833F /* MockBINDataAPIClient.swift */; }; - 042ED1652AF0F5FD0027833F /* MockRawDataManagerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 042ED1642AF0F5FD0027833F /* MockRawDataManagerDelegate.swift */; }; - 0442B6472B7BA4C7004DB054 /* MockPrimerAPIAnalyticsClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0442B6452B7BA498004DB054 /* MockPrimerAPIAnalyticsClient.swift */; }; - 0442B6492B7BA4CD004DB054 /* MockAnalyticsStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0442B6432B7BA477004DB054 /* MockAnalyticsStorage.swift */; }; - 044348DE2BB5B3D80072D97C /* DefaultNetworkServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 044348DD2BB5B3D80072D97C /* DefaultNetworkServiceTests.swift */; }; - 04769C152B1A680C0051581C /* Promises+Helper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04769C142B1A680C0051581C /* Promises+Helper.swift */; }; - 0479FB192AF2599A00D0AFC9 /* StringTyper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0479FB172AF2599200D0AFC9 /* StringTyper.swift */; }; - 047D8E892ADEA4C700A5E7BD /* NetworkService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 047D8E882ADEA4C700A5E7BD /* NetworkService.swift */; }; - 047EE2022BB47B1B006C775C /* NetworkingReportingServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 047EE2012BB47B1B006C775C /* NetworkingReportingServiceTests.swift */; }; - 0488648B2BA88F63007BCDA6 /* NetworkRequestFactoryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0488648A2BA88F63007BCDA6 /* NetworkRequestFactoryTests.swift */; }; - 0488648D2BA89402007BCDA6 /* CodingUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0488648C2BA89402007BCDA6 /* CodingUtilities.swift */; }; - 0488648F2BA89E04007BCDA6 /* NetworkResponseFactoryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0488648E2BA89E04007BCDA6 /* NetworkResponseFactoryTests.swift */; }; 0489E2BB2B68F71300FA0682 /* TapGestureRecognizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0489E2BA2B68F71300FA0682 /* TapGestureRecognizer.swift */; }; - 049298012B1DD466002E04B8 /* AnalyticsServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 049298002B1DD466002E04B8 /* AnalyticsServiceTests.swift */; }; - 049298072B1E1F4D002E04B8 /* AnalyticsStorageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 049298062B1E1F4D002E04B8 /* AnalyticsStorageTests.swift */; }; 049A055E2B4BF057002CEEBA /* MerchantHeadlessVaultManagerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 049A055D2B4BF057002CEEBA /* MerchantHeadlessVaultManagerViewController.swift */; }; - 049A05602B4C191D002CEEBA /* NativeUIManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 049A055F2B4C191D002CEEBA /* NativeUIManagerTests.swift */; }; - 04A153CF2BC40CE10018D805 /* RequestDispatcherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04A153CE2BC40CE10018D805 /* RequestDispatcherTests.swift */; }; - 04DAAED42B03EED1002E2614 /* AssetsManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04DAAED32B03EED1002E2614 /* AssetsManagerTests.swift */; }; - 04DAAED62B03EF0B002E2614 /* SDKSessionHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04DAAED52B03EF0B002E2614 /* SDKSessionHelper.swift */; }; - 04DFAADC2AAA01E60030FECE /* Debug App Tests-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 04DFAADB2AAA01E60030FECE /* Debug App Tests-Info.plist */; }; - 04F6EF742AE6A06200115D05 /* AnalyticsEventsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04F6EF732AE6A06200115D05 /* AnalyticsEventsTests.swift */; }; - 04FAF9EC2AE7B33E002E4BAE /* StringExtensionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04FAF9EB2AE7B33E002E4BAE /* StringExtensionTests.swift */; }; - 05290163DCB52E50E29AF612 /* Pods_Debug_App_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82C5808E70210187BAEC47B1 /* Pods_Debug_App_Tests.framework */; }; - 05FAC0D894B841B52E9E0A9A /* PrimerRawCardDataManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEB1E1B37192BF739461AFF1 /* PrimerRawCardDataManagerTests.swift */; }; - 088961D00784BD296EA9745C /* EncodingDecodingContainerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7D8E1E91CA11EC6831ADEE4 /* EncodingDecodingContainerTests.swift */; }; + 04F3235C2BD2F99000F5927C /* UIApplication+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04F3235B2BD2F99000F5927C /* UIApplication+Extensions.swift */; }; + 04F323612BD408C600F5927C /* AppetizeConfigTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04F3235D2BD408C600F5927C /* AppetizeConfigTests.swift */; }; + 04F323622BD408C600F5927C /* Debug App Tests-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 04F3235E2BD408C600F5927C /* Debug App Tests-Info.plist */; }; + 04F323632BD408C600F5927C /* MetadataParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04F3235F2BD408C600F5927C /* MetadataParserTests.swift */; }; + 04F323642BD409FE00F5927C /* BanksListModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = E11F47512B06C5030091C31F /* BanksListModel.swift */; }; + 04F323652BD40A0E00F5927C /* MerchantHeadlessCheckoutBankViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E129D66F2B162022004694F9 /* MerchantHeadlessCheckoutBankViewController.swift */; }; + 04F323662BD40A2300F5927C /* MerchantNewLineItemViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ED746F8924E70AD868BC0F4 /* MerchantNewLineItemViewController.swift */; }; 0BB8BB3F9A6AC28A0C107DC8 /* UIStackViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93F15C1E46C70C3D73B50F31 /* UIStackViewExtensions.swift */; }; 135E5BFD51371FABB5FF35D3 /* MerchantHeadlessCheckoutAvailablePaymentMethodsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72E691B9A6A8EBB9F6A6B266 /* MerchantHeadlessCheckoutAvailablePaymentMethodsViewController.swift */; }; 14EE32F4821BD1F19F75227F /* MerchantHeadlessCheckoutRawRetailDataViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C353D84EABA4990DAB4DD28 /* MerchantHeadlessCheckoutRawRetailDataViewController.swift */; }; - 1589385B62C86DE7C735F3EC /* PrimerAPIConfigurationModuleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C690FB7E6E8C942C87B1A1B /* PrimerAPIConfigurationModuleTests.swift */; }; - 161D4BE3FFD5E4A60F4461F0 /* CreateResumePaymentService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38DD0A9535544D446514124A /* CreateResumePaymentService.swift */; }; - 208CA849F3187C2DA63CC17B /* HUC_TokenizationViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A5E3ACDA26D44F66B55766B /* HUC_TokenizationViewModelTests.swift */; }; - 213196DEDF2A3A84037ED884 /* PollingModuleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49DFB1ACD5014BF28ED283B3 /* PollingModuleTests.swift */; }; - 242EF5037D6FB396B7AE1CB5 /* HeadlessUniversalCheckoutTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E63F5C5C1FD2F3E6CB02EC5A /* HeadlessUniversalCheckoutTests.swift */; }; - 24C060A48D4A2670FFC3426F /* ThreeDSErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF8639891B79E2FCCE10A510 /* ThreeDSErrorTests.swift */; }; - 25FA73D4BBA89962663B5378 /* Mocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4AC1EC0F98CB56DA4D075CA /* Mocks.swift */; }; - 2662EB3445AE8C7188953EFD /* HeadlessVaultManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AA706A14BACFDB8E5715788 /* HeadlessVaultManagerTests.swift */; }; - 2C98B33ECA68109C7A6AA134 /* PrimerBancontactCardDataManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9899972360BCA5992CEE5BC /* PrimerBancontactCardDataManagerTests.swift */; }; - 2E0D85B7343377F1319902AD /* MockPaymentMethodTokenizationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A23886804B13FA754E775D0 /* MockPaymentMethodTokenizationViewModel.swift */; }; - 33EA4F728A7984997A0EF515 /* TokenizationServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 952364FBFD6FA09653ECA37E /* TokenizationServiceTests.swift */; }; 34CDCA7B403C001E4C55D26D /* MerchantSessionAndSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C18C9664115CFDEB59FED19A /* MerchantSessionAndSettingsViewController.swift */; }; - 3BB02CA24B6B3EF458326B7D /* Networking.swift in Sources */ = {isa = PBXBuildFile; fileRef = D038BDB23C062D362AAA09BE /* Networking.swift */; }; - 3D112A8DE292D097E651FCDB /* IPay88Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A5E6F7A9C12C69CB66032E3 /* IPay88Tests.swift */; }; - 3EE90DEB1DB7BE9270FB17BF /* URLSessionStackTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F4E35F809D3FAF4354D5B05 /* URLSessionStackTests.swift */; }; - 3FD160A4D951EA772ADF4E25 /* DecodedClientToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F8DC3341BDBB9AEDBE8D6DD /* DecodedClientToken.swift */; }; - 4BD7794627267B40E9E10686 /* PrimerCheckoutTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9813BD518AC7C3F442B5075 /* PrimerCheckoutTheme.swift */; }; 53E3182FFC4E5F05D866CFAE /* Networking.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8DE1E4FB055B60582977315 /* Networking.swift */; }; - 583EBAA90902121CEA479416 /* VaultService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E8D7F3C53F8CCE4A03C975E /* VaultService.swift */; }; 592E00D98C8835CBCDAA26D9 /* MerchantDropInUIViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9874F439DA3EA5854A454687 /* MerchantDropInUIViewController.swift */; }; - 5976CCA261F0811F5D7707DA /* TokenizationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E8F69253D85350BB7A1A761 /* TokenizationService.swift */; }; 5E24CD5B3084FE3E8A3E85EC /* CheckoutTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72845A3010F10A88F2EC7849 /* CheckoutTheme.swift */; }; 60F6C3AFA11A7EDB0687856A /* ViewController+PrimerUIHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4139D8F153BB399DA67F2EE /* ViewController+PrimerUIHelpers.swift */; }; 60F7E716B34BE721651566DA /* Data+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1594BC5C96ECC3F46C811B2F /* Data+Extensions.swift */; }; - 622A605DDEA98D981670B53F /* DropInUI_TokenizationViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DB3B88857B810440CDA881E /* DropInUI_TokenizationViewModelTests.swift */; }; - 6B2212601374387CB004DA86 /* MaskTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD26E8C6074BB89ACBD5B8B9 /* MaskTests.swift */; }; - 70EAA3B33425CC9D16239BB0 /* ApplePayTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31CFA93A373A7DB78DA77283 /* ApplePayTests.swift */; }; 72F8D6065334FCD5B726A52C /* MerchantHeadlessCheckoutRawPhoneNumberDataViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 404E173A513B986A36F835F7 /* MerchantHeadlessCheckoutRawPhoneNumberDataViewController.swift */; }; - 77A8EFBA78D6C6B95A400C74 /* WebViewUtilTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA30891B2D5F9B6B97E56B99 /* WebViewUtilTests.swift */; }; - 7F49B29FCC55CF3C5CB6C506 /* InternalCardComponentManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 994AE6760B506D02499AEC90 /* InternalCardComponentManagerTests.swift */; }; - 800B92A57CAAC6471D01A89D /* CardData.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3D9154BF1E011FED6799CD5 /* CardData.swift */; }; - 8064B65A8F83D5B004D081FD /* PaymentMethodConfigTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752785ACCF65527C239391A8 /* PaymentMethodConfigTests.swift */; }; 85605C241F1CD45BA676D4A7 /* String+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9023841AFCE8E3205CB713A /* String+Extensions.swift */; }; 85EDC3F175D699BFF6BD48EF /* ViewController+Primer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39CCCB917D1881082ED75975 /* ViewController+Primer.swift */; }; 876140D52B63F7DB0058CA8C /* MerchantHeadlessCheckoutKlarnaViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 876140D42B63F7DB0058CA8C /* MerchantHeadlessCheckoutKlarnaViewController.swift */; }; - 876140D82B66F8070058CA8C /* KlarnaTestsMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 876140D72B66F8070058CA8C /* KlarnaTestsMocks.swift */; }; - 876140DE2B66F86A0058CA8C /* KlarnaComponentTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 876140DD2B66F86A0058CA8C /* KlarnaComponentTests.swift */; }; - 876140E22B66F89D0058CA8C /* KlarnaHeadlessManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 876140E12B66F89D0058CA8C /* KlarnaHeadlessManagerTests.swift */; }; 876140E62B67F3B30058CA8C /* MerchantHeadlessCheckoutKlarnaViewController+Klarna.swift in Sources */ = {isa = PBXBuildFile; fileRef = 876140E52B67F3B30058CA8C /* MerchantHeadlessCheckoutKlarnaViewController+Klarna.swift */; }; 876140EF2B6BE8C20058CA8C /* MerchantHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 876140EE2B6BE8C20058CA8C /* MerchantHelpers.swift */; }; - 876140F42B70FBFE0058CA8C /* KlarnaTokenizationComponentTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 876140F32B70FBFE0058CA8C /* KlarnaTokenizationComponentTests.swift */; }; - 876140F62B716E060058CA8C /* KlarnaTokenizationManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 876140F52B716E060058CA8C /* KlarnaTokenizationManagerTests.swift */; }; 876141082B8346650058CA8C /* MerchantHeadlessKlarnaInitializationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 876141072B8346650058CA8C /* MerchantHeadlessKlarnaInitializationView.swift */; }; 8761410A2B8355920058CA8C /* MerchantHeadlessKlarnaInitializationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 876141092B8355920058CA8C /* MerchantHeadlessKlarnaInitializationViewModel.swift */; }; 8761410C2B849A250058CA8C /* MerchantHeadlessKlarnaInitializationView+Elements.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8761410B2B849A250058CA8C /* MerchantHeadlessKlarnaInitializationView+Elements.swift */; }; - 87DF3EC72BA871BD00162100 /* PrimerKlarnaCategoriesViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87DF3EC62BA871BD00162100 /* PrimerKlarnaCategoriesViewControllerTests.swift */; }; - 8B5CB0C992DBAB293D378FAD /* MockModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EA7D2BB0AC0A1877DB2E6CE /* MockModule.swift */; }; - 91FAC91E687B6981268E677E /* DateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA0B2BEE5C389FD13E210847 /* DateTests.swift */; }; - 9263BD762EC26F6AA986F0C9 /* MockAPIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17476BFBED51F389FCE82F16 /* MockAPIClient.swift */; }; 949864026D1CDE6F5C62C66E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CE259612A00F85709107B872 /* Main.storyboard */; }; - 961B5D18058EF4CFCD0185AE /* MockVaultCheckoutViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A3E75CD834937EF85DE1C14 /* MockVaultCheckoutViewModel.swift */; }; - 97F0B302DF965C1AD1EC6F4D /* PaymentMethodConfigServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 743F107C464526926A34A433 /* PaymentMethodConfigServiceTests.swift */; }; - A1055D6F2AF125E90027B967 /* DebouncerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1055D6E2AF125E90027B967 /* DebouncerTests.swift */; }; - A12AC2532B5046CF00C26999 /* CurrencyStorageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A12AC2522B5046CF00C26999 /* CurrencyStorageTests.swift */; }; - A12AC2552B505B6200C26999 /* CurrencyLoaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A12AC2542B505B6100C26999 /* CurrencyLoaderTests.swift */; }; - A13392BC2AD459E90005A4D7 /* NolPayLinkCardComponentTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = A13392BB2AD459E90005A4D7 /* NolPayLinkCardComponentTest.swift */; }; - A1536BAD2AEBEC3A0087DDC0 /* NolPayPhoneMetadataServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1536BAC2AEBEC3A0087DDC0 /* NolPayPhoneMetadataServiceTests.swift */; }; - A1536BAF2AEC0A6D0087DDC0 /* NolTestsMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1536BAE2AEC0A6D0087DDC0 /* NolTestsMocks.swift */; }; - A1585C752ACDAA700014F0B9 /* NolPayLinkedCardsComponentTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1585C742ACDAA700014F0B9 /* NolPayLinkedCardsComponentTests.swift */; }; - A19CB17B2BAA129900DB4326 /* CVVRecaptureViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A19CB17A2BAA129900DB4326 /* CVVRecaptureViewModelTests.swift */; }; A19EF5632B20E22E00A72F60 /* .swiftlint.yml in Resources */ = {isa = PBXBuildFile; fileRef = A19EF5622B20E22E00A72F60 /* .swiftlint.yml */; }; - A1A3D0F32AD5585A00F7D8C9 /* NolPayUnlinkCardComponentTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1A3D0F22AD5585A00F7D8C9 /* NolPayUnlinkCardComponentTest.swift */; }; - A1A3D0F52AD56BE300F7D8C9 /* NolPayPaymentComponentTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1A3D0F42AD56BE300F7D8C9 /* NolPayPaymentComponentTests.swift */; }; - A39750255D4C33527A3766A0 /* UserInterfaceModuleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B8CB5A11A44AA9F3D7FE356 /* UserInterfaceModuleTests.swift */; }; - A61B9E61EDCE18D34438352E /* PayPalConfirmBillingAgreementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D122A0B71B707C2110AB7F5 /* PayPalConfirmBillingAgreementTests.swift */; }; AAE3B30B64B6822A20987FCA /* CreateClientToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = 229849A3DBE0858EE90673B9 /* CreateClientToken.swift */; }; AD9CF1073EE0676E6640481A /* MerchantHeadlessCheckoutRawDataViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B866FF13033A5CB8B4C3388E /* MerchantHeadlessCheckoutRawDataViewController.swift */; }; + B15DB155FF963676B88B96BF /* Pods_Debug_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E07ED300DA4DBEB8D2BF520D /* Pods_Debug_App.framework */; }; + BAEBC22D052C55BD8EC53C6B /* Pods_Debug_App_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F0FD41735810826EB829619C /* Pods_Debug_App_Tests.framework */; }; C0115AC7BC96FDF49EF8E530 /* PaymentMethodCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E79C93EA805E87E1137A513 /* PaymentMethodCell.swift */; }; - C29B625B5698094691227852 /* TokenizationResponseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0A003705AFF7F922BCFE75F /* TokenizationResponseTests.swift */; }; - C6D7F7ECFD35B3DC3AFD6CB2 /* PayPalService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25FD540BEA16ABBDFE7DE182 /* PayPalService.swift */; }; C75A11E6AEEFC2B7A29BBC04 /* TestScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6AEF11B151368BF993C3EA9 /* TestScenario.swift */; }; - C8A64A69AD55D9BF82F0D876 /* StringTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872A0647D4136E27365FB7F8 /* StringTests.swift */; }; CE5E673A96BB5B96AE5EFC56 /* Range+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9128566126AA7F571FFECA3A /* Range+Extensions.swift */; }; - D649870C2D022B4063BDC0B4 /* PrimerRawRetailerDataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B266F9E1651BD20E45DCCF68 /* PrimerRawRetailerDataTests.swift */; }; D886D8E47D883304B505CE11 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC5687FF32E8661F1A00CE5 /* AppDelegate.swift */; }; - DB1A2989DDE0928C62B15303 /* PayPalServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D7EC742DEB5BE12252E3E5B /* PayPalServiceTests.swift */; }; - DC98712939835FB79A20BD63 /* IntExtensionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9314E0A4E884A8228611A030 /* IntExtensionTests.swift */; }; DE53DA2D0AD108306C92E198 /* UIViewController+API.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1FD8065D40A2D691F643F3B /* UIViewController+API.swift */; }; - E108F58E2B0D4F0800EC3CC6 /* WebRedirectComponentTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E108F58D2B0D4F0800EC3CC6 /* WebRedirectComponentTests.swift */; }; - E11F473D2B0694C50091C31F /* PrimerHeadlessFormWithRedirectManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E11F473C2B0694C50091C31F /* PrimerHeadlessFormWithRedirectManagerTests.swift */; }; - E11F47482B06C4E30091C31F /* MerchantHeadlessCheckoutBankViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E11F47422B06C4E30091C31F /* MerchantHeadlessCheckoutBankViewController.swift */; }; - E11F474A2B06C4E30091C31F /* BanksListModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = E11F47442B06C4E30091C31F /* BanksListModel.swift */; }; - E11F474C2B06C4E30091C31F /* MerchantNewLineItemViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E11F47462B06C4E30091C31F /* MerchantNewLineItemViewController.swift */; }; E11F47542B06C5030091C31F /* BanksListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E11F47502B06C5030091C31F /* BanksListView.swift */; }; E11F47562B06C5030091C31F /* ImageViewWithUrl.swift in Sources */ = {isa = PBXBuildFile; fileRef = E11F47522B06C5030091C31F /* ImageViewWithUrl.swift */; }; - E130C3D92AFD19FF00AC3E7C /* NetworkTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E130C3D82AFD19FF00AC3E7C /* NetworkTests.swift */; }; - E13E72452AFE653000911866 /* IdealPaymentMethodTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E13E72442AFE653000911866 /* IdealPaymentMethodTests.swift */; }; E1A2971F2B021ABA005ADA51 /* URL+NetworkHeaders.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1AB44D12AFE13AF00639DC5 /* URL+NetworkHeaders.swift */; }; - E1A297262B036AB1005ADA51 /* BankComponentTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1A297252B036AB1005ADA51 /* BankComponentTests.swift */; }; - E1E502B12AFE9ECF00CD7F0A /* XCTestCase+Tokenization.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1E502B02AFE9ECF00CD7F0A /* XCTestCase+Tokenization.swift */; }; - E6F85ECD80B64754E7A6D35E /* RawDataManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C7C082270CF1C6B7810F9B3 /* RawDataManagerTests.swift */; }; EA7FAA4F8476BD3711D628CB /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B18D7E7738BF86467B0F1465 /* Images.xcassets */; }; F02F496FD20B5291C044F62C /* MerchantResultViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00E3C8FE62D22147335F2455 /* MerchantResultViewController.swift */; }; - F03699592AC2E63700E4179D /* (null) in Sources */ = {isa = PBXBuildFile; }; + F03699592AC2E63700E4179D /* BuildFile in Sources */ = {isa = PBXBuildFile; }; F08F63D82B9B5A7C006EF9A9 /* SessionConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = F08F63D72B9B5A7C006EF9A9 /* SessionConfiguration.swift */; }; F08F63DA2B9B5BC5006EF9A9 /* AppetizeConfigProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = F08F63D92B9B5BC5006EF9A9 /* AppetizeConfigProvider.swift */; }; F08F63DC2B9F27B0006EF9A9 /* MetadataParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = F08F63DB2B9F27B0006EF9A9 /* MetadataParser.swift */; }; - F08F63DE2B9F27F4006EF9A9 /* MetadataParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F08F63DD2B9F27F4006EF9A9 /* MetadataParserTests.swift */; }; - F08F63E62BA0BF0C006EF9A9 /* AppetizeConfigTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F08F63E52BA0BF0C006EF9A9 /* AppetizeConfigTests.swift */; }; F0C2147F6FA26527BE55549A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = FC701AFD94F96F0F1D108D1A /* LaunchScreen.xib */; }; - F1A71C2E0D900FEB9AF1351C /* ThreeDSProtocolVersionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 021A00DEB01A46C876592575 /* ThreeDSProtocolVersionTests.swift */; }; - F4141A68EA2AFAD82959B4CC /* Pods_Debug_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8A2886D1F7D43E091FD80419 /* Pods_Debug_App.framework */; }; - F99DAF50E86E6F8CCD127E5B /* ThemeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD381E7E16D01D8D743232F7 /* ThemeTests.swift */; }; FD5ADBCFA70DB606339F3AF2 /* TransactionResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70D3D6CF0F006A06B7CEC71B /* TransactionResponse.swift */; }; /* End PBXBuildFile section */ @@ -185,73 +95,34 @@ /* Begin PBXFileReference section */ 00E3C8FE62D22147335F2455 /* MerchantResultViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MerchantResultViewController.swift; sourceTree = ""; }; 01C09DEAB07F42004B26A278 /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/LaunchScreen.strings"; sourceTree = ""; }; - 021A00DEB01A46C876592575 /* ThreeDSProtocolVersionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreeDSProtocolVersionTests.swift; sourceTree = ""; }; - 0402B7B52AFBBA7200B02C75 /* CardNetworkTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardNetworkTests.swift; sourceTree = ""; }; - 0402B7B72AFBBC2200B02C75 /* ApplePayUtilsTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplePayUtilsTest.swift; sourceTree = ""; }; 041295A92AB9E25D00A4F243 /* MerchantHeadlessCheckoutNolPayViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MerchantHeadlessCheckoutNolPayViewController.swift; sourceTree = ""; }; - 041295AB2AB9E2A900A4F243 /* PrimerHeadlessNolPayManagerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PrimerHeadlessNolPayManagerTests.swift; sourceTree = ""; }; - 041F52082ADE92A300A1D702 /* ListCardNetworksEndpointTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListCardNetworksEndpointTests.swift; sourceTree = ""; }; - 04236A9A2B7D2EA50041EC11 /* JWTFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JWTFactory.swift; sourceTree = ""; }; - 042ED15C2AF010500027833F /* CardValidationServiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardValidationServiceTests.swift; sourceTree = ""; }; - 042ED1612AF0F5600027833F /* MockBINDataAPIClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockBINDataAPIClient.swift; sourceTree = ""; }; - 042ED1642AF0F5FD0027833F /* MockRawDataManagerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockRawDataManagerDelegate.swift; sourceTree = ""; }; - 0442B6432B7BA477004DB054 /* MockAnalyticsStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockAnalyticsStorage.swift; sourceTree = ""; }; - 0442B6452B7BA498004DB054 /* MockPrimerAPIAnalyticsClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockPrimerAPIAnalyticsClient.swift; sourceTree = ""; }; - 044348DD2BB5B3D80072D97C /* DefaultNetworkServiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultNetworkServiceTests.swift; sourceTree = ""; }; - 04769C142B1A680C0051581C /* Promises+Helper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Promises+Helper.swift"; sourceTree = ""; }; - 0479FB172AF2599200D0AFC9 /* StringTyper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringTyper.swift; sourceTree = ""; }; - 047D8E882ADEA4C700A5E7BD /* NetworkService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkService.swift; sourceTree = ""; }; - 047EE2012BB47B1B006C775C /* NetworkingReportingServiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkingReportingServiceTests.swift; sourceTree = ""; }; - 0488648A2BA88F63007BCDA6 /* NetworkRequestFactoryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkRequestFactoryTests.swift; sourceTree = ""; }; - 0488648C2BA89402007BCDA6 /* CodingUtilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CodingUtilities.swift; sourceTree = ""; }; - 0488648E2BA89E04007BCDA6 /* NetworkResponseFactoryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkResponseFactoryTests.swift; sourceTree = ""; }; 0489E2BA2B68F71300FA0682 /* TapGestureRecognizer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TapGestureRecognizer.swift; sourceTree = ""; }; - 049298002B1DD466002E04B8 /* AnalyticsServiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsServiceTests.swift; sourceTree = ""; }; - 049298062B1E1F4D002E04B8 /* AnalyticsStorageTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsStorageTests.swift; sourceTree = ""; }; 049A055D2B4BF057002CEEBA /* MerchantHeadlessVaultManagerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MerchantHeadlessVaultManagerViewController.swift; sourceTree = ""; }; - 049A055F2B4C191D002CEEBA /* NativeUIManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NativeUIManagerTests.swift; sourceTree = ""; }; - 04A153CE2BC40CE10018D805 /* RequestDispatcherTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestDispatcherTests.swift; sourceTree = ""; }; - 04DAAED32B03EED1002E2614 /* AssetsManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AssetsManagerTests.swift; sourceTree = ""; }; - 04DAAED52B03EF0B002E2614 /* SDKSessionHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SDKSessionHelper.swift; sourceTree = ""; }; - 04DFAADB2AAA01E60030FECE /* Debug App Tests-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Debug App Tests-Info.plist"; sourceTree = ""; }; - 04F6EF732AE6A06200115D05 /* AnalyticsEventsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsEventsTests.swift; sourceTree = ""; }; - 04FAF9EB2AE7B33E002E4BAE /* StringExtensionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringExtensionTests.swift; sourceTree = ""; }; + 04F3235B2BD2F99000F5927C /* UIApplication+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIApplication+Extensions.swift"; sourceTree = ""; }; + 04F3235D2BD408C600F5927C /* AppetizeConfigTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppetizeConfigTests.swift; sourceTree = ""; }; + 04F3235E2BD408C600F5927C /* Debug App Tests-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Debug App Tests-Info.plist"; sourceTree = ""; }; + 04F3235F2BD408C600F5927C /* MetadataParserTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MetadataParserTests.swift; sourceTree = ""; }; 0DA32ABCF07A4EBED014327B /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/LaunchScreen.strings; sourceTree = ""; }; 0ED746F8924E70AD868BC0F4 /* MerchantNewLineItemViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MerchantNewLineItemViewController.swift; sourceTree = ""; }; 0FD08B8CE57A11D1E35A8684 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/LaunchScreen.strings; sourceTree = ""; }; 13FA89917603E4BA5BB66AFC /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/LaunchScreen.strings; sourceTree = ""; }; 1594BC5C96ECC3F46C811B2F /* Data+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Data+Extensions.swift"; sourceTree = ""; }; - 17476BFBED51F389FCE82F16 /* MockAPIClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockAPIClient.swift; sourceTree = ""; }; - 1B8CB5A11A44AA9F3D7FE356 /* UserInterfaceModuleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInterfaceModuleTests.swift; sourceTree = ""; }; 1D05E65C196E6715D7D8B0C6 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Main.strings; sourceTree = ""; }; - 1F4E35F809D3FAF4354D5B05 /* URLSessionStackTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLSessionStackTests.swift; sourceTree = ""; }; - 1F79B50111AC4161CFB1EFE8 /* ApayaTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApayaTests.swift; sourceTree = ""; }; + 1F278229D66AFE30C9C39085 /* Pods-Debug App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Debug App.release.xcconfig"; path = "Target Support Files/Pods-Debug App/Pods-Debug App.release.xcconfig"; sourceTree = ""; }; 229849A3DBE0858EE90673B9 /* CreateClientToken.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateClientToken.swift; sourceTree = ""; }; - 25FD540BEA16ABBDFE7DE182 /* PayPalService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PayPalService.swift; sourceTree = ""; }; - 28249328E3C719F45A8196C9 /* Pods-Debug App Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Debug App Tests.release.xcconfig"; path = "Target Support Files/Pods-Debug App Tests/Pods-Debug App Tests.release.xcconfig"; sourceTree = ""; }; + 27B211EA3949D1672A82B5F6 /* Pods-Debug App Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Debug App Tests.debug.xcconfig"; path = "Target Support Files/Pods-Debug App Tests/Pods-Debug App Tests.debug.xcconfig"; sourceTree = ""; }; 2A328E38DA586FFE0ED2894B /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Main.strings; sourceTree = ""; }; 2E64F057A39A91CA01CCB57F /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Main.strings; sourceTree = ""; }; - 2E8F69253D85350BB7A1A761 /* TokenizationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TokenizationService.swift; sourceTree = ""; }; - 31CFA93A373A7DB78DA77283 /* ApplePayTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplePayTests.swift; sourceTree = ""; }; 33E18D5B5190C64631309D1B /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/LaunchScreen.strings; sourceTree = ""; }; - 38DD0A9535544D446514124A /* CreateResumePaymentService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateResumePaymentService.swift; sourceTree = ""; }; 39CCCB917D1881082ED75975 /* ViewController+Primer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ViewController+Primer.swift"; sourceTree = ""; }; 404E173A513B986A36F835F7 /* MerchantHeadlessCheckoutRawPhoneNumberDataViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MerchantHeadlessCheckoutRawPhoneNumberDataViewController.swift; sourceTree = ""; }; 483D2036DE3F89CA2C244C4F /* Debug App Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Debug App Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 49DFB1ACD5014BF28ED283B3 /* PollingModuleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PollingModuleTests.swift; sourceTree = ""; }; - 4A5E3ACDA26D44F66B55766B /* HUC_TokenizationViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HUC_TokenizationViewModelTests.swift; sourceTree = ""; }; 4ACFB17A73AB7240BED98585 /* ExampleApp.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = ExampleApp.entitlements; sourceTree = ""; }; 4C353D84EABA4990DAB4DD28 /* MerchantHeadlessCheckoutRawRetailDataViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MerchantHeadlessCheckoutRawRetailDataViewController.swift; sourceTree = ""; }; 4E79C93EA805E87E1137A513 /* PaymentMethodCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaymentMethodCell.swift; sourceTree = ""; }; 52F54EC3C1ACE19DF48BD6E2 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/LaunchScreen.strings; sourceTree = ""; }; - 5AA706A14BACFDB8E5715788 /* HeadlessVaultManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlessVaultManagerTests.swift; sourceTree = ""; }; - 5D7EC742DEB5BE12252E3E5B /* PayPalServiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PayPalServiceTests.swift; sourceTree = ""; }; - 5DB3B88857B810440CDA881E /* DropInUI_TokenizationViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DropInUI_TokenizationViewModelTests.swift; sourceTree = ""; }; - 5E8D7F3C53F8CCE4A03C975E /* VaultService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VaultService.swift; sourceTree = ""; }; - 5F8DC3341BDBB9AEDBE8D6DD /* DecodedClientToken.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DecodedClientToken.swift; sourceTree = ""; }; 6493EA8D95DDA066DE982B24 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Main.strings; sourceTree = ""; }; 68E2722188A5A2948DB31144 /* Debug App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Debug App.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 6C690FB7E6E8C942C87B1A1B /* PrimerAPIConfigurationModuleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrimerAPIConfigurationModuleTests.swift; sourceTree = ""; }; 6D2261DDEE5DC5D2ED518037 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 6D665EEA8106E51925C3CF2B /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Main.strings; sourceTree = ""; }; 70D3D6CF0F006A06B7CEC71B /* TransactionResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionResponse.swift; sourceTree = ""; }; @@ -259,107 +130,49 @@ 72845A3010F10A88F2EC7849 /* CheckoutTheme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckoutTheme.swift; sourceTree = ""; }; 72E691B9A6A8EBB9F6A6B266 /* MerchantHeadlessCheckoutAvailablePaymentMethodsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MerchantHeadlessCheckoutAvailablePaymentMethodsViewController.swift; sourceTree = ""; }; 743E00065B4A8D6C95092A23 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/LaunchScreen.strings; sourceTree = ""; }; - 743F107C464526926A34A433 /* PaymentMethodConfigServiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaymentMethodConfigServiceTests.swift; sourceTree = ""; }; 7480FE5F665CC66C092BC95A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 752785ACCF65527C239391A8 /* PaymentMethodConfigTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaymentMethodConfigTests.swift; sourceTree = ""; }; - 7A3E75CD834937EF85DE1C14 /* MockVaultCheckoutViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockVaultCheckoutViewModel.swift; sourceTree = ""; }; - 7A5E6F7A9C12C69CB66032E3 /* IPay88Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IPay88Tests.swift; sourceTree = ""; }; - 7EA7D2BB0AC0A1877DB2E6CE /* MockModule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockModule.swift; sourceTree = ""; }; - 82C5808E70210187BAEC47B1 /* Pods_Debug_App_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Debug_App_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 872A0647D4136E27365FB7F8 /* StringTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringTests.swift; sourceTree = ""; }; + 85AFC960D1A9EB56C4561471 /* Pods-Debug App Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Debug App Tests.release.xcconfig"; path = "Target Support Files/Pods-Debug App Tests/Pods-Debug App Tests.release.xcconfig"; sourceTree = ""; }; 876140D42B63F7DB0058CA8C /* MerchantHeadlessCheckoutKlarnaViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MerchantHeadlessCheckoutKlarnaViewController.swift; sourceTree = ""; }; - 876140D72B66F8070058CA8C /* KlarnaTestsMocks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KlarnaTestsMocks.swift; sourceTree = ""; }; - 876140DD2B66F86A0058CA8C /* KlarnaComponentTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KlarnaComponentTests.swift; sourceTree = ""; }; - 876140E12B66F89D0058CA8C /* KlarnaHeadlessManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KlarnaHeadlessManagerTests.swift; sourceTree = ""; }; 876140E52B67F3B30058CA8C /* MerchantHeadlessCheckoutKlarnaViewController+Klarna.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MerchantHeadlessCheckoutKlarnaViewController+Klarna.swift"; sourceTree = ""; }; 876140EE2B6BE8C20058CA8C /* MerchantHelpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MerchantHelpers.swift; sourceTree = ""; }; - 876140F32B70FBFE0058CA8C /* KlarnaTokenizationComponentTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KlarnaTokenizationComponentTests.swift; sourceTree = ""; }; - 876140F52B716E060058CA8C /* KlarnaTokenizationManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KlarnaTokenizationManagerTests.swift; sourceTree = ""; }; 876141072B8346650058CA8C /* MerchantHeadlessKlarnaInitializationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MerchantHeadlessKlarnaInitializationView.swift; sourceTree = ""; }; 876141092B8355920058CA8C /* MerchantHeadlessKlarnaInitializationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MerchantHeadlessKlarnaInitializationViewModel.swift; sourceTree = ""; }; 8761410B2B849A250058CA8C /* MerchantHeadlessKlarnaInitializationView+Elements.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MerchantHeadlessKlarnaInitializationView+Elements.swift"; sourceTree = ""; }; - 87DF3EC62BA871BD00162100 /* PrimerKlarnaCategoriesViewControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrimerKlarnaCategoriesViewControllerTests.swift; sourceTree = ""; }; - 8A23886804B13FA754E775D0 /* MockPaymentMethodTokenizationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockPaymentMethodTokenizationViewModel.swift; sourceTree = ""; }; - 8A2886D1F7D43E091FD80419 /* Pods_Debug_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Debug_App.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 8A3FDC6FE0EB5AB5828D4D80 /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/LaunchScreen.strings; sourceTree = ""; }; - 8C7C082270CF1C6B7810F9B3 /* RawDataManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RawDataManagerTests.swift; sourceTree = ""; }; 9128566126AA7F571FFECA3A /* Range+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Range+Extensions.swift"; sourceTree = ""; }; 92BE0A1A904DCEA405A11CC1 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Main.strings; sourceTree = ""; }; - 9314E0A4E884A8228611A030 /* IntExtensionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntExtensionTests.swift; sourceTree = ""; }; 93F15C1E46C70C3D73B50F31 /* UIStackViewExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIStackViewExtensions.swift; sourceTree = ""; }; 942332BD921CBCAFBC77BD6D /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Main.strings; sourceTree = ""; }; - 952364FBFD6FA09653ECA37E /* TokenizationServiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TokenizationServiceTests.swift; sourceTree = ""; }; - 97731417340A948FC8CD6ED8 /* Pods-Debug App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Debug App.debug.xcconfig"; path = "Target Support Files/Pods-Debug App/Pods-Debug App.debug.xcconfig"; sourceTree = ""; }; 98079137F3DE1FE6221DA7EC /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Main.strings; sourceTree = ""; }; 9874F439DA3EA5854A454687 /* MerchantDropInUIViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MerchantDropInUIViewController.swift; sourceTree = ""; }; - 994AE6760B506D02499AEC90 /* InternalCardComponentManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InternalCardComponentManagerTests.swift; sourceTree = ""; }; - 9D122A0B71B707C2110AB7F5 /* PayPalConfirmBillingAgreementTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PayPalConfirmBillingAgreementTests.swift; sourceTree = ""; }; - A1055D6E2AF125E90027B967 /* DebouncerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DebouncerTests.swift; sourceTree = ""; }; - A12AC2522B5046CF00C26999 /* CurrencyStorageTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurrencyStorageTests.swift; sourceTree = ""; }; - A12AC2542B505B6100C26999 /* CurrencyLoaderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurrencyLoaderTests.swift; sourceTree = ""; }; - A13392BB2AD459E90005A4D7 /* NolPayLinkCardComponentTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NolPayLinkCardComponentTest.swift; sourceTree = ""; }; - A1536BAC2AEBEC3A0087DDC0 /* NolPayPhoneMetadataServiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NolPayPhoneMetadataServiceTests.swift; sourceTree = ""; }; - A1536BAE2AEC0A6D0087DDC0 /* NolTestsMocks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NolTestsMocks.swift; sourceTree = ""; }; - A1585C742ACDAA700014F0B9 /* NolPayLinkedCardsComponentTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NolPayLinkedCardsComponentTests.swift; sourceTree = ""; }; A1604A656AF654D7422A2A5E /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Main.strings; sourceTree = ""; }; - A19CB17A2BAA129900DB4326 /* CVVRecaptureViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CVVRecaptureViewModelTests.swift; sourceTree = ""; }; A19EF5622B20E22E00A72F60 /* .swiftlint.yml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.yaml; path = .swiftlint.yml; sourceTree = ""; }; - A1A3D0F22AD5585A00F7D8C9 /* NolPayUnlinkCardComponentTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NolPayUnlinkCardComponentTest.swift; sourceTree = ""; }; - A1A3D0F42AD56BE300F7D8C9 /* NolPayPaymentComponentTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NolPayPaymentComponentTests.swift; sourceTree = ""; }; A6AEF11B151368BF993C3EA9 /* TestScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestScenario.swift; sourceTree = ""; }; - AD381E7E16D01D8D743232F7 /* ThemeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeTests.swift; sourceTree = ""; }; - B08BF9387885E3CCB33008A2 /* Pods-Debug App Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Debug App Tests.debug.xcconfig"; path = "Target Support Files/Pods-Debug App Tests/Pods-Debug App Tests.debug.xcconfig"; sourceTree = ""; }; B18D7E7738BF86467B0F1465 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; B1FD8065D40A2D691F643F3B /* UIViewController+API.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+API.swift"; sourceTree = ""; }; - B266F9E1651BD20E45DCCF68 /* PrimerRawRetailerDataTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrimerRawRetailerDataTests.swift; sourceTree = ""; }; B866FF13033A5CB8B4C3388E /* MerchantHeadlessCheckoutRawDataViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MerchantHeadlessCheckoutRawDataViewController.swift; sourceTree = ""; }; - B9813BD518AC7C3F442B5075 /* PrimerCheckoutTheme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrimerCheckoutTheme.swift; sourceTree = ""; }; - BA0B2BEE5C389FD13E210847 /* DateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateTests.swift; sourceTree = ""; }; - BD26E8C6074BB89ACBD5B8B9 /* MaskTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MaskTests.swift; sourceTree = ""; }; - BF8639891B79E2FCCE10A510 /* ThreeDSErrorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreeDSErrorTests.swift; sourceTree = ""; }; + BB7C19D2A72C70B70AA4DF8C /* Pods-Debug App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Debug App.debug.xcconfig"; path = "Target Support Files/Pods-Debug App/Pods-Debug App.debug.xcconfig"; sourceTree = ""; }; C18C9664115CFDEB59FED19A /* MerchantSessionAndSettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MerchantSessionAndSettingsViewController.swift; sourceTree = ""; }; C4DFE77F28AB538220A0F6EE /* ka */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ka; path = ka.lproj/Main.strings; sourceTree = ""; }; - C7D8E1E91CA11EC6831ADEE4 /* EncodingDecodingContainerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EncodingDecodingContainerTests.swift; sourceTree = ""; }; C7EB86C62BA46BF51C64ABC2 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/LaunchScreen.strings; sourceTree = ""; }; - CA30891B2D5F9B6B97E56B99 /* WebViewUtilTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewUtilTests.swift; sourceTree = ""; }; - D038BDB23C062D362AAA09BE /* Networking.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Networking.swift; sourceTree = ""; }; - D0A003705AFF7F922BCFE75F /* TokenizationResponseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TokenizationResponseTests.swift; sourceTree = ""; }; - D3D9154BF1E011FED6799CD5 /* CardData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardData.swift; sourceTree = ""; }; D4139D8F153BB399DA67F2EE /* ViewController+PrimerUIHelpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ViewController+PrimerUIHelpers.swift"; sourceTree = ""; }; D5C1B1F65A9382606A25CE77 /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/Main.strings; sourceTree = ""; }; DAC5687FF32E8661F1A00CE5 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; DBC8EA85D1CBC1EC4AB3EB8C /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/LaunchScreen.strings; sourceTree = ""; }; - DEC0E14FABFAE4D0EFC3A585 /* Pods-Debug App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Debug App.release.xcconfig"; path = "Target Support Files/Pods-Debug App/Pods-Debug App.release.xcconfig"; sourceTree = ""; }; DECCDC4079DC6471CEDDEA84 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/LaunchScreen.strings; sourceTree = ""; }; - E108F58D2B0D4F0800EC3CC6 /* WebRedirectComponentTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebRedirectComponentTests.swift; sourceTree = ""; }; - E11F473C2B0694C50091C31F /* PrimerHeadlessFormWithRedirectManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrimerHeadlessFormWithRedirectManagerTests.swift; sourceTree = ""; }; - E11F47422B06C4E30091C31F /* MerchantHeadlessCheckoutBankViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MerchantHeadlessCheckoutBankViewController.swift; sourceTree = ""; }; - E11F47432B06C4E30091C31F /* BanksListView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BanksListView.swift; sourceTree = ""; }; - E11F47442B06C4E30091C31F /* BanksListModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BanksListModel.swift; sourceTree = ""; }; - E11F47452B06C4E30091C31F /* ImageViewWithUrl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageViewWithUrl.swift; sourceTree = ""; }; - E11F47462B06C4E30091C31F /* MerchantNewLineItemViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MerchantNewLineItemViewController.swift; sourceTree = ""; }; - E11F47472B06C4E30091C31F /* MerchantHeadlessCheckoutNolPayViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MerchantHeadlessCheckoutNolPayViewController.swift; sourceTree = ""; }; + E07ED300DA4DBEB8D2BF520D /* Pods_Debug_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Debug_App.framework; sourceTree = BUILT_PRODUCTS_DIR; }; E11F47502B06C5030091C31F /* BanksListView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BanksListView.swift; sourceTree = ""; }; E11F47512B06C5030091C31F /* BanksListModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BanksListModel.swift; sourceTree = ""; }; E11F47522B06C5030091C31F /* ImageViewWithUrl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageViewWithUrl.swift; sourceTree = ""; }; E129D66F2B162022004694F9 /* MerchantHeadlessCheckoutBankViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MerchantHeadlessCheckoutBankViewController.swift; sourceTree = ""; }; - E130C3D82AFD19FF00AC3E7C /* NetworkTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkTests.swift; sourceTree = ""; }; - E13E72442AFE653000911866 /* IdealPaymentMethodTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IdealPaymentMethodTests.swift; sourceTree = ""; }; - E1A297252B036AB1005ADA51 /* BankComponentTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BankComponentTests.swift; sourceTree = ""; }; E1AB44D12AFE13AF00639DC5 /* URL+NetworkHeaders.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "URL+NetworkHeaders.swift"; sourceTree = ""; }; E1C3EF0BA039C0A50EDE13A5 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Main.strings; sourceTree = ""; }; - E1E502B02AFE9ECF00CD7F0A /* XCTestCase+Tokenization.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "XCTestCase+Tokenization.swift"; sourceTree = ""; }; - E63F5C5C1FD2F3E6CB02EC5A /* HeadlessUniversalCheckoutTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadlessUniversalCheckoutTests.swift; sourceTree = ""; }; E7640DB186F9638C2F556F77 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Main.strings; sourceTree = ""; }; E8DE1E4FB055B60582977315 /* Networking.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Networking.swift; sourceTree = ""; }; - E9899972360BCA5992CEE5BC /* PrimerBancontactCardDataManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrimerBancontactCardDataManagerTests.swift; sourceTree = ""; }; - EEB1E1B37192BF739461AFF1 /* PrimerRawCardDataManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrimerRawCardDataManagerTests.swift; sourceTree = ""; }; F08F63D72B9B5A7C006EF9A9 /* SessionConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionConfiguration.swift; sourceTree = ""; }; F08F63D92B9B5BC5006EF9A9 /* AppetizeConfigProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppetizeConfigProvider.swift; sourceTree = ""; }; F08F63DB2B9F27B0006EF9A9 /* MetadataParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MetadataParser.swift; sourceTree = ""; }; - F08F63DD2B9F27F4006EF9A9 /* MetadataParserTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MetadataParserTests.swift; sourceTree = ""; }; - F08F63E52BA0BF0C006EF9A9 /* AppetizeConfigTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppetizeConfigTests.swift; sourceTree = ""; }; - F4AC1EC0F98CB56DA4D075CA /* Mocks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Mocks.swift; sourceTree = ""; }; + F0FD41735810826EB829619C /* Pods_Debug_App_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Debug_App_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; F816A2444633C4336A7CB071 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Main.strings; sourceTree = ""; }; F9023841AFCE8E3205CB713A /* String+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Extensions.swift"; sourceTree = ""; }; FB1F71737862EF5D0F4FE5AB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; @@ -373,7 +186,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 05290163DCB52E50E29AF612 /* Pods_Debug_App_Tests.framework in Frameworks */, + BAEBC22D052C55BD8EC53C6B /* Pods_Debug_App_Tests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -381,77 +194,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - F4141A68EA2AFAD82959B4CC /* Pods_Debug_App.framework in Frameworks */, + B15DB155FF963676B88B96BF /* Pods_Debug_App.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 042ED1632AF0F5CE0027833F /* Delegates */ = { - isa = PBXGroup; - children = ( - 042ED1642AF0F5FD0027833F /* MockRawDataManagerDelegate.swift */, - ); - path = Delegates; - sourceTree = ""; - }; - 0442B6422B7BA468004DB054 /* Analytics */ = { - isa = PBXGroup; - children = ( - 0442B6432B7BA477004DB054 /* MockAnalyticsStorage.swift */, - 0442B6452B7BA498004DB054 /* MockPrimerAPIAnalyticsClient.swift */, - ); - path = Analytics; - sourceTree = ""; - }; - 0479FB162AF2598800D0AFC9 /* Test Utilities */ = { - isa = PBXGroup; - children = ( - 0479FB172AF2599200D0AFC9 /* StringTyper.swift */, - 04DAAED52B03EF0B002E2614 /* SDKSessionHelper.swift */, - 04236A9A2B7D2EA50041EC11 /* JWTFactory.swift */, - 0488648C2BA89402007BCDA6 /* CodingUtilities.swift */, - ); - path = "Test Utilities"; - sourceTree = ""; - }; - 047EE1FE2BB47A97006C775C /* Legacy */ = { - isa = PBXGroup; - children = ( - E130C3D82AFD19FF00AC3E7C /* NetworkTests.swift */, - 1F4E35F809D3FAF4354D5B05 /* URLSessionStackTests.swift */, - ); - path = Legacy; - sourceTree = ""; - }; - 047EE1FF2BB47AA5006C775C /* Endpoints */ = { - isa = PBXGroup; - children = ( - 041F52082ADE92A300A1D702 /* ListCardNetworksEndpointTests.swift */, - ); - path = Endpoints; - sourceTree = ""; - }; - 047EE2002BB47B04006C775C /* Services */ = { - isa = PBXGroup; - children = ( - 047EE2012BB47B1B006C775C /* NetworkingReportingServiceTests.swift */, - 044348DD2BB5B3D80072D97C /* DefaultNetworkServiceTests.swift */, - 04A153CE2BC40CE10018D805 /* RequestDispatcherTests.swift */, - ); - path = Services; - sourceTree = ""; - }; - 048864892BA88F44007BCDA6 /* Factories */ = { - isa = PBXGroup; - children = ( - 0488648A2BA88F63007BCDA6 /* NetworkRequestFactoryTests.swift */, - 0488648E2BA89E04007BCDA6 /* NetworkResponseFactoryTests.swift */, - ); - path = Factories; - sourceTree = ""; - }; 0489E2B92B68F70400FA0682 /* Utilities */ = { isa = PBXGroup; children = ( @@ -462,12 +211,23 @@ path = Utilities; sourceTree = ""; }; - 04DAAED22B03EEBE002E2614 /* Assets */ = { + 04F323602BD408C600F5927C /* Tests */ = { isa = PBXGroup; children = ( - 04DAAED32B03EED1002E2614 /* AssetsManagerTests.swift */, + 04F3235E2BD408C600F5927C /* Debug App Tests-Info.plist */, + 04F3235D2BD408C600F5927C /* AppetizeConfigTests.swift */, + 04F3235F2BD408C600F5927C /* MetadataParserTests.swift */, ); - path = Assets; + path = Tests; + sourceTree = ""; + }; + 093C53944BD75C6EB0F2C8C0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + E07ED300DA4DBEB8D2BF520D /* Pods_Debug_App.framework */, + F0FD41735810826EB829619C /* Pods_Debug_App_Tests.framework */, + ); + name = Frameworks; sourceTree = ""; }; 094077DEFDC2739B10CF4183 /* Resources */ = { @@ -503,7 +263,7 @@ FBDF3F8B5F93A0EC28048640 /* Project */, DF30711EB149C64C364BB79A /* Products */, 61E8D69DF93462D748F446DF /* Pods */, - EF8855DEDF971BA3B94636A0 /* Frameworks */, + 093C53944BD75C6EB0F2C8C0 /* Frameworks */, ); sourceTree = ""; }; @@ -516,17 +276,6 @@ path = "Localized Views"; sourceTree = ""; }; - 2F23D3C9CC9CBC1B95329B1C /* Network */ = { - isa = PBXGroup; - children = ( - 047EE1FF2BB47AA5006C775C /* Endpoints */, - 047EE1FE2BB47A97006C775C /* Legacy */, - 048864892BA88F44007BCDA6 /* Factories */, - 047EE2002BB47B04006C775C /* Services */, - ); - path = Network; - sourceTree = ""; - }; 553A7EDE72B8249F55A0E6B9 /* Extension */ = { isa = PBXGroup; children = ( @@ -537,37 +286,11 @@ B1FD8065D40A2D691F643F3B /* UIViewController+API.swift */, 39CCCB917D1881082ED75975 /* ViewController+Primer.swift */, D4139D8F153BB399DA67F2EE /* ViewController+PrimerUIHelpers.swift */, + 04F3235B2BD2F99000F5927C /* UIApplication+Extensions.swift */, ); path = Extension; sourceTree = ""; }; - 5836043C1C4E5A1CF7B81CDD /* Services */ = { - isa = PBXGroup; - children = ( - 994AE6760B506D02499AEC90 /* InternalCardComponentManagerTests.swift */, - 743F107C464526926A34A433 /* PaymentMethodConfigServiceTests.swift */, - 5D7EC742DEB5BE12252E3E5B /* PayPalServiceTests.swift */, - 952364FBFD6FA09653ECA37E /* TokenizationServiceTests.swift */, - 042ED15C2AF010500027833F /* CardValidationServiceTests.swift */, - ); - path = Services; - sourceTree = ""; - }; - 5CC7BF9D8A0A9D8490C48151 /* Primer */ = { - isa = PBXGroup; - children = ( - 876140D62B66F75D0058CA8C /* Klarna */, - E13E72432AFE64E800911866 /* Ideal */, - A15985C22ACDA82F00A64C3C /* NolPay */, - E9899972360BCA5992CEE5BC /* PrimerBancontactCardDataManagerTests.swift */, - EEB1E1B37192BF739461AFF1 /* PrimerRawCardDataManagerTests.swift */, - B266F9E1651BD20E45DCCF68 /* PrimerRawRetailerDataTests.swift */, - 049A055F2B4C191D002CEEBA /* NativeUIManagerTests.swift */, - A19CB17A2BAA129900DB4326 /* CVVRecaptureViewModelTests.swift */, - ); - path = Primer; - sourceTree = ""; - }; 5E99BB590FD6521F2D5403BB /* Sources */ = { isa = PBXGroup; children = ( @@ -582,39 +305,17 @@ path = Sources; sourceTree = ""; }; - 61C1263B3C114C5B0A1E5AB4 /* Services */ = { - isa = PBXGroup; - children = ( - 38DD0A9535544D446514124A /* CreateResumePaymentService.swift */, - 25FD540BEA16ABBDFE7DE182 /* PayPalService.swift */, - 2E8F69253D85350BB7A1A761 /* TokenizationService.swift */, - 5E8D7F3C53F8CCE4A03C975E /* VaultService.swift */, - 047D8E882ADEA4C700A5E7BD /* NetworkService.swift */, - 042ED1612AF0F5600027833F /* MockBINDataAPIClient.swift */, - ); - path = Services; - sourceTree = ""; - }; 61E8D69DF93462D748F446DF /* Pods */ = { isa = PBXGroup; children = ( - 97731417340A948FC8CD6ED8 /* Pods-Debug App.debug.xcconfig */, - DEC0E14FABFAE4D0EFC3A585 /* Pods-Debug App.release.xcconfig */, - B08BF9387885E3CCB33008A2 /* Pods-Debug App Tests.debug.xcconfig */, - 28249328E3C719F45A8196C9 /* Pods-Debug App Tests.release.xcconfig */, + BB7C19D2A72C70B70AA4DF8C /* Pods-Debug App.debug.xcconfig */, + 1F278229D66AFE30C9C39085 /* Pods-Debug App.release.xcconfig */, + 27B211EA3949D1672A82B5F6 /* Pods-Debug App Tests.debug.xcconfig */, + 85AFC960D1A9EB56C4561471 /* Pods-Debug App Tests.release.xcconfig */, ); path = Pods; sourceTree = ""; }; - 626776D8EFEF24D5C5A36307 /* Extensions */ = { - isa = PBXGroup; - children = ( - C7D8E1E91CA11EC6831ADEE4 /* EncodingDecodingContainerTests.swift */, - 04FAF9EB2AE7B33E002E4BAE /* StringExtensionTests.swift */, - ); - path = Extensions; - sourceTree = ""; - }; 64FB843527A1671D550B536F /* Network */ = { isa = PBXGroup; children = ( @@ -636,19 +337,6 @@ path = KlarnaHeadless; sourceTree = ""; }; - 876140D62B66F75D0058CA8C /* Klarna */ = { - isa = PBXGroup; - children = ( - 876140D72B66F8070058CA8C /* KlarnaTestsMocks.swift */, - 876140DD2B66F86A0058CA8C /* KlarnaComponentTests.swift */, - 876140E12B66F89D0058CA8C /* KlarnaHeadlessManagerTests.swift */, - 876140F32B70FBFE0058CA8C /* KlarnaTokenizationComponentTests.swift */, - 876140F52B716E060058CA8C /* KlarnaTokenizationManagerTests.swift */, - 87DF3EC62BA871BD00162100 /* PrimerKlarnaCategoriesViewControllerTests.swift */, - ); - path = Klarna; - sourceTree = ""; - }; 876140ED2B6BE8860058CA8C /* Merchant Helpers */ = { isa = PBXGroup; children = ( @@ -657,113 +345,6 @@ path = "Merchant Helpers"; sourceTree = ""; }; - 9EE81958BB2BB34183F6C0AB /* Modules */ = { - isa = PBXGroup; - children = ( - 5DB3B88857B810440CDA881E /* DropInUI_TokenizationViewModelTests.swift */, - 4A5E3ACDA26D44F66B55766B /* HUC_TokenizationViewModelTests.swift */, - 49DFB1ACD5014BF28ED283B3 /* PollingModuleTests.swift */, - 6C690FB7E6E8C942C87B1A1B /* PrimerAPIConfigurationModuleTests.swift */, - 1B8CB5A11A44AA9F3D7FE356 /* UserInterfaceModuleTests.swift */, - E1E502B02AFE9ECF00CD7F0A /* XCTestCase+Tokenization.swift */, - ); - path = Modules; - sourceTree = ""; - }; - A15985C22ACDA82F00A64C3C /* NolPay */ = { - isa = PBXGroup; - children = ( - 041295AB2AB9E2A900A4F243 /* PrimerHeadlessNolPayManagerTests.swift */, - A1536BAC2AEBEC3A0087DDC0 /* NolPayPhoneMetadataServiceTests.swift */, - A1585C742ACDAA700014F0B9 /* NolPayLinkedCardsComponentTests.swift */, - A13392BB2AD459E90005A4D7 /* NolPayLinkCardComponentTest.swift */, - A1A3D0F22AD5585A00F7D8C9 /* NolPayUnlinkCardComponentTest.swift */, - A1A3D0F42AD56BE300F7D8C9 /* NolPayPaymentComponentTests.swift */, - A1536BAE2AEC0A6D0087DDC0 /* NolTestsMocks.swift */, - ); - path = NolPay; - sourceTree = ""; - }; - A95565BDB7031F41ECD023D7 /* Helpers */ = { - isa = PBXGroup; - children = ( - D3D9154BF1E011FED6799CD5 /* CardData.swift */, - D038BDB23C062D362AAA09BE /* Networking.swift */, - 04769C142B1A680C0051581C /* Promises+Helper.swift */, - A12AC2542B505B6100C26999 /* CurrencyLoaderTests.swift */, - ); - path = Helpers; - sourceTree = ""; - }; - ACC4CBBD9744630CB46A5EE4 /* v2 */ = { - isa = PBXGroup; - children = ( - E63F5C5C1FD2F3E6CB02EC5A /* HeadlessUniversalCheckoutTests.swift */, - 5AA706A14BACFDB8E5715788 /* HeadlessVaultManagerTests.swift */, - 17476BFBED51F389FCE82F16 /* MockAPIClient.swift */, - 7EA7D2BB0AC0A1877DB2E6CE /* MockModule.swift */, - 8C7C082270CF1C6B7810F9B3 /* RawDataManagerTests.swift */, - ); - path = v2; - sourceTree = ""; - }; - C8A971C6C0021F0115DF44CC /* Utils */ = { - isa = PBXGroup; - children = ( - 0402B7B72AFBBC2200B02C75 /* ApplePayUtilsTest.swift */, - BA0B2BEE5C389FD13E210847 /* DateTests.swift */, - A1055D6E2AF125E90027B967 /* DebouncerTests.swift */, - 9314E0A4E884A8228611A030 /* IntExtensionTests.swift */, - BD26E8C6074BB89ACBD5B8B9 /* MaskTests.swift */, - 872A0647D4136E27365FB7F8 /* StringTests.swift */, - CA30891B2D5F9B6B97E56B99 /* WebViewUtilTests.swift */, - F08F63DD2B9F27F4006EF9A9 /* MetadataParserTests.swift */, - F08F63E52BA0BF0C006EF9A9 /* AppetizeConfigTests.swift */, - ); - path = Utils; - sourceTree = ""; - }; - D83EED4C1249B62B908781B0 /* Data Models */ = { - isa = PBXGroup; - children = ( - 1F79B50111AC4161CFB1EFE8 /* ApayaTests.swift */, - 31CFA93A373A7DB78DA77283 /* ApplePayTests.swift */, - 0402B7B52AFBBA7200B02C75 /* CardNetworkTests.swift */, - 5F8DC3341BDBB9AEDBE8D6DD /* DecodedClientToken.swift */, - A12AC2522B5046CF00C26999 /* CurrencyStorageTests.swift */, - 7A5E6F7A9C12C69CB66032E3 /* IPay88Tests.swift */, - 752785ACCF65527C239391A8 /* PaymentMethodConfigTests.swift */, - 9D122A0B71B707C2110AB7F5 /* PayPalConfirmBillingAgreementTests.swift */, - B9813BD518AC7C3F442B5075 /* PrimerCheckoutTheme.swift */, - AD381E7E16D01D8D743232F7 /* ThemeTests.swift */, - BF8639891B79E2FCCE10A510 /* ThreeDSErrorTests.swift */, - 021A00DEB01A46C876592575 /* ThreeDSProtocolVersionTests.swift */, - D0A003705AFF7F922BCFE75F /* TokenizationResponseTests.swift */, - ); - path = "Data Models"; - sourceTree = ""; - }; - D99811C39E1808A948623732 /* Unit Tests */ = { - isa = PBXGroup; - children = ( - 04DAAED22B03EEBE002E2614 /* Assets */, - E1A2F78003351E14426E0B36 /* Analytics */, - D83EED4C1249B62B908781B0 /* Data Models */, - 626776D8EFEF24D5C5A36307 /* Extensions */, - A95565BDB7031F41ECD023D7 /* Helpers */, - E4C8DBB82E4149A7C4D26467 /* Mocks */, - 9EE81958BB2BB34183F6C0AB /* Modules */, - 2F23D3C9CC9CBC1B95329B1C /* Network */, - 5CC7BF9D8A0A9D8490C48151 /* Primer */, - 5836043C1C4E5A1CF7B81CDD /* Services */, - 0479FB162AF2598800D0AFC9 /* Test Utilities */, - C8A971C6C0021F0115DF44CC /* Utils */, - ACC4CBBD9744630CB46A5EE4 /* v2 */, - F4AC1EC0F98CB56DA4D075CA /* Mocks.swift */, - ); - path = "Unit Tests"; - sourceTree = ""; - }; D9AC6F54A87D432982864A63 /* Model */ = { isa = PBXGroup; children = ( @@ -776,23 +357,6 @@ path = Model; sourceTree = ""; }; - D9FD37D45BD73B08D04AC94C /* Tests */ = { - isa = PBXGroup; - children = ( - 04DFAADB2AAA01E60030FECE /* Debug App Tests-Info.plist */, - D99811C39E1808A948623732 /* Unit Tests */, - ); - path = Tests; - sourceTree = ""; - }; - DAAB90DB09F0793B3580DE69 /* ViewModels */ = { - isa = PBXGroup; - children = ( - 7A3E75CD834937EF85DE1C14 /* MockVaultCheckoutViewModel.swift */, - ); - path = ViewModels; - sourceTree = ""; - }; DF30711EB149C64C364BB79A /* Products */ = { isa = PBXGroup; children = ( @@ -802,28 +366,6 @@ name = Products; sourceTree = ""; }; - E11F47402B06C4E30091C31F /* New UI */ = { - isa = PBXGroup; - children = ( - E11F47412B06C4E30091C31F /* FormWithRedirect */, - E11F47462B06C4E30091C31F /* MerchantNewLineItemViewController.swift */, - E11F47472B06C4E30091C31F /* MerchantHeadlessCheckoutNolPayViewController.swift */, - ); - name = "New UI"; - path = "Sources/View Controllers/New UI"; - sourceTree = SOURCE_ROOT; - }; - E11F47412B06C4E30091C31F /* FormWithRedirect */ = { - isa = PBXGroup; - children = ( - E11F47422B06C4E30091C31F /* MerchantHeadlessCheckoutBankViewController.swift */, - E11F47432B06C4E30091C31F /* BanksListView.swift */, - E11F47442B06C4E30091C31F /* BanksListModel.swift */, - E11F47452B06C4E30091C31F /* ImageViewWithUrl.swift */, - ); - path = FormWithRedirect; - sourceTree = ""; - }; E11F474E2B06C5030091C31F /* FormWithRedirect */ = { isa = PBXGroup; children = ( @@ -835,40 +377,6 @@ path = FormWithRedirect; sourceTree = ""; }; - E13E72432AFE64E800911866 /* Ideal */ = { - isa = PBXGroup; - children = ( - E11F47402B06C4E30091C31F /* New UI */, - E13E72442AFE653000911866 /* IdealPaymentMethodTests.swift */, - E1A297252B036AB1005ADA51 /* BankComponentTests.swift */, - E108F58D2B0D4F0800EC3CC6 /* WebRedirectComponentTests.swift */, - E11F473C2B0694C50091C31F /* PrimerHeadlessFormWithRedirectManagerTests.swift */, - ); - path = Ideal; - sourceTree = ""; - }; - E1A2F78003351E14426E0B36 /* Analytics */ = { - isa = PBXGroup; - children = ( - 04F6EF732AE6A06200115D05 /* AnalyticsEventsTests.swift */, - 049298002B1DD466002E04B8 /* AnalyticsServiceTests.swift */, - 049298062B1E1F4D002E04B8 /* AnalyticsStorageTests.swift */, - ); - path = Analytics; - sourceTree = ""; - }; - E4C8DBB82E4149A7C4D26467 /* Mocks */ = { - isa = PBXGroup; - children = ( - 0442B6422B7BA468004DB054 /* Analytics */, - 042ED1632AF0F5CE0027833F /* Delegates */, - 61C1263B3C114C5B0A1E5AB4 /* Services */, - DAAB90DB09F0793B3580DE69 /* ViewModels */, - 8A23886804B13FA754E775D0 /* MockPaymentMethodTokenizationViewModel.swift */, - ); - path = Mocks; - sourceTree = ""; - }; EF5FBE3673FBCB40F55F4DC0 /* New UI */ = { isa = PBXGroup; children = ( @@ -880,15 +388,6 @@ path = "New UI"; sourceTree = ""; }; - EF8855DEDF971BA3B94636A0 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 8A2886D1F7D43E091FD80419 /* Pods_Debug_App.framework */, - 82C5808E70210187BAEC47B1 /* Pods_Debug_App_Tests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; F214F09DF97D2A83FC7D0BE0 /* View */ = { isa = PBXGroup; children = ( @@ -900,9 +399,9 @@ FBDF3F8B5F93A0EC28048640 /* Project */ = { isa = PBXGroup; children = ( + 04F323602BD408C600F5927C /* Tests */, 094077DEFDC2739B10CF4183 /* Resources */, 5E99BB590FD6521F2D5403BB /* Sources */, - D9FD37D45BD73B08D04AC94C /* Tests */, 4ACFB17A73AB7240BED98585 /* ExampleApp.entitlements */, FB1F71737862EF5D0F4FE5AB /* Info.plist */, ); @@ -916,7 +415,7 @@ isa = PBXNativeTarget; buildConfigurationList = 4700FFD06E10F0EE123A7B8B /* Build configuration list for PBXNativeTarget "Debug App Tests" */; buildPhases = ( - 38CE3210461AF2DB7193B25B /* [CP] Check Pods Manifest.lock */, + 1130539E7FE8944445055CB5 /* [CP] Check Pods Manifest.lock */, 1E0FCAD905F5F8F13B6A164B /* Sources */, 9CED4C4EFACB340F3C55B1F0 /* Resources */, D11E367C3560C383BC4CA0A7 /* Embed Frameworks */, @@ -936,13 +435,13 @@ isa = PBXNativeTarget; buildConfigurationList = CA98A6B11506835A81F6391A /* Build configuration list for PBXNativeTarget "Debug App" */; buildPhases = ( - 0C48779C396DBF62C6CAB8C0 /* [CP] Check Pods Manifest.lock */, + F95E0F04FEDC53EFF22A8FAD /* [CP] Check Pods Manifest.lock */, 66BB6A7BADD3A9CDD6412CE2 /* Sources */, 10FBAAC827CE0E3983CD7597 /* Resources */, 73B416AD9A0CB3B0EA16AF79 /* Embed Frameworks */, CB612F7DF16CD3190025327F /* Frameworks */, A18BD8BD2AFE4B0900923C87 /* SwiftLint */, - A6EE74438C5753653409B474 /* [CP] Embed Pods Frameworks */, + B23FED1E6EB620606C7965BB /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -1006,7 +505,6 @@ buildActionMask = 2147483647; files = ( A19EF5632B20E22E00A72F60 /* .swiftlint.yml in Resources */, - 04DFAADC2AAA01E60030FECE /* Debug App Tests-Info.plist in Resources */, EA7FAA4F8476BD3711D628CB /* Images.xcassets in Resources */, F0C2147F6FA26527BE55549A /* LaunchScreen.xib in Resources */, 949864026D1CDE6F5C62C66E /* Main.storyboard in Resources */, @@ -1017,13 +515,14 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 04F323622BD408C600F5927C /* Debug App Tests-Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 0C48779C396DBF62C6CAB8C0 /* [CP] Check Pods Manifest.lock */ = { + 1130539E7FE8944445055CB5 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1038,69 +537,69 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Debug App-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Debug App Tests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 38CE3210461AF2DB7193B25B /* [CP] Check Pods Manifest.lock */ = { + A18BD8BD2AFE4B0900923C87 /* SwiftLint */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; + name = SwiftLint; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Debug App Tests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "if [[ \"$(uname -m)\" == arm64 ]]; then\n export PATH=\"/opt/homebrew/bin:$PATH\"\nfi\n\nif which swiftlint > /dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; }; - A18BD8BD2AFE4B0900923C87 /* SwiftLint */ = { + B23FED1E6EB620606C7965BB /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Debug App/Pods-Debug App-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); - name = SwiftLint; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Debug App/Pods-Debug App-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "if [[ \"$(uname -m)\" == arm64 ]]; then\n export PATH=\"/opt/homebrew/bin:$PATH\"\nfi\n\nif which swiftlint > /dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Debug App/Pods-Debug App-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; - A6EE74438C5753653409B474 /* [CP] Embed Pods Frameworks */ = { + F95E0F04FEDC53EFF22A8FAD /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Debug App/Pods-Debug App-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Debug App/Pods-Debug App-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Debug App-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Debug App/Pods-Debug App-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -1110,100 +609,9 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 876140DE2B66F86A0058CA8C /* KlarnaComponentTests.swift in Sources */, - 70EAA3B33425CC9D16239BB0 /* ApplePayTests.swift in Sources */, - A13392BC2AD459E90005A4D7 /* NolPayLinkCardComponentTest.swift in Sources */, - 3FD160A4D951EA772ADF4E25 /* DecodedClientToken.swift in Sources */, - 876140E22B66F89D0058CA8C /* KlarnaHeadlessManagerTests.swift in Sources */, - 876140D82B66F8070058CA8C /* KlarnaTestsMocks.swift in Sources */, - E1E502B12AFE9ECF00CD7F0A /* XCTestCase+Tokenization.swift in Sources */, - 3D112A8DE292D097E651FCDB /* IPay88Tests.swift in Sources */, - 04DAAED42B03EED1002E2614 /* AssetsManagerTests.swift in Sources */, - F08F63E62BA0BF0C006EF9A9 /* AppetizeConfigTests.swift in Sources */, - A1536BAF2AEC0A6D0087DDC0 /* NolTestsMocks.swift in Sources */, - A61B9E61EDCE18D34438352E /* PayPalConfirmBillingAgreementTests.swift in Sources */, - 047EE2022BB47B1B006C775C /* NetworkingReportingServiceTests.swift in Sources */, - E13E72452AFE653000911866 /* IdealPaymentMethodTests.swift in Sources */, - 0442B6472B7BA4C7004DB054 /* MockPrimerAPIAnalyticsClient.swift in Sources */, - 8064B65A8F83D5B004D081FD /* PaymentMethodConfigTests.swift in Sources */, - 04DAAED62B03EF0B002E2614 /* SDKSessionHelper.swift in Sources */, - 0488648D2BA89402007BCDA6 /* CodingUtilities.swift in Sources */, - 4BD7794627267B40E9E10686 /* PrimerCheckoutTheme.swift in Sources */, - A12AC2552B505B6200C26999 /* CurrencyLoaderTests.swift in Sources */, - F99DAF50E86E6F8CCD127E5B /* ThemeTests.swift in Sources */, - A12AC2532B5046CF00C26999 /* CurrencyStorageTests.swift in Sources */, - 0488648F2BA89E04007BCDA6 /* NetworkResponseFactoryTests.swift in Sources */, - 04769C152B1A680C0051581C /* Promises+Helper.swift in Sources */, - 049298072B1E1F4D002E04B8 /* AnalyticsStorageTests.swift in Sources */, - 24C060A48D4A2670FFC3426F /* ThreeDSErrorTests.swift in Sources */, - F1A71C2E0D900FEB9AF1351C /* ThreeDSProtocolVersionTests.swift in Sources */, - E108F58E2B0D4F0800EC3CC6 /* WebRedirectComponentTests.swift in Sources */, - 04FAF9EC2AE7B33E002E4BAE /* StringExtensionTests.swift in Sources */, - C29B625B5698094691227852 /* TokenizationResponseTests.swift in Sources */, - 047D8E892ADEA4C700A5E7BD /* NetworkService.swift in Sources */, - 041F52092ADE92A300A1D702 /* ListCardNetworksEndpointTests.swift in Sources */, - 0402B7B62AFBBA7200B02C75 /* CardNetworkTests.swift in Sources */, - A1585C752ACDAA700014F0B9 /* NolPayLinkedCardsComponentTests.swift in Sources */, - 088961D00784BD296EA9745C /* EncodingDecodingContainerTests.swift in Sources */, - 800B92A57CAAC6471D01A89D /* CardData.swift in Sources */, - A1A3D0F32AD5585A00F7D8C9 /* NolPayUnlinkCardComponentTest.swift in Sources */, - 3BB02CA24B6B3EF458326B7D /* Networking.swift in Sources */, - 04A153CF2BC40CE10018D805 /* RequestDispatcherTests.swift in Sources */, - 25FA73D4BBA89962663B5378 /* Mocks.swift in Sources */, - 2E0D85B7343377F1319902AD /* MockPaymentMethodTokenizationViewModel.swift in Sources */, - A19CB17B2BAA129900DB4326 /* CVVRecaptureViewModelTests.swift in Sources */, - E11F473D2B0694C50091C31F /* PrimerHeadlessFormWithRedirectManagerTests.swift in Sources */, - 161D4BE3FFD5E4A60F4461F0 /* CreateResumePaymentService.swift in Sources */, - C6D7F7ECFD35B3DC3AFD6CB2 /* PayPalService.swift in Sources */, - 042ED1622AF0F5600027833F /* MockBINDataAPIClient.swift in Sources */, - 5976CCA261F0811F5D7707DA /* TokenizationService.swift in Sources */, - 583EBAA90902121CEA479416 /* VaultService.swift in Sources */, - 87DF3EC72BA871BD00162100 /* PrimerKlarnaCategoriesViewControllerTests.swift in Sources */, - 961B5D18058EF4CFCD0185AE /* MockVaultCheckoutViewModel.swift in Sources */, - 622A605DDEA98D981670B53F /* DropInUI_TokenizationViewModelTests.swift in Sources */, - 0488648B2BA88F63007BCDA6 /* NetworkRequestFactoryTests.swift in Sources */, - F03699592AC2E63700E4179D /* (null) in Sources */, - 208CA849F3187C2DA63CC17B /* HUC_TokenizationViewModelTests.swift in Sources */, - 213196DEDF2A3A84037ED884 /* PollingModuleTests.swift in Sources */, - 04F6EF742AE6A06200115D05 /* AnalyticsEventsTests.swift in Sources */, - 049298012B1DD466002E04B8 /* AnalyticsServiceTests.swift in Sources */, - 1589385B62C86DE7C735F3EC /* PrimerAPIConfigurationModuleTests.swift in Sources */, - E130C3D92AFD19FF00AC3E7C /* NetworkTests.swift in Sources */, - A39750255D4C33527A3766A0 /* UserInterfaceModuleTests.swift in Sources */, - 0479FB192AF2599A00D0AFC9 /* StringTyper.swift in Sources */, - 3EE90DEB1DB7BE9270FB17BF /* URLSessionStackTests.swift in Sources */, - 2C98B33ECA68109C7A6AA134 /* PrimerBancontactCardDataManagerTests.swift in Sources */, - 876140F62B716E060058CA8C /* KlarnaTokenizationManagerTests.swift in Sources */, - 05FAC0D894B841B52E9E0A9A /* PrimerRawCardDataManagerTests.swift in Sources */, - D649870C2D022B4063BDC0B4 /* PrimerRawRetailerDataTests.swift in Sources */, - A1536BAD2AEBEC3A0087DDC0 /* NolPayPhoneMetadataServiceTests.swift in Sources */, - F08F63DE2B9F27F4006EF9A9 /* MetadataParserTests.swift in Sources */, - 04236A9B2B7D2EA50041EC11 /* JWTFactory.swift in Sources */, - 7F49B29FCC55CF3C5CB6C506 /* InternalCardComponentManagerTests.swift in Sources */, - DB1A2989DDE0928C62B15303 /* PayPalServiceTests.swift in Sources */, - 97F0B302DF965C1AD1EC6F4D /* PaymentMethodConfigServiceTests.swift in Sources */, - 33EA4F728A7984997A0EF515 /* TokenizationServiceTests.swift in Sources */, - E1A297262B036AB1005ADA51 /* BankComponentTests.swift in Sources */, - 91FAC91E687B6981268E677E /* DateTests.swift in Sources */, - 042ED1652AF0F5FD0027833F /* MockRawDataManagerDelegate.swift in Sources */, - 041295AD2AB9E2C100A4F243 /* PrimerHeadlessNolPayManagerTests.swift in Sources */, - DC98712939835FB79A20BD63 /* IntExtensionTests.swift in Sources */, - 044348DE2BB5B3D80072D97C /* DefaultNetworkServiceTests.swift in Sources */, - 049A05602B4C191D002CEEBA /* NativeUIManagerTests.swift in Sources */, - 6B2212601374387CB004DA86 /* MaskTests.swift in Sources */, - C8A64A69AD55D9BF82F0D876 /* StringTests.swift in Sources */, - 0402B7B82AFBBC2200B02C75 /* ApplePayUtilsTest.swift in Sources */, - 77A8EFBA78D6C6B95A400C74 /* WebViewUtilTests.swift in Sources */, - 876140F42B70FBFE0058CA8C /* KlarnaTokenizationComponentTests.swift in Sources */, - 242EF5037D6FB396B7AE1CB5 /* HeadlessUniversalCheckoutTests.swift in Sources */, - 042ED15D2AF010500027833F /* CardValidationServiceTests.swift in Sources */, - 2662EB3445AE8C7188953EFD /* HeadlessVaultManagerTests.swift in Sources */, - A1A3D0F52AD56BE300F7D8C9 /* NolPayPaymentComponentTests.swift in Sources */, - 0442B6492B7BA4CD004DB054 /* MockAnalyticsStorage.swift in Sources */, - 9263BD762EC26F6AA986F0C9 /* MockAPIClient.swift in Sources */, - A1055D6F2AF125E90027B967 /* DebouncerTests.swift in Sources */, - 8B5CB0C992DBAB293D378FAD /* MockModule.swift in Sources */, - E6F85ECD80B64754E7A6D35E /* RawDataManagerTests.swift in Sources */, + F03699592AC2E63700E4179D /* BuildFile in Sources */, + 04F323612BD408C600F5927C /* AppetizeConfigTests.swift in Sources */, + 04F323632BD408C600F5927C /* MetadataParserTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1215,14 +623,16 @@ 60F7E716B34BE721651566DA /* Data+Extensions.swift in Sources */, CE5E673A96BB5B96AE5EFC56 /* Range+Extensions.swift in Sources */, 85605C241F1CD45BA676D4A7 /* String+Extensions.swift in Sources */, + 04F323662BD40A2300F5927C /* MerchantNewLineItemViewController.swift in Sources */, 0BB8BB3F9A6AC28A0C107DC8 /* UIStackViewExtensions.swift in Sources */, DE53DA2D0AD108306C92E198 /* UIViewController+API.swift in Sources */, 85EDC3F175D699BFF6BD48EF /* ViewController+Primer.swift in Sources */, - E11F47482B06C4E30091C31F /* MerchantHeadlessCheckoutBankViewController.swift in Sources */, 60F6C3AFA11A7EDB0687856A /* ViewController+PrimerUIHelpers.swift in Sources */, 5E24CD5B3084FE3E8A3E85EC /* CheckoutTheme.swift in Sources */, + 04F323642BD409FE00F5927C /* BanksListModel.swift in Sources */, AAE3B30B64B6822A20987FCA /* CreateClientToken.swift in Sources */, F08F63D82B9B5A7C006EF9A9 /* SessionConfiguration.swift in Sources */, + 04F323652BD40A0E00F5927C /* MerchantHeadlessCheckoutBankViewController.swift in Sources */, 876141082B8346650058CA8C /* MerchantHeadlessKlarnaInitializationView.swift in Sources */, C75A11E6AEEFC2B7A29BBC04 /* TestScenario.swift in Sources */, F08F63DC2B9F27B0006EF9A9 /* MetadataParser.swift in Sources */, @@ -1232,7 +642,6 @@ 049A055E2B4BF057002CEEBA /* MerchantHeadlessVaultManagerViewController.swift in Sources */, 53E3182FFC4E5F05D866CFAE /* Networking.swift in Sources */, 592E00D98C8835CBCDAA26D9 /* MerchantDropInUIViewController.swift in Sources */, - E11F474C2B06C4E30091C31F /* MerchantNewLineItemViewController.swift in Sources */, 8761410A2B8355920058CA8C /* MerchantHeadlessKlarnaInitializationViewModel.swift in Sources */, 041295AA2AB9E25D00A4F243 /* MerchantHeadlessCheckoutNolPayViewController.swift in Sources */, 135E5BFD51371FABB5FF35D3 /* MerchantHeadlessCheckoutAvailablePaymentMethodsViewController.swift in Sources */, @@ -1241,13 +650,13 @@ 72F8D6065334FCD5B726A52C /* MerchantHeadlessCheckoutRawPhoneNumberDataViewController.swift in Sources */, 14EE32F4821BD1F19F75227F /* MerchantHeadlessCheckoutRawRetailDataViewController.swift in Sources */, F02F496FD20B5291C044F62C /* MerchantResultViewController.swift in Sources */, + 04F3235C2BD2F99000F5927C /* UIApplication+Extensions.swift in Sources */, 8761410C2B849A250058CA8C /* MerchantHeadlessKlarnaInitializationView+Elements.swift in Sources */, 876140EF2B6BE8C20058CA8C /* MerchantHelpers.swift in Sources */, 0489E2BB2B68F71300FA0682 /* TapGestureRecognizer.swift in Sources */, F08F63DA2B9B5BC5006EF9A9 /* AppetizeConfigProvider.swift in Sources */, E11F47562B06C5030091C31F /* ImageViewWithUrl.swift in Sources */, 34CDCA7B403C001E4C55D26D /* MerchantSessionAndSettingsViewController.swift in Sources */, - E11F474A2B06C4E30091C31F /* BanksListModel.swift in Sources */, 876140E62B67F3B30058CA8C /* MerchantHeadlessCheckoutKlarnaViewController+Klarna.swift in Sources */, C0115AC7BC96FDF49EF8E530 /* PaymentMethodCell.swift in Sources */, ); @@ -1315,7 +724,7 @@ /* Begin XCBuildConfiguration section */ 313E094F25A94116E340B043 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 97731417340A948FC8CD6ED8 /* Pods-Debug App.debug.xcconfig */; + baseConfigurationReference = BB7C19D2A72C70B70AA4DF8C /* Pods-Debug App.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/ExampleApp.entitlements"; @@ -1350,7 +759,7 @@ }; 44381669975E0C07E78FA641 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DEC0E14FABFAE4D0EFC3A585 /* Pods-Debug App.release.xcconfig */; + baseConfigurationReference = 1F278229D66AFE30C9C39085 /* Pods-Debug App.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = "$(SRCROOT)/ExampleApp.entitlements"; @@ -1384,7 +793,7 @@ }; 5434DA74E34D2EBEBD3D74C7 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B08BF9387885E3CCB33008A2 /* Pods-Debug App Tests.debug.xcconfig */; + baseConfigurationReference = 27B211EA3949D1672A82B5F6 /* Pods-Debug App Tests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_IDENTITY = "iPhone Developer"; @@ -1467,7 +876,7 @@ }; F10A44A87CE1B40DAFF5D30F /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 28249328E3C719F45A8196C9 /* Pods-Debug App Tests.release.xcconfig */; + baseConfigurationReference = 85AFC960D1A9EB56C4561471 /* Pods-Debug App Tests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_IDENTITY = "iPhone Developer"; diff --git a/Debug App/Sources/Extension/UIApplication+Extensions.swift b/Debug App/Sources/Extension/UIApplication+Extensions.swift new file mode 100644 index 0000000000..7362fa81cd --- /dev/null +++ b/Debug App/Sources/Extension/UIApplication+Extensions.swift @@ -0,0 +1,23 @@ +// +// UIApplication+Extensions.swift +// Debug App +// +// Created by Jack Newcombe on 19/04/2024. +// Copyright © 2024 Primer API Ltd. All rights reserved. +// + +import UIKit + +extension UIApplication { + var windows: [UIWindow] { + let windowScene = self.connectedScenes.compactMap{ $0 as? UIWindowScene }.first + guard let windows = windowScene?.windows else { + return [] + } + return windows + } + + var keyWindow: UIWindow? { + return windows.first + } +} diff --git a/Debug App/Tests/Unit Tests/Utils/AppetizeConfigTests.swift b/Debug App/Tests/AppetizeConfigTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Utils/AppetizeConfigTests.swift rename to Debug App/Tests/AppetizeConfigTests.swift diff --git a/Debug App/Tests/Unit Tests/Utils/MetadataParserTests.swift b/Debug App/Tests/MetadataParserTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Utils/MetadataParserTests.swift rename to Debug App/Tests/MetadataParserTests.swift diff --git a/Debug App/Tests/Unit Tests/Network/Legacy/NetworkTests.swift b/Debug App/Tests/Unit Tests/Network/Legacy/NetworkTests.swift deleted file mode 100644 index fc8fdfddc6..0000000000 --- a/Debug App/Tests/Unit Tests/Network/Legacy/NetworkTests.swift +++ /dev/null @@ -1,17 +0,0 @@ -// -// NetworkTests.swift -// Debug App Tests -// -// Created by Alexandra Lovin on 09.11.2023. -// Copyright © 2023 Primer API Ltd. All rights reserved. -// - -import XCTest -@testable import Debug_App -final class NetworkTests: XCTestCase { - - func test_http_headers_new_workflows() { - XCTAssertNil(URL.requestSessionHTTPHeaders(useNewWorkflows: false)) - XCTAssertEqual(URL.requestSessionHTTPHeaders(useNewWorkflows: true), ["Legacy-Workflows": "false"]) - } -} diff --git a/Package.swift b/Package.swift index 80c699d9b3..270e157592 100644 --- a/Package.swift +++ b/Package.swift @@ -22,6 +22,13 @@ let package = Package( .process("Resources"), .copy("Classes/Third Party/PromiseKit/LICENSE") ] + ), + .testTarget( + name: "PrimerSDKTests", + dependencies: [ + .byName(name: "PrimerSDK") + ], + path: "Tests/Unit Tests" ) ], swiftLanguageVersions: [.v5] diff --git a/Sources/PrimerSDK/Classes/Core/Analytics/AnalyticsStorage.swift b/Sources/PrimerSDK/Classes/Core/Analytics/AnalyticsStorage.swift index 4f98a90c2f..fe57284976 100644 --- a/Sources/PrimerSDK/Classes/Core/Analytics/AnalyticsStorage.swift +++ b/Sources/PrimerSDK/Classes/Core/Analytics/AnalyticsStorage.swift @@ -58,6 +58,7 @@ extension Analytics { func save(_ events: [Analytics.Event]) throws { do { let eventsData = try JSONEncoder().encode(events) + try FileManager.default.createDirectory(at: fileURL.deletingLastPathComponent(), withIntermediateDirectories: true) try eventsData.write(to: fileURL) } catch { logger.error(message: "📚 Analytics: Failed to save file \(error.localizedDescription)") diff --git a/Sources/PrimerSDK/Classes/User Interface/TokenizationViewModels/WebRedirectPaymentMethodTokenizationViewModel.swift b/Sources/PrimerSDK/Classes/User Interface/TokenizationViewModels/WebRedirectPaymentMethodTokenizationViewModel.swift index 609257d7d3..33aef8b9a0 100644 --- a/Sources/PrimerSDK/Classes/User Interface/TokenizationViewModels/WebRedirectPaymentMethodTokenizationViewModel.swift +++ b/Sources/PrimerSDK/Classes/User Interface/TokenizationViewModels/WebRedirectPaymentMethodTokenizationViewModel.swift @@ -199,6 +199,16 @@ class WebRedirectPaymentMethodTokenizationViewModel: PaymentMethodTokenizationVi ) Analytics.Service.record(events: [presentEvent, networkEvent]) + + #if DEBUG + // This ensures that the presentation completion is correctly handled in headless unit tests + guard UIApplication.shared.windows.count > 0 else { + self.handleWebViewControllerPresentedCompletion() + seal.fulfill() + return + } + #endif + if PrimerUIManager.primerRootViewController == nil { firstly { PrimerUIManager.prepareRootViewController() @@ -206,7 +216,7 @@ class WebRedirectPaymentMethodTokenizationViewModel: PaymentMethodTokenizationVi .done { PrimerUIManager.primerRootViewController?.present(self.webViewController!, animated: true, completion: { DispatchQueue.main.async { - self.handleWebViewControlllerPresentedCompletion() + self.handleWebViewControllerPresentedCompletion() seal.fulfill() } }) @@ -215,7 +225,7 @@ class WebRedirectPaymentMethodTokenizationViewModel: PaymentMethodTokenizationVi } else { PrimerUIManager.primerRootViewController?.present(self.webViewController!, animated: true, completion: { DispatchQueue.main.async { - self.handleWebViewControlllerPresentedCompletion() + self.handleWebViewControllerPresentedCompletion() seal.fulfill() } }) @@ -224,7 +234,7 @@ class WebRedirectPaymentMethodTokenizationViewModel: PaymentMethodTokenizationVi } } - private func handleWebViewControlllerPresentedCompletion() { + private func handleWebViewControllerPresentedCompletion() { DispatchQueue.main.async { let viewEvent = Analytics.Event.ui( action: .view, diff --git a/Debug App/Tests/Unit Tests/Analytics/AnalyticsEventsTests.swift b/Tests/Unit Tests/Analytics/AnalyticsEventsTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Analytics/AnalyticsEventsTests.swift rename to Tests/Unit Tests/Analytics/AnalyticsEventsTests.swift diff --git a/Debug App/Tests/Unit Tests/Analytics/AnalyticsServiceTests.swift b/Tests/Unit Tests/Analytics/AnalyticsServiceTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Analytics/AnalyticsServiceTests.swift rename to Tests/Unit Tests/Analytics/AnalyticsServiceTests.swift diff --git a/Debug App/Tests/Unit Tests/Analytics/AnalyticsStorageTests.swift b/Tests/Unit Tests/Analytics/AnalyticsStorageTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Analytics/AnalyticsStorageTests.swift rename to Tests/Unit Tests/Analytics/AnalyticsStorageTests.swift diff --git a/Debug App/Tests/Unit Tests/Assets/AssetsManagerTests.swift b/Tests/Unit Tests/Assets/AssetsManagerTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Assets/AssetsManagerTests.swift rename to Tests/Unit Tests/Assets/AssetsManagerTests.swift diff --git a/Debug App/Tests/Unit Tests/Data Models/ApplePayTests.swift b/Tests/Unit Tests/Data Models/ApplePayTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Data Models/ApplePayTests.swift rename to Tests/Unit Tests/Data Models/ApplePayTests.swift diff --git a/Debug App/Tests/Unit Tests/Data Models/CardNetworkTests.swift b/Tests/Unit Tests/Data Models/CardNetworkTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Data Models/CardNetworkTests.swift rename to Tests/Unit Tests/Data Models/CardNetworkTests.swift diff --git a/Debug App/Tests/Unit Tests/Data Models/CurrencyStorageTests.swift b/Tests/Unit Tests/Data Models/CurrencyStorageTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Data Models/CurrencyStorageTests.swift rename to Tests/Unit Tests/Data Models/CurrencyStorageTests.swift diff --git a/Debug App/Tests/Unit Tests/Data Models/DecodedClientToken.swift b/Tests/Unit Tests/Data Models/DecodedClientToken.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Data Models/DecodedClientToken.swift rename to Tests/Unit Tests/Data Models/DecodedClientToken.swift diff --git a/Debug App/Tests/Unit Tests/Data Models/IPay88Tests.swift b/Tests/Unit Tests/Data Models/IPay88Tests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Data Models/IPay88Tests.swift rename to Tests/Unit Tests/Data Models/IPay88Tests.swift diff --git a/Debug App/Tests/Unit Tests/Data Models/PayPalConfirmBillingAgreementTests.swift b/Tests/Unit Tests/Data Models/PayPalConfirmBillingAgreementTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Data Models/PayPalConfirmBillingAgreementTests.swift rename to Tests/Unit Tests/Data Models/PayPalConfirmBillingAgreementTests.swift diff --git a/Debug App/Tests/Unit Tests/Data Models/PaymentMethodConfigTests.swift b/Tests/Unit Tests/Data Models/PaymentMethodConfigTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Data Models/PaymentMethodConfigTests.swift rename to Tests/Unit Tests/Data Models/PaymentMethodConfigTests.swift diff --git a/Debug App/Tests/Unit Tests/Data Models/PrimerCheckoutTheme.swift b/Tests/Unit Tests/Data Models/PrimerCheckoutTheme.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Data Models/PrimerCheckoutTheme.swift rename to Tests/Unit Tests/Data Models/PrimerCheckoutTheme.swift diff --git a/Debug App/Tests/Unit Tests/Data Models/ThemeTests.swift b/Tests/Unit Tests/Data Models/ThemeTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Data Models/ThemeTests.swift rename to Tests/Unit Tests/Data Models/ThemeTests.swift diff --git a/Debug App/Tests/Unit Tests/Data Models/ThreeDSErrorTests.swift b/Tests/Unit Tests/Data Models/ThreeDSErrorTests.swift similarity index 99% rename from Debug App/Tests/Unit Tests/Data Models/ThreeDSErrorTests.swift rename to Tests/Unit Tests/Data Models/ThreeDSErrorTests.swift index ac0ad49348..50ba29ee95 100644 --- a/Debug App/Tests/Unit Tests/Data Models/ThreeDSErrorTests.swift +++ b/Tests/Unit Tests/Data Models/ThreeDSErrorTests.swift @@ -6,9 +6,10 @@ // Copyright © 2023 Primer API Ltd. All rights reserved. // +#if canImport(Primer3DS) import XCTest @testable import PrimerSDK -@testable import Primer3DS +import Primer3DS class ThreeDSErrorTests: XCTestCase { @@ -189,3 +190,4 @@ class ThreeDSErrorTests: XCTestCase { threeDsErrorDetail: primer3DSError.threeDsErrorDetail)) } } +#endif diff --git a/Debug App/Tests/Unit Tests/Data Models/ThreeDSProtocolVersionTests.swift b/Tests/Unit Tests/Data Models/ThreeDSProtocolVersionTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Data Models/ThreeDSProtocolVersionTests.swift rename to Tests/Unit Tests/Data Models/ThreeDSProtocolVersionTests.swift diff --git a/Debug App/Tests/Unit Tests/Data Models/TokenizationResponseTests.swift b/Tests/Unit Tests/Data Models/TokenizationResponseTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Data Models/TokenizationResponseTests.swift rename to Tests/Unit Tests/Data Models/TokenizationResponseTests.swift diff --git a/Debug App/Tests/Unit Tests/Extensions/EncodingDecodingContainerTests.swift b/Tests/Unit Tests/Extensions/EncodingDecodingContainerTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Extensions/EncodingDecodingContainerTests.swift rename to Tests/Unit Tests/Extensions/EncodingDecodingContainerTests.swift diff --git a/Debug App/Tests/Unit Tests/Extensions/StringExtensionTests.swift b/Tests/Unit Tests/Extensions/StringExtensionTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Extensions/StringExtensionTests.swift rename to Tests/Unit Tests/Extensions/StringExtensionTests.swift diff --git a/Debug App/Tests/Unit Tests/Helpers/CardData.swift b/Tests/Unit Tests/Helpers/CardData.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Helpers/CardData.swift rename to Tests/Unit Tests/Helpers/CardData.swift diff --git a/Debug App/Tests/Unit Tests/Helpers/CurrencyLoaderTests.swift b/Tests/Unit Tests/Helpers/CurrencyLoaderTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Helpers/CurrencyLoaderTests.swift rename to Tests/Unit Tests/Helpers/CurrencyLoaderTests.swift diff --git a/Debug App/Tests/Unit Tests/Helpers/Networking.swift b/Tests/Unit Tests/Helpers/Networking.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Helpers/Networking.swift rename to Tests/Unit Tests/Helpers/Networking.swift diff --git a/Debug App/Tests/Unit Tests/Helpers/Promises+Helper.swift b/Tests/Unit Tests/Helpers/Promises+Helper.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Helpers/Promises+Helper.swift rename to Tests/Unit Tests/Helpers/Promises+Helper.swift diff --git a/Debug App/Tests/Unit Tests/Mocks.swift b/Tests/Unit Tests/Mocks.swift similarity index 99% rename from Debug App/Tests/Unit Tests/Mocks.swift rename to Tests/Unit Tests/Mocks.swift index a8009c2d6d..c177c6dc0c 100644 --- a/Debug App/Tests/Unit Tests/Mocks.swift +++ b/Tests/Unit Tests/Mocks.swift @@ -371,7 +371,7 @@ class MockPrimerAPIConfigurationModule: PrimerAPIConfigurationModuleProtocol { // MARK: - MOCKED PROPERTIES - var mockedNetworkDelay: TimeInterval = 2 + var mockedNetworkDelay: TimeInterval = 0.5 var mockedAPIConfiguration: PrimerAPIConfiguration? func setupSession( diff --git a/Debug App/Tests/Unit Tests/Mocks/Analytics/MockAnalyticsStorage.swift b/Tests/Unit Tests/Mocks/Analytics/MockAnalyticsStorage.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Mocks/Analytics/MockAnalyticsStorage.swift rename to Tests/Unit Tests/Mocks/Analytics/MockAnalyticsStorage.swift diff --git a/Debug App/Tests/Unit Tests/Mocks/Analytics/MockPrimerAPIAnalyticsClient.swift b/Tests/Unit Tests/Mocks/Analytics/MockPrimerAPIAnalyticsClient.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Mocks/Analytics/MockPrimerAPIAnalyticsClient.swift rename to Tests/Unit Tests/Mocks/Analytics/MockPrimerAPIAnalyticsClient.swift diff --git a/Debug App/Tests/Unit Tests/Mocks/Delegates/MockRawDataManagerDelegate.swift b/Tests/Unit Tests/Mocks/Delegates/MockRawDataManagerDelegate.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Mocks/Delegates/MockRawDataManagerDelegate.swift rename to Tests/Unit Tests/Mocks/Delegates/MockRawDataManagerDelegate.swift diff --git a/Debug App/Tests/Unit Tests/Mocks/MockPaymentMethodTokenizationViewModel.swift b/Tests/Unit Tests/Mocks/MockPaymentMethodTokenizationViewModel.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Mocks/MockPaymentMethodTokenizationViewModel.swift rename to Tests/Unit Tests/Mocks/MockPaymentMethodTokenizationViewModel.swift diff --git a/Debug App/Tests/Unit Tests/Mocks/Services/CreateResumePaymentService.swift b/Tests/Unit Tests/Mocks/Services/CreateResumePaymentService.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Mocks/Services/CreateResumePaymentService.swift rename to Tests/Unit Tests/Mocks/Services/CreateResumePaymentService.swift diff --git a/Debug App/Tests/Unit Tests/Mocks/Services/MockBINDataAPIClient.swift b/Tests/Unit Tests/Mocks/Services/MockBINDataAPIClient.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Mocks/Services/MockBINDataAPIClient.swift rename to Tests/Unit Tests/Mocks/Services/MockBINDataAPIClient.swift diff --git a/Debug App/Tests/Unit Tests/Mocks/Services/NetworkService.swift b/Tests/Unit Tests/Mocks/Services/NetworkService.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Mocks/Services/NetworkService.swift rename to Tests/Unit Tests/Mocks/Services/NetworkService.swift diff --git a/Debug App/Tests/Unit Tests/Mocks/Services/PayPalService.swift b/Tests/Unit Tests/Mocks/Services/PayPalService.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Mocks/Services/PayPalService.swift rename to Tests/Unit Tests/Mocks/Services/PayPalService.swift diff --git a/Debug App/Tests/Unit Tests/Mocks/Services/TokenizationService.swift b/Tests/Unit Tests/Mocks/Services/TokenizationService.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Mocks/Services/TokenizationService.swift rename to Tests/Unit Tests/Mocks/Services/TokenizationService.swift diff --git a/Debug App/Tests/Unit Tests/Mocks/Services/VaultService.swift b/Tests/Unit Tests/Mocks/Services/VaultService.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Mocks/Services/VaultService.swift rename to Tests/Unit Tests/Mocks/Services/VaultService.swift diff --git a/Debug App/Tests/Unit Tests/Mocks/ViewModels/MockVaultCheckoutViewModel.swift b/Tests/Unit Tests/Mocks/ViewModels/MockVaultCheckoutViewModel.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Mocks/ViewModels/MockVaultCheckoutViewModel.swift rename to Tests/Unit Tests/Mocks/ViewModels/MockVaultCheckoutViewModel.swift diff --git a/Debug App/Tests/Unit Tests/Modules/DropInUI_TokenizationViewModelTests.swift b/Tests/Unit Tests/Modules/DropInUI_TokenizationViewModelTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Modules/DropInUI_TokenizationViewModelTests.swift rename to Tests/Unit Tests/Modules/DropInUI_TokenizationViewModelTests.swift diff --git a/Debug App/Tests/Unit Tests/Modules/HUC_TokenizationViewModelTests.swift b/Tests/Unit Tests/Modules/HUC_TokenizationViewModelTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Modules/HUC_TokenizationViewModelTests.swift rename to Tests/Unit Tests/Modules/HUC_TokenizationViewModelTests.swift diff --git a/Debug App/Tests/Unit Tests/Modules/PollingModuleTests.swift b/Tests/Unit Tests/Modules/PollingModuleTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Modules/PollingModuleTests.swift rename to Tests/Unit Tests/Modules/PollingModuleTests.swift diff --git a/Debug App/Tests/Unit Tests/Modules/PrimerAPIConfigurationModuleTests.swift b/Tests/Unit Tests/Modules/PrimerAPIConfigurationModuleTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Modules/PrimerAPIConfigurationModuleTests.swift rename to Tests/Unit Tests/Modules/PrimerAPIConfigurationModuleTests.swift diff --git a/Debug App/Tests/Unit Tests/Modules/UserInterfaceModuleTests.swift b/Tests/Unit Tests/Modules/UserInterfaceModuleTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Modules/UserInterfaceModuleTests.swift rename to Tests/Unit Tests/Modules/UserInterfaceModuleTests.swift diff --git a/Debug App/Tests/Unit Tests/Modules/XCTestCase+Tokenization.swift b/Tests/Unit Tests/Modules/XCTestCase+Tokenization.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Modules/XCTestCase+Tokenization.swift rename to Tests/Unit Tests/Modules/XCTestCase+Tokenization.swift diff --git a/Debug App/Tests/Unit Tests/Network/Endpoints/ListCardNetworksEndpointTests.swift b/Tests/Unit Tests/Network/Endpoints/ListCardNetworksEndpointTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Network/Endpoints/ListCardNetworksEndpointTests.swift rename to Tests/Unit Tests/Network/Endpoints/ListCardNetworksEndpointTests.swift diff --git a/Debug App/Tests/Unit Tests/Network/Factories/NetworkRequestFactoryTests.swift b/Tests/Unit Tests/Network/Factories/NetworkRequestFactoryTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Network/Factories/NetworkRequestFactoryTests.swift rename to Tests/Unit Tests/Network/Factories/NetworkRequestFactoryTests.swift diff --git a/Debug App/Tests/Unit Tests/Network/Factories/NetworkResponseFactoryTests.swift b/Tests/Unit Tests/Network/Factories/NetworkResponseFactoryTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Network/Factories/NetworkResponseFactoryTests.swift rename to Tests/Unit Tests/Network/Factories/NetworkResponseFactoryTests.swift diff --git a/Debug App/Tests/Unit Tests/Network/Legacy/URLSessionStackTests.swift b/Tests/Unit Tests/Network/Legacy/URLSessionStackTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Network/Legacy/URLSessionStackTests.swift rename to Tests/Unit Tests/Network/Legacy/URLSessionStackTests.swift diff --git a/Debug App/Tests/Unit Tests/Network/Services/DefaultNetworkServiceTests.swift b/Tests/Unit Tests/Network/Services/DefaultNetworkServiceTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Network/Services/DefaultNetworkServiceTests.swift rename to Tests/Unit Tests/Network/Services/DefaultNetworkServiceTests.swift diff --git a/Debug App/Tests/Unit Tests/Network/Services/NetworkingReportingServiceTests.swift b/Tests/Unit Tests/Network/Services/NetworkingReportingServiceTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Network/Services/NetworkingReportingServiceTests.swift rename to Tests/Unit Tests/Network/Services/NetworkingReportingServiceTests.swift diff --git a/Debug App/Tests/Unit Tests/Network/Services/RequestDispatcherTests.swift b/Tests/Unit Tests/Network/Services/RequestDispatcherTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Network/Services/RequestDispatcherTests.swift rename to Tests/Unit Tests/Network/Services/RequestDispatcherTests.swift diff --git a/Debug App/Tests/Unit Tests/Primer/CVVRecaptureViewModelTests.swift b/Tests/Unit Tests/Primer/CVVRecaptureViewModelTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Primer/CVVRecaptureViewModelTests.swift rename to Tests/Unit Tests/Primer/CVVRecaptureViewModelTests.swift diff --git a/Debug App/Tests/Unit Tests/Primer/Ideal/BankComponentTests.swift b/Tests/Unit Tests/Primer/Ideal/BankComponentTests.swift similarity index 79% rename from Debug App/Tests/Unit Tests/Primer/Ideal/BankComponentTests.swift rename to Tests/Unit Tests/Primer/Ideal/BankComponentTests.swift index 0dbe0c4e86..ad311ec97c 100644 --- a/Debug App/Tests/Unit Tests/Primer/Ideal/BankComponentTests.swift +++ b/Tests/Unit Tests/Primer/Ideal/BankComponentTests.swift @@ -11,26 +11,21 @@ import XCTest final class BankComponentTests: XCTestCase { - var banks: [IssuingBank] = [] - var steps: [BanksStep] = [] + let expectationTimeout = 5.0 + var validationErrors: [String] = [] var validationStatuses: [String] = [] var webRedirectComponent: WebRedirectComponent? + var mockSteppableDelegate: MockSteppableDelegate! + override func setUp() { - super.setUp() - cleanup() + mockSteppableDelegate = MockSteppableDelegate() } override func tearDown() { - super.tearDown() - cleanup() - } - - func cleanup() { webRedirectComponent = nil - banks.removeAll() - steps.removeAll() + mockSteppableDelegate = nil validationErrors.removeAll() validationStatuses.removeAll() } @@ -72,18 +67,18 @@ final class BankComponentTests: XCTestCase { redirectExpectation.fulfill() return self.webRedirectComponent(tokenizationModelDelegate: mockModel) } - bankComponent.stepDelegate = self + bankComponent.stepDelegate = mockSteppableDelegate XCTAssertNil(bankComponent.bankId) bankComponent.start() let banksRetrievedExpectation = expectation(description: "banks_retrieved") - DispatchQueue.main.asyncAfter(deadline: .now() + 5) { - XCTAssertEqual(self.banks.map { $0.name }, mockModel.mockBanks.map { $0.name }) + mockSteppableDelegate.onReceiveBanks = { banks in + XCTAssertEqual(banks.map { $0.name }, mockModel.mockBanks.map { $0.name }) bankComponent.updateCollectedData(collectableData: BanksCollectableData.bankId(bankId: bankId)) XCTAssertEqual(bankComponent.bankId, bankId) bankComponent.submit() banksRetrievedExpectation.fulfill() } - waitForExpectations(timeout: 10) + waitForExpectations(timeout: self.expectationTimeout) XCTAssertNotNil(webRedirectComponent) } @@ -92,16 +87,16 @@ final class BankComponentTests: XCTestCase { let bankComponent = DefaultBanksComponent(paymentMethodType: .adyenIDeal, tokenizationProvidingModel: mockModel) { self.webRedirectComponent(tokenizationModelDelegate: mockModel) } - bankComponent.stepDelegate = self + bankComponent.stepDelegate = mockSteppableDelegate bankComponent.start() let expectation = expectation(description: "banks_retrieved") - DispatchQueue.main.asyncAfter(deadline: .now() + 5) { - XCTAssertEqual(self.banks.map { $0.name }, mockModel.mockBanks.map { $0.name }) - XCTAssertEqual(self.banks.map { $0.id }, mockModel.mockBanks.map { $0.id }) - XCTAssertEqual(self.steps, [.loading, .banksRetrieved(banks: mockModel.mockBanks.map { IssuingBank(bank: $0) })]) + mockSteppableDelegate.onReceiveBanks = { banks in + XCTAssertEqual(banks.map { $0.name }, mockModel.mockBanks.map { $0.name }) + XCTAssertEqual(banks.map { $0.id }, mockModel.mockBanks.map { $0.id }) + XCTAssertEqual(self.mockSteppableDelegate.steps, [.loading, .banksRetrieved(banks: mockModel.mockBanks.map { IssuingBank(bank: $0) })]) expectation.fulfill() } - waitForExpectations(timeout: 10) + waitForExpectations(timeout: self.expectationTimeout) } func testFilterBanks() { @@ -109,18 +104,32 @@ final class BankComponentTests: XCTestCase { let bankComponent = DefaultBanksComponent(paymentMethodType: .adyenIDeal, tokenizationProvidingModel: mockModel) { self.webRedirectComponent(tokenizationModelDelegate: mockModel) } - bankComponent.stepDelegate = self - bankComponent.start() + bankComponent.stepDelegate = mockSteppableDelegate + + let firstBanksResult = mockModel.mockBanks.map { IssuingBank(bank: $0) } + let secondBanksResult = mockModel.mockBanks.filter { + $0.name == MockBankSelectorTokenizationModel.bankNameToBeFiltered + }.map { IssuingBank(bank: $0) } + let expectation = expectation(description: "banks_filtered") - DispatchQueue.main.asyncAfter(deadline: .now() + 5) { - XCTAssertEqual(self.banks.map { $0.name }, mockModel.mockBanks.map { $0.name }) + mockSteppableDelegate.onReceiveBanks = { banks in + XCTAssertEqual(banks.map { $0.name }, mockModel.mockBanks.map { $0.name }) + self.mockSteppableDelegate.onReceiveBanks = { banks in + XCTAssertTrue(mockModel.didCallFilter) + XCTAssertEqual(banks.map { $0.name }, [MockBankSelectorTokenizationModel.bankNameToBeFiltered]) + XCTAssertEqual(self.mockSteppableDelegate.steps, [ + .loading, + .banksRetrieved(banks: firstBanksResult), + .banksRetrieved(banks: secondBanksResult) + ]) + expectation.fulfill() + } bankComponent.updateCollectedData(collectableData: BanksCollectableData.bankFilterText(text: "filter_query")) - XCTAssertTrue(mockModel.didCallFilter) - XCTAssertEqual(self.banks.map { $0.name }, [MockBankSelectorTokenizationModel.bankNameToBeFiltered]) - expectation.fulfill() - XCTAssertEqual(self.steps, [.loading, .banksRetrieved(banks: mockModel.mockBanks.map { IssuingBank(bank: $0) }), .banksRetrieved(banks: mockModel.mockBanks.filter { $0.name == MockBankSelectorTokenizationModel.bankNameToBeFiltered }.map { IssuingBank(bank: $0) })]) } - waitForExpectations(timeout: 10) + + bankComponent.start() + + waitForExpectations(timeout: self.expectationTimeout) } func testValidationNoBanksAtSelection() { @@ -128,7 +137,7 @@ final class BankComponentTests: XCTestCase { let bankComponent = DefaultBanksComponent(paymentMethodType: .adyenIDeal, tokenizationProvidingModel: mockModel) { self.webRedirectComponent(tokenizationModelDelegate: mockModel) } - bankComponent.stepDelegate = self + bankComponent.stepDelegate = mockSteppableDelegate bankComponent.validationDelegate = self bankComponent.updateCollectedData(collectableData: BanksCollectableData.bankId(bankId: "mock_id")) XCTAssertEqual(validationStatuses, ["validating", "invalid"]) @@ -140,7 +149,7 @@ final class BankComponentTests: XCTestCase { let bankComponent = DefaultBanksComponent(paymentMethodType: .adyenIDeal, tokenizationProvidingModel: mockModel) { self.webRedirectComponent(tokenizationModelDelegate: mockModel) } - bankComponent.stepDelegate = self + bankComponent.stepDelegate = mockSteppableDelegate bankComponent.validationDelegate = self bankComponent.updateCollectedData(collectableData: BanksCollectableData.bankFilterText(text: "mock_query")) XCTAssertEqual(validationStatuses, ["validating", "invalid"]) @@ -152,19 +161,18 @@ final class BankComponentTests: XCTestCase { let bankComponent = DefaultBanksComponent(paymentMethodType: .adyenIDeal, tokenizationProvidingModel: mockModel) { self.webRedirectComponent(tokenizationModelDelegate: mockModel) } - bankComponent.stepDelegate = self + bankComponent.stepDelegate = mockSteppableDelegate bankComponent.validationDelegate = self - bankComponent.stepDelegate = self bankComponent.start() let expectation = expectation(description: "banks_retrieved") - DispatchQueue.main.asyncAfter(deadline: .now() + 5) { + mockSteppableDelegate.onReceiveBanks = { _ in bankComponent.updateCollectedData(collectableData: BanksCollectableData.bankId(bankId: "0")) XCTAssertEqual(self.validationStatuses, ["validating", "valid"]) XCTAssertTrue(self.validationErrors.isEmpty) expectation.fulfill() - } - waitForExpectations(timeout: 10) + } + waitForExpectations(timeout: self.expectationTimeout) } func testValidationForInvalidBankId() { @@ -172,23 +180,30 @@ final class BankComponentTests: XCTestCase { let bankComponent = DefaultBanksComponent(paymentMethodType: .adyenIDeal, tokenizationProvidingModel: mockModel) { self.webRedirectComponent(tokenizationModelDelegate: mockModel) } - bankComponent.stepDelegate = self + bankComponent.stepDelegate = mockSteppableDelegate bankComponent.validationDelegate = self - bankComponent.stepDelegate = self bankComponent.start() let expectation = expectation(description: "banks_retrieved") - DispatchQueue.main.asyncAfter(deadline: .now() + 5) { + mockSteppableDelegate.onReceiveBanks = { _ in bankComponent.updateCollectedData(collectableData: BanksCollectableData.bankId(bankId: "mock_bank_id")) XCTAssertEqual(self.validationStatuses, ["validating", "invalid"]) XCTAssertEqual(self.validationErrors, ["Please provide a valid bank id"]) expectation.fulfill() } - waitForExpectations(timeout: 10) + waitForExpectations(timeout: self.expectationTimeout) } } -extension BankComponentTests: PrimerHeadlessSteppableDelegate { +class MockSteppableDelegate: PrimerHeadlessSteppableDelegate { + + var banks: [IssuingBank] = [] + var steps: [BanksStep] = [] + + var onReceiveStep: ((PrimerHeadlessStep) -> Void)? + + var onReceiveBanks: (([IssuingBank]) -> Void)? + func didReceiveStep(step: PrimerHeadlessStep) { guard let step = step as? BanksStep else { return @@ -197,6 +212,7 @@ extension BankComponentTests: PrimerHeadlessSteppableDelegate { switch step { case .loading: break case .banksRetrieved(banks: let banks): + self.onReceiveBanks?(banks) self.banks = banks } } diff --git a/Debug App/Tests/Unit Tests/Primer/Ideal/IdealPaymentMethodTests.swift b/Tests/Unit Tests/Primer/Ideal/IdealPaymentMethodTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Primer/Ideal/IdealPaymentMethodTests.swift rename to Tests/Unit Tests/Primer/Ideal/IdealPaymentMethodTests.swift diff --git a/Debug App/Tests/Unit Tests/Primer/Ideal/PrimerHeadlessFormWithRedirectManagerTests.swift b/Tests/Unit Tests/Primer/Ideal/PrimerHeadlessFormWithRedirectManagerTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Primer/Ideal/PrimerHeadlessFormWithRedirectManagerTests.swift rename to Tests/Unit Tests/Primer/Ideal/PrimerHeadlessFormWithRedirectManagerTests.swift diff --git a/Debug App/Tests/Unit Tests/Primer/Ideal/WebRedirectComponentTests.swift b/Tests/Unit Tests/Primer/Ideal/WebRedirectComponentTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Primer/Ideal/WebRedirectComponentTests.swift rename to Tests/Unit Tests/Primer/Ideal/WebRedirectComponentTests.swift diff --git a/Debug App/Tests/Unit Tests/Primer/Klarna/KlarnaComponentTests.swift b/Tests/Unit Tests/Primer/Klarna/KlarnaComponentTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Primer/Klarna/KlarnaComponentTests.swift rename to Tests/Unit Tests/Primer/Klarna/KlarnaComponentTests.swift diff --git a/Debug App/Tests/Unit Tests/Primer/Klarna/KlarnaHeadlessManagerTests.swift b/Tests/Unit Tests/Primer/Klarna/KlarnaHeadlessManagerTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Primer/Klarna/KlarnaHeadlessManagerTests.swift rename to Tests/Unit Tests/Primer/Klarna/KlarnaHeadlessManagerTests.swift diff --git a/Debug App/Tests/Unit Tests/Primer/Klarna/KlarnaTestsMocks.swift b/Tests/Unit Tests/Primer/Klarna/KlarnaTestsMocks.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Primer/Klarna/KlarnaTestsMocks.swift rename to Tests/Unit Tests/Primer/Klarna/KlarnaTestsMocks.swift diff --git a/Debug App/Tests/Unit Tests/Primer/Klarna/KlarnaTokenizationComponentTests.swift b/Tests/Unit Tests/Primer/Klarna/KlarnaTokenizationComponentTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Primer/Klarna/KlarnaTokenizationComponentTests.swift rename to Tests/Unit Tests/Primer/Klarna/KlarnaTokenizationComponentTests.swift diff --git a/Debug App/Tests/Unit Tests/Primer/Klarna/KlarnaTokenizationManagerTests.swift b/Tests/Unit Tests/Primer/Klarna/KlarnaTokenizationManagerTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Primer/Klarna/KlarnaTokenizationManagerTests.swift rename to Tests/Unit Tests/Primer/Klarna/KlarnaTokenizationManagerTests.swift diff --git a/Debug App/Tests/Unit Tests/Primer/Klarna/PrimerKlarnaCategoriesViewControllerTests.swift b/Tests/Unit Tests/Primer/Klarna/PrimerKlarnaCategoriesViewControllerTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Primer/Klarna/PrimerKlarnaCategoriesViewControllerTests.swift rename to Tests/Unit Tests/Primer/Klarna/PrimerKlarnaCategoriesViewControllerTests.swift diff --git a/Debug App/Tests/Unit Tests/Primer/NativeUIManagerTests.swift b/Tests/Unit Tests/Primer/NativeUIManagerTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Primer/NativeUIManagerTests.swift rename to Tests/Unit Tests/Primer/NativeUIManagerTests.swift diff --git a/Debug App/Tests/Unit Tests/Primer/NolPay/NolPayLinkCardComponentTest.swift b/Tests/Unit Tests/Primer/NolPay/NolPayLinkCardComponentTest.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Primer/NolPay/NolPayLinkCardComponentTest.swift rename to Tests/Unit Tests/Primer/NolPay/NolPayLinkCardComponentTest.swift diff --git a/Debug App/Tests/Unit Tests/Primer/NolPay/NolPayLinkedCardsComponentTests.swift b/Tests/Unit Tests/Primer/NolPay/NolPayLinkedCardsComponentTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Primer/NolPay/NolPayLinkedCardsComponentTests.swift rename to Tests/Unit Tests/Primer/NolPay/NolPayLinkedCardsComponentTests.swift diff --git a/Debug App/Tests/Unit Tests/Primer/NolPay/NolPayPaymentComponentTests.swift b/Tests/Unit Tests/Primer/NolPay/NolPayPaymentComponentTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Primer/NolPay/NolPayPaymentComponentTests.swift rename to Tests/Unit Tests/Primer/NolPay/NolPayPaymentComponentTests.swift diff --git a/Debug App/Tests/Unit Tests/Primer/NolPay/NolPayPhoneMetadataServiceTests.swift b/Tests/Unit Tests/Primer/NolPay/NolPayPhoneMetadataServiceTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Primer/NolPay/NolPayPhoneMetadataServiceTests.swift rename to Tests/Unit Tests/Primer/NolPay/NolPayPhoneMetadataServiceTests.swift diff --git a/Debug App/Tests/Unit Tests/Primer/NolPay/NolPayUnlinkCardComponentTest.swift b/Tests/Unit Tests/Primer/NolPay/NolPayUnlinkCardComponentTest.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Primer/NolPay/NolPayUnlinkCardComponentTest.swift rename to Tests/Unit Tests/Primer/NolPay/NolPayUnlinkCardComponentTest.swift diff --git a/Debug App/Tests/Unit Tests/Primer/NolPay/NolTestsMocks.swift b/Tests/Unit Tests/Primer/NolPay/NolTestsMocks.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Primer/NolPay/NolTestsMocks.swift rename to Tests/Unit Tests/Primer/NolPay/NolTestsMocks.swift diff --git a/Debug App/Tests/Unit Tests/Primer/NolPay/PrimerHeadlessNolPayManagerTests.swift b/Tests/Unit Tests/Primer/NolPay/PrimerHeadlessNolPayManagerTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Primer/NolPay/PrimerHeadlessNolPayManagerTests.swift rename to Tests/Unit Tests/Primer/NolPay/PrimerHeadlessNolPayManagerTests.swift diff --git a/Debug App/Tests/Unit Tests/Primer/PrimerBancontactCardDataManagerTests.swift b/Tests/Unit Tests/Primer/PrimerBancontactCardDataManagerTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Primer/PrimerBancontactCardDataManagerTests.swift rename to Tests/Unit Tests/Primer/PrimerBancontactCardDataManagerTests.swift diff --git a/Debug App/Tests/Unit Tests/Primer/PrimerInputElementTests.swift b/Tests/Unit Tests/Primer/PrimerInputElementTests.swift similarity index 99% rename from Debug App/Tests/Unit Tests/Primer/PrimerInputElementTests.swift rename to Tests/Unit Tests/Primer/PrimerInputElementTests.swift index 3936e37417..63a3e9817a 100644 --- a/Debug App/Tests/Unit Tests/Primer/PrimerInputElementTests.swift +++ b/Tests/Unit Tests/Primer/PrimerInputElementTests.swift @@ -111,6 +111,7 @@ private extension CardNetwork { case .amex: return ["1234", "4567", "8901"] case .bancontact, + .cartesBancaires, .diners, .discover, .elo, diff --git a/Debug App/Tests/Unit Tests/Primer/PrimerRawCardDataManagerTests.swift b/Tests/Unit Tests/Primer/PrimerRawCardDataManagerTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Primer/PrimerRawCardDataManagerTests.swift rename to Tests/Unit Tests/Primer/PrimerRawCardDataManagerTests.swift diff --git a/Debug App/Tests/Unit Tests/Primer/PrimerRawRetailerDataTests.swift b/Tests/Unit Tests/Primer/PrimerRawRetailerDataTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Primer/PrimerRawRetailerDataTests.swift rename to Tests/Unit Tests/Primer/PrimerRawRetailerDataTests.swift diff --git a/Debug App/Tests/Unit Tests/Services/CardValidationServiceTests.swift b/Tests/Unit Tests/Services/CardValidationServiceTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Services/CardValidationServiceTests.swift rename to Tests/Unit Tests/Services/CardValidationServiceTests.swift diff --git a/Debug App/Tests/Unit Tests/Services/InternalCardComponentManagerTests.swift b/Tests/Unit Tests/Services/InternalCardComponentManagerTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Services/InternalCardComponentManagerTests.swift rename to Tests/Unit Tests/Services/InternalCardComponentManagerTests.swift diff --git a/Debug App/Tests/Unit Tests/Services/PayPalServiceTests.swift b/Tests/Unit Tests/Services/PayPalServiceTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Services/PayPalServiceTests.swift rename to Tests/Unit Tests/Services/PayPalServiceTests.swift diff --git a/Debug App/Tests/Unit Tests/Services/PaymentMethodConfigServiceTests.swift b/Tests/Unit Tests/Services/PaymentMethodConfigServiceTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Services/PaymentMethodConfigServiceTests.swift rename to Tests/Unit Tests/Services/PaymentMethodConfigServiceTests.swift diff --git a/Debug App/Tests/Unit Tests/Services/TokenizationServiceTests.swift b/Tests/Unit Tests/Services/TokenizationServiceTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Services/TokenizationServiceTests.swift rename to Tests/Unit Tests/Services/TokenizationServiceTests.swift diff --git a/Debug App/Tests/Unit Tests/Test Utilities/CodingUtilities.swift b/Tests/Unit Tests/Test Utilities/CodingUtilities.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Test Utilities/CodingUtilities.swift rename to Tests/Unit Tests/Test Utilities/CodingUtilities.swift diff --git a/Debug App/Tests/Unit Tests/Test Utilities/JWTFactory.swift b/Tests/Unit Tests/Test Utilities/JWTFactory.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Test Utilities/JWTFactory.swift rename to Tests/Unit Tests/Test Utilities/JWTFactory.swift diff --git a/Debug App/Tests/Unit Tests/Test Utilities/SDKSessionHelper.swift b/Tests/Unit Tests/Test Utilities/SDKSessionHelper.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Test Utilities/SDKSessionHelper.swift rename to Tests/Unit Tests/Test Utilities/SDKSessionHelper.swift diff --git a/Debug App/Tests/Unit Tests/Test Utilities/StringTyper.swift b/Tests/Unit Tests/Test Utilities/StringTyper.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Test Utilities/StringTyper.swift rename to Tests/Unit Tests/Test Utilities/StringTyper.swift diff --git a/Debug App/Tests/Unit Tests/Utils/ApplePayUtilsTest.swift b/Tests/Unit Tests/Utils/ApplePayUtilsTest.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Utils/ApplePayUtilsTest.swift rename to Tests/Unit Tests/Utils/ApplePayUtilsTest.swift diff --git a/Debug App/Tests/Unit Tests/Utils/CharacterSet+Utils.swift b/Tests/Unit Tests/Utils/CharacterSet+Utils.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Utils/CharacterSet+Utils.swift rename to Tests/Unit Tests/Utils/CharacterSet+Utils.swift diff --git a/Debug App/Tests/Unit Tests/Utils/DateTests.swift b/Tests/Unit Tests/Utils/DateTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Utils/DateTests.swift rename to Tests/Unit Tests/Utils/DateTests.swift diff --git a/Debug App/Tests/Unit Tests/Utils/DebouncerTests.swift b/Tests/Unit Tests/Utils/DebouncerTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Utils/DebouncerTests.swift rename to Tests/Unit Tests/Utils/DebouncerTests.swift diff --git a/Debug App/Tests/Unit Tests/Utils/IntExtensionTests.swift b/Tests/Unit Tests/Utils/IntExtensionTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Utils/IntExtensionTests.swift rename to Tests/Unit Tests/Utils/IntExtensionTests.swift diff --git a/Debug App/Tests/Unit Tests/Utils/MaskTests.swift b/Tests/Unit Tests/Utils/MaskTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Utils/MaskTests.swift rename to Tests/Unit Tests/Utils/MaskTests.swift diff --git a/Debug App/Tests/Unit Tests/Utils/StringTests.swift b/Tests/Unit Tests/Utils/StringTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Utils/StringTests.swift rename to Tests/Unit Tests/Utils/StringTests.swift diff --git a/Debug App/Tests/Unit Tests/Utils/VersionUtilsTests.swift b/Tests/Unit Tests/Utils/VersionUtilsTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Utils/VersionUtilsTests.swift rename to Tests/Unit Tests/Utils/VersionUtilsTests.swift diff --git a/Debug App/Tests/Unit Tests/Utils/WebViewUtilTests.swift b/Tests/Unit Tests/Utils/WebViewUtilTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/Utils/WebViewUtilTests.swift rename to Tests/Unit Tests/Utils/WebViewUtilTests.swift diff --git a/Debug App/Tests/Unit Tests/v2/HeadlessUniversalCheckoutTests.swift b/Tests/Unit Tests/v2/HeadlessUniversalCheckoutTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/v2/HeadlessUniversalCheckoutTests.swift rename to Tests/Unit Tests/v2/HeadlessUniversalCheckoutTests.swift diff --git a/Debug App/Tests/Unit Tests/v2/HeadlessVaultManagerTests.swift b/Tests/Unit Tests/v2/HeadlessVaultManagerTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/v2/HeadlessVaultManagerTests.swift rename to Tests/Unit Tests/v2/HeadlessVaultManagerTests.swift diff --git a/Debug App/Tests/Unit Tests/v2/MockAPIClient.swift b/Tests/Unit Tests/v2/MockAPIClient.swift similarity index 99% rename from Debug App/Tests/Unit Tests/v2/MockAPIClient.swift rename to Tests/Unit Tests/v2/MockAPIClient.swift index 4dffbc90ed..3be803ad99 100644 --- a/Debug App/Tests/Unit Tests/v2/MockAPIClient.swift +++ b/Tests/Unit Tests/v2/MockAPIClient.swift @@ -11,7 +11,7 @@ import XCTest class MockPrimerAPIClient: PrimerAPIClientProtocol { - var mockedNetworkDelay: TimeInterval = 1 + var mockedNetworkDelay: TimeInterval = 0.5 var validateClientTokenResult: (SuccessResponse?, Error?)? var fetchConfigurationResult: (Response.Body.Configuration?, Error?)? var fetchConfigurationWithActionsResult: (Response.Body.Configuration?, Error?)? diff --git a/Debug App/Tests/Unit Tests/v2/MockModule.swift b/Tests/Unit Tests/v2/MockModule.swift similarity index 100% rename from Debug App/Tests/Unit Tests/v2/MockModule.swift rename to Tests/Unit Tests/v2/MockModule.swift diff --git a/Debug App/Tests/Unit Tests/v2/RawDataManagerTests.swift b/Tests/Unit Tests/v2/RawDataManagerTests.swift similarity index 100% rename from Debug App/Tests/Unit Tests/v2/RawDataManagerTests.swift rename to Tests/Unit Tests/v2/RawDataManagerTests.swift diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 5589e74686..5e3bf6e37b 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -52,7 +52,7 @@ platform :ios do podfile: podfile_path ) - run_tests(workspace: app_workspace, + run_tests(workspace: app_workspace, scheme: "Debug App Tests", destination: "platform=iOS Simulator,name=iPhone 14 Pro", xcargs: "EXCLUDED_ARCHS[sdk=iphonesimulator*]=arm64", @@ -112,18 +112,16 @@ platform :ios do end desc 'This action builds the app using the SPM integration' - lane :build_spm do + lane :test_spm do common_pre_build_action - build_app(workspace: app_workspace, - scheme: spm_app_scheme, - sdk: "iphonesimulator", - configuration: "Debug", - destination: "generic/platform=iOS Simulator", - xcargs: "EXCLUDED_ARCHS[sdk=iphonesimulator*]=arm64", - export_method: "development", - skip_package_ipa: true, - skip_package_pkg: true - ) + run_tests( + package_path: ".", + scheme: "PrimerSDKTests", + sdk: "iphonesimulator17.2", + destination: "OS=17.2,name=iPhone 15 Pro", + result_bundle: true, + output_directory: Dir.pwd + "/test_output" + ) end lane :build_cocoapods do |options| @@ -153,7 +151,7 @@ platform :ios do skip_package_dependencies_resolution: true ) end - + desc 'This action runs Unit Tests, builds the app and uploads it to Appetize' lane :appetize_build_and_upload do |options| @@ -184,7 +182,7 @@ platform :ios do public_key: public_key, note: sdk_version_name_source_branch ) - + update_deployment_url(lane_context[SharedValues::APPETIZE_APP_URL]) update_livedemostore_url("https://livedemostore.common.primer.io/ios/#{url_end}") @@ -244,7 +242,7 @@ platform :ios do # The build is identified by the contents of CFBundleVersion in Info.plist version_name = get_appetize_version_name(build_type, pr_number) - + set_info_plist_value(path: info_plist_path, key: "CFBundleVersion", value: version_name) set_info_plist_value(path: info_plist_path, key: "CFBundleShortVersionString", value: "#{version_name}") end @@ -267,7 +265,7 @@ platform :ios do return "preview_#{pr_number}" end end - + def update_deployment_url(pub_url) sh("echo APPETIZE_APP_URL=#{pub_url} >> $GITHUB_ENV") end