Skip to content

Commit 6bdd19a

Browse files
committed
Throw Error when serializing non dictionary deepObject values
1 parent 9b5e8b5 commit 6bdd19a

File tree

4 files changed

+48
-11
lines changed

4 files changed

+48
-11
lines changed

Sources/OpenAPIRuntime/URICoder/Parsing/URIParser.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ struct URIParser: Sendable {
3939
typealias Raw = String.SubSequence
4040

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

4444
/// A malformed key-value pair was detected.
4545
case malformedKeyValuePair(Raw)

Sources/OpenAPIRuntime/URICoder/Serialization/URISerializer.swift

+5-2
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,17 @@ extension CharacterSet {
6565
extension URISerializer {
6666

6767
/// A serializer error.
68-
enum SerializationError: Swift.Error, Equatable {
68+
enum SerializationError: Swift.Error, Hashable {
6969

7070
/// Nested containers are not supported.
7171
case nestedContainersNotSupported
7272

7373
/// Deep object arrays are not supported.
7474
case deepObjectsArrayNotSupported
7575

76+
/// Deep object with primitive values are not supported.
77+
case deepObjectsWithPrimitiveValuesNotSupported
78+
7679
/// An invalid configuration was detected.
7780
case invalidConfiguration(String)
7881
}
@@ -123,7 +126,7 @@ extension URISerializer {
123126
switch configuration.style {
124127
case .form: keyAndValueSeparator = "="
125128
case .simple: keyAndValueSeparator = nil
126-
case .deepObject: keyAndValueSeparator = "="
129+
case .deepObject: throw SerializationError.deepObjectsWithPrimitiveValuesNotSupported
127130
}
128131
try serializePrimitiveKeyValuePair(primitive, forKey: key, separator: keyAndValueSeparator)
129132
case .array(let array): try serializeArray(array.map(unwrapPrimitiveValue), forKey: key)

Tests/OpenAPIRuntimeTests/URICoder/Parsing/Test_URIParser.swift

+9-1
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,15 @@ final class Test_URIParser: Test_Runtime {
121121
)
122122
} catch {
123123
guard let expectedError = input.expectedError,
124-
let serializationError = error as? ParsingError else { throw error }
124+
let serializationError = error as? ParsingError else {
125+
XCTAssert(
126+
false,
127+
"Unexpected error thrown: \(error)",
128+
file: testCase.file,
129+
line: testCase.line
130+
)
131+
return
132+
}
125133
XCTAssertEqual(
126134
expectedError,
127135
serializationError,

Tests/OpenAPIRuntimeTests/URICoder/Serialization/Test_URISerializer.swift

+33-7
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@ final class Test_URISerializer: Test_Runtime {
3232
simpleUnexplode: "",
3333
formDataExplode: "empty=",
3434
formDataUnexplode: "empty=",
35-
deepObjectExplode: "empty="
35+
deepObjectExplode: .custom(
36+
"empty=",
37+
expectedError: .deepObjectsWithPrimitiveValuesNotSupported
38+
)
3639
)
3740
),
3841
makeCase(
@@ -45,7 +48,10 @@ final class Test_URISerializer: Test_Runtime {
4548
simpleUnexplode: "fred",
4649
formDataExplode: "who=fred",
4750
formDataUnexplode: "who=fred",
48-
deepObjectExplode: "who=fred"
51+
deepObjectExplode: .custom(
52+
"who=fred",
53+
expectedError: .deepObjectsWithPrimitiveValuesNotSupported
54+
)
4955
)
5056
),
5157
makeCase(
@@ -58,7 +64,10 @@ final class Test_URISerializer: Test_Runtime {
5864
simpleUnexplode: "1234",
5965
formDataExplode: "x=1234",
6066
formDataUnexplode: "x=1234",
61-
deepObjectExplode: "x=1234"
67+
deepObjectExplode: .custom(
68+
"x=1234",
69+
expectedError: .deepObjectsWithPrimitiveValuesNotSupported
70+
)
6271
)
6372
),
6473
makeCase(
@@ -71,7 +80,10 @@ final class Test_URISerializer: Test_Runtime {
7180
simpleUnexplode: "12.34",
7281
formDataExplode: "x=12.34",
7382
formDataUnexplode: "x=12.34",
74-
deepObjectExplode: "x=12.34"
83+
deepObjectExplode: .custom(
84+
"x=12.34",
85+
expectedError: .deepObjectsWithPrimitiveValuesNotSupported
86+
)
7587
)
7688
),
7789
makeCase(
@@ -84,7 +96,10 @@ final class Test_URISerializer: Test_Runtime {
8496
simpleUnexplode: "true",
8597
formDataExplode: "enabled=true",
8698
formDataUnexplode: "enabled=true",
87-
deepObjectExplode: "enabled=true"
99+
deepObjectExplode: .custom(
100+
"enabled=true",
101+
expectedError: .deepObjectsWithPrimitiveValuesNotSupported
102+
)
88103
)
89104
),
90105
makeCase(
@@ -97,7 +112,10 @@ final class Test_URISerializer: Test_Runtime {
97112
simpleUnexplode: "Hello%20World",
98113
formDataExplode: "hello=Hello+World",
99114
formDataUnexplode: "hello=Hello+World",
100-
deepObjectExplode: "hello=Hello%20World"
115+
deepObjectExplode: .custom(
116+
"hello=Hello%20World",
117+
expectedError: .deepObjectsWithPrimitiveValuesNotSupported
118+
)
101119
)
102120
),
103121
makeCase(
@@ -147,7 +165,15 @@ final class Test_URISerializer: Test_Runtime {
147165
)
148166
} catch {
149167
guard let expectedError = input.expectedError,
150-
let serializationError = error as? URISerializer.SerializationError else { throw error }
168+
let serializationError = error as? URISerializer.SerializationError else {
169+
XCTAssert(
170+
false,
171+
"Unexpected error thrown: \(error)",
172+
file: testCase.file,
173+
line: testCase.line
174+
)
175+
return
176+
}
151177
XCTAssertEqual(
152178
expectedError,
153179
serializationError,

0 commit comments

Comments
 (0)