Skip to content

Commit

Permalink
feat(ad-hoc): card formatting tests (#147)
Browse files Browse the repository at this point in the history
Add CardExpirationFormatter and CardNumberFormatter tests.
  • Loading branch information
andrii-vysotskyi-cko authored Aug 9, 2023
1 parent 077835a commit 04e9204
Show file tree
Hide file tree
Showing 5 changed files with 145 additions and 52 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,18 @@ final class CardExpirationFormatter: Formatter {
/// Returns formatted version of given expiration string.
func string(from string: String) -> String {
let expiration = self.expiration(from: string)
guard !expiration.month.isEmpty || !expiration.year.isEmpty else {
guard !expiration.month.isEmpty else {
return ""
}
return formatted(month: expiration.month, year: expiration.year)
}

func expirationMonth(from string: String) -> Int? {
let monthDescription = expiration(from: string).month
return Int(monthDescription)
guard let month = Int(monthDescription), month > 0, month <= 12 else {
return nil
}
return month
}

func expirationYear(from string: String) -> Int? {
Expand Down Expand Up @@ -104,11 +107,8 @@ final class CardExpirationFormatter: Formatter {
}

private func formatted(month: String, forcePadding: Bool) -> String {
if month.isEmpty {
return ""
}
guard let monthValue = Int(month) else {
assertionFailure("Month should be valid integer or empty.")
assertionFailure("Month should be valid integer.")
return month
}
guard monthValue != 0 else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,7 @@ final class CardNumberFormatter: Formatter {
return formattedNumber
}
}
if let formattedNumber = attemptToFormat(cardNumber: normalizedNumber, pattern: Constants.defaultPattern) {
return formattedNumber
}
return partialNumber
return attemptToFormat(cardNumber: normalizedNumber, pattern: Constants.defaultPattern) ?? partialNumber
}

func normalized(number: String) -> String {
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
//
// CardExpirationFormatterTests.swift
// ProcessOut
//
// Created by Andrii Vysotskyi on 21.07.2023.
//

import XCTest
@testable import ProcessOut

final class CardExpirationFormatterTests: XCTestCase {

override func setUp() {
super.setUp()
sut = CardExpirationFormatter()
}

func test_string() {
// When
let formatted = sut.string(from: "1230")

// Then
XCTAssertEqual(formatted, "12 / 30")
}

func test_string_whenStringHasNoDigits_returnsEmptyString() {
// When
let formatted = sut.string(from: "a")

// Then
XCTAssertEqual(formatted, "")
}

func test_string_whenStringIsPrefixedWithZeros_keepsZingleZero() {
// When
let formatted = sut.string(from: "001")

// Then
XCTAssertEqual(formatted, "01 / ")
}

func test_string_whenStringHasOnlyZeros_returnsZero() {
// When
let formatted = sut.string(from: "000")

// Then
XCTAssertEqual(formatted, "0")
}

func test_string_returnsPaddedMonth() {
// Given
let strings = (2...9).map(\.description)

// When
let formatted = strings.map(sut.string(from:))

// Then
let allSatisfy = formatted.allSatisfy { $0.first == "0" }
XCTAssertTrue(allSatisfy)
}

func test_string_whenMonthIsIncomplete_returnsIt() {
// When
let formatted = sut.string(from: "1")

// Then
XCTAssertEqual(formatted, "1")
}

// MARK: - Expiration Month

func test_expirationMonth_returnsValue() {
// When
let month = sut.expirationMonth(from: "01")

// Then
XCTAssertEqual(month, 1)
}

func test_expirationMonth_whenMonthIsInvalid_returnsNil() {
// When
let month = sut.expirationMonth(from: "0")

// Then
XCTAssertEqual(month, nil)
}

// MARK: - Expiration Year

func test_expirationYear_returnsValue() {
// When
let year = sut.expirationYear(from: "01/1")

// Then
XCTAssertEqual(year, 1)
}

func test_expirationYear_whenYearComponentIsNotSet_returnsNil() {
// When
let year = sut.expirationYear(from: "01/")

// Then
XCTAssertEqual(year, nil)
}

// MARK: - Private Properties

private var sut: CardExpirationFormatter!
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,18 +17,42 @@ final class CardNumberFormatterTests: XCTestCase {

func test_normalized_retainsDigits() {
// When
let normalizedNumber = sut.normalized(number: "+1#")
let normalized = sut.normalized(number: "+1#")

// Then
XCTAssertEqual(normalizedNumber, "1")
XCTAssertEqual(normalized, "1")
}

func test_string() {
func test_string_whenHasNoMatchingLeading_fallsBackToDefaultPattern() {
// When
let formattedNumber = sut.string(from: "621")
let formatted = sut.string(from: "99999")

// Then
XCTAssertEqual(formattedNumber, "621")
XCTAssertEqual(formatted, "9999 9")
}

func test_string_returnsFormattedNumber() {
// When
let formatted = sut.string(from: "123456789123456")

// Then
XCTAssertEqual(formatted, "1234 56789 123456")
}

func test_string_whenEmpty_returnsEmptyString() {
// When
let formatted = sut.string(from: "")

// Then
XCTAssertEqual(formatted, "")
}

func test_string_whenExceedsMaxLength_returnsValueWithoutExcessiveSuffix() {
// When
let formatted = sut.string(from: "12345678912345678910")

// Then
XCTAssertEqual(formatted, "1234 5678 9123 4567 891")
}

// MARK: - Private Properties
Expand Down

0 comments on commit 04e9204

Please sign in to comment.