Skip to content

Commit 80e41d5

Browse files
committed
7853 Track count of JITMs received in fetchSuccess
1 parent 3652919 commit 80e41d5

File tree

5 files changed

+39
-53
lines changed

5 files changed

+39
-53
lines changed

WooCommerce/Classes/ViewRelated/Dashboard/DashboardViewModel.swift

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,11 +157,14 @@ final class DashboardViewModel {
157157
hook: .adminNotices) { [weak self] result in
158158
guard let self = self else { return }
159159
switch result {
160-
case let .success(.some(message)):
160+
case let .success(messages):
161+
guard let message = messages.first else {
162+
return
163+
}
161164
self.analytics.track(event:
162165
.JustInTimeMessage.fetchSuccess(source: Constants.dashboardScreenName,
163166
messageID: message.messageID,
164-
count: 1))
167+
count: Int64(messages.count)))
165168
let viewModel = JustInTimeMessageAnnouncementCardViewModel(
166169
justInTimeMessage: message,
167170
screenName: Constants.dashboardScreenName,
@@ -172,8 +175,6 @@ final class DashboardViewModel {
172175
self.analytics.track(event:
173176
.JustInTimeMessage.fetchFailure(source: Constants.dashboardScreenName,
174177
error: error))
175-
case .success(.none):
176-
break
177178
}
178179
}
179180
stores.dispatch(action)

