Skip to content

Commit 4255be2

Browse files
committed
Add new tests for WooShippingSplitShipmentsViewModel
1 parent bd2a08f commit 4255be2

File tree

1 file changed

+269
-0
lines changed

1 file changed

+269
-0
lines changed

WooCommerce/WooCommerceTests/ViewRelated/Shipping Label/WooShipping Create Shipping Labels/Split shipments/WooShippingSplitShipmentsViewModelTests.swift

Lines changed: 269 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,275 @@ final class WooShippingSplitShipmentsViewModelTests: XCTestCase {
7979
assertEqual("13 kg • ₹22.50", viewModel.itemsDetailLabel)
8080
}
8181

82+
func test_shipments_is_correct_initially() throws {
83+
// Given
84+
let items = [sampleItem(id: 1, weight: 5, value: 10, quantity: 2),
85+
sampleItem(id: 2, weight: 3, value: 2.5, quantity: 1)]
86+
87+
// When
88+
let viewModel = WooShippingSplitShipmentsViewModel(order: sampleOrder,
89+
config: WooShippingConfig.fake(),
90+
items: items,
91+
currencySettings: currencySettings,
92+
shippingSettingsService: shippingSettingsService)
93+
94+
// Then
95+
XCTAssertEqual(viewModel.shipments.count, 1)
96+
let shipment = try XCTUnwrap(viewModel.shipments.first)
97+
XCTAssertEqual(shipment.count, items.count)
98+
}
99+
100+
// MARK: - `moveToNoticeViewModel`
101+
102+
func test_moveToNoticeViewModel_is_nil_initially() {
103+
// Given
104+
let items = [sampleItem(id: 1, weight: 5, value: 10, quantity: 2),
105+
sampleItem(id: 2, weight: 3, value: 2.5, quantity: 1)]
106+
107+
// When
108+
let viewModel = WooShippingSplitShipmentsViewModel(order: sampleOrder,
109+
config: WooShippingConfig.fake(),
110+
items: items,
111+
currencySettings: currencySettings,
112+
shippingSettingsService: shippingSettingsService)
113+
114+
// Then
115+
XCTAssertNil(viewModel.moveToNoticeViewModel)
116+
}
117+
118+
func test_moveToNoticeViewModel_is_nil_when_there_exists_one_shipment_and_all_items_are_selected() {
119+
// Given
120+
let items = [sampleItem(id: 1, weight: 5, value: 10, quantity: 2),
121+
sampleItem(id: 2, weight: 3, value: 2.5, quantity: 1)]
122+
123+
let viewModel = WooShippingSplitShipmentsViewModel(order: sampleOrder,
124+
config: WooShippingConfig.fake(),
125+
items: items,
126+
currencySettings: currencySettings,
127+
shippingSettingsService: shippingSettingsService)
128+
129+
// When
130+
viewModel.selectAll()
131+
132+
// Then
133+
XCTAssertNil(viewModel.moveToNoticeViewModel)
134+
}
135+
136+
func test_moveToNoticeViewModel_is_correct_when_there_exists_one_shipment_and_not_all_items_are_selected() throws {
137+
// Given
138+
let items = [sampleItem(id: 1, weight: 5, value: 10, quantity: 2),
139+
sampleItem(id: 2, weight: 3, value: 2.5, quantity: 1)]
140+
141+
let viewModel = WooShippingSplitShipmentsViewModel(order: sampleOrder,
142+
config: WooShippingConfig.fake(),
143+
items: items,
144+
currencySettings: currencySettings,
145+
shippingSettingsService: shippingSettingsService)
146+
147+
// When
148+
viewModel.shipments.first?.first?.childItemRows.first?.handleTap()
149+
150+
// Then
151+
let moveToNoticeViewModel = try XCTUnwrap(viewModel.moveToNoticeViewModel)
152+
XCTAssertEqual(moveToNoticeViewModel.selectedItemsCount, 1)
153+
XCTAssertEqual(moveToNoticeViewModel.existingShipmentsCount, 1)
154+
XCTAssertEqual(moveToNoticeViewModel.currentShipmentIndex, 0)
155+
}
156+
157+
func test_moveToNoticeViewModel_is_correct_when_there_exists_more_than_one_shipment_and_not_all_items_are_selected() throws {
158+
// Given
159+
let items = [sampleItem(id: 1, weight: 5, value: 10, quantity: 2),
160+
sampleItem(id: 2, weight: 3, value: 2.5, quantity: 1),
161+
sampleItem(id: 3, weight: 4, value: 5, quantity: 3)]
162+
let viewModel = WooShippingSplitShipmentsViewModel(order: sampleOrder,
163+
config: WooShippingConfig.fake(),
164+
items: items,
165+
currencySettings: currencySettings,
166+
shippingSettingsService: shippingSettingsService)
167+
168+
// When
169+
viewModel.shipments.first?.first?.childItemRows.first?.handleTap()
170+
viewModel.moveSelectedItems(to: .newShipment)
171+
viewModel.shipments.first?.last?.mainItemRow.handleTap()
172+
173+
// Then
174+
let moveToNoticeViewModel = try XCTUnwrap(viewModel.moveToNoticeViewModel)
175+
XCTAssertEqual(moveToNoticeViewModel.selectedItemsCount, 3)
176+
XCTAssertEqual(moveToNoticeViewModel.existingShipmentsCount, 2)
177+
XCTAssertEqual(moveToNoticeViewModel.currentShipmentIndex, 0)
178+
}
179+
180+
func test_moveToNoticeViewModel_is_correct_when_there_exists_more_than_one_shipment_and_all_items_are_selected() throws {
181+
// Given
182+
let items = [sampleItem(id: 1, weight: 5, value: 10, quantity: 2),
183+
sampleItem(id: 2, weight: 3, value: 2.5, quantity: 1),
184+
sampleItem(id: 3, weight: 4, value: 5, quantity: 3)]
185+
let viewModel = WooShippingSplitShipmentsViewModel(order: sampleOrder,
186+
config: WooShippingConfig.fake(),
187+
items: items,
188+
currencySettings: currencySettings,
189+
shippingSettingsService: shippingSettingsService)
190+
191+
// When
192+
viewModel.shipments.first?.first?.childItemRows.first?.handleTap()
193+
viewModel.moveSelectedItems(to: .newShipment)
194+
viewModel.selectAll()
195+
196+
// Then
197+
let moveToNoticeViewModel = try XCTUnwrap(viewModel.moveToNoticeViewModel)
198+
XCTAssertEqual(moveToNoticeViewModel.selectedItemsCount, 5)
199+
XCTAssertEqual(moveToNoticeViewModel.existingShipmentsCount, 2)
200+
XCTAssertEqual(moveToNoticeViewModel.currentShipmentIndex, 0)
201+
}
202+
203+
// MARK: - `moveSelectedItems`
204+
205+
func test_moveSelectedItems_to_new_shipments_works_correctly_when_moving_a_subset_of_items() {
206+
// Given
207+
let items = [sampleItem(id: 1, weight: 5, value: 10, quantity: 2),
208+
sampleItem(id: 2, weight: 3, value: 2.5, quantity: 1)]
209+
let viewModel = WooShippingSplitShipmentsViewModel(order: sampleOrder,
210+
config: WooShippingConfig.fake(),
211+
items: items,
212+
currencySettings: currencySettings,
213+
shippingSettingsService: shippingSettingsService)
214+
215+
// When
216+
viewModel.shipments.first?.first?.childItemRows.first?.handleTap()
217+
viewModel.moveSelectedItems(to: .newShipment)
218+
219+
// Then
220+
XCTAssertEqual(viewModel.shipments.count, 2)
221+
222+
XCTAssertEqual(viewModel.shipments[0].count, 2)
223+
XCTAssertEqual(viewModel.shipments[0][0].packageItem.productOrVariationID, items[0].productOrVariationID)
224+
XCTAssertEqual(viewModel.shipments[0][0].packageItem.quantity, 1)
225+
XCTAssertEqual(viewModel.shipments[0][1].packageItem.productOrVariationID, items[1].productOrVariationID)
226+
XCTAssertEqual(viewModel.shipments[0][1].packageItem.quantity, 1)
227+
228+
XCTAssertEqual(viewModel.shipments[1].count, 1)
229+
XCTAssertEqual(viewModel.shipments[1][0].packageItem.productOrVariationID, items[0].productOrVariationID)
230+
XCTAssertEqual(viewModel.shipments[1][0].packageItem.quantity, 1)
231+
}
232+
233+
func test_moveSelectedItems_to_new_shipments_works_correctly_when_moving_whole_item() {
234+
// Given
235+
let items = [sampleItem(id: 1, weight: 5, value: 10, quantity: 2),
236+
sampleItem(id: 2, weight: 3, value: 2.5, quantity: 1)]
237+
let viewModel = WooShippingSplitShipmentsViewModel(order: sampleOrder,
238+
config: WooShippingConfig.fake(),
239+
items: items,
240+
currencySettings: currencySettings,
241+
shippingSettingsService: shippingSettingsService)
242+
243+
// When
244+
viewModel.shipments.first?.first?.mainItemRow.handleTap()
245+
viewModel.moveSelectedItems(to: .newShipment)
246+
247+
// Then
248+
XCTAssertEqual(viewModel.shipments.count, 2)
249+
250+
XCTAssertEqual(viewModel.shipments[0].count, 1)
251+
XCTAssertEqual(viewModel.shipments[0][0].packageItem.productOrVariationID, items[1].productOrVariationID)
252+
XCTAssertEqual(viewModel.shipments[0][0].packageItem.quantity, 1)
253+
254+
XCTAssertEqual(viewModel.shipments[1].count, 1)
255+
XCTAssertEqual(viewModel.shipments[1][0].packageItem.productOrVariationID, items[0].productOrVariationID)
256+
XCTAssertEqual(viewModel.shipments[1][0].packageItem.quantity, 2)
257+
}
258+
259+
func test_moveSelectedItems_to_existing_shipments_works_correctly() {
260+
// Given
261+
let items = [sampleItem(id: 1, weight: 5, value: 10, quantity: 2),
262+
sampleItem(id: 2, weight: 3, value: 2.5, quantity: 1),
263+
sampleItem(id: 3, weight: 4, value: 5, quantity: 3)]
264+
let viewModel = WooShippingSplitShipmentsViewModel(order: sampleOrder,
265+
config: WooShippingConfig.fake(),
266+
items: items,
267+
currencySettings: currencySettings,
268+
shippingSettingsService: shippingSettingsService)
269+
270+
// When
271+
viewModel.shipments.first?.first?.childItemRows.first?.handleTap()
272+
viewModel.moveSelectedItems(to: .newShipment)
273+
viewModel.shipments.first?.last?.mainItemRow.handleTap()
274+
viewModel.moveSelectedItems(to: .existingShipment(index: 1))
275+
276+
// Then
277+
XCTAssertEqual(viewModel.shipments.count, 2)
278+
279+
XCTAssertEqual(viewModel.shipments[0].count, 2)
280+
XCTAssertEqual(viewModel.shipments[0][0].packageItem.productOrVariationID, items[0].productOrVariationID)
281+
XCTAssertEqual(viewModel.shipments[0][0].packageItem.quantity, 1)
282+
XCTAssertEqual(viewModel.shipments[0][1].packageItem.productOrVariationID, items[1].productOrVariationID)
283+
XCTAssertEqual(viewModel.shipments[0][1].packageItem.quantity, 1)
284+
285+
XCTAssertEqual(viewModel.shipments[1].count, 2)
286+
XCTAssertEqual(viewModel.shipments[1][0].packageItem.productOrVariationID, items[0].productOrVariationID)
287+
XCTAssertEqual(viewModel.shipments[1][0].packageItem.quantity, 1)
288+
XCTAssertEqual(viewModel.shipments[1][1].packageItem.productOrVariationID, items[2].productOrVariationID)
289+
XCTAssertEqual(viewModel.shipments[1][1].packageItem.quantity, 3)
290+
}
291+
292+
func test_moveSelectedItems_to_new_shipments_updates_section_headers_for_current_shipment() {
293+
// Given
294+
let items = [sampleItem(id: 1, weight: 5, value: 10, quantity: 2),
295+
sampleItem(id: 2, weight: 3, value: 2.5, quantity: 1)]
296+
let viewModel = WooShippingSplitShipmentsViewModel(order: sampleOrder,
297+
config: WooShippingConfig.fake(),
298+
items: items,
299+
currencySettings: currencySettings,
300+
shippingSettingsService: shippingSettingsService)
301+
302+
// When
303+
viewModel.shipments.first?.first?.childItemRows.first?.handleTap()
304+
viewModel.moveSelectedItems(to: .newShipment)
305+
306+
// Then
307+
assertEqual("2 items", viewModel.itemsCountLabel)
308+
assertEqual("₹12.50", viewModel.itemsPriceLabel)
309+
assertEqual("8 kg • ₹12.50", viewModel.itemsDetailLabel)
310+
}
311+
312+
func test_switching_shipments_updates_section_headers() {
313+
// Given
314+
let items = [sampleItem(id: 1, weight: 5, value: 10, quantity: 2),
315+
sampleItem(id: 2, weight: 3, value: 2.5, quantity: 1)]
316+
let viewModel = WooShippingSplitShipmentsViewModel(order: sampleOrder,
317+
config: WooShippingConfig.fake(),
318+
items: items,
319+
currencySettings: currencySettings,
320+
shippingSettingsService: shippingSettingsService)
321+
322+
// When
323+
viewModel.shipments.first?.first?.childItemRows.first?.handleTap()
324+
viewModel.moveSelectedItems(to: .newShipment)
325+
viewModel.selectedShipmentIndex = 1
326+
327+
// Then
328+
assertEqual("1 item", viewModel.itemsCountLabel)
329+
assertEqual("₹10.00", viewModel.itemsPriceLabel)
330+
assertEqual("5 kg • ₹10.00", viewModel.itemsDetailLabel)
331+
}
332+
333+
func test_topTabItems_are_updated_after_moving_items_to_new_shipment() {
334+
// Given
335+
let items = [sampleItem(id: 1, weight: 5, value: 10, quantity: 2),
336+
sampleItem(id: 2, weight: 3, value: 2.5, quantity: 1)]
337+
let viewModel = WooShippingSplitShipmentsViewModel(order: sampleOrder,
338+
config: WooShippingConfig.fake(),
339+
items: items,
340+
currencySettings: currencySettings,
341+
shippingSettingsService: shippingSettingsService)
342+
XCTAssertEqual(viewModel.topTabItems.count, 1)
343+
344+
// When
345+
viewModel.shipments.first?.first?.childItemRows.first?.handleTap()
346+
viewModel.moveSelectedItems(to: .newShipment)
347+
348+
// Then
349+
XCTAssertEqual(viewModel.topTabItems.count, 2)
350+
}
82351
}
83352

84353
private extension WooShippingSplitShipmentsViewModelTests {

0 commit comments

Comments
 (0)