Update CIVDetailsResponse object for card-add-verify flow (#510)
* updated civ card object and added unit test * newline on trailing parentheses
This commit is contained in:
parent
f4f0185802
commit
14608c01f7
|
@ -18,7 +18,6 @@
|
|||
3B2F4E252739CD59008618CD /* StripeiOS-Shared.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 3B2F4E1B2739CD59008618CD /* StripeiOS-Shared.xcconfig */; };
|
||||
3B2F4E262739CD59008618CD /* Project-Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 3B2F4E1C2739CD59008618CD /* Project-Debug.xcconfig */; };
|
||||
3B2F4E272739CD59008618CD /* StripeiOS-Release.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 3B2F4E1D2739CD59008618CD /* StripeiOS-Release.xcconfig */; };
|
||||
3B967077273C86840027F66A /* StripeCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B967076273C86840027F66A /* StripeCore.framework */; };
|
||||
3B967094273C87950027F66A /* StripeCardScanBundleLocator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B967093273C87950027F66A /* StripeCardScanBundleLocator.swift */; };
|
||||
3B9671AB273DCC4E0027F66A /* SSDOcr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B9671A9273DCC4E0027F66A /* SSDOcr.swift */; };
|
||||
3B9671AC273DCC4E0027F66A /* UxModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B9671AA273DCC4E0027F66A /* UxModel.swift */; };
|
||||
|
@ -108,6 +107,12 @@
|
|||
3BFA5465273A09C5005B6CB7 /* CardScanMisc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BFA5451273A09C5005B6CB7 /* CardScanMisc.swift */; };
|
||||
3BFA5466273A09C5005B6CB7 /* VerifyCardExplanationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BFA5452273A09C5005B6CB7 /* VerifyCardExplanationViewController.swift */; };
|
||||
3BFA5467273A09C5005B6CB7 /* FrameData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BFA5453273A09C5005B6CB7 /* FrameData.swift */; };
|
||||
F38E6B70274437BE008EF7A6 /* CardScanMockData.swift in Sources */ = {isa = PBXBuildFile; fileRef = F38E6B6F274437BE008EF7A6 /* CardScanMockData.swift */; };
|
||||
F38E6B7327443934008EF7A6 /* STPAPIClient+CardImageVerificationTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = F38E6B7227443934008EF7A6 /* STPAPIClient+CardImageVerificationTest.swift */; };
|
||||
F38E6B7B27443C0F008EF7A6 /* CardImageVerification_CardSet_200.json in Resources */ = {isa = PBXBuildFile; fileRef = F38E6B7A27443C0F008EF7A6 /* CardImageVerification_CardSet_200.json */; };
|
||||
F38E6B8327445A12008EF7A6 /* CardImageVerification_CardAdd_200.json in Resources */ = {isa = PBXBuildFile; fileRef = F38E6B8227445A12008EF7A6 /* CardImageVerification_CardAdd_200.json */; };
|
||||
F38E6B85274466C7008EF7A6 /* StripeCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F38E6B84274466C7008EF7A6 /* StripeCore.framework */; };
|
||||
F38E6B872744673D008EF7A6 /* StripeCoreTestUtils.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F38E6B862744673D008EF7A6 /* StripeCoreTestUtils.framework */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
|
@ -135,7 +140,6 @@
|
|||
3B2F4E1B2739CD59008618CD /* StripeiOS-Shared.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "StripeiOS-Shared.xcconfig"; sourceTree = "<group>"; };
|
||||
3B2F4E1C2739CD59008618CD /* Project-Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Project-Debug.xcconfig"; sourceTree = "<group>"; };
|
||||
3B2F4E1D2739CD59008618CD /* StripeiOS-Release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "StripeiOS-Release.xcconfig"; sourceTree = "<group>"; };
|
||||
3B967076273C86840027F66A /* StripeCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = StripeCore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
3B967093273C87950027F66A /* StripeCardScanBundleLocator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StripeCardScanBundleLocator.swift; sourceTree = "<group>"; };
|
||||
3B9671A9273DCC4E0027F66A /* SSDOcr.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSDOcr.swift; sourceTree = "<group>"; };
|
||||
3B9671AA273DCC4E0027F66A /* UxModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UxModel.swift; sourceTree = "<group>"; };
|
||||
|
@ -223,8 +227,15 @@
|
|||
3BFA5451273A09C5005B6CB7 /* CardScanMisc.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CardScanMisc.swift; sourceTree = "<group>"; };
|
||||
3BFA5452273A09C5005B6CB7 /* VerifyCardExplanationViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VerifyCardExplanationViewController.swift; sourceTree = "<group>"; };
|
||||
3BFA5453273A09C5005B6CB7 /* FrameData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FrameData.swift; sourceTree = "<group>"; };
|
||||
3BFA5480273C422D005B6CB7 /* UxModelTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UxModelTests.swift; sourceTree = "<group>"; };
|
||||
3BFA5480273C422D005B6CB7 /* UxModelTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = UxModelTests.swift; path = ../UxModelTests.swift; sourceTree = "<group>"; };
|
||||
3BFA5493273C4573005B6CB7 /* synthetic_test_image.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = synthetic_test_image.jpg; sourceTree = "<group>"; };
|
||||
F38E6B6F274437BE008EF7A6 /* CardScanMockData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardScanMockData.swift; sourceTree = "<group>"; };
|
||||
F38E6B7227443934008EF7A6 /* STPAPIClient+CardImageVerificationTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "STPAPIClient+CardImageVerificationTest.swift"; sourceTree = "<group>"; };
|
||||
F38E6B7A27443C0F008EF7A6 /* CardImageVerification_CardSet_200.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = CardImageVerification_CardSet_200.json; sourceTree = "<group>"; };
|
||||
F38E6B7C27443E60008EF7A6 /* OHHTTPStubs.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = OHHTTPStubs.xcframework; path = ../Carthage/Build/OHHTTPStubs.xcframework; sourceTree = "<group>"; };
|
||||
F38E6B8227445A12008EF7A6 /* CardImageVerification_CardAdd_200.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = CardImageVerification_CardAdd_200.json; sourceTree = "<group>"; };
|
||||
F38E6B84274466C7008EF7A6 /* StripeCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = StripeCore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
F38E6B862744673D008EF7A6 /* StripeCoreTestUtils.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = StripeCoreTestUtils.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
|
@ -232,7 +243,7 @@
|
|||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
3B967077273C86840027F66A /* StripeCore.framework in Frameworks */,
|
||||
F38E6B85274466C7008EF7A6 /* StripeCore.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -240,6 +251,7 @@
|
|||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
F38E6B872744673D008EF7A6 /* StripeCoreTestUtils.framework in Frameworks */,
|
||||
3BD9805127430CCD00B09BCD /* StripeCardScan.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
|
@ -299,7 +311,9 @@
|
|||
3B967075273C86840027F66A /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3B967076273C86840027F66A /* StripeCore.framework */,
|
||||
F38E6B7C27443E60008EF7A6 /* OHHTTPStubs.xcframework */,
|
||||
F38E6B84274466C7008EF7A6 /* StripeCore.framework */,
|
||||
F38E6B862744673D008EF7A6 /* StripeCoreTestUtils.framework */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
|
@ -324,9 +338,11 @@
|
|||
3BD9804D27430CCD00B09BCD /* StripeCardScanTests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3BFA5492273C4573005B6CB7 /* Resources */,
|
||||
3BFA5491273C4538005B6CB7 /* UnitTests */,
|
||||
3B2F4E072739CCFE008618CD /* Info.plist */,
|
||||
F38E6B6D27443668008EF7A6 /* Helpers */,
|
||||
F38E6B7427443B1E008EF7A6 /* Mock Data */,
|
||||
3BFA5492273C4573005B6CB7 /* Resources */,
|
||||
3BFA5491273C4538005B6CB7 /* Unit */,
|
||||
);
|
||||
path = StripeCardScanTests;
|
||||
sourceTree = "<group>";
|
||||
|
@ -519,12 +535,13 @@
|
|||
path = DTO;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
3BFA5491273C4538005B6CB7 /* UnitTests */ = {
|
||||
3BFA5491273C4538005B6CB7 /* Unit */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3BFA5480273C422D005B6CB7 /* UxModelTests.swift */,
|
||||
F38E6B71274438AE008EF7A6 /* API Bindings */,
|
||||
F38E6B6E27443696008EF7A6 /* ML Models */,
|
||||
);
|
||||
path = UnitTests;
|
||||
path = Unit;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
3BFA5492273C4573005B6CB7 /* Resources */ = {
|
||||
|
@ -535,6 +552,39 @@
|
|||
path = Resources;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
F38E6B6D27443668008EF7A6 /* Helpers */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
F38E6B6F274437BE008EF7A6 /* CardScanMockData.swift */,
|
||||
);
|
||||
path = Helpers;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
F38E6B6E27443696008EF7A6 /* ML Models */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3BFA5480273C422D005B6CB7 /* UxModelTests.swift */,
|
||||
);
|
||||
path = "ML Models";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
F38E6B71274438AE008EF7A6 /* API Bindings */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
F38E6B7227443934008EF7A6 /* STPAPIClient+CardImageVerificationTest.swift */,
|
||||
);
|
||||
path = "API Bindings";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
F38E6B7427443B1E008EF7A6 /* Mock Data */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
F38E6B8227445A12008EF7A6 /* CardImageVerification_CardAdd_200.json */,
|
||||
F38E6B7A27443C0F008EF7A6 /* CardImageVerification_CardSet_200.json */,
|
||||
);
|
||||
path = "Mock Data";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXHeadersBuildPhase section */
|
||||
|
@ -647,6 +697,8 @@
|
|||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
3BD9806027430EA300B09BCD /* synthetic_test_image.jpg in Resources */,
|
||||
F38E6B8327445A12008EF7A6 /* CardImageVerification_CardAdd_200.json in Resources */,
|
||||
F38E6B7B27443C0F008EF7A6 /* CardImageVerification_CardSet_200.json in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@ -748,6 +800,8 @@
|
|||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
F38E6B70274437BE008EF7A6 /* CardScanMockData.swift in Sources */,
|
||||
F38E6B7327443934008EF7A6 /* STPAPIClient+CardImageVerificationTest.swift in Sources */,
|
||||
3BD9805D27430E9900B09BCD /* UxModelTests.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
|
|
|
@ -1,22 +1,20 @@
|
|||
//
|
||||
// CardImageVerificationDetailsResponse.swift
|
||||
// CardVerify
|
||||
// StripeCardScan
|
||||
//
|
||||
// Created by Jaime Park on 9/16/21.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
@_spi(STP) import StripeCore
|
||||
|
||||
|
||||
struct CardImageVerificationExpectedCard: Decodable {
|
||||
let last4: String
|
||||
let issuer: String
|
||||
}
|
||||
|
||||
struct CardImageVerificationDetailsResponse: StripeDecodable {
|
||||
let expectedCard: CardImageVerificationExpectedCard
|
||||
let expectedCard: CardImageVerificationExpectedCard?
|
||||
|
||||
var _allResponseFieldsStorage: NonEncodableParameters?
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
//
|
||||
// VerificationAPI.swift
|
||||
// CardVerify
|
||||
// STPAPIClient+CardImageVerification.swift
|
||||
// StripeCardScan
|
||||
//
|
||||
// Created by Jaime Park on 9/15/21.
|
||||
//
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
//
|
||||
// CardScanMockData.swift
|
||||
// StripeCardScanTests
|
||||
//
|
||||
// Created by Jaime Park on 11/16/21.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
@testable import StripeCardScan
|
||||
import StripeCoreTestUtils
|
||||
|
||||
// note: This class is to find the test bundle
|
||||
private class ClassForBundle {}
|
||||
|
||||
enum CardImageVerificationDetailsResponseMock: String, MockData {
|
||||
var bundle: Bundle { return Bundle(for: ClassForBundle.self) }
|
||||
|
||||
typealias ResponseType = CardImageVerificationDetailsResponse
|
||||
|
||||
case cardImageVerification_cardSet_200 = "CardImageVerification_CardSet_200"
|
||||
case cardImageVerification_cardAdd_200 = "CardImageVerification_CardAdd_200"
|
||||
}
|
|
@ -0,0 +1,2 @@
|
|||
{
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"expected_card": {
|
||||
"last4": "4242",
|
||||
"issuer": "Visa"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,102 @@
|
|||
//
|
||||
// STPAPIClient+CardImageVerificationTest.swift
|
||||
// StripeCardScanTests
|
||||
//
|
||||
// Created by Jaime Park on 11/16/21.
|
||||
//
|
||||
|
||||
@testable import StripeCardScan
|
||||
@testable @_spi(STP) import StripeCore
|
||||
import StripeCoreTestUtils
|
||||
import OHHTTPStubs
|
||||
import XCTest
|
||||
|
||||
class STPAPIClient_CardImageVerificationTest: APIStubbedTestCase {
|
||||
let cardImageVerificationId = "civ_1234"
|
||||
let cardImageVerificationClientSecret = "civ_client_secret_1234"
|
||||
|
||||
/**
|
||||
The following test is mocking a flow where the merchant has set a card during the CIV intent creation.
|
||||
It will check the following:
|
||||
1. Request URL has been constructed properly: /v1/card_image_verifications/:id/initialize_client?client_secret=:secret
|
||||
2. Response from request has details of card set during the CIV intent creation
|
||||
*/
|
||||
func testGetCardImageVerificationDetails_CardSet() throws {
|
||||
let mockResponse = try CardImageVerificationDetailsResponseMock.cardImageVerification_cardSet_200.data()
|
||||
|
||||
// Stub the request to get details of CIV intent
|
||||
stub { request in
|
||||
XCTAssertNotNil(request.url)
|
||||
XCTAssertEqual(request.url?.absoluteString.contains("v1/card_image_verifications/\(self.cardImageVerificationId)/initialize_client"), true)
|
||||
XCTAssertEqual(request.url?.query?.contains("client_secret=\(self.cardImageVerificationClientSecret)"), true)
|
||||
XCTAssertEqual(request.httpMethod, "GET")
|
||||
return true
|
||||
} response: { request in
|
||||
return HTTPStubsResponse(data: mockResponse, statusCode: 200, headers: nil)
|
||||
}
|
||||
|
||||
let exp = expectation(description: "Request completed")
|
||||
|
||||
// Make request to get card details
|
||||
let apiClient = stubbedAPIClient()
|
||||
let promise = apiClient.getCardImageVerificationDetails(
|
||||
cardImageVerificationSecret: cardImageVerificationClientSecret,
|
||||
cardImageVerificationId: cardImageVerificationId
|
||||
)
|
||||
|
||||
promise.observe { result in
|
||||
switch result {
|
||||
case .success(let response):
|
||||
XCTAssertEqual(response.expectedCard?.last4, "4242")
|
||||
XCTAssertEqual(response.expectedCard?.issuer, "Visa")
|
||||
case .failure(let error):
|
||||
XCTFail("Request returned error \(error)")
|
||||
}
|
||||
exp.fulfill()
|
||||
}
|
||||
|
||||
wait(for: [exp], timeout: 1)
|
||||
}
|
||||
|
||||
/**
|
||||
The following test is mocking a flow where the merchant has not set a card during the CIV intent creation.
|
||||
It will check the following:
|
||||
1. Request URL has been constructed properly: /v1/card_image_verifications/:id/initialize_client?client_secret=:secret
|
||||
2. Response from request is empty
|
||||
*/
|
||||
func testGetCardImageVerificationDetails_CardAdd() throws {
|
||||
let mockResponse = try CardImageVerificationDetailsResponseMock.cardImageVerification_cardAdd_200.data()
|
||||
|
||||
// Stub the request to get details of CIV intent
|
||||
stub { request in
|
||||
XCTAssertNotNil(request.url)
|
||||
XCTAssertEqual(request.url?.absoluteString.contains("v1/card_image_verifications/\(self.cardImageVerificationId)/initialize_client"), true)
|
||||
XCTAssertEqual(request.url?.query?.contains("client_secret=\(self.cardImageVerificationClientSecret)"), true)
|
||||
XCTAssertEqual(request.httpMethod, "GET")
|
||||
return true
|
||||
} response: { request in
|
||||
return HTTPStubsResponse(data: mockResponse, statusCode: 200, headers: nil)
|
||||
}
|
||||
|
||||
let exp = expectation(description: "Request completed")
|
||||
|
||||
// Make request to get card details
|
||||
let apiClient = stubbedAPIClient()
|
||||
let promise = apiClient.getCardImageVerificationDetails(
|
||||
cardImageVerificationSecret: cardImageVerificationClientSecret,
|
||||
cardImageVerificationId: cardImageVerificationId
|
||||
)
|
||||
|
||||
promise.observe { result in
|
||||
switch result {
|
||||
case .success(let response):
|
||||
XCTAssertNil(response.expectedCard)
|
||||
case .failure(let error):
|
||||
XCTFail("Request returned error \(error)")
|
||||
}
|
||||
exp.fulfill()
|
||||
}
|
||||
|
||||
wait(for: [exp], timeout: 1)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue