Skip to content

Commit 9b5e8b5

Browse files
committed
Add support of error testing in URIParser
1 parent 74af537 commit 9b5e8b5

File tree

2 files changed

+41
-14
lines changed

2 files changed

+41
-14
lines changed

Sources/OpenAPIRuntime/URICoder/Parsing/URIParser.swift

+8-3
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ struct URIParser: Sendable {
3636
}
3737

3838
/// A typealias for the underlying raw string storage.
39-
private typealias Raw = String.SubSequence
39+
typealias Raw = String.SubSequence
4040

4141
/// A parser error.
42-
private enum ParsingError: Swift.Error {
42+
enum ParsingError: Swift.Error, Equatable {
4343

4444
/// A malformed key-value pair was detected.
4545
case malformedKeyValuePair(Raw)
@@ -219,7 +219,7 @@ extension URIParser {
219219
/// - Returns: The parsed root node.
220220
/// - Throws: An error if parsing fails.
221221
private mutating func parseExplodedDeepObjectRoot() throws -> URIParsedNode {
222-
try parseGenericRoot { data, appendPair in
222+
let parseNode = try parseGenericRoot { data, appendPair in
223223
let keyValueSeparator: Character = "="
224224
let pairSeparator: Character = "&"
225225
let nestedKeyStartingCharacter: Character = "["
@@ -249,6 +249,11 @@ extension URIParser {
249249
appendPair(key, [value])
250250
}
251251
}
252+
253+
try parseNode.forEach { (key, value) in
254+
if value.count > 1 { throw ParsingError.malformedKeyValuePair(key) }
255+
}
256+
return parseNode
252257
}
253258
}
254259

Tests/OpenAPIRuntimeTests/URICoder/Parsing/Test_URIParser.swift

+33-11
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,10 @@ final class Test_URIParser: Test_Runtime {
7878
simpleUnexplode: .custom("red,green,blue", value: ["": ["red", "green", "blue"]]),
7979
formDataExplode: "list=red&list=green&list=blue",
8080
formDataUnexplode: "list=red,green,blue",
81-
deepObjectExplode: .custom("object%5Blist%5D=red&object%5Blist%5D=green&object%5Blist%5D=blue", value: [:])
81+
deepObjectExplode: .custom(
82+
"object%5Blist%5D=red&object%5Blist%5D=green&object%5Blist%5D=blue",
83+
expectedError: .malformedKeyValuePair("list")
84+
)
8285
),
8386
value: ["list": ["red", "green", "blue"]]
8487
),
@@ -107,14 +110,26 @@ final class Test_URIParser: Test_Runtime {
107110
for testCase in cases {
108111
func testVariant(_ variant: Case.Variant, _ input: Case.Variants.Input) throws {
109112
var parser = URIParser(configuration: variant.config, data: input.string[...])
110-
let parsedNode = try parser.parseRoot()
111-
XCTAssertEqual(
112-
parsedNode,
113-
input.valueOverride ?? testCase.value,
114-
"Failed for config: \(variant.name)",
115-
file: testCase.file,
116-
line: testCase.line
117-
)
113+
do {
114+
let parsedNode = try parser.parseRoot()
115+
XCTAssertEqual(
116+
parsedNode,
117+
input.valueOverride ?? testCase.value,
118+
"Failed for config: \(variant.name)",
119+
file: testCase.file,
120+
line: testCase.line
121+
)
122+
} catch {
123+
guard let expectedError = input.expectedError,
124+
let serializationError = error as? ParsingError else { throw error }
125+
XCTAssertEqual(
126+
expectedError,
127+
serializationError,
128+
"Failed for config: \(variant.name)",
129+
file: testCase.file,
130+
line: testCase.line
131+
)
132+
}
118133
}
119134
let variants = testCase.variants
120135
try testVariant(.formExplode, variants.formExplode)
@@ -147,19 +162,26 @@ extension Test_URIParser {
147162
struct Input: ExpressibleByStringLiteral {
148163
var string: String
149164
var valueOverride: URIParsedNode?
165+
var expectedError: ParsingError?
150166

151-
init(string: String, valueOverride: URIParsedNode? = nil) {
167+
init(string: String, valueOverride: URIParsedNode? = nil, expectedError: ParsingError? = nil) {
152168
self.string = string
153169
self.valueOverride = valueOverride
170+
self.expectedError = expectedError
154171
}
155172

156173
static func custom(_ string: String, value: URIParsedNode) -> Self {
157-
.init(string: string, valueOverride: value)
174+
.init(string: string, valueOverride: value, expectedError: nil)
175+
}
176+
177+
static func custom(_ string: String, expectedError: ParsingError) -> Self {
178+
.init(string: string, valueOverride: nil, expectedError: expectedError)
158179
}
159180

160181
init(stringLiteral value: String) {
161182
self.string = value
162183
self.valueOverride = nil
184+
self.expectedError = nil
163185
}
164186
}
165187

0 commit comments

Comments
 (0)