@@ -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
84353private extension WooShippingSplitShipmentsViewModelTests {
0 commit comments