Skip to content

Commit

Permalink
feat(GiniHealthSDK): PaymentComponentsController tests
Browse files Browse the repository at this point in the history
IPC-187
  • Loading branch information
razvancapra committed Apr 1, 2024
1 parent 511c892 commit fb3dbc6
Show file tree
Hide file tree
Showing 4 changed files with 173 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ public enum GiniHealthError: Error {
/// Error thrown when api didn't returns payment extractions.
case noPaymentDataExtracted
}

extension GiniHealthError: Equatable {}
/**
Data structure for Payment Review Screen initialization.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ protocol PaymentComponentsProtocol {
var isLoading: Bool { get set }
var selectedPaymentProvider: PaymentProvider? { get set }
func loadPaymentProviders()
func checkIfDocumentIsPayable(docId: String, completion: @escaping (Result<Bool, GiniHealthError>) -> Void)
func paymentView(documentId: String) -> UIView
func bankSelectionBottomSheet() -> UIViewController
func loadPaymentReviewScreenFor(documentID: String, trackingDelegate: GiniHealthTrackingDelegate?, completion: @escaping (UIViewController?, GiniHealthError?) -> Void)
func paymentInfoViewController() -> UIViewController
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
//


import Foundation
import UIKit
@testable import GiniHealthSDK
@testable import GiniHealthAPILibrary

Expand All @@ -27,4 +27,53 @@ class MockPaymentComponents: PaymentComponentsProtocol {
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)
}

func checkIfDocumentIsPayable(docId: String, completion: @escaping (Result<Bool, GiniHealthError>) -> Void) {
switch docId {
case MockSessionManager.payableDocumentID:
completion(.success(true))
case MockSessionManager.notPayableDocumentID:
completion(.success(false))
case MockSessionManager.missingDocumentID:
completion(.failure(.apiError(.noResponse)))
default:
fatalError("Document id not handled in tests")
}
}

func paymentView(documentId: String) -> UIView {
let viewModel = PaymentComponentViewModel(paymentProvider: selectedPaymentProvider)
viewModel.documentId = documentId
let view = PaymentComponentView()
view.viewModel = viewModel
return view
}

func bankSelectionBottomSheet() -> UIViewController {
let paymentProvidersBottomView = BanksBottomView()
let paymentProvidersBottomViewModel = BanksBottomViewModel(paymentProviders: paymentProviders,
selectedPaymentProvider: selectedPaymentProvider)
paymentProvidersBottomView.viewModel = paymentProvidersBottomViewModel
let bankSelectionBottomSheet = BankSelectionBottomSheet()
bankSelectionBottomSheet.bottomSheet = paymentProvidersBottomView
return bankSelectionBottomSheet
}

func loadPaymentReviewScreenFor(documentID: String, trackingDelegate: (any GiniHealthTrackingDelegate)?, completion: @escaping (UIViewController?, GiniHealthError?) -> Void) {
switch documentID {
case MockSessionManager.payableDocumentID:
completion(PaymentReviewViewController(), nil)
case MockSessionManager.missingDocumentID:
completion(nil, .apiError(.noResponse))
default:
fatalError("Document id not handled in tests")
}
}

func paymentInfoViewController() -> UIViewController {
let paymentInfoViewController = PaymentInfoViewController()
let paymentInfoViewModel = PaymentInfoViewModel(paymentProviders: paymentProviders)
paymentInfoViewController.viewModel = paymentInfoViewModel
return paymentInfoViewController
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import XCTest

final class PaymentComponentsControllerTests: XCTestCase {
var giniHealthAPI: HealthAPI!
var paymentComponentsController: PaymentComponentsProtocol!
var mockPaymentComponentsController: PaymentComponentsProtocol!

override func setUp() {
super.setUp()
Expand All @@ -20,21 +20,131 @@ final class PaymentComponentsControllerTests: XCTestCase {
let paymentService = PaymentService(sessionManager: sessionManagerMock)
giniHealthAPI = MockHealthAPI(docService: documentService, payService: paymentService)
let giniHealth = GiniHealth(with: giniHealthAPI)
paymentComponentsController = MockPaymentComponents(giniHealthSDK: giniHealth)
mockPaymentComponentsController = MockPaymentComponents(giniHealthSDK: giniHealth)
}

override func tearDown() {
giniHealthAPI = nil
paymentComponentsController = nil
mockPaymentComponentsController = nil
super.tearDown()
}

func testLoadPaymentProviders_Success() {
// When
paymentComponentsController.loadPaymentProviders()
mockPaymentComponentsController.loadPaymentProviders()

// Then
XCTAssertFalse(paymentComponentsController.isLoading)
XCTAssertNotNil(paymentComponentsController.selectedPaymentProvider)
XCTAssertFalse(mockPaymentComponentsController.isLoading)
XCTAssertNotNil(mockPaymentComponentsController.selectedPaymentProvider)
}

func testCheckIfDocumentIsPayable_Success() {
let expectedResult: Result<Bool, GiniHealthError> = .success(true)
// When
var receivedResult: Result<Bool, GiniHealthError>?
mockPaymentComponentsController.checkIfDocumentIsPayable(docId: MockSessionManager.payableDocumentID) { result in
receivedResult = result
}

// Then
XCTAssertEqual(receivedResult, expectedResult)
}

func testCheckIfDocumentIsPayable_NotPayable() {
let expectedResult: Result<Bool, GiniHealthError> = .success(false)
// When
var receivedResult: Result<Bool, GiniHealthError>?
mockPaymentComponentsController.checkIfDocumentIsPayable(docId: MockSessionManager.notPayableDocumentID) { result in
receivedResult = result
}

// Then
XCTAssertEqual(receivedResult, expectedResult)
}

func testCheckIfDocumentIsPayable_Failure() {
let expectedResult: Result<Bool, GiniHealthError> = .failure(.apiError(.noResponse))
// When
var receivedResult: Result<Bool, GiniHealthError>?
mockPaymentComponentsController.checkIfDocumentIsPayable(docId: MockSessionManager.missingDocumentID) { result in
receivedResult = result
}

// Then
XCTAssertEqual(receivedResult, expectedResult)
}

func testPaymentView_ReturnsView() {
// Given
let documentId = "123456"
let expectedViewModel = PaymentComponentViewModel(paymentProvider: nil)
let expectedView = PaymentComponentView()
expectedView.viewModel = expectedViewModel

// When
let view = mockPaymentComponentsController.paymentView(documentId: documentId)

// Then
XCTAssertTrue(view is PaymentComponentView)
XCTAssertEqual((view as! PaymentComponentView).viewModel?.documentId, documentId)
}

func testBankSelectionBottomSheet_ReturnsViewController() {
// When
let viewController = mockPaymentComponentsController.bankSelectionBottomSheet()

// Then
XCTAssertTrue(viewController is BankSelectionBottomSheet)
let bottomSheet = viewController as! BankSelectionBottomSheet
XCTAssertTrue(bottomSheet.bottomSheet != nil)
}

func testLoadPaymentReviewScreenFor_Success() {
// Given
let documentID = MockSessionManager.payableDocumentID

// When
var receivedViewController: UIViewController?
var receivedError: GiniHealthError?
mockPaymentComponentsController.loadPaymentReviewScreenFor(documentID: documentID, trackingDelegate: nil) { viewController, error in
receivedViewController = viewController
receivedError = error
}

// Then
XCTAssertNil(receivedError)
XCTAssertNotNil(receivedViewController)
XCTAssertTrue(receivedViewController is PaymentReviewViewController)
}

func testLoadPaymentReviewScreenFor_Failure() {
// Given
let documentID = MockSessionManager.missingDocumentID

// When
var receivedViewController: UIViewController?
var receivedError: GiniHealthError?
mockPaymentComponentsController.loadPaymentReviewScreenFor(documentID: documentID, trackingDelegate: nil) { viewController, error in
receivedViewController = viewController
receivedError = error
}

// Then
XCTAssertNotNil(receivedError)
XCTAssertNil(receivedViewController)
XCTAssertEqual(receivedError, .apiError(.noResponse))
}

func testPaymentInfoViewController_ReturnsCorrectViewController() {
// When
let viewController = mockPaymentComponentsController.paymentInfoViewController()

// Then
XCTAssertTrue(viewController is PaymentInfoViewController)
let paymentInfoVC = viewController as! PaymentInfoViewController
XCTAssertNotNil(paymentInfoVC.viewModel)
XCTAssertTrue(paymentInfoVC.viewModel != nil)
let paymentInfoViewModel = paymentInfoVC.viewModel!
XCTAssertEqual(paymentInfoViewModel.paymentProviders, [])
}
}

0 comments on commit fb3dbc6

Please sign in to comment.