diff --git a/AutocompleteClient.xcodeproj/project.pbxproj b/AutocompleteClient.xcodeproj/project.pbxproj index afb11677..6ecd8a17 100644 --- a/AutocompleteClient.xcodeproj/project.pbxproj +++ b/AutocompleteClient.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ 08465ECA2161C96900AEBD76 /* TrackSearchResultClickRequestBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08465EC92161C96900AEBD76 /* TrackSearchResultClickRequestBuilder.swift */; }; 08465ECC2161D0B100AEBD76 /* TrackSessionStartRequestBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08465ECB2161D0B100AEBD76 /* TrackSessionStartRequestBuilder.swift */; }; + 08689F0121897914000D3565 /* ConstructorIOUserIDTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08689F0021897914000D3565 /* ConstructorIOUserIDTests.swift */; }; 0874A32E216BCE2700812CDC /* ConstructorIOABTestCellTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0874A32D216BCE2700812CDC /* ConstructorIOABTestCellTests.swift */; }; 0879E93F215F290D00018BBA /* TrackAutocompleteSelectRequestBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0879E93E215F290D00018BBA /* TrackAutocompleteSelectRequestBuilderTests.swift */; }; 088F7D1C210FA3B4005B9FB4 /* CIOSessionManagerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 088F7D1B210FA3B4005B9FB4 /* CIOSessionManagerDelegate.swift */; }; @@ -196,6 +197,7 @@ /* Begin PBXFileReference section */ 08465EC92161C96900AEBD76 /* TrackSearchResultClickRequestBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackSearchResultClickRequestBuilder.swift; sourceTree = ""; }; 08465ECB2161D0B100AEBD76 /* TrackSessionStartRequestBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackSessionStartRequestBuilder.swift; sourceTree = ""; }; + 08689F0021897914000D3565 /* ConstructorIOUserIDTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConstructorIOUserIDTests.swift; sourceTree = ""; }; 0874A32D216BCE2700812CDC /* ConstructorIOABTestCellTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConstructorIOABTestCellTests.swift; sourceTree = ""; }; 0879E93E215F290D00018BBA /* TrackAutocompleteSelectRequestBuilderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TrackAutocompleteSelectRequestBuilderTests.swift; sourceTree = ""; }; 088F7D1B210FA3B4005B9FB4 /* CIOSessionManagerDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CIOSessionManagerDelegate.swift; sourceTree = ""; }; @@ -568,6 +570,7 @@ F64E94E8212DC93300E50EDE /* ConstructorIOAutocompleteTests.swift */, F63808FE1F5D6C1000C3B322 /* ConstructorIOTests.swift */, 0874A32D216BCE2700812CDC /* ConstructorIOABTestCellTests.swift */, + 08689F0021897914000D3565 /* ConstructorIOUserIDTests.swift */, ); path = Worker; sourceTree = ""; @@ -1553,6 +1556,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 08689F0121897914000D3565 /* ConstructorIOUserIDTests.swift in Sources */, F64F46B51F5975070094C697 /* AutocompleteResultTests.swift in Sources */, F1C557451F605C9D0040D6AD /* TrackConversionRequestBuilderTests.swift in Sources */, F685254021380CAB00A27FAA /* Matcher+Regex.swift in Sources */, diff --git a/AutocompleteClient/FW/Logic/Request/Builder/RequestBuilder.swift b/AutocompleteClient/FW/Logic/Request/Builder/RequestBuilder.swift index f34c0bbe..8f8841b3 100644 --- a/AutocompleteClient/FW/Logic/Request/Builder/RequestBuilder.swift +++ b/AutocompleteClient/FW/Logic/Request/Builder/RequestBuilder.swift @@ -27,6 +27,10 @@ public class RequestBuilder { queryItems.add(URLQueryItem(name: Constants.Query.apiKey, value: apiKey)) } + func set(userID: String){ + queryItems.add(URLQueryItem(name: "ui", value: userID)) + } + func set(clientID: String){ queryItems.add(URLQueryItem(name: "i", value: clientID)) } @@ -70,7 +74,7 @@ public class RequestBuilder { } private func addDateQueryItem(queryItems items: inout QueryItemCollection){ - let dateString = String(Int(self.dateProvider.provideDate().timeIntervalSince1970 * 1000)) + let dateString = String(Int64(self.dateProvider.provideDate().timeIntervalSince1970 * 1000)) items.add(URLQueryItem(name: Constants.Track.dateTime, value: dateString)) } } diff --git a/AutocompleteClient/FW/Logic/Worker/ConstructorIO.swift b/AutocompleteClient/FW/Logic/Worker/ConstructorIO.swift index a8546da0..104bb18b 100644 --- a/AutocompleteClient/FW/Logic/Worker/ConstructorIO.swift +++ b/AutocompleteClient/FW/Logic/Worker/ConstructorIO.swift @@ -27,6 +27,8 @@ public class ConstructorIO: CIOSessionManagerDelegate { public let clientID: String? + public var userID: String? + public var sessionID: Int{ get { return self.sessionManager.getSessionWithIncrement() @@ -144,6 +146,7 @@ public class ConstructorIO: CIOSessionManagerDelegate { private func buildRequest(data: CIORequestData) -> URLRequest{ let requestBuilder = RequestBuilder(apiKey: self.config.apiKey) self.attachClientID(requestBuilder: requestBuilder) + self.attachUserID(requestBuilder: requestBuilder) self.attachSessionIDWithIncrement(requestBuilder: requestBuilder) self.attachABTestCells(requestBuilder: requestBuilder) requestBuilder.build(trackData: data) @@ -154,6 +157,7 @@ public class ConstructorIO: CIOSessionManagerDelegate { let data = CIOTrackSessionStartData(session: session) let requestBuilder = RequestBuilder(apiKey: self.config.apiKey) self.attachClientID(requestBuilder: requestBuilder) + self.attachUserID(requestBuilder: requestBuilder) self.attachSessionIDWithoutIncrement(requestBuilder: requestBuilder) self.attachABTestCells(requestBuilder: requestBuilder) requestBuilder.build(trackData: data) @@ -165,6 +169,12 @@ public class ConstructorIO: CIOSessionManagerDelegate { requestBuilder.set(testCellKey: cell.key, testCellValue: cell.value); }) } + + private func attachUserID(requestBuilder: RequestBuilder){ + if let uid = self.userID{ + requestBuilder.set(userID: uid) + } + } private func attachClientID(requestBuilder: RequestBuilder){ if let cID = self.clientID{ diff --git a/AutocompleteClientTests/FW/Logic/Worker/ConstructorIOUserIDTests.swift b/AutocompleteClientTests/FW/Logic/Worker/ConstructorIOUserIDTests.swift new file mode 100644 index 00000000..d126b28d --- /dev/null +++ b/AutocompleteClientTests/FW/Logic/Worker/ConstructorIOUserIDTests.swift @@ -0,0 +1,39 @@ +// +// ConstructorIOUserIDTests.swift +// AutocompleteClientTests +// +// Copyright © Constructor.io. All rights reserved. +// http://constructor.io/ +// + +import XCTest +@testable import ConstructorAutocomplete + +class ConstructorIOUserIDTests: XCTestCase { + + var constructor: ConstructorIO! + + override func setUp() { + super.setUp() + self.constructor = TestConstants.testConstructor() + self.constructor.userID = "abcdefg"; + } + + func testAutocomplete() { + let term = "a term" + let query = CIOAutocompleteQuery(query: term) + let builder = CIOBuilder(expectation: "Calling Autocomplete with 200 should return a response", builder: http(200)) + stub(regex("https://ac.cnstrc.com/autocomplete/a%20term?s=1&i=\(kRegexClientID)&ui=abcdefg&key=key_OucJxxrfiTVUQx0C&c=cioios-&_dt=\(kRegexTimestamp)"), builder.create()) + + self.constructor.autocomplete(forQuery: query) { (response) in } + self.wait(for: builder.expectation) + } + + func testTrackInputFocus(){ + let searchTerm = "corn" + let builder = CIOBuilder(expectation: "Calling trackInputFocus should send a valid request.", builder: http(200)) + stub(regex("https://ac.cnstrc.com/behavior?action=focus&i=\(kRegexClientID)&ui=abcdefg&key=key_OucJxxrfiTVUQx0C&c=cioios-&s=1&term=corn&_dt=\(kRegexTimestamp)"), builder.create()) + self.constructor.trackInputFocus(searchTerm: searchTerm) + self.wait(for: builder.expectation) + } +} diff --git a/UserApplication/AppDelegate.swift b/UserApplication/AppDelegate.swift index 40e8b851..fc89bb38 100644 --- a/UserApplication/AppDelegate.swift +++ b/UserApplication/AppDelegate.swift @@ -49,7 +49,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, CIOAutocompleteDelegate, let config = ConstructorIOConfig(apiKey: key, resultCount: AutocompleteResultCount(numResultsForSection: ["Search Suggestions" : 3, "Products" : 0])) let viewController = CIOAutocompleteViewController(config: config) - + viewController.searchBarDisplayMode = CIOSearchBarDisplayMode.NavigationBar viewController.searchBarShouldShowCancelButton = false @@ -163,6 +163,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate, CIOAutocompleteDelegate, func autocompleteControllerWillAppear(controller: CIOAutocompleteViewController) { print("Search controller will appear") + if controller.constructorIO.userID == nil{ + controller.constructorIO.userID = "user_id$1 3" + } } func autocompleteControllerDidLoad(controller: CIOAutocompleteViewController) {