WooCommerce/WooCommerceTests/ViewRelated/Dashboard/DashboardViewModelTests.swift

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ final class DashboardViewModelTests: XCTestCase {
101101
stores.whenReceivingAction(ofType: JustInTimeMessageAction.self) { action in
102102
switch action {
103103
case let .loadMessage(_, _, _, completion):
104-
completion(.success(Yosemite.JustInTimeMessage.fake()))
104+
completion(.success([Yosemite.JustInTimeMessage.fake()]))
105105
default:
106106
XCTFail("Received unsupported action: \(action)")
107107
}
@@ -118,7 +118,7 @@ final class DashboardViewModelTests: XCTestCase {
118118
func test_view_model_syncs_just_in_time_messages_when_ineligible_for_products_onboarding() {
119119
// Given
120120
let message = Yosemite.JustInTimeMessage.fake().copy(title: "JITM Message")
121-
prepareStoresToShowJustInTimeMessage(.success(message))
121+
prepareStoresToShowJustInTimeMessage(.success([message]))
122122
let viewModel = DashboardViewModel(stores: stores)
123123

124124
// When
@@ -128,7 +128,7 @@ final class DashboardViewModelTests: XCTestCase {
128128
XCTAssertEqual(viewModel.announcementViewModel?.title, "JITM Message")
129129
}
130130

131-
func prepareStoresToShowJustInTimeMessage(_ response: Result<Yosemite.JustInTimeMessage?, Error>) {
131+
func prepareStoresToShowJustInTimeMessage(_ response: Result<[Yosemite.JustInTimeMessage], Error>) {
132132
stores.whenReceivingAction(ofType: ProductAction.self) { action in
133133
switch action {
134134
case let .checkProductsOnboardingEligibility(_, completion):
@@ -160,7 +160,7 @@ final class DashboardViewModelTests: XCTestCase {
160160
stores.whenReceivingAction(ofType: JustInTimeMessageAction.self) { action in
161161
switch action {
162162
case let .loadMessage(_, _, _, completion):
163-
completion(.success(nil))
163+
completion(.success([]))
164164
default:
165165
XCTFail("Received unsupported action: \(action)")
166166
}
@@ -188,7 +188,7 @@ final class DashboardViewModelTests: XCTestCase {
188188
stores.whenReceivingAction(ofType: JustInTimeMessageAction.self) { action in
189189
switch action {
190190
case let .loadMessage(_, _, _, completion):
191-
completion(.success(Yosemite.JustInTimeMessage.fake()))
191+
completion(.success([Yosemite.JustInTimeMessage.fake()]))
192192
default:
193193
XCTFail("Received unsupported action: \(action)")
194194
}
@@ -202,11 +202,14 @@ final class DashboardViewModelTests: XCTestCase {
202202
XCTAssertNil(viewModel.announcementViewModel)
203203
}
204204

205-
func test_fetch_success_analytics_logged_when_just_in_time_message_retrieved() {
205+
func test_fetch_success_analytics_logged_when_just_in_time_messages_retrieved() {
206206
// Given
207207
let message = Yosemite.JustInTimeMessage.fake().copy(messageID: "test-message-id",
208208
featureClass: "test-feature-class")
209-
prepareStoresToShowJustInTimeMessage(.success(message))
209+
210+
let secondMessage = Yosemite.JustInTimeMessage.fake().copy(messageID: "test-message-id-2",
211+
featureClass: "test-feature-class-2")
212+
prepareStoresToShowJustInTimeMessage(.success([message, secondMessage]))
210213
let viewModel = DashboardViewModel(stores: stores, analytics: analytics)
211214

212215
// When
@@ -221,7 +224,22 @@ final class DashboardViewModelTests: XCTestCase {
221224

222225
assertEqual("my_store", properties["source"] as? String)
223226
assertEqual("test-message-id", properties["jitm"] as? String)
224-
assertEqual(1, properties["count"] as? Int64)
227+
assertEqual(2, properties["count"] as? Int64)
228+
}
229+
230+
func test_when_two_messages_are_received_only_the_first_is_displayed() {
231+
// Given
232+
let message = Yosemite.JustInTimeMessage.fake().copy(title: "Higher priority JITM")
233+
234+
let secondMessage = Yosemite.JustInTimeMessage.fake().copy(title: "Lower priority JITM")
235+
prepareStoresToShowJustInTimeMessage(.success([message, secondMessage]))
236+
let viewModel = DashboardViewModel(stores: stores, analytics: analytics)
237+
238+
// When
239+
viewModel.syncAnnouncements(for: sampleSiteID)
240+
241+
// Then
242+
XCTAssertEqual(viewModel.announcementViewModel?.title, "Higher priority JITM")
225243
}
226244

227245
func test_fetch_failure_analytics_logged_when_just_in_time_message_errors() {

Yosemite/Yosemite/Actions/JustInTimeMessageAction.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ public enum JustInTimeMessageAction: Action {
88
case loadMessage(siteID: Int64,
99
screen: String,
1010
hook: JustInTimeMessageHook,
11-
completion: (Result<JustInTimeMessage?, Error>) -> ())
11+
completion: (Result<[JustInTimeMessage], Error>) -> ())
1212

1313
/// Dismisses a `JustInTimeMessage` and others for the same `featureClass`
1414
///

Yosemite/Yosemite/Stores/JustInTimeMessageStore.swift

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,25 +44,22 @@ private extension JustInTimeMessageStore {
4444
func loadMessage(for siteID: Int64,
4545
screen: String,
4646
hook: JustInTimeMessageHook,
47-
completion: @escaping (Result<JustInTimeMessage?, Error>) -> ()) {
47+
completion: @escaping (Result<[JustInTimeMessage], Error>) -> ()) {
4848
Task {
4949
let result = await remote.loadAllJustInTimeMessages(
5050
for: siteID,
5151
messagePath: .init(app: .wooMobile,
5252
screen: screen,
5353
hook: hook))
54-
let displayResult = result.map(topDisplayMessage(_:))
54+
let displayResult = result.map(displayMessages(_:))
5555
await MainActor.run {
5656
completion(displayResult)
5757
}
5858
}
5959
}
6060

61-
func topDisplayMessage(_ messages: [Networking.JustInTimeMessage]) -> JustInTimeMessage? {
62-
guard let topMessage = messages.first else {
63-
return nil
64-
}
65-
return JustInTimeMessage(message: topMessage)
61+
func displayMessages(_ messages: [Networking.JustInTimeMessage]) -> [JustInTimeMessage] {
62+
return messages.map { JustInTimeMessage(message: $0) }
6663
}
6764

6865
func dismissMessage(_ message: JustInTimeMessage,

Yosemite/YosemiteTests/Stores/JustInTimeMessageStoreTests.swift

Lines changed: 3 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ final class JustInTimeMessageStoreTests: XCTestCase {
2626
sut = JustInTimeMessageStore(dispatcher: Dispatcher(), storageManager: storageManager, network: network)
2727
}
2828

29-
func test_loadMessage_then_it_returns_nil_upon_successful_empty_response() throws {
29+
func test_loadMessage_then_it_returns_empty_array_upon_successful_empty_response() throws {
3030
// Given
3131
network.simulateResponse(requestUrlSuffix: "jetpack/v4/jitm", filename: "empty-data-array")
3232

@@ -43,7 +43,7 @@ final class JustInTimeMessageStoreTests: XCTestCase {
4343

4444
// Then
4545
XCTAssert(result.isSuccess)
46-
XCTAssertNil(try result.get())
46+
XCTAssert(try result.get().isEmpty)
4747
}
4848

4949
func test_loadMessage_then_it_returns_the_Just_In_Time_Message_upon_successful_response() throws {
@@ -72,37 +72,7 @@ final class JustInTimeMessageStoreTests: XCTestCase {
7272

7373
// Then
7474
XCTAssert(result.isSuccess)
75-
let recievedMessage = try XCTUnwrap(result.get())
76-
assertEqual(expectedJustInTimeMessage, recievedMessage)
77-
}
78-
79-
func test_loadMessage_then_it_returns_the_first_Just_In_Time_Message_upon_successful_response_with_multiple_jitms() throws {
80-
// Given
81-
network.simulateResponse(requestUrlSuffix: "jetpack/v4/jitm", filename: "just-in-time-message-list-multiple")
82-
83-
// When
84-
let result = waitFor { promise in
85-
let action = JustInTimeMessageAction.loadMessage(
86-
siteID: self.sampleSiteID,
87-
screen: "my_store",
88-
hook: .adminNotices) { result in
89-
promise(result)
90-
}
91-
self.sut.onAction(action)
92-
}
93-
94-
let expectedJustInTimeMessage = JustInTimeMessage(
95-
siteID: sampleSiteID,
96-
messageID: "woomobile_onboarding_add_product",
97-
featureClass: "woomobile_onboarding_products",
98-
title: "Add some products",
99-
detail: "Get started selling your products: add them easily using the Products tab",
100-
buttonTitle: "Add product",
101-
url: "woocommerce://products/add")
102-
103-
// Then
104-
XCTAssert(result.isSuccess)
105-
let recievedMessage = try XCTUnwrap(result.get())
75+
let recievedMessage = try XCTUnwrap(result.get().first)
10676
assertEqual(expectedJustInTimeMessage, recievedMessage)
10777
}
10878

0 commit comments

Comments
 (0)