Skip to content

Commit

Permalink
fix(GiniHealthSDKTests): fix use of forced wrap + small refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
razvancapra committed Apr 10, 2024
1 parent b09ce45 commit 447234f
Show file tree
Hide file tree
Showing 6 changed files with 151 additions and 98 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ final class GiniHealthTests: XCTestCase {

func testFetchBankingApps_Success() {
// Given
let expectedProviders: [PaymentProvider] = loadProviders()
let expectedProviders: [PaymentProvider]? = loadProviders()

// When
let expectation = self.expectation(description: "Fetching banking apps")
Expand All @@ -51,13 +51,18 @@ final class GiniHealthTests: XCTestCase {

// Then
XCTAssertNotNil(receivedProviders)
XCTAssertEqual(receivedProviders?.count, expectedProviders.count)
XCTAssertEqual(receivedProviders?.count, expectedProviders?.count)
XCTAssertEqual(receivedProviders, expectedProviders)
}

func testCheckIfDocumentIsPayable_Success() {
// Given
let expectedExtractions: ExtractionsContainer = loadExtractionResults(fileName: "extractionResultWithIBAN", type: "json")
let fileName = "extractionResultWithIBAN"
let expectedExtractions: ExtractionsContainer? = GiniHealthSDKTests.load(fromFile: fileName)
guard let expectedExtractions else {
XCTFail("Error loading file: `\(fileName).json`")
return
}
let expectedExtractionsResult = ExtractionResult(extractionsContainer: expectedExtractions)
let expectedIsPayable = expectedExtractionsResult.extractions.first(where: { $0.name == "iban" })?.value.isNotEmpty

Expand All @@ -81,7 +86,12 @@ final class GiniHealthTests: XCTestCase {

func testCheckIfDocumentIsNotPayable_Success() {
// Given
let expectedExtractions: ExtractionsContainer = loadExtractionResults(fileName: "extractionResultWithIBAN", type: "json")
let fileName = "extractionResultWithIBAN"
let expectedExtractions: ExtractionsContainer? = GiniHealthSDKTests.load(fromFile: fileName)
guard let expectedExtractions else {
XCTFail("Error loading file: `\(fileName).json`")
return
}
let expectedExtractionsResult = ExtractionResult(extractionsContainer: expectedExtractions)
let expectedIsPayable = expectedExtractionsResult.extractions.first(where: { $0.name == "iban" })?.value.isEmpty

Expand Down Expand Up @@ -124,7 +134,7 @@ final class GiniHealthTests: XCTestCase {

func testPollDocument_Success() {
// Given
let expectedDocument: Document = loadDocument(fileName: "document1", type: "json")
let expectedDocument: Document? = GiniHealthSDKTests.load(fromFile: "document1")

// When
let expectation = self.expectation(description: "Polling document")
Expand All @@ -142,7 +152,7 @@ final class GiniHealthTests: XCTestCase {

// Then
XCTAssertNotNil(receivedDocument)
XCTAssertEqual(receivedDocument!, expectedDocument)
XCTAssertEqual(receivedDocument, expectedDocument)
}

func testPollDocument_Failure() {
Expand All @@ -166,7 +176,12 @@ final class GiniHealthTests: XCTestCase {

func testGetExtractions_Success() {
// Given
let expectedExtractionContainer: ExtractionsContainer = loadExtractionResults(fileName: "extractionsWithPayment", type: "json")
let fileName = "extractionsWithPayment"
let expectedExtractionContainer: ExtractionsContainer? = GiniHealthSDKTests.load(fromFile: fileName)
guard let expectedExtractionContainer else {
XCTFail("Error loading file: `\(fileName).json`")
return
}
let expectedExtractions: [Extraction] = ExtractionResult(extractionsContainer: expectedExtractionContainer).payment?.first ?? []

// When
Expand All @@ -185,7 +200,7 @@ final class GiniHealthTests: XCTestCase {

// Then
XCTAssertNotNil(receivedExtractions)
XCTAssertEqual(receivedExtractions!.count, expectedExtractions.count)
XCTAssertEqual(receivedExtractions?.count, expectedExtractions.count)
}

func testGetExtractions_Failure() {
Expand Down Expand Up @@ -228,13 +243,13 @@ final class GiniHealthTests: XCTestCase {

// Then
XCTAssertNotNil(receivedRequestId)
XCTAssertEqual(receivedRequestId!, expectedPaymentRequestID)
XCTAssertEqual(receivedRequestId, expectedPaymentRequestID)
}

func testOpenLink_Success() {
let mockUIApplication = MockUIApplication(canOpen: true)
let urlOpener = URLOpener(mockUIApplication)
let waitForWebsiteOpen = expectation(description: "Link was opened!")
let waitForWebsiteOpen = expectation(description: "Link was opened")

giniHealth.openPaymentProviderApp(requestID: "123", universalLink: "ginipay-bank://", urlOpener: urlOpener, completion: { open in
waitForWebsiteOpen.fulfill()
Expand All @@ -247,7 +262,7 @@ final class GiniHealthTests: XCTestCase {
func testOpenLink_Failure() {
let mockUIApplication = MockUIApplication(canOpen: false)
let urlOpener = URLOpener(mockUIApplication)
let waitForWebsiteOpen = expectation(description: "Link was not opened!")
let waitForWebsiteOpen = expectation(description: "Link was not opened")

giniHealth.openPaymentProviderApp(requestID: "123", universalLink: "ginipay-bank://", urlOpener: urlOpener, completion: { open in
waitForWebsiteOpen.fulfill()
Expand All @@ -259,7 +274,12 @@ final class GiniHealthTests: XCTestCase {

func testSetDocumentForReview_Success() {
// Given
let expectedExtractionContainer: ExtractionsContainer = loadExtractionResults(fileName: "extractionsWithPayment", type: "json")
let fileName = "extractionsWithPayment"
let expectedExtractionContainer: ExtractionsContainer? = GiniHealthSDKTests.load(fromFile: fileName)
guard let expectedExtractionContainer else {
XCTFail("Error loading file: `\(fileName).json`")
return
}
let expectedExtractions: [Extraction] = ExtractionResult(extractionsContainer: expectedExtractionContainer).payment?.first ?? []

// When
Expand All @@ -278,14 +298,24 @@ final class GiniHealthTests: XCTestCase {

// Then
XCTAssertNotNil(receivedExtractions)
XCTAssertEqual(receivedExtractions!.count, expectedExtractions.count)
XCTAssertEqual(receivedExtractions?.count, expectedExtractions.count)
}

func testFetchDataForReview_Success() {
// Given
let expectedExtractionContainer: ExtractionsContainer = loadExtractionResults(fileName: "extractionsWithPayment", type: "json")
let fileName = "extractionsWithPayment"
let expectedExtractionContainer: ExtractionsContainer? = GiniHealthSDKTests.load(fromFile: fileName)
guard let expectedExtractionContainer else {
XCTFail("Error loading file: `\(fileName).json`")
return
}
let expectedExtractions: [Extraction] = ExtractionResult(extractionsContainer: expectedExtractionContainer).payment?.first ?? []
let expectedDocument: Document = loadDocument(fileName: "document4", type: "json")
let documentFileName = "document4"
let expectedDocument: Document? = GiniHealthSDKTests.load(fromFile: documentFileName)
guard let expectedDocument else {
XCTFail("Error loading file: `\(documentFileName).json`")
return
}
let expectedDatForReview = DataForReview(document: expectedDocument, extractions: expectedExtractions)

// When
Expand All @@ -304,8 +334,8 @@ final class GiniHealthTests: XCTestCase {

// Then
XCTAssertNotNil(receivedDataForReview)
XCTAssertEqual(receivedDataForReview!.document, expectedDatForReview.document)
XCTAssertEqual(receivedDataForReview!.extractions.count, expectedDatForReview.extractions.count)
XCTAssertEqual(receivedDataForReview?.document, expectedDatForReview.document)
XCTAssertEqual(receivedDataForReview?.extractions.count, expectedDatForReview.extractions.count)
}

func testFetchDataForReview_Failure() {
Expand All @@ -327,4 +357,3 @@ final class GiniHealthTests: XCTestCase {
XCTAssertNotNil(receivedError)
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
//
// FileLoader.swift
//
// Copyright © 2024 Gini GmbH. All rights reserved.
//


import Foundation

import Foundation

struct FileLoader {
static func loadFile(withName mockFileName: String, ofType fileType: String) -> Data? {
guard let filePath = Bundle.module.path(forResource: mockFileName, ofType: fileType) else {
print("File not found.")
return nil
}

let fileURL = URL(fileURLWithPath: filePath)
do {
let data = try Data(contentsOf: fileURL)
return data
} catch {
print("Error loading file:", error)
return nil
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,12 @@ class MockPaymentComponents: PaymentComponentsProtocol {

func loadPaymentProviders() {
isLoading = false
let paymentProviderResponse = loadProviderResponse()
selectedPaymentProvider = PaymentProvider(id: paymentProviderResponse.id, name: paymentProviderResponse.name, appSchemeIOS: paymentProviderResponse.appSchemeIOS, minAppVersion: paymentProviderResponse.minAppVersion, colors: paymentProviderResponse.colors, iconData: Data(url: URL(string: paymentProviderResponse.iconLocation))!, appStoreUrlIOS: paymentProviderResponse.appStoreUrlIOS, universalLinkIOS: paymentProviderResponse.universalLinkIOS)
guard let paymentProviderResponse: PaymentProviderResponse = load(fromFile: "provider") else {
return
}
if let iconData = Data(url: URL(string: paymentProviderResponse.iconLocation)) {
selectedPaymentProvider = PaymentProvider(id: paymentProviderResponse.id, name: paymentProviderResponse.name, appSchemeIOS: paymentProviderResponse.appSchemeIOS, minAppVersion: paymentProviderResponse.minAppVersion, colors: paymentProviderResponse.colors, iconData: iconData, appStoreUrlIOS: paymentProviderResponse.appStoreUrlIOS, universalLinkIOS: paymentProviderResponse.universalLinkIOS)
}
}

func checkIfDocumentIsPayable(docId: String, completion: @escaping (Result<Bool, GiniHealthError>) -> Void) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,9 @@ final class MockSessionManager: SessionManagerProtocol {
switch apiMethod {
case .file(_):
let imageData = UIImage(named: "Gini-Test-Payment-Provider", in: Bundle.module, compatibleWith: nil)?.pngData()
completion(.success(imageData as! T.ResponseType))
if let imageData = imageData as? T.ResponseType {
completion(.success(imageData))
}
default:
break
}
Expand All @@ -46,43 +48,63 @@ final class MockSessionManager: SessionManagerProtocol {
case .document(let id):
switch (id, resource.params.method) {
case (MockSessionManager.payableDocumentID, .get):
let document: Document = load(fromFile: "document1", type: "json")
completion(.success(document as! T.ResponseType))
let document: Document? = load(fromFile: "document1", type: "json")
if let document = document as? T.ResponseType {
completion(.success(document))
}
case (MockSessionManager.notPayableDocumentID, .get):
let document: Document = load(fromFile: "document2", type: "json")
completion(.success(document as! T.ResponseType))
let document: Document? = load(fromFile: "document2", type: "json")
if let document = document as? T.ResponseType {
completion(.success(document))
}
case (MockSessionManager.failurePayableDocumentID, .get):
let document: Document = load(fromFile: "document3", type: "json")
completion(.success(document as! T.ResponseType))
let document: Document? = load(fromFile: "document3", type: "json")
if let document = document as? T.ResponseType {
completion(.success(document))
}
case (MockSessionManager.missingDocumentID, .get):
completion(.failure(.notFound(response: nil, data: nil)))
case (MockSessionManager.extractionsWithPaymentDocumentID, .get):
let document: Document = load(fromFile: "document4", type: "json")
completion(.success(document as! T.ResponseType))
let document: Document? = load(fromFile: "document4", type: "json")
if let document = document as? T.ResponseType {
completion(.success(document))
}
default:
fatalError("Document id not found in tests")
}
case .createPaymentRequest:
completion(.success(MockSessionManager.paymentRequestId as! T.ResponseType))
if let paymentRequestId = MockSessionManager.paymentRequestId as? T.ResponseType {
completion(.success(paymentRequestId))
}
case .paymentProvider(_):
let providerResponse: PaymentProviderResponse = loadProviderResponse()
completion(.success(providerResponse as! T.ResponseType))
let providerResponse: PaymentProviderResponse? = load(fromFile: "provider")
if let providerResponse = providerResponse as? T.ResponseType {
completion(.success(providerResponse))
}
case .paymentProviders:
let paymentProvidersResponse: [PaymentProviderResponse] = loadProvidersResponse()
completion(.success(paymentProvidersResponse as! T.ResponseType))
let paymentProvidersResponse: [PaymentProviderResponse]? = load(fromFile: "providers")
if let paymentProvidersResponse = paymentProvidersResponse as? T.ResponseType {
completion(.success(paymentProvidersResponse))
}
case .extractions(let documentId):
switch (documentId, resource.params.method) {
case (MockSessionManager.payableDocumentID, .get):
let extractionResults: ExtractionsContainer = loadExtractionResults(fileName: "extractionResultWithIBAN", type: "json")
completion(.success(extractionResults as! T.ResponseType))
let extractionResults: ExtractionsContainer? = load(fromFile: "extractionResultWithIBAN")
if let extractionResults = extractionResults as? T.ResponseType {
completion(.success(extractionResults))
}
case (MockSessionManager.notPayableDocumentID, .get):
let extractionResults: ExtractionsContainer = loadExtractionResults(fileName: "extractionResultWithoutIBAN", type: "json")
completion(.success(extractionResults as! T.ResponseType))
let extractionResults: ExtractionsContainer? = load(fromFile: "extractionResultWithoutIBAN")
if let extractionResults = extractionResults as? T.ResponseType {
completion(.success(extractionResults))
}
case (MockSessionManager.failurePayableDocumentID, .get):
completion(.failure(.noResponse))
case (MockSessionManager.extractionsWithPaymentDocumentID, .get):
let extractionResults: ExtractionsContainer = loadExtractionResults(fileName: "extractionsWithPayment", type: "json")
completion(.success(extractionResults as! T.ResponseType))
let extractionResults: ExtractionsContainer? = load(fromFile: "extractionsWithPayment")
if let extractionResults = extractionResults as? T.ResponseType {
completion(.success(extractionResults))
}
default:
fatalError("Document id not found in tests")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,64 +8,22 @@
import UIKit
import GiniHealthAPILibrary

func loadProviderResponse() -> PaymentProviderResponse {
let fileURLPath: String? = Bundle.module
.path(forResource: "provider", ofType: "json")
let jsonData = try? Data.init(contentsOf: URL(fileURLWithPath: fileURLPath!))
return try! JSONDecoder().decode(PaymentProviderResponse.self, from: jsonData!)
}

func loadProvidersResponse() -> [PaymentProviderResponse] {
let fileURLPath: String? = Bundle.module
.path(forResource: "providers", ofType: "json")
let jsonData = try? Data.init(contentsOf: URL(fileURLWithPath: fileURLPath!))

return (try? JSONDecoder().decode([PaymentProviderResponse].self, from: jsonData!))!
}

func loadProviders() -> PaymentProviders {
func loadProviders() -> PaymentProviders? {
var providers: PaymentProviders = []
let fileURLPath: String? = Bundle.module
.path(forResource: "providers", ofType: "json")
let jsonData = try? Data.init(contentsOf: URL(fileURLWithPath: fileURLPath!))
let providersResponse = try! JSONDecoder().decode([PaymentProviderResponse].self, from: jsonData!)
let providersResponse: [PaymentProviderResponse]? = load(fromFile: "providers")
guard let providersResponse else { return nil }
for providerResponse in providersResponse {
let imageData = UIImage(named: "Gini-Test-Payment-Provider", in: Bundle.module, compatibleWith: nil)?.pngData()
let imageData = UIImage(named: "Gini-Test-Payment-Provider", in: Bundle.module, compatibleWith: nil)?.pngData()
let provider = PaymentProvider(id: providerResponse.id, name: providerResponse.name, appSchemeIOS: providerResponse.appSchemeIOS, minAppVersion: providerResponse.minAppVersion, colors: providerResponse.colors, iconData: imageData ?? Data(), appStoreUrlIOS: providerResponse.appStoreUrlIOS, universalLinkIOS: providerResponse.universalLinkIOS)
providers.append(provider)
}
}
return providers
}

func loadDocument(fileName: String, type: String) -> Document {
let jsonData = loadFile(withName: fileName, ofType: type)

return (try? JSONDecoder().decode(Document.self, from: jsonData))!
}

func loadExtractionResults(fileName: String, type: String) -> ExtractionsContainer {
let jsonData = loadFile(withName: fileName, ofType: type)

return (try? JSONDecoder().decode(ExtractionsContainer.self, from: jsonData))!
}

func loadFile(withName name: String, ofType type: String) -> Data {
let fileURLPath: String? = Bundle.module
.path(forResource: name, ofType: type)
let data = try? Data.init(contentsOf: URL(fileURLWithPath: fileURLPath!))

return data!
}

func load<T: Decodable>(fromFile named: String, type: String) -> T {
let jsonData = loadFile(withName: named, ofType: type)
func load<T: Decodable>(fromFile named: String, type: String = "json") -> T? {
guard let jsonData = FileLoader.loadFile(withName: named, ofType: type) else {
return nil
}

return (try? JSONDecoder().decode(T.self, from: jsonData))!
}

func loadPaymentRequest() -> PaymentRequest {
let fileURLPath: String? = Bundle.module
.path(forResource: "paymentRequest", ofType: "json")
let jsonData = try? Data.init(contentsOf: URL(fileURLWithPath: fileURLPath!))
return try! JSONDecoder().decode(PaymentRequest.self, from: jsonData!)
return try? JSONDecoder().decode(T.self, from: jsonData)
}
Loading

0 comments on commit 447234f

Please sign in to comment.