Skip to content

Commit a47d430

Browse files
authored
fix: wrong parsing datafile for segments if defined as pure string (#61)
1 parent 828e9a7 commit a47d430

File tree

3 files changed

+85
-3
lines changed

3 files changed

+85
-3
lines changed

Sources/FeaturevisorTypes/Extensions/KeyedDecodingContainer+GroupSegment.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ extension KeyedDecodingContainer {
3232
throw DecodingError.dataCorrupted(context)
3333
}
3434

35+
guard
36+
let _ = try? JSONSerialization.jsonObject(with: data, options: .allowFragments)
37+
else {
38+
return .plain(stringifiedGroupSegment)
39+
}
40+
3541
return try JSONDecoder().decode(GroupSegment.self, from: data)
3642
}
3743
}

Tests/FeaturevisorTypesTests/FeaturevisorTypesTests.swift

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ final class FeaturevisorTypesTests: XCTestCase {
2020
// THEN
2121
XCTAssertEqual(result.revision, "0.0.13")
2222
XCTAssertEqual(result.schemaVersion, "1")
23-
XCTAssertEqual(result.attributes.count, 3)
24-
XCTAssertEqual(result.features.count, 2)
25-
XCTAssertEqual(result.segments.count, 1)
23+
XCTAssertEqual(result.attributes.count, 4)
24+
XCTAssertEqual(result.features.count, 3)
25+
XCTAssertEqual(result.segments.count, 3)
2626

2727
let segment = result.segments[0]
2828
XCTAssertEqual(segment.key, "myAccount")
@@ -199,6 +199,35 @@ final class FeaturevisorTypesTests: XCTestCase {
199199
XCTAssertNil(traffic22.variables)
200200
XCTAssertEqual(traffic22.allocation.count, 0)
201201

202+
let feature3 = result.features[2]
203+
XCTAssertEqual(feature3.key, "f_safe_mode_gcp")
204+
XCTAssertNil(feature3.deprecated)
205+
XCTAssertEqual(feature3.bucketBy, .single("userId"))
206+
XCTAssertEqual(feature3.ranges.count, 0)
207+
XCTAssertEqual(feature3.variations.count, 0)
208+
XCTAssertEqual(feature3.traffic.count, 2)
209+
210+
let traffic31 = feature3.traffic[0]
211+
XCTAssertEqual(traffic31.key, "0")
212+
XCTAssertNil(traffic31.enabled)
213+
XCTAssertEqual(traffic31.percentage, 100000)
214+
XCTAssertEqual(traffic31.variation, nil)
215+
XCTAssertEqual(
216+
traffic31.segments,
217+
.multiple([.or(.init(or: [.plain("OsIOS"), .plain("OsAndroid"), .plain("OsTvOS")]))])
218+
)
219+
XCTAssertEqual(traffic31.variables?.count, 1)
220+
XCTAssertEqual(traffic31.allocation.count, 0)
221+
222+
let traffic32 = feature3.traffic[1]
223+
XCTAssertEqual(traffic32.key, "1")
224+
XCTAssertNil(traffic32.enabled)
225+
XCTAssertEqual(traffic32.percentage, 100000)
226+
XCTAssertEqual(traffic32.variation, nil)
227+
XCTAssertEqual(traffic32.segments, .plain("PlatformWeb"))
228+
XCTAssertEqual(traffic32.variables?.count, 1)
229+
XCTAssertEqual(traffic32.allocation.count, 0)
230+
202231
let attribute1 = result.attributes[0]
203232
XCTAssertEqual(attribute1.key, "chapter")
204233
XCTAssertNil(attribute1.archived)

Tests/FeaturevisorTypesTests/JSONs/DatafileContentValidResponse.json

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,24 @@
1515
"key": "userId",
1616
"type": "string",
1717
"capture": true
18+
},
19+
{
20+
"key": "device_os",
21+
"type": "string"
1822
}
1923
],
2024
"segments": [
2125
{
2226
"key": "myAccount",
2327
"conditions": "[{\"attribute\":\"chapter\",\"operator\":\"equals\",\"value\":\"account\"}]"
28+
},
29+
{
30+
"key": "OsIOS",
31+
"conditions": "[{\"attribute\":\"device_os\",\"operator\":\"in\",\"value\":[\"iOS\",\"iPadOS\"]}]"
32+
},
33+
{
34+
"key": "OsTvOS",
35+
"conditions": "[{\"attribute\":\"device_os\",\"operator\":\"equals\",\"value\":\"tvOS\"}]"
2436
}
2537
],
2638
"features": [
@@ -160,6 +172,41 @@
160172
]
161173
}
162174
]
175+
},
176+
{
177+
"key": "f_safe_mode_gcp",
178+
"bucketBy": "userId",
179+
"traffic": [
180+
{
181+
"key": "0",
182+
"segments": "[{\"or\":[\"OsIOS\",\"OsAndroid\",\"OsTvOS\"]}]",
183+
"percentage": 100000,
184+
"allocation": [
185+
186+
],
187+
"variables": {
188+
"version": 4
189+
}
190+
},
191+
{
192+
"key": "1",
193+
"segments": "PlatformWeb",
194+
"percentage": 100000,
195+
"allocation": [
196+
197+
],
198+
"variables": {
199+
"version": 1
200+
}
201+
}
202+
],
203+
"variablesSchema": [
204+
{
205+
"key": "version",
206+
"type": "integer",
207+
"defaultValue": 1
208+
}
209+
]
163210
}
164211
]
165212
}

0 commit comments

Comments
 (0)