Skip to content

Commit

Permalink
Merge pull request #181 from klaviyo/as/chnl-9098-opened-event-when-n…
Browse files Browse the repository at this point in the history
…ot-inited

Allowing opened push event to be transmitted when SDK is not initialized
  • Loading branch information
ajaysubra authored May 31, 2024
2 parents 4940d18 + 4e1dc18 commit 9b08d8f
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 8 deletions.
6 changes: 5 additions & 1 deletion Sources/KlaviyoSwift/StateManagement.swift
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,11 @@ enum KlaviyoAction: Equatable {

var requiresInitialization: Bool {
switch self {
case .setEmail, .setPhoneNumber, .setExternalId, .setPushToken, .enqueueEvent, .enqueueProfile, .setProfileProperty, .resetProfile, .resetStateAndDequeue:
// if event metric is opened push we DON'T require initilization in all other event metric cases we DO.
case let .enqueueEvent(event) where event.metric.name == .OpenedPush:
return false

case .setEmail, .setPhoneNumber, .setExternalId, .setPushToken, .enqueueProfile, .setProfileProperty, .resetProfile, .resetStateAndDequeue, .enqueueEvent:
return true

case .initialize, .completeInitialization, .deQueueCompletedResults, .networkConnectivityChanged, .flushQueue, .sendRequest, .stop, .start, .cancelInFlightRequests, .requestFailed:
Expand Down
35 changes: 28 additions & 7 deletions Tests/KlaviyoSwiftTests/StateManagementEdgeCaseTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ class StateManagementEdgeCaseTests: XCTestCase {
// MARK: - Set Email

@MainActor
func testSetEmailUninitialized() async throws {
func testSetEmailUninitializedDoesNotAddToPendingRequest() async throws {
let expection = XCTestExpectation(description: "fatal error expected")
environment.emitDeveloperWarning = { _ in
// Would really fatalError - not happening because we can't do that in tests so we fake it.
Expand Down Expand Up @@ -168,7 +168,7 @@ class StateManagementEdgeCaseTests: XCTestCase {
// MARK: - Set External Id

@MainActor
func testSetExternalIdUninitialized() async throws {
func testSetExternalIdUninitializedDoesNotAddToPendingRequest() async throws {
let apiKey = "fake-key"
let initialState = KlaviyoState(apiKey: apiKey,
anonymousId: environment.analytics.uuid().uuidString,
Expand Down Expand Up @@ -213,7 +213,7 @@ class StateManagementEdgeCaseTests: XCTestCase {
// MARK: - Set Phone number

@MainActor
func testSetPhoneNumberUninitialized() async throws {
func testSetPhoneNumberUninitializedDoesNotAddToPendingRequest() async throws {
let apiKey = "fake-key"
let initialState = KlaviyoState(apiKey: apiKey,
anonymousId: environment.analytics.uuid().uuidString,
Expand Down Expand Up @@ -257,7 +257,7 @@ class StateManagementEdgeCaseTests: XCTestCase {
// MARK: - Set Push Token

@MainActor
func testSetPushTokenUninitialized() async throws {
func testSetPushTokenUninitializedDoesNotAddToPendingRequest() async throws {
let apiKey = "fake-key"
let initialState = KlaviyoState(apiKey: apiKey,
anonymousId: environment.analytics.uuid().uuidString,
Expand Down Expand Up @@ -369,15 +369,30 @@ class StateManagementEdgeCaseTests: XCTestCase {
// MARK: - set enqueue event uninitialized

@MainActor
func testEnqueueEventUninitialized() async throws {
func testOpenedPushEventUninitializedAddsToPendingRequests() async throws {
let store = TestStore(initialState: .init(queue: []), reducer: KlaviyoReducer())
let event = Event(name: .OpenedPush)
_ = await store.send(.enqueueEvent(event)) {
$0.pendingRequests = [.event(event)]
}
}

@MainActor
func testEnqueueNonOpenedPushEventUninitializedDoesNotAddToPendingRequest() async throws {
let expection = XCTestExpectation(description: "fatal error expected")
environment.emitDeveloperWarning = { _ in
// Would really runTimeWarn - not happening because we can't do that in tests so we fake it.
expection.fulfill()
}
let store = TestStore(initialState: .init(queue: []), reducer: KlaviyoReducer())
let event = Event(name: .OpenedPush)
_ = await store.send(.enqueueEvent(event))

let nonOpenedPushEvents = Event.EventName.allCases.filter { $0 != .OpenedPush }

for event in nonOpenedPushEvents {
let event = Event(name: event)
_ = await store.send(.enqueueEvent(event))
}

await fulfillment(of: [expection])
}

Expand Down Expand Up @@ -423,3 +438,9 @@ class StateManagementEdgeCaseTests: XCTestCase {
}
}
}

extension Event.EventName: CaseIterable {
public static var allCases: [KlaviyoSwift.Event.EventName] {
[.OpenedPush, .OpenedAppMetric, .ViewedProductMetric, .AddedToCartMetric, .StartedCheckoutMetric, .CustomEvent("someEvent")]
}
}

0 comments on commit 9b08d8f

Please sign in to comment.