Skip to content

Commit ee7300c

Browse files
authored
[CSL-2581] Add refined content to browse (#178)
1 parent d139677 commit ee7300c

File tree

5 files changed

+107
-1
lines changed

5 files changed

+107
-1
lines changed

AutocompleteClient/FW/API/Parser/Browse/BrowseResponseParser.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class BrowseResponseParser: AbstractBrowseResponseParser {
2222
let resultsObj: [JSONObject]? = response["results"] as? [JSONObject]
2323
let sortOptionsObj: [JSONObject]? = response["sort_options"] as? [JSONObject]
2424
let groupsObj = response["groups"] as? [JSONObject]
25+
let refinedContentObj = response["refined_content"] as? [JSONObject]
2526

2627
let facets: [CIOFilterFacet] = (facetsObj)?.compactMap { obj in return CIOFilterFacet(json: obj) } ?? []
2728
let results: [CIOResult] = (resultsObj)?.compactMap { obj in return CIOResult(json: obj) } ?? []
@@ -31,6 +32,7 @@ class BrowseResponseParser: AbstractBrowseResponseParser {
3132
let collection: CIOCollectionData? = CIOCollectionData(json: response["collection"] as? JSONObject)
3233
let resultID = json?["result_id"] as? String ?? ""
3334
let resultSources: CIOResultSources? = CIOResultSources(json: response["result_sources"] as? JSONObject)
35+
let refinedContent: [CIORefinedContent] = refinedContentObj?.compactMap({ obj in return CIORefinedContent(json: obj) }) ?? []
3436

3537
guard let request: JSONObject = json?["request"] as? JSONObject else {
3638
throw CIOError(errorType: .invalidResponse)
@@ -44,6 +46,7 @@ class BrowseResponseParser: AbstractBrowseResponseParser {
4446
totalNumResults: totalNumResults,
4547
resultID: resultID,
4648
collection: collection,
49+
refinedContent: refinedContent,
4750
resultSources: resultSources,
4851
request: request
4952
)

AutocompleteClient/FW/Logic/Result/Responses/CIOBrowseResponse.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ public struct CIOBrowseResponse {
4747
*/
4848
public let collection: CIOCollectionData?
4949

50+
/**
51+
A list of refined content
52+
*/
53+
public let refinedContent: [CIORefinedContent]
54+
5055
/**
5156
Sources of the result set
5257
*/

AutocompleteClientTests/FW/API/Parser/BrowseResponseParserTest.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,24 @@ class BrowseResponseParserTests: XCTestCase {
5353
XCTFail("Parse should never throw an exception when a valid JSON string is passed.")
5454
}
5555
}
56+
57+
func testBrowseParser_ParsingJSONString_ParsesRefinedContent() {
58+
let data = TestResource.load(name: TestResource.Response.browseJSONFilename)
59+
do {
60+
let response = try self.parser.parse(browseResponseData: data)
61+
let refinedContentData = response.refinedContent.first!.data
62+
63+
XCTAssertNotNil(refinedContentData["header"], "Valid header should be correctly parsed")
64+
XCTAssertNotNil(refinedContentData["body"], "Valid body should be correctly parsed")
65+
XCTAssertNotNil(refinedContentData["altText"], "Valid altText should be correctly parsed")
66+
XCTAssertNotNil(refinedContentData["assetUrl"], "Valid assetUrl should be correctly parsed")
67+
XCTAssertNotNil(refinedContentData["mobileAssetUrl"], "Valid mobileAssetUrl should be correctly parsed")
68+
XCTAssertNotNil(refinedContentData["mobileAssetAltText"], "Valid mobileAssetAltText should be correctly parsed")
69+
XCTAssertNotNil(refinedContentData["ctaLink"], "Valid ctaLink should be correctly parsed")
70+
XCTAssertNotNil(refinedContentData["ctaText"], "Valid ctaText should be correctly parsed")
71+
72+
} catch {
73+
XCTFail("Parse should never throw an exception when a valid JSON string is passed.")
74+
}
75+
}
5676
}

AutocompleteClientTests/FW/Logic/Worker/ConstructorIOIntegrationTests.swift

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -942,6 +942,62 @@ class ConstructorIOIntegrationTests: XCTestCase {
942942
self.wait(for: expectation)
943943
}
944944

945+
func testBrowse_ShouldReturnRefinedContent() {
946+
let constructorClient = ConstructorIO(config: ConstructorIOConfig(apiKey: testACKey))
947+
let expectation = XCTestExpectation(description: "Request 204")
948+
let query = CIOBrowseQuery(filterName: groupFilterName, filterValue: groupFilterValue)
949+
constructorClient.browse(forQuery: query, completionHandler: { response in
950+
let cioError = response.error as? CIOError
951+
let responseData = response.data!
952+
let refinedContent = responseData.refinedContent[0]
953+
let refinedContentData = refinedContent.data
954+
let header = refinedContentData["header"] as? String
955+
let body = refinedContentData["body"] as? String
956+
let altText = refinedContentData["altText"] as? String
957+
let assetUrl = refinedContentData["assetUrl"] as? String
958+
let mobileAssetUrl = refinedContentData["mobileAssetUrl"] as? String
959+
let mobileAssetAltText = refinedContentData["mobileAssetAltText"] as? String
960+
let ctaLink = refinedContentData["ctaLink"] as? String
961+
let ctaText = refinedContentData["ctaText"] as? String
962+
963+
XCTAssertNil(cioError)
964+
XCTAssertNotNil(refinedContent)
965+
XCTAssertEqual(header, "Content 1 Header")
966+
XCTAssertEqual(body, "Content 1 Body")
967+
XCTAssertEqual(altText, "Content 1 desktop alt text")
968+
XCTAssertEqual(assetUrl, "https://constructor.io/wp-content/uploads/2022/09/groceryshop-2022-r2.png")
969+
XCTAssertEqual(mobileAssetUrl, "https://constructor.io/wp-content/uploads/2022/09/groceryshop-2022-r2.png")
970+
XCTAssertEqual(mobileAssetAltText, "Content 1 mobile alt text")
971+
XCTAssertEqual(ctaLink, "https://constructor.io/wp-content/uploads/2022/09/groceryshop-2022-r2.png")
972+
XCTAssertEqual(ctaText, "Content 1 CTA Button")
973+
expectation.fulfill()
974+
})
975+
self.wait(for: expectation)
976+
}
977+
978+
func testBrowse_ShouldReturnRefinedContentWithArtbitraryData() {
979+
let constructorClient = ConstructorIO(config: ConstructorIOConfig(apiKey: testACKey))
980+
let expectation = XCTestExpectation(description: "Request 204")
981+
let query = CIOBrowseQuery(filterName: groupFilterName, filterValue: groupFilterValue)
982+
constructorClient.browse(forQuery: query, completionHandler: { response in
983+
let cioError = response.error as? CIOError
984+
let responseData = response.data!
985+
let refinedContent = responseData.refinedContent[2]
986+
let refinedContentData = refinedContent.data
987+
let tag1Value = refinedContentData["tag-1"] as? String
988+
let tag2Value = refinedContentData["tag-2"] as? String
989+
let arbitraryDataObject = refinedContentData["arbitraryDataObject"] as? [String: String] ?? [:]
990+
991+
XCTAssertNil(cioError)
992+
XCTAssertNotNil(refinedContent)
993+
XCTAssertEqual(tag1Value, "tag-1-value")
994+
XCTAssertEqual(tag2Value, "tag-2-value")
995+
XCTAssertEqual(arbitraryDataObject["pizza"], "pie")
996+
expectation.fulfill()
997+
})
998+
self.wait(for: expectation)
999+
}
1000+
9451001
func testBrowseItems() {
9461002
let expectation = XCTestExpectation(description: "Request 204")
9471003
let query = CIOBrowseItemsQuery(ids: itemIds)

AutocompleteClientTests/Resources/response_browse_json.json

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,29 @@
242242
"status": "selected"
243243
}
244244
],
245-
"refined_content": [],
245+
"refined_content": [{
246+
"data": {
247+
"body": "Content 1 Body",
248+
"header": "Content 1 Header",
249+
"altText": "Content 1 desktop alt text",
250+
"ctaLink": "https://constructor.io/wp-content/uploads/2022/09/groceryshop-2022-r2.png",
251+
"ctaText": "Content 1 CTA Button",
252+
"assetUrl": "https://constructor.io/wp-content/uploads/2022/09/groceryshop-2022-r2.png",
253+
"mobileAssetUrl": "https://constructor.io/wp-content/uploads/2022/09/groceryshop-2022-r2.png",
254+
"mobileAssetAltText": "Content 1 mobile alt text"
255+
}
256+
}, {
257+
"data": {
258+
"body": "Content 2 Body",
259+
"header": "Content 2 Header",
260+
"altText": "Content 2 desktop alt text",
261+
"ctaLink": "https://constructor.io/wp-content/uploads/2022/04/Dont-just-trust-the-AI-1.png",
262+
"ctaText": "Content 2 Button",
263+
"assetUrl": "https://constructor.io/wp-content/uploads/2022/04/Dont-just-trust-the-AI-1.png",
264+
"mobileAssetUrl": "https://constructor.io/wp-content/uploads/2022/04/Dont-just-trust-the-AI-1.png",
265+
"mobileAssetAltText": "Content 2 mobile alt text"
266+
}
267+
}],
246268
"total_num_results": 3,
247269
"features": [
248270
{

0 commit comments

Comments
 (0)