Skip to content

Commit

Permalink
PIA-1847: Unit tests on network requests use cases
Browse files Browse the repository at this point in the history
  • Loading branch information
kp-laura-sempere committed Jun 20, 2024
1 parent 09a5299 commit 00f5328
Show file tree
Hide file tree
Showing 4 changed files with 479 additions and 4 deletions.
2 changes: 1 addition & 1 deletion Sources/PIALibrary/Account/DefaultAccountProvider.swift
Original file line number Diff line number Diff line change
Expand Up @@ -628,7 +628,7 @@ open class DefaultAccountProvider: AccountProvider, ConfigurationAccess, Databas
return
}

paymentUseCase.processPayment(with: user.credentials, request: payment) { (error) in
paymentUseCase(with: user.credentials, request: payment) { (error) in

log.debug("Payment processed with error: \(error)")

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ private let log = SwiftyBeaver.self

protocol PaymentUseCaseType {
typealias Completion = ((NetworkRequestError?) -> Void)
func processPayment(with credentials: Credentials, request: Payment, completion: @escaping Completion)
func callAsFunction(with credentials: Credentials, request: Payment, completion: @escaping Completion)
}


Expand All @@ -19,7 +19,7 @@ class PaymentUseCase: PaymentUseCaseType {
self.paymentInformationDataConverter = paymentInformationDataConverter
}

func processPayment(with credentials: Credentials, request: Payment, completion: @escaping Completion) {
func callAsFunction(with credentials: Credentials, request: Payment, completion: @escaping Completion) {

var configuration = PaymentRequestConfiguration()

Expand Down Expand Up @@ -59,7 +59,7 @@ private extension PaymentUseCase {
}

private func handleErrorResponse(_ error: NetworkRequestError, completion: @escaping Completion) {
if case .connectionError(statusCode: let statusCode, message: let message) = error, statusCode == 400 {
if case .allConnectionAttemptsFailed(statusCode: let statusCode) = error, statusCode == 400 {
completion(NetworkRequestError.badReceipt)
return
}
Expand Down
155 changes: 155 additions & 0 deletions Tests/PIALibraryTests/Accounts/PaymentUseCaseTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
import XCTest
@testable import PIALibrary

class PaymentUseCaseTests: XCTestCase {
class Fixture {
let networkClientMock = NetworkRequestClientMock()
let paymentInformationDataConverter = PaymentInformationDataConverter()
let credentials = Credentials(username: "username", password: "password")
let payment = Payment(receipt: Data())

func stubSuccessFullNetworkRequest() {
let successResponse = NetworkRequestResponseMock(statusCode: 200, data: Data())
networkClientMock.executeRequestResponse = successResponse
networkClientMock.executeRequestError = nil
}

func stubNetworRequestError(_ error: NetworkRequestError) {
networkClientMock.executeRequestError = error
}
}

var fixture: Fixture!
var sut: PaymentUseCase!

override func setUp() {
fixture = Fixture()
}

override func tearDown() {
fixture = nil
sut = nil
}

private func instantiateSut() {
sut = PaymentUseCase(networkClient: fixture.networkClientMock, paymentInformationDataConverter: fixture.paymentInformationDataConverter)
}

func test_payment_when_network_request_succeeds() {
// GIVEN that the payment request succeeds
fixture.stubSuccessFullNetworkRequest()

instantiateSut()

let expectation = expectation(description: "Payment request is executed")
var capturedError: NetworkRequestError?

// WHEN executing the request
sut.callAsFunction(with: fixture.credentials, request: fixture.payment) { error in
capturedError = error
expectation.fulfill()
}

wait(for: [expectation], timeout: 3)

let executedRequestConfiguration = fixture.networkClientMock.executeRequestWithConfiguation!

// THEN the payment request is executed
XCTAssertEqual(fixture.networkClientMock.executeRequestCalledAttempt, 1)
XCTAssertEqual(executedRequestConfiguration.path, RequestAPI.Path.iosPayment)

let userPassToBase64 = "username:password".toBase64()!
let otherHeaders = ["Authorization": "Basic \(userPassToBase64)"]

// WITH the Basic Authorization Header
XCTAssertEqual(executedRequestConfiguration.otherHeaders!, otherHeaders)

let requestBody = fixture.paymentInformationDataConverter(payment: fixture.payment)!

// AND the payment info object encoded int he body
XCTAssertEqual(executedRequestConfiguration.body!.count, requestBody.count)

// AND no error is retured
XCTAssertNil(capturedError)

}

func test_payment_when_network_request_failsWith401() {
// GIVEN that the payment request fails
fixture.stubNetworRequestError(.allConnectionAttemptsFailed(statusCode: 401))

instantiateSut()

let expectation = expectation(description: "Payment request is executed")
var capturedError: NetworkRequestError?

// WHEN executing the request
sut.callAsFunction(with: fixture.credentials, request: fixture.payment) { error in
capturedError = error
expectation.fulfill()
}

wait(for: [expectation], timeout: 3)

let executedRequestConfiguration = fixture.networkClientMock.executeRequestWithConfiguation!

// THEN the payment request is executed
XCTAssertEqual(fixture.networkClientMock.executeRequestCalledAttempt, 1)
XCTAssertEqual(executedRequestConfiguration.path, RequestAPI.Path.iosPayment)

let userPassToBase64 = "username:password".toBase64()!
let otherHeaders = ["Authorization": "Basic \(userPassToBase64)"]

// WITH the Basic Authorization Header
XCTAssertEqual(executedRequestConfiguration.otherHeaders!, otherHeaders)

let requestBody = fixture.paymentInformationDataConverter(payment: fixture.payment)!

// AND the payment info object encoded int he body
XCTAssertEqual(executedRequestConfiguration.body!.count, requestBody.count)

// AND an Error is retured
XCTAssertNotNil(capturedError)
XCTAssertEqual(capturedError, .allConnectionAttemptsFailed(statusCode: 401))
}

func test_payment_when_network_request_failsWith400() {
// GIVEN that the payment request fails
fixture.stubNetworRequestError(.allConnectionAttemptsFailed(statusCode: 400))

instantiateSut()

let expectation = expectation(description: "Payment request is executed")
var capturedError: NetworkRequestError?

// WHEN executing the request
sut.callAsFunction(with: fixture.credentials, request: fixture.payment) { error in
capturedError = error
expectation.fulfill()
}

wait(for: [expectation], timeout: 3)

let executedRequestConfiguration = fixture.networkClientMock.executeRequestWithConfiguation!

// THEN the payment request is executed
XCTAssertEqual(fixture.networkClientMock.executeRequestCalledAttempt, 1)
XCTAssertEqual(executedRequestConfiguration.path, RequestAPI.Path.iosPayment)

let userPassToBase64 = "username:password".toBase64()!
let otherHeaders = ["Authorization": "Basic \(userPassToBase64)"]

// WITH the Basic Authorization Header
XCTAssertEqual(executedRequestConfiguration.otherHeaders!, otherHeaders)

let requestBody = fixture.paymentInformationDataConverter(payment: fixture.payment)!

// AND the payment info object encoded int he body
XCTAssertEqual(executedRequestConfiguration.body!.count, requestBody.count)

// AND an Error is retured
XCTAssertNotNil(capturedError)
XCTAssertEqual(capturedError, .badReceipt)
}

}
Loading

0 comments on commit 00f5328

Please sign in to comment.