Skip to content

Commit 4ea5462

Browse files
committed
Create POSOrderMapperTests
1 parent 2663256 commit 4ea5462

File tree

2 files changed

+219
-1
lines changed

2 files changed

+219
-1
lines changed

Modules/Sources/Yosemite/PointOfSale/OrderList/POSOrderMapper.swift

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,13 @@ struct POSOrderMapper {
2626
return currencyFormatter.formatAmount(order.discountTotal, with: order.currency, isNegative: true) ?? ""
2727
}()
2828

29+
let formattedNetAmount: String? = {
30+
guard !order.refunds.isEmpty else {
31+
return nil
32+
}
33+
return order.netAmount(currencyFormatter: currencyFormatter)
34+
}()
35+
2936
return POSOrder(
3037
id: order.orderID,
3138
number: order.number,
@@ -41,7 +48,7 @@ struct POSOrderMapper {
4148
formattedTotalTax: currencyFormatter.formatAmount(order.totalTax, with: order.currency) ?? "",
4249
formattedDiscountTotal: formattedDiscountTotal,
4350
formattedPaymentTotal: order.paymentTotal(currencyFormatter: currencyFormatter),
44-
formattedNetAmount: order.netAmount(currencyFormatter: currencyFormatter)
51+
formattedNetAmount: formattedNetAmount
4552
)
4653
}
4754

Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
1+
import Foundation
2+
import Testing
3+
import WooFoundation
4+
import NetworkingCore
5+
@testable import Yosemite
6+
7+
struct POSOrderMapperTests {
8+
private let currencyFormatter: CurrencyFormatter
9+
private let sut: POSOrderMapper
10+
11+
init() {
12+
currencyFormatter = CurrencyFormatter(currencySettings: CurrencySettings())
13+
sut = POSOrderMapper(currencyFormatter: currencyFormatter)
14+
}
15+
16+
// MARK: - formattedDiscountTotal Logic Tests
17+
18+
@Test
19+
func formattedDiscountTotal_returns_nil_when_discount_total_is_zero() {
20+
// Given
21+
let order = makeOrder(discountTotal: "0.00")
22+
23+
// When
24+
let result = sut.map(order: order)
25+
26+
// Then
27+
#expect(result.formattedDiscountTotal == nil)
28+
}
29+
30+
@Test
31+
func formattedDiscountTotal_returns_nil_when_discount_total_is_negative() {
32+
// Given
33+
let order = makeOrder(discountTotal: "-5.00")
34+
35+
// When
36+
let result = sut.map(order: order)
37+
38+
// Then
39+
#expect(result.formattedDiscountTotal == nil)
40+
}
41+
42+
@Test
43+
func formattedDiscountTotal_returns_nil_when_discount_total_is_invalid() {
44+
// Given
45+
let order = makeOrder(discountTotal: "invalid")
46+
47+
// When
48+
let result = sut.map(order: order)
49+
50+
// Then
51+
#expect(result.formattedDiscountTotal == nil)
52+
}
53+
54+
@Test
55+
func formattedDiscountTotal_returns_formatted_negative_value_when_discount_total_is_positive() {
56+
// Given
57+
let order = makeOrder(discountTotal: "15.50", currency: "USD")
58+
59+
// When
60+
let result = sut.map(order: order)
61+
62+
// Then
63+
#expect(result.formattedDiscountTotal == "-$15.50")
64+
}
65+
66+
// MARK: - formattedPaymentTotal Logic Tests
67+
68+
@Test
69+
func formattedPaymentTotal_returns_zero_when_order_is_not_paid() {
70+
// Given
71+
let order = makeOrder(total: "25.99", datePaid: nil, currency: "USD")
72+
73+
// When
74+
let result = sut.map(order: order)
75+
76+
// Then
77+
#expect(result.formattedPaymentTotal == "$0.00")
78+
}
79+
80+
@Test
81+
func formattedPaymentTotal_returns_total_value_when_order_is_paid() {
82+
// Given
83+
let order = makeOrder(total: "25.99", datePaid: Date(), currency: "USD")
84+
85+
// When
86+
let result = sut.map(order: order)
87+
88+
// Then
89+
#expect(result.formattedPaymentTotal == "$25.99")
90+
}
91+
92+
// MARK: - formattedNetAmount Logic Tests
93+
94+
@Test
95+
func formattedNetAmount_returns_nil_when_no_refunds_exist() {
96+
// Given
97+
let order = makeOrder(total: "25.99", currency: "USD", refunds: [])
98+
99+
// When
100+
let result = sut.map(order: order)
101+
102+
// Then
103+
#expect(result.formattedNetAmount == nil)
104+
}
105+
106+
@Test
107+
func formattedNetAmount_returns_calculated_net_amount_when_refunds_exist() {
108+
// Given
109+
let refund = makeRefund(refundID: 1, total: "-10.00")
110+
let order = makeOrder(total: "25.99", currency: "USD", refunds: [refund])
111+
112+
// When
113+
let result = sut.map(order: order)
114+
115+
// Then
116+
#expect(result.formattedNetAmount == "$15.99")
117+
}
118+
119+
@Test
120+
func formattedNetAmount_returns_zero_when_refund_equals_total() {
121+
// Given
122+
let refund = makeRefund(refundID: 1, total: "-25.99")
123+
let order = makeOrder(total: "25.99", currency: "USD", refunds: [refund])
124+
125+
// When
126+
let result = sut.map(order: order)
127+
128+
// Then
129+
#expect(result.formattedNetAmount == "$0.00")
130+
}
131+
132+
@Test
133+
func formattedNetAmount_handles_multiple_refunds() {
134+
// Given
135+
let refund1 = makeRefund(refundID: 1, total: "-10.00")
136+
let refund2 = makeRefund(refundID: 2, total: "-5.00")
137+
let order = makeOrder(total: "25.99", currency: "USD", refunds: [refund1, refund2])
138+
139+
// When
140+
let result = sut.map(order: order)
141+
142+
// Then
143+
#expect(result.formattedNetAmount == "$10.99")
144+
}
145+
}
146+
147+
// MARK: - Test Helpers
148+
149+
private extension POSOrderMapperTests {
150+
func makeOrder(
151+
orderID: Int64 = 1,
152+
number: String = "1001",
153+
dateCreated: Date = Date(),
154+
status: OrderStatusEnum = .completed,
155+
total: String = "25.99",
156+
datePaid: Date? = nil,
157+
discountTotal: String = "0.00",
158+
totalTax: String = "2.50",
159+
currency: String = "USD",
160+
refunds: [OrderRefundCondensed] = [],
161+
items: [OrderItem] = []
162+
) -> NetworkingCore.Order {
163+
return NetworkingCore.Order.fake().copy(
164+
orderID: orderID,
165+
number: number,
166+
status: status,
167+
currency: currency,
168+
dateCreated: dateCreated,
169+
datePaid: datePaid,
170+
discountTotal: discountTotal,
171+
total: total,
172+
totalTax: totalTax,
173+
items: items.isEmpty ? [makeOrderItem()] : items,
174+
refunds: refunds
175+
)
176+
}
177+
178+
func makeOrderItem(
179+
itemID: Int64 = 1,
180+
name: String = "Test Item",
181+
productID: Int64 = 101,
182+
variationID: Int64 = 0,
183+
quantity: Decimal = 1.0,
184+
price: NSDecimalNumber = NSDecimalNumber(string: "10.00"),
185+
subtotal: String = "10.00",
186+
total: String = "10.00"
187+
) -> NetworkingCore.OrderItem {
188+
return NetworkingCore.OrderItem.fake().copy(
189+
itemID: itemID,
190+
name: name,
191+
productID: productID,
192+
variationID: variationID,
193+
quantity: quantity,
194+
price: price,
195+
subtotal: subtotal,
196+
total: total
197+
)
198+
}
199+
200+
func makeRefund(
201+
refundID: Int64,
202+
total: String,
203+
reason: String? = nil
204+
) -> NetworkingCore.OrderRefundCondensed {
205+
return NetworkingCore.OrderRefundCondensed(
206+
refundID: refundID,
207+
reason: reason,
208+
total: total
209+
)
210+
}
211+
}

0 commit comments

Comments
 (0)