Skip to content

Commit 8ac9b11

Browse files
committed
Write unit tests for CreditCardValidationRule
1 parent 184553a commit 8ac9b11

1 file changed

Lines changed: 164 additions & 0 deletions

File tree

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
//
2+
// Validator
3+
// Copyright © 2025 Space Code. All rights reserved.
4+
//
5+
6+
@testable import ValidatorCore
7+
import XCTest
8+
9+
// MARK: - CreditCardValidationRuleTests
10+
11+
final class CreditCardValidationRuleTests: XCTestCase {
12+
// MARK: - Visa
13+
14+
func test_validate_visaCardValid_shouldReturnTrue() {
15+
// given
16+
let rule = CreditCardValidationRule(types: [.visa], error: String.error)
17+
let validVisa = "4111111111111111"
18+
19+
// when
20+
let isValid = rule.validate(input: validVisa)
21+
22+
// then
23+
XCTAssertTrue(isValid)
24+
}
25+
26+
func test_validate_visaCardInvalid_shouldReturnFalse() {
27+
// given
28+
let rule = CreditCardValidationRule(types: [.visa], error: String.error)
29+
let invalidVisa = "411111111111112"
30+
31+
// when
32+
let isValid = rule.validate(input: invalidVisa)
33+
34+
// then
35+
XCTAssertFalse(isValid)
36+
}
37+
38+
// MARK: - MasterCard
39+
40+
func test_validate_masterCardValid_shouldReturnTrue() {
41+
// given
42+
let rule = CreditCardValidationRule(types: [.masterCard], error: String.error)
43+
let validMaster = "5500000000000004"
44+
45+
// when
46+
let isValid = rule.validate(input: validMaster)
47+
48+
// then
49+
XCTAssertTrue(isValid)
50+
}
51+
52+
func test_validate_masterCardInvalid_shouldReturnFalse() {
53+
// given
54+
let rule = CreditCardValidationRule(types: [.masterCard], error: String.error)
55+
let invalidMaster = "550000000000"
56+
57+
// when
58+
let isValid = rule.validate(input: invalidMaster)
59+
60+
// then
61+
XCTAssertFalse(isValid)
62+
}
63+
64+
// MARK: - American Express
65+
66+
func test_validate_amexValid_shouldReturnTrue() {
67+
// given
68+
let rule = CreditCardValidationRule(types: [.amex], error: String.error)
69+
let validAmex = "340000000000009"
70+
71+
// when
72+
let isValid = rule.validate(input: validAmex)
73+
74+
// then
75+
XCTAssertTrue(isValid)
76+
}
77+
78+
func test_validate_amexInvalid_shouldReturnFalse() {
79+
// given
80+
let rule = CreditCardValidationRule(types: [.amex], error: String.error)
81+
let invalidAmex = "3400000000000099"
82+
83+
// when
84+
let isValid = rule.validate(input: invalidAmex)
85+
86+
// then
87+
XCTAssertFalse(isValid)
88+
}
89+
90+
// MARK: - JCB
91+
92+
func test_validate_jcbValid_shouldReturnTrue() {
93+
// given
94+
let rule = CreditCardValidationRule(types: [.jcb], error: String.error)
95+
let validJCB = "3528000000000007"
96+
97+
// when
98+
let isValid = rule.validate(input: validJCB)
99+
100+
// then
101+
XCTAssertTrue(isValid)
102+
}
103+
104+
// MARK: - UnionPay
105+
106+
func test_validate_unionPayValid_shouldReturnTrue() {
107+
// given
108+
let rule = CreditCardValidationRule(types: [.unionPay], error: String.error)
109+
let validUnionPay = "6221260000000000"
110+
111+
// when
112+
let isValid = rule.validate(input: validUnionPay)
113+
114+
// then
115+
XCTAssertTrue(isValid)
116+
}
117+
118+
// MARK: - Multiple Types
119+
120+
func test_validate_multipleTypesValid_shouldReturnTrue() {
121+
// given
122+
let rule = CreditCardValidationRule(types: [.visa, .amex, .masterCard], error: String.error)
123+
let validVisa = "4111111111111111"
124+
125+
// when
126+
let isValid = rule.validate(input: validVisa)
127+
128+
// then
129+
XCTAssertTrue(isValid)
130+
}
131+
132+
// MARK: - Unknown Card Type
133+
134+
func test_validate_unknownCardType_shouldReturnFalse() {
135+
// given
136+
let rule = CreditCardValidationRule(types: [.visa], error: String.error)
137+
let randomCard = "9999999999999999"
138+
139+
// when
140+
let isValid = rule.validate(input: randomCard)
141+
142+
// then
143+
XCTAssertFalse(isValid)
144+
}
145+
146+
// MARK: - Empty Input
147+
148+
func test_validate_emptyString_shouldReturnFalse() {
149+
// given
150+
let rule = CreditCardValidationRule(types: [.visa], error: String.error)
151+
152+
// when
153+
let isValid = rule.validate(input: "")
154+
155+
// then
156+
XCTAssertFalse(isValid)
157+
}
158+
}
159+
160+
// MARK: Constants
161+
162+
private extension String {
163+
static let error = "Invalid card number"
164+
}

0 commit comments

Comments
 (0)