From 2c397cf8c4f01977ca147d368d35d1e166e87735 Mon Sep 17 00:00:00 2001 From: Xinyi Ye Date: Wed, 18 Oct 2023 14:30:16 -0700 Subject: [PATCH 1/7] feat: add client upload time --- Sources/Amplitude/Utilities/HttpClient.swift | 3 ++- .../Utilities/HttpClientTests.swift | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/Sources/Amplitude/Utilities/HttpClient.swift b/Sources/Amplitude/Utilities/HttpClient.swift index 2ebda526..5eb12481 100644 --- a/Sources/Amplitude/Utilities/HttpClient.swift +++ b/Sources/Amplitude/Utilities/HttpClient.swift @@ -72,8 +72,9 @@ class HttpClient { func getRequestData(events: String) -> Data? { let apiKey = configuration.apiKey + let clientUploadTime: String = ISO8601DateFormatter().string(from: Date()) var requestPayload = """ - {"api_key":"\(apiKey)","events":\(events) + {"api_key":"\(apiKey)","client_upload_time":"\(clientUploadTime)","events":\(events) """ if let minIdLength = configuration.minIdLength { requestPayload += """ diff --git a/Tests/AmplitudeTests/Utilities/HttpClientTests.swift b/Tests/AmplitudeTests/Utilities/HttpClientTests.swift index 774746f0..67cea4d8 100644 --- a/Tests/AmplitudeTests/Utilities/HttpClientTests.swift +++ b/Tests/AmplitudeTests/Utilities/HttpClientTests.swift @@ -42,6 +42,23 @@ final class HttpClientTests: XCTestCase { } } + func testGetRequestData() { + let httpClient = HttpClient(configuration: configuration) + let event = BaseEvent(userId: "unit-test user", eventType: "unit-test event") + + let dateFormatter = ISO8601DateFormatter() + let currentDate = Date() + let expectedClientUploadTime = dateFormatter.string(from: currentDate) + + let expectedRequestPayload = """ + {"api_key":"testApiKey","client_upload_time":"\(expectedClientUploadTime)","events":[\(event.toString())]} + """.data(using: .utf8) + + let result = httpClient.getRequestData(events: "[\(event.toString())]") + + XCTAssertEqual(result, expectedRequestPayload) + } + func testUploadWithInvalidApiKey() { // TODO: currently this test is sending request to real Amplitude host, update to mock for better stability let httpClient = HttpClient(configuration: configuration) From 2be2931301e77263a1d72af64e5409beae8a0a06 Mon Sep 17 00:00:00 2001 From: Xinyi Ye Date: Tue, 24 Oct 2023 11:22:08 -0700 Subject: [PATCH 2/7] fix: update format --- Sources/Amplitude/Utilities/HttpClient.swift | 6 ++++-- Tests/AmplitudeTests/Utilities/HttpClientTests.swift | 8 +++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Sources/Amplitude/Utilities/HttpClient.swift b/Sources/Amplitude/Utilities/HttpClient.swift index 5eb12481..38c4675a 100644 --- a/Sources/Amplitude/Utilities/HttpClient.swift +++ b/Sources/Amplitude/Utilities/HttpClient.swift @@ -70,9 +70,11 @@ class HttpClient { return request } - func getRequestData(events: String) -> Data? { + func getRequestData(events: String, currentTime: Date = Date()) -> Data? { let apiKey = configuration.apiKey - let clientUploadTime: String = ISO8601DateFormatter().string(from: Date()) + let formatter = ISO8601DateFormatter() + formatter.formatOptions.insert(.withFractionalSeconds) + let clientUploadTime: String = formatter.string(from: currentTime) var requestPayload = """ {"api_key":"\(apiKey)","client_upload_time":"\(clientUploadTime)","events":\(events) """ diff --git a/Tests/AmplitudeTests/Utilities/HttpClientTests.swift b/Tests/AmplitudeTests/Utilities/HttpClientTests.swift index 67cea4d8..482b4a31 100644 --- a/Tests/AmplitudeTests/Utilities/HttpClientTests.swift +++ b/Tests/AmplitudeTests/Utilities/HttpClientTests.swift @@ -46,15 +46,13 @@ final class HttpClientTests: XCTestCase { let httpClient = HttpClient(configuration: configuration) let event = BaseEvent(userId: "unit-test user", eventType: "unit-test event") - let dateFormatter = ISO8601DateFormatter() - let currentDate = Date() - let expectedClientUploadTime = dateFormatter.string(from: currentDate) + let currentTime = Date(timeIntervalSince1970: 1698171384) let expectedRequestPayload = """ - {"api_key":"testApiKey","client_upload_time":"\(expectedClientUploadTime)","events":[\(event.toString())]} + {"api_key":"testApiKey","client_upload_time":"2023-10-24T18:16:24.000Z","events":[\(event.toString())]} """.data(using: .utf8) - let result = httpClient.getRequestData(events: "[\(event.toString())]") + let result = httpClient.getRequestData(events: "[\(event.toString())]", currentTime: currentTime) XCTAssertEqual(result, expectedRequestPayload) } From 12da22fc57755a119bad146ee047e459c1c44714 Mon Sep 17 00:00:00 2001 From: Xinyi Ye Date: Fri, 27 Oct 2023 09:50:20 -0700 Subject: [PATCH 3/7] Revert "fix: update format" This reverts commit 2be2931301e77263a1d72af64e5409beae8a0a06. --- Sources/Amplitude/Utilities/HttpClient.swift | 6 ++---- Tests/AmplitudeTests/Utilities/HttpClientTests.swift | 8 +++++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Sources/Amplitude/Utilities/HttpClient.swift b/Sources/Amplitude/Utilities/HttpClient.swift index 38c4675a..5eb12481 100644 --- a/Sources/Amplitude/Utilities/HttpClient.swift +++ b/Sources/Amplitude/Utilities/HttpClient.swift @@ -70,11 +70,9 @@ class HttpClient { return request } - func getRequestData(events: String, currentTime: Date = Date()) -> Data? { + func getRequestData(events: String) -> Data? { let apiKey = configuration.apiKey - let formatter = ISO8601DateFormatter() - formatter.formatOptions.insert(.withFractionalSeconds) - let clientUploadTime: String = formatter.string(from: currentTime) + let clientUploadTime: String = ISO8601DateFormatter().string(from: Date()) var requestPayload = """ {"api_key":"\(apiKey)","client_upload_time":"\(clientUploadTime)","events":\(events) """ diff --git a/Tests/AmplitudeTests/Utilities/HttpClientTests.swift b/Tests/AmplitudeTests/Utilities/HttpClientTests.swift index 482b4a31..67cea4d8 100644 --- a/Tests/AmplitudeTests/Utilities/HttpClientTests.swift +++ b/Tests/AmplitudeTests/Utilities/HttpClientTests.swift @@ -46,13 +46,15 @@ final class HttpClientTests: XCTestCase { let httpClient = HttpClient(configuration: configuration) let event = BaseEvent(userId: "unit-test user", eventType: "unit-test event") - let currentTime = Date(timeIntervalSince1970: 1698171384) + let dateFormatter = ISO8601DateFormatter() + let currentDate = Date() + let expectedClientUploadTime = dateFormatter.string(from: currentDate) let expectedRequestPayload = """ - {"api_key":"testApiKey","client_upload_time":"2023-10-24T18:16:24.000Z","events":[\(event.toString())]} + {"api_key":"testApiKey","client_upload_time":"\(expectedClientUploadTime)","events":[\(event.toString())]} """.data(using: .utf8) - let result = httpClient.getRequestData(events: "[\(event.toString())]", currentTime: currentTime) + let result = httpClient.getRequestData(events: "[\(event.toString())]") XCTAssertEqual(result, expectedRequestPayload) } From 345266ccd2a5d27528186740be3a06ecabefac4e Mon Sep 17 00:00:00 2001 From: Xinyi Ye Date: Fri, 27 Oct 2023 11:05:17 -0700 Subject: [PATCH 4/7] Mock Date() by getDate() --- Sources/Amplitude/Utilities/HttpClient.swift | 7 ++++++- Tests/AmplitudeTests/Supports/TestUtilities.swift | 5 +++++ Tests/AmplitudeTests/Utilities/HttpClientTests.swift | 8 ++------ 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/Sources/Amplitude/Utilities/HttpClient.swift b/Sources/Amplitude/Utilities/HttpClient.swift index 5eb12481..998ef910 100644 --- a/Sources/Amplitude/Utilities/HttpClient.swift +++ b/Sources/Amplitude/Utilities/HttpClient.swift @@ -72,7 +72,9 @@ class HttpClient { func getRequestData(events: String) -> Data? { let apiKey = configuration.apiKey - let clientUploadTime: String = ISO8601DateFormatter().string(from: Date()) + let formatter = ISO8601DateFormatter() + formatter.formatOptions.insert(.withFractionalSeconds) + let clientUploadTime: String = formatter.string(from: getDate()) var requestPayload = """ {"api_key":"\(apiKey)","client_upload_time":"\(clientUploadTime)","events":\(events) """ @@ -84,6 +86,9 @@ class HttpClient { requestPayload += "}" return requestPayload.data(using: .utf8) } + func getDate() -> Date { + return Date() + } } extension HttpClient { diff --git a/Tests/AmplitudeTests/Supports/TestUtilities.swift b/Tests/AmplitudeTests/Supports/TestUtilities.swift index da724473..260c56b9 100644 --- a/Tests/AmplitudeTests/Supports/TestUtilities.swift +++ b/Tests/AmplitudeTests/Supports/TestUtilities.swift @@ -129,6 +129,11 @@ class FakeHttpClient: HttpClient { completion(Result.success(200)) return nil } + + override func getDate() -> Date { + // timestamp of 2023-10-24T18:16:24.000 in UTC time zone + return Date(timeIntervalSince1970: 1698171384) + } } class FakeResponseHandler: ResponseHandler { diff --git a/Tests/AmplitudeTests/Utilities/HttpClientTests.swift b/Tests/AmplitudeTests/Utilities/HttpClientTests.swift index 67cea4d8..0fc84599 100644 --- a/Tests/AmplitudeTests/Utilities/HttpClientTests.swift +++ b/Tests/AmplitudeTests/Utilities/HttpClientTests.swift @@ -43,15 +43,11 @@ final class HttpClientTests: XCTestCase { } func testGetRequestData() { - let httpClient = HttpClient(configuration: configuration) + let httpClient = FakeHttpClient(configuration: configuration) let event = BaseEvent(userId: "unit-test user", eventType: "unit-test event") - let dateFormatter = ISO8601DateFormatter() - let currentDate = Date() - let expectedClientUploadTime = dateFormatter.string(from: currentDate) - let expectedRequestPayload = """ - {"api_key":"testApiKey","client_upload_time":"\(expectedClientUploadTime)","events":[\(event.toString())]} + {"api_key":"testApiKey","client_upload_time":"2023-10-24T18:16:24.000Z","events":[\(event.toString())]} """.data(using: .utf8) let result = httpClient.getRequestData(events: "[\(event.toString())]") From 360e2e639101b6af311fc37c05dea95db700cd42 Mon Sep 17 00:00:00 2001 From: Xinyi Ye Date: Fri, 27 Oct 2023 11:15:17 -0700 Subject: [PATCH 5/7] fix lint --- Tests/AmplitudeTests/Supports/TestUtilities.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Tests/AmplitudeTests/Supports/TestUtilities.swift b/Tests/AmplitudeTests/Supports/TestUtilities.swift index 260c56b9..68c31320 100644 --- a/Tests/AmplitudeTests/Supports/TestUtilities.swift +++ b/Tests/AmplitudeTests/Supports/TestUtilities.swift @@ -129,7 +129,6 @@ class FakeHttpClient: HttpClient { completion(Result.success(200)) return nil } - override func getDate() -> Date { // timestamp of 2023-10-24T18:16:24.000 in UTC time zone return Date(timeIntervalSince1970: 1698171384) From a61f9d020a015e6af9c71babfe2cbe04e7db756f Mon Sep 17 00:00:00 2001 From: Xinyi Ye Date: Fri, 27 Oct 2023 13:30:10 -0700 Subject: [PATCH 6/7] Update Sources/Amplitude/Utilities/HttpClient.swift Co-authored-by: Justin Fiedler --- Sources/Amplitude/Utilities/HttpClient.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Sources/Amplitude/Utilities/HttpClient.swift b/Sources/Amplitude/Utilities/HttpClient.swift index 998ef910..a641152b 100644 --- a/Sources/Amplitude/Utilities/HttpClient.swift +++ b/Sources/Amplitude/Utilities/HttpClient.swift @@ -86,6 +86,7 @@ class HttpClient { requestPayload += "}" return requestPayload.data(using: .utf8) } + func getDate() -> Date { return Date() } From 90bc1633e2d7af030db8db4e217fde2239627905 Mon Sep 17 00:00:00 2001 From: Xinyi Ye Date: Fri, 27 Oct 2023 13:30:24 -0700 Subject: [PATCH 7/7] Update Tests/AmplitudeTests/Supports/TestUtilities.swift Co-authored-by: Justin Fiedler --- Tests/AmplitudeTests/Supports/TestUtilities.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Tests/AmplitudeTests/Supports/TestUtilities.swift b/Tests/AmplitudeTests/Supports/TestUtilities.swift index 68c31320..3652ebf7 100644 --- a/Tests/AmplitudeTests/Supports/TestUtilities.swift +++ b/Tests/AmplitudeTests/Supports/TestUtilities.swift @@ -129,6 +129,7 @@ class FakeHttpClient: HttpClient { completion(Result.success(200)) return nil } + override func getDate() -> Date { // timestamp of 2023-10-24T18:16:24.000 in UTC time zone return Date(timeIntervalSince1970: 1698171384)