Skip to content

Commit

Permalink
Merge pull request #294 from omise/fix/MIT-2552-SonarCloud-OmiseError
Browse files Browse the repository at this point in the history
Fix SonarCloud "Cognitive Complexity" warning in BadRequestReason
  • Loading branch information
Andrei Solovev authored May 31, 2024
2 parents 5e77680 + f781e62 commit e92bcac
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 26 deletions.
62 changes: 36 additions & 26 deletions OmiseSDK/Sources/Models/OmiseError.swift
Original file line number Diff line number Diff line change
Expand Up @@ -500,27 +500,9 @@ extension OmiseError.APIErrorCode.BadRequestReason: Decodable {
static let nameIsTooLong: NSRegularExpression! = try? NSRegularExpression(pattern: "name is too long \\(maximum is ([\\d]+) characters\\)", options: [])
}

// swiftlint:disable:next cyclomatic_complexity
init(message: String, currency: Currency?) throws {
if message.hasPrefix("amount must be ") {
if let lessThanValidAmountMatch = ErrorMessageRegularExpression.amountLessThanValidAmount
.firstMatch(in: message, range: NSRange(message.startIndex..<message.endIndex, in: message)),
lessThanValidAmountMatch.numberOfRanges == 2,
let amountRange = Range(lessThanValidAmountMatch.range(at: 1), in: message) {
self = .amountIsLessThanValidAmount(validAmount: Int64(message[amountRange]), currency: currency)
} else if let greaterThanValidAmountMatch = ErrorMessageRegularExpression.amountGreaterThanValidAmount
.firstMatch(in: message, range: NSRange(message.startIndex..<message.endIndex, in: message)),
greaterThanValidAmountMatch.numberOfRanges == 2,
let amountRange = Range(greaterThanValidAmountMatch.range(at: 1), in: message) {
self = .amountIsGreaterThanValidAmount(validAmount: Int64(message[amountRange]), currency: currency)
} else if let atLeastValidAmountMatch = ErrorMessageRegularExpression.amountAtLeastValidAmount
.firstMatch(in: message, range: NSRange(message.startIndex..<message.endIndex, in: message)),
atLeastValidAmountMatch.numberOfRanges == 2,
let amountRange = Range(atLeastValidAmountMatch.range(at: 1), in: message) {
self = .amountIsLessThanValidAmount(validAmount: Int64(message[amountRange]), currency: currency)
} else {
self = .other(message)
}
self = Self.processAmountMessage(message: message, currency: currency)
} else if message.contains("currency must be") {
self = .invalidCurrency
} else if message.contains("type") {
Expand All @@ -529,12 +511,8 @@ extension OmiseError.APIErrorCode.BadRequestReason: Decodable {
self = .currencyNotSupported
} else if message.contains("name") && message.contains("blank") {
self = .emptyName
} else if message.hasPrefix("name is too long"),
let lessThanValidAmountMatch = ErrorMessageRegularExpression.nameIsTooLong
.firstMatch(in: message, range: NSRange(message.startIndex..<message.endIndex, in: message)),
lessThanValidAmountMatch.numberOfRanges == 2,
let amountRange = Range(lessThanValidAmountMatch.range(at: 1), in: message) {
self = .nameIsTooLong(maximum: Int(message[amountRange]))
} else if message.hasPrefix("name is too long"), let reason = Self.processNameTooLongMessage(message: message) {
self = reason
} else if message.contains("name") {
self = .nameIsTooLong(maximum: nil)
} else if message.contains("email") {
Expand All @@ -545,7 +523,39 @@ extension OmiseError.APIErrorCode.BadRequestReason: Decodable {
self = .other(message)
}
}


private static func processAmountMessage(message: String, currency: Currency?) -> Self {
if let lessThanValidAmountMatch = ErrorMessageRegularExpression.amountLessThanValidAmount
.firstMatch(in: message, range: NSRange(message.startIndex..<message.endIndex, in: message)),
lessThanValidAmountMatch.numberOfRanges == 2,
let amountRange = Range(lessThanValidAmountMatch.range(at: 1), in: message) {
return .amountIsLessThanValidAmount(validAmount: Int64(message[amountRange]), currency: currency)
} else if let greaterThanValidAmountMatch = ErrorMessageRegularExpression.amountGreaterThanValidAmount
.firstMatch(in: message, range: NSRange(message.startIndex..<message.endIndex, in: message)),
greaterThanValidAmountMatch.numberOfRanges == 2,
let amountRange = Range(greaterThanValidAmountMatch.range(at: 1), in: message) {
return .amountIsGreaterThanValidAmount(validAmount: Int64(message[amountRange]), currency: currency)
} else if let atLeastValidAmountMatch = ErrorMessageRegularExpression.amountAtLeastValidAmount
.firstMatch(in: message, range: NSRange(message.startIndex..<message.endIndex, in: message)),
atLeastValidAmountMatch.numberOfRanges == 2,
let amountRange = Range(atLeastValidAmountMatch.range(at: 1), in: message) {
return .amountIsLessThanValidAmount(validAmount: Int64(message[amountRange]), currency: currency)
} else {
return .other(message)
}
}

private static func processNameTooLongMessage(message: String) -> Self? {
let matchRange = NSRange(message.startIndex..<message.endIndex, in: message)
guard let match = ErrorMessageRegularExpression.nameIsTooLong.firstMatch(in: message, range: matchRange),
match.numberOfRanges == 2,
let range = Range(match.range(at: 1), in: message) else {
return nil
}

return .nameIsTooLong(maximum: Int(message[range]))
}

public init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()

Expand Down
32 changes: 32 additions & 0 deletions OmiseSDKTests/OmiseErrorTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import Foundation
import XCTest
@testable import OmiseSDK

class OmiseErrorTests: XCTestCase {

func testBadRequestReason() throws {
let currencies: [Currency?] = [nil, .jpy, .myr, .thb, .usd]
for currency in currencies {
let expectedResults: [String: OmiseError.APIErrorCode.BadRequestReason] = [
"amount must be at least 500": .amountIsLessThanValidAmount(validAmount: 500, currency: currency),
"amount must be less than 500": .amountIsGreaterThanValidAmount(validAmount: 500, currency: currency),
"amount must be greater than 500": .amountIsLessThanValidAmount(validAmount: 500, currency: currency),
"name is too long (maximum is 50 characters)": .nameIsTooLong(maximum: 50),
"name is too long ... 20": .nameIsTooLong(maximum: nil), // check if it should be .invalidName instead,
"... name ... blank ...": .emptyName,
"... name ...": .nameIsTooLong(maximum: nil), // check if it should be .invalidName instead,
"... email ...": .invalidEmail,
"... phone ...": .invalidPhoneNumber,
"... type ...": .typeNotSupported,
"... currency must be...": .invalidCurrency,
"... currency ...": .currencyNotSupported,
"Something else": .other("Something else")
]

for (testString, expectedResult) in expectedResults {
let result = try OmiseError.APIErrorCode.BadRequestReason(message: testString, currency: currency)
XCTAssertEqual(result, expectedResult)
}
}
}
}
4 changes: 4 additions & 0 deletions dev.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,7 @@
75D13E1D2B86FF8C0073A831 /* CreditCardPaymentDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75D13E1C2B86FF8C0073A831 /* CreditCardPaymentDelegate.swift */; };
75D13E202B8703F80073A831 /* CreditCardPaymentController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75D13E1E2B8703F70073A831 /* CreditCardPaymentController.swift */; };
75D13E212B8703F80073A831 /* CreditCardPaymentController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 75D13E1F2B8703F80073A831 /* CreditCardPaymentController.xib */; };
75D4E7062C05F50500ECCE72 /* OmiseErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75D4E7052C05F50500ECCE72 /* OmiseErrorTests.swift */; };
75DAD8902A0BB8D80098AF96 /* LocalConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75DAD88F2A0BB8D80098AF96 /* LocalConfig.swift */; };
75E0EB712B7A904100E3198A /* SourceFlowTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E0EB702B7A904100E3198A /* SourceFlowTests.swift */; };
75E0EB722B7A962600E3198A /* CreateSourcePayloadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B4208D2B78C2120036134D /* CreateSourcePayloadTests.swift */; };
Expand Down Expand Up @@ -435,6 +436,7 @@
75D13E1C2B86FF8C0073A831 /* CreditCardPaymentDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreditCardPaymentDelegate.swift; sourceTree = "<group>"; };
75D13E1E2B8703F70073A831 /* CreditCardPaymentController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreditCardPaymentController.swift; sourceTree = "<group>"; };
75D13E1F2B8703F80073A831 /* CreditCardPaymentController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CreditCardPaymentController.xib; sourceTree = "<group>"; };
75D4E7052C05F50500ECCE72 /* OmiseErrorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OmiseErrorTests.swift; sourceTree = "<group>"; };
75DAD88F2A0BB8D80098AF96 /* LocalConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalConfig.swift; sourceTree = "<group>"; };
75DAD8922A0BC9540098AF96 /* Config.local.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Config.local.plist; sourceTree = "<group>"; };
75E0EB702B7A904100E3198A /* SourceFlowTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceFlowTests.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1213,6 +1215,7 @@
75CFC4D32B73B21100422A8F /* ClientTests.swift */,
750708F32B7A765500A48DD0 /* OmiseSDKTests.swift */,
75F8C0B62B1F78E300AE78D9 /* PaymentChooserViewControllerTests.swift */,
75D4E7052C05F50500ECCE72 /* OmiseErrorTests.swift */,
);
path = OmiseSDKTests;
sourceTree = "<group>";
Expand Down Expand Up @@ -1691,6 +1694,7 @@
7509D4E72A1C8E3D0050AB38 /* AtomeFormViewModelTests.swift in Sources */,
7509D4E22A1C876B0050AB38 /* AtomeFormViewContextMockup.swift in Sources */,
750708E32B790B8300A48DD0 /* String+JSON.swift in Sources */,
75D4E7062C05F50500ECCE72 /* OmiseErrorTests.swift in Sources */,
750708E52B790BD600A48DD0 /* SampleData.swift in Sources */,
758A4E972BE38AFD005E7B5A /* SHA512Tests.swift in Sources */,
750708E02B7909BB00A48DD0 /* SourceTests.swift in Sources */,
Expand Down

0 comments on commit e92bcac

Please sign in to comment.