Skip to content

Commit a63b346

Browse files
authored
[CSL 395] Add Filtering to Autocomplete Requests (#119)
* Add filters to autocomplete request query builder and add tests * Add/update integration tests
1 parent ead6005 commit a63b346

File tree

4 files changed

+127
-8
lines changed

4 files changed

+127
-8
lines changed

AutocompleteClient/FW/Logic/Request/CIOAutocompleteQuery.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ public struct CIOAutocompleteQuery: CIORequestData {
2727
*/
2828
let numResultsForSection: [String: Int]?
2929

30+
/**
31+
The filters used to refine results
32+
*/
33+
let filters: CIOQueryFilters?
34+
3035
func url(with baseURL: String) -> String {
3136
return String(format: Constants.AutocompleteQuery.format, baseURL, query)
3237
}
@@ -38,20 +43,24 @@ public struct CIOAutocompleteQuery: CIORequestData {
3843
- query: User typed query to return results for
3944
- numResults: The number of results to return
4045
- numresultsForSection: The section to return results from
46+
- filters: The filters used to refine results
4147

4248
### Usage Example: ###
4349
```
4450
let autocompleteQuery = CIOAutocompleteQuery(query: "apple", numResults: 5, numResultsForSection: ["Products": 6, "Search Suggestions": 8])
4551
```
4652
*/
47-
public init(query: String, numResults: Int? = nil, numResultsForSection: [String: Int]? = nil) {
53+
public init(query: String, filters: CIOQueryFilters? = nil, numResults: Int? = nil, numResultsForSection: [String: Int]? = nil) {
4854
self.query = query.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed)!
4955
self.numResults = numResults
5056
self.numResultsForSection = numResultsForSection
57+
self.filters = filters
5158
}
5259

5360
func decorateRequest(requestBuilder: RequestBuilder) {
5461
requestBuilder.set(numResults: self.numResults)
5562
requestBuilder.set(numResultsForSection: self.numResultsForSection)
63+
requestBuilder.set(groupFilter: self.filters?.groupFilter)
64+
requestBuilder.set(facetFilters: self.filters?.facetFilters)
5665
}
5766
}

AutocompleteClientTests/FW/Logic/Request/AutocompleteQueryRequestBuilderTests.swift

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,4 +98,36 @@ class AutocompleteQueryRequestBuilderTests: XCTestCase {
9898
let url = request.url!.absoluteString
9999
XCTAssertTrue(url.hasPrefix("\(customBaseURL)/autocomplete/\(endodedQuery)?"))
100100
}
101+
102+
func testAutocompleteQueryBuilder_WithAGroupFilter() {
103+
let facetFilters = [
104+
(key: "Nutrition", value: "Organic")
105+
]
106+
let queryFilters = CIOQueryFilters(groupFilter: nil, facetFilters: facetFilters)
107+
let query = CIOAutocompleteQuery(query: self.query, filters: queryFilters, numResults: 20)
108+
builder.build(trackData: query)
109+
let request = builder.getRequest()
110+
let url = request.url!.absoluteString
111+
XCTAssertTrue(url.hasPrefix("https://ac.cnstrc.com/autocomplete/\(endodedQuery)?"))
112+
print(url)
113+
XCTAssertTrue(url.contains("filters%5BNutrition%5D=Organic"), "URL should contain the Nutrition facet filter.")
114+
XCTAssertTrue(url.contains("num_results=20"), "URL should contain the num_results URL parameter.")
115+
XCTAssertTrue(url.contains("c=cioios-"), "URL should contain the version string.")
116+
XCTAssertTrue(url.contains("key=\(testACKey)"), "URL should contain api key.")
117+
XCTAssertEqual(request.httpMethod, "GET")
118+
}
119+
120+
func testAutocompleteQueryBuilder_WithAFacetFilter() {
121+
let queryFilters = CIOQueryFilters(groupFilter: "101", facetFilters: nil)
122+
let query = CIOAutocompleteQuery(query: self.query, filters: queryFilters, numResults: 20)
123+
builder.build(trackData: query)
124+
let request = builder.getRequest()
125+
let url = request.url!.absoluteString
126+
XCTAssertTrue(url.hasPrefix("https://ac.cnstrc.com/autocomplete/\(endodedQuery)?"))
127+
XCTAssertTrue(url.contains("filters%5Bgroup_id%5D=101"), "URL should contain the group filter.")
128+
XCTAssertTrue(url.contains("num_results=20"), "URL should contain the num_results URL parameter.")
129+
XCTAssertTrue(url.contains("c=cioios-"), "URL should contain the version string.")
130+
XCTAssertTrue(url.contains("key=\(testACKey)"), "URL should contain api key.")
131+
XCTAssertEqual(request.httpMethod, "GET")
132+
}
101133
}

AutocompleteClientTests/FW/Logic/Worker/ConstructorIOAutocompleteTests.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class ConstructorIOAutocompleteTests: XCTestCase {
2525
let builder = CIOBuilder(expectation: "Calling Autocomplete with 200 should return a response", builder: http(200))
2626
stub(regex("https://ac.cnstrc.com/autocomplete/a%20term?_dt=\(kRegexTimestamp)&c=\(kRegexVersion)&i=\(kRegexClientID)&key=\(kRegexAutocompleteKey)&s=\(kRegexSession)"), builder.create())
2727

28-
self.constructor.autocomplete(forQuery: query) { (_) in }
28+
self.constructor.autocomplete(forQuery: query) { _ in }
2929
self.wait(for: builder.expectation)
3030
}
3131

@@ -36,7 +36,7 @@ class ConstructorIOAutocompleteTests: XCTestCase {
3636

3737
stub(regex("https://ac.cnstrc.com/autocomplete/a%20term?_dt=\(kRegexTimestamp)&c=\(kRegexVersion)&i=\(kRegexClientID)&key=\(kRegexAutocompleteKey)&s=\(kRegexSession)"), noConnectivity())
3838

39-
self.constructor.autocomplete(forQuery: query) { (response) in
39+
self.constructor.autocomplete(forQuery: query) { response in
4040
if let error = response.error as? CIOError {
4141
XCTAssertEqual(error, CIOError.noConnection, "Returned error from network client should be type CIOError.noConnection.")
4242
expectation.fulfill()
@@ -52,7 +52,7 @@ class ConstructorIOAutocompleteTests: XCTestCase {
5252

5353
stub(regex("https://ac.cnstrc.com/autocomplete/a%20term?_dt=\(kRegexTimestamp)&c=\(kRegexVersion)&i=\(kRegexClientID)&key=\(kRegexAutocompleteKey)&s=\(kRegexSession)"), http(400))
5454

55-
self.constructor.autocomplete(forQuery: query) { (response) in
55+
self.constructor.autocomplete(forQuery: query) { response in
5656
if let error = response.error as? CIOError {
5757
XCTAssertEqual(error, CIOError.badRequest, "Returned error from network client should be type CIOError.badRequest.")
5858
expectation.fulfill()
@@ -68,7 +68,7 @@ class ConstructorIOAutocompleteTests: XCTestCase {
6868

6969
stub(regex("https://ac.cnstrc.com/autocomplete/a%20term?_dt=\(kRegexTimestamp)&c=\(kRegexVersion)&i=\(kRegexClientID)&key=\(kRegexAutocompleteKey)&s=\(kRegexSession)"), http(500))
7070

71-
self.constructor.autocomplete(forQuery: query) { (response) in
71+
self.constructor.autocomplete(forQuery: query) { response in
7272
if let error = response.error as? CIOError {
7373
XCTAssertEqual(error, CIOError.internalServerError, "Returned error from network client should be type CIOError, internalServerError.")
7474
expectation.fulfill()

AutocompleteClientTests/FW/Logic/Worker/ConstructorIOIntegrationTests.swift

Lines changed: 81 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ class ConstructorIOIntegrationTests: XCTestCase {
8787

8888
func testSearchResultClick() {
8989
let expectation = XCTestExpectation(description: "Tracking 204")
90-
let request = self.constructor.trackSearchResultClick(itemName: itemName, customerID: customerID, searchTerm: searchTerm, sectionName: sectionName, resultID: nil, completionHandler: { response in
90+
self.constructor.trackSearchResultClick(itemName: itemName, customerID: customerID, searchTerm: searchTerm, sectionName: sectionName, resultID: nil, completionHandler: { response in
9191
let cioError = response.error as? CIOError
9292
XCTAssertNil(cioError)
9393
expectation.fulfill()
@@ -97,7 +97,7 @@ class ConstructorIOIntegrationTests: XCTestCase {
9797

9898
func testBrowseResultsLoaded() {
9999
let expectation = XCTestExpectation(description: "Tracking 204")
100-
var request = self.constructor.trackBrowseResultsLoaded(filterName: filterName, filterValue: filterValue, resultCount: resultCount, resultID: nil, completionHandler: { response in
100+
self.constructor.trackBrowseResultsLoaded(filterName: filterName, filterValue: filterValue, resultCount: resultCount, resultID: nil, completionHandler: { response in
101101
let cioError = response.error as? CIOError
102102
XCTAssertNil(cioError)
103103
expectation.fulfill()
@@ -156,7 +156,7 @@ class ConstructorIOIntegrationTests: XCTestCase {
156156
}
157157

158158
func testRecommendations() {
159-
let expectation = XCTestExpectation(description: "Request 200")
159+
let expectation = XCTestExpectation(description: "Request 204")
160160
let query = CIORecommendationsQuery(podID: podID, itemID: customerID, section: sectionName)
161161
self.constructor.recommendations(forQuery: query, completionHandler: { response in
162162
let cioError = response.error as? CIOError
@@ -170,4 +170,82 @@ class ConstructorIOIntegrationTests: XCTestCase {
170170
})
171171
self.wait(for: expectation)
172172
}
173+
174+
func testAutocomplete() {
175+
let expectation = XCTestExpectation(description: "Request 204")
176+
let query = CIOAutocompleteQuery(query: "a", filters: nil, numResults: 20)
177+
self.constructor.autocomplete(forQuery: query, completionHandler: { response in
178+
let cioError = response.error as? CIOError
179+
XCTAssertNil(cioError)
180+
expectation.fulfill()
181+
})
182+
self.wait(for: expectation)
183+
}
184+
185+
func testAutocomplete_WithFilters() {
186+
let expectation = XCTestExpectation(description: "Request 204")
187+
let facetFilters = [
188+
(key: "Brand", value: "A&W")
189+
]
190+
let queryFilters = CIOQueryFilters(groupFilter: nil, facetFilters: facetFilters)
191+
let query = CIOAutocompleteQuery(query: "a", filters: queryFilters, numResults: 20)
192+
self.constructor.autocomplete(forQuery: query, completionHandler: { response in
193+
let cioError = response.error as? CIOError
194+
XCTAssertNil(cioError)
195+
expectation.fulfill()
196+
})
197+
self.wait(for: expectation)
198+
}
199+
200+
func testSearch() {
201+
let expectation = XCTestExpectation(description: "Request 204")
202+
let query = CIOSearchQuery(query: "a", filters: nil)
203+
self.constructor.search(forQuery: query, completionHandler: { response in
204+
let cioError = response.error as? CIOError
205+
XCTAssertNil(cioError)
206+
expectation.fulfill()
207+
})
208+
self.wait(for: expectation)
209+
}
210+
211+
func testSearch_WithFilters() {
212+
let expectation = XCTestExpectation(description: "Request 204")
213+
let facetFilters = [
214+
(key: "Brand", value: "A&W")
215+
]
216+
let queryFilters = CIOQueryFilters(groupFilter: "101", facetFilters: facetFilters)
217+
let query = CIOSearchQuery(query: "a", filters: queryFilters)
218+
self.constructor.search(forQuery: query, completionHandler: { response in
219+
let cioError = response.error as? CIOError
220+
XCTAssertNil(cioError)
221+
expectation.fulfill()
222+
})
223+
self.wait(for: expectation)
224+
}
225+
226+
func testBrowse() {
227+
let expectation = XCTestExpectation(description: "Request 204")
228+
let query = CIOBrowseQuery(filterName: "group_id", filterValue: "431")
229+
self.constructor.browse(forQuery: query, completionHandler: { response in
230+
let cioError = response.error as? CIOError
231+
XCTAssertNil(cioError)
232+
expectation.fulfill()
233+
})
234+
self.wait(for: expectation)
235+
}
236+
237+
func testBrowse_WithFilters() {
238+
let expectation = XCTestExpectation(description: "Request 204")
239+
let facetFilters = [
240+
(key: "Brand", value: "A&W")
241+
]
242+
let queryFilters = CIOQueryFilters(groupFilter: "101", facetFilters: facetFilters)
243+
let query = CIOBrowseQuery(filterName: "group_id", filterValue: "431", filters: queryFilters)
244+
self.constructor.browse(forQuery: query, completionHandler: { response in
245+
let cioError = response.error as? CIOError
246+
XCTAssertNil(cioError)
247+
expectation.fulfill()
248+
})
249+
self.wait(for: expectation)
250+
}
173251
}

0 commit comments

Comments
 (0)