@freedom_sky/feige-lib 5.22.0 → 5.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/.eslintignore +2 -2
  2. package/.eslintrc.js +15 -15
  3. package/.prettierrc.js +6 -6
  4. package/AGENTS.md +75 -75
  5. package/CHANGE.md +38 -34
  6. package/azure-pipelines-release.yml +56 -0
  7. package/dist/announcement/enum/announcement.enum.d.ts +11 -11
  8. package/dist/announcement/enum/announcement.enum.js +15 -15
  9. package/dist/buffet/index.d.ts +46 -46
  10. package/dist/buffet/index.js +95 -95
  11. package/dist/const/const.d.ts +372 -370
  12. package/dist/const/const.js +2387 -2374
  13. package/dist/enum/ai-token.enum.d.ts +10 -10
  14. package/dist/enum/ai-token.enum.js +14 -14
  15. package/dist/enum/checkout.enum.d.ts +13 -13
  16. package/dist/enum/checkout.enum.js +17 -17
  17. package/dist/enum/common.enum.d.ts +18 -14
  18. package/dist/enum/common.enum.js +23 -18
  19. package/dist/enum/continent.enum.d.ts +8 -8
  20. package/dist/enum/continent.enum.js +11 -11
  21. package/dist/enum/dish.enum.d.ts +4 -4
  22. package/dist/enum/dish.enum.js +7 -7
  23. package/dist/enum/from.enum.d.ts +14 -14
  24. package/dist/enum/from.enum.js +17 -17
  25. package/dist/enum/member.enum.d.ts +16 -16
  26. package/dist/enum/member.enum.js +21 -21
  27. package/dist/enum/menu-io.enum.d.ts +4 -4
  28. package/dist/enum/menu-io.enum.js +7 -7
  29. package/dist/enum/order.enum.d.ts +7 -7
  30. package/dist/enum/order.enum.js +10 -10
  31. package/dist/enum/pay-company.enum.d.ts +4 -4
  32. package/dist/enum/pay-company.enum.js +7 -7
  33. package/dist/enum/printer.enum.d.ts +36 -36
  34. package/dist/enum/printer.enum.js +45 -45
  35. package/dist/enum/receptionist.enum.d.ts +8 -8
  36. package/dist/enum/receptionist.enum.js +11 -11
  37. package/dist/enum/reservation.enum.d.ts +5 -5
  38. package/dist/enum/reservation.enum.js +8 -8
  39. package/dist/enum/role.enum.d.ts +7 -7
  40. package/dist/enum/role.enum.js +10 -10
  41. package/dist/enum/sms.enum.d.ts +14 -14
  42. package/dist/enum/sms.enum.js +18 -18
  43. package/dist/enum/tax.enum.d.ts +4 -4
  44. package/dist/enum/tax.enum.js +7 -7
  45. package/dist/enum/time-menu.enum.d.ts +4 -4
  46. package/dist/enum/time-menu.enum.js +7 -7
  47. package/dist/enum/timezone.emum.d.ts +33 -33
  48. package/dist/enum/timezone.emum.js +36 -36
  49. package/dist/enum/user-status.enum.d.ts +9 -9
  50. package/dist/enum/user-status.enum.js +12 -12
  51. package/dist/enum/visit-task.enum.d.ts +13 -13
  52. package/dist/enum/visit-task.enum.js +17 -17
  53. package/dist/enum/yeepay.enum.d.ts +22 -22
  54. package/dist/enum/yeepay.enum.js +30 -30
  55. package/dist/index.d.ts +203 -202
  56. package/dist/index.js +564 -562
  57. package/dist/interfaces/common/language.interface.d.ts +13 -13
  58. package/dist/interfaces/common/language.interface.js +2 -2
  59. package/dist/interfaces/member/member-transaction.interface.d.ts +27 -27
  60. package/dist/interfaces/member/member-transaction.interface.js +2 -2
  61. package/dist/interfaces/member/member.interface.d.ts +16 -16
  62. package/dist/interfaces/member/member.interface.js +2 -2
  63. package/dist/interfaces/order/baseOrder.interface.d.ts +84 -84
  64. package/dist/interfaces/order/baseOrder.interface.js +2 -2
  65. package/dist/interfaces/order/buffetOrder.interface.d.ts +13 -13
  66. package/dist/interfaces/order/buffetOrder.interface.js +2 -2
  67. package/dist/interfaces/order/deliveryOrder.interface.d.ts +9 -9
  68. package/dist/interfaces/order/deliveryOrder.interface.js +2 -2
  69. package/dist/interfaces/order/index.d.ts +7 -7
  70. package/dist/interfaces/order/index.js +6 -6
  71. package/dist/interfaces/order/order.interface.d.ts +75 -75
  72. package/dist/interfaces/order/order.interface.js +17 -17
  73. package/dist/interfaces/order/pickupOrder.interface.d.ts +8 -8
  74. package/dist/interfaces/order/pickupOrder.interface.js +2 -2
  75. package/dist/interfaces/order/serialOrder.interface.d.ts +4 -4
  76. package/dist/interfaces/order/serialOrder.interface.js +2 -2
  77. package/dist/interfaces/order/tableOrder.interface.d.ts +7 -7
  78. package/dist/interfaces/order/tableOrder.interface.js +2 -2
  79. package/dist/interfaces/reservation/reservation.interface.d.ts +46 -46
  80. package/dist/interfaces/reservation/reservation.interface.js +2 -2
  81. package/dist/interfaces/store/classification.interface.d.ts +7 -7
  82. package/dist/interfaces/store/classification.interface.js +2 -2
  83. package/dist/interfaces/store/dish.interface.d.ts +18 -18
  84. package/dist/interfaces/store/dish.interface.js +2 -2
  85. package/dist/interfaces/store/dishSnapshot.interface.d.ts +11 -11
  86. package/dist/interfaces/store/dishSnapshot.interface.js +2 -2
  87. package/dist/interfaces/store/member.interface.d.ts +8 -8
  88. package/dist/interfaces/store/member.interface.js +2 -2
  89. package/dist/interfaces/store/menu-export.interface.d.ts +12 -12
  90. package/dist/interfaces/store/menu-export.interface.js +2 -2
  91. package/dist/interfaces/store/specification.interface.d.ts +17 -17
  92. package/dist/interfaces/store/specification.interface.js +2 -2
  93. package/dist/interfaces/store/store.interface.d.ts +300 -300
  94. package/dist/interfaces/store/store.interface.js +2 -2
  95. package/dist/interfaces/store/subscription.interface.d.ts +43 -43
  96. package/dist/interfaces/store/subscription.interface.js +2 -2
  97. package/dist/interfaces/user/user.interface.d.ts +139 -139
  98. package/dist/interfaces/user/user.interface.js +2 -2
  99. package/dist/interfaces/visit-task/visit-task.interface.d.ts +17 -17
  100. package/dist/interfaces/visit-task/visit-task.interface.js +2 -2
  101. package/dist/order/index.d.ts +22 -22
  102. package/dist/order/index.js +58 -58
  103. package/jest.config.js +189 -189
  104. package/josn-hub/orders/tax-have-price-bind-order.ts +381 -381
  105. package/josn-hub/orders/tax-order.ts +371 -371
  106. package/josn-hub/orders//346/225/264/345/215/225/344/273/267/346/240/274/351/203/275/346/230/257/350/264/237/346/225/260/347/232/204/346/203/205/345/206/265.ts +321 -321
  107. package/josn-hub/orders//346/234/211/344/270/200/344/270/252/350/217/234/347/232/204/344/273/267/346/240/274/346/230/257/350/264/237/346/225/260/347/232/204/346/203/205/345/206/265.ts +348 -348
  108. package/josn-hub/orders//347/202/271/344/272/206/344/270/215/345/212/240/344/273/267/345/222/214/345/233/272/345/256/232/345/212/240/345/207/217/344/273/267/350/247/204/346/240/274/347/232/204/350/256/242/345/215/225.ts +350 -350
  109. package/josn-hub/orders//347/202/271/344/272/206/345/233/272/345/256/232/345/212/240/344/273/267-/347/231/276/345/210/206/346/257/224/345/212/240/344/273/267/350/247/204/346/240/274/347/232/204/350/256/242/345/215/225.ts +301 -301
  110. package/josn-hub/orders//347/202/271/344/272/206/346/234/252/345/212/240/344/273/267/350/247/204/346/240/274/347/232/204/350/256/242/345/215/225.ts +321 -321
  111. package/josn-hub/orders//347/202/271/344/272/206/346/234/252/345/212/240/344/273/267/350/247/204/346/240/274/347/232/204/350/256/242/345/215/225/345/271/266/346/234/211/351/205/215/351/200/201/350/264/271.ts +159 -159
  112. package/josn-hub/orders//350/207/252/345/212/251/351/244/220/347/232/204/346/203/205/345/206/265.ts +665 -665
  113. package/josn-hub/orders//351/203/250/345/210/206/351/200/200/350/217/234/347/232/204/346/203/205/345/206/265.ts +73 -73
  114. package/package.json +59 -59
  115. package/src/announcement/enum/announcement.enum.ts +12 -12
  116. package/src/buffet/index.ts +123 -123
  117. package/src/const/const.ts +2407 -2394
  118. package/src/enum/ai-token.enum.ts +10 -10
  119. package/src/enum/checkout.enum.ts +14 -14
  120. package/src/enum/common.enum.ts +20 -15
  121. package/src/enum/continent.enum.ts +8 -8
  122. package/src/enum/dish.enum.ts +4 -4
  123. package/src/enum/from.enum.ts +14 -14
  124. package/src/enum/member.enum.ts +16 -16
  125. package/src/enum/menu-io.enum.ts +4 -4
  126. package/src/enum/order.enum.ts +7 -7
  127. package/src/enum/pay-company.enum.ts +4 -4
  128. package/src/enum/printer.enum.ts +40 -40
  129. package/src/enum/receptionist.enum.ts +8 -8
  130. package/src/enum/reservation.enum.ts +5 -5
  131. package/src/enum/role.enum.ts +7 -7
  132. package/src/enum/sms.enum.ts +14 -14
  133. package/src/enum/tax.enum.ts +4 -4
  134. package/src/enum/time-menu.enum.ts +4 -4
  135. package/src/enum/timezone.emum.ts +33 -33
  136. package/src/enum/user-status.enum.ts +9 -9
  137. package/src/enum/visit-task.enum.ts +14 -14
  138. package/src/enum/yeepay.enum.ts +27 -27
  139. package/src/index.spec.ts +1082 -1082
  140. package/src/index.ts +616 -614
  141. package/src/interfaces/common/language.interface.ts +13 -13
  142. package/src/interfaces/member/member-transaction.interface.ts +32 -32
  143. package/src/interfaces/member/member.interface.ts +16 -16
  144. package/src/interfaces/order/baseOrder.interface.ts +89 -89
  145. package/src/interfaces/order/buffetOrder.interface.ts +14 -14
  146. package/src/interfaces/order/deliveryOrder.interface.ts +10 -10
  147. package/src/interfaces/order/index.ts +7 -7
  148. package/src/interfaces/order/order.interface.ts +84 -84
  149. package/src/interfaces/order/pickupOrder.interface.ts +9 -9
  150. package/src/interfaces/order/serialOrder.interface.ts +5 -5
  151. package/src/interfaces/order/tableOrder.interface.ts +8 -8
  152. package/src/interfaces/reservation/reservation.interface.ts +48 -48
  153. package/src/interfaces/store/classification.interface.ts +7 -7
  154. package/src/interfaces/store/dish.interface.ts +18 -18
  155. package/src/interfaces/store/dishSnapshot.interface.ts +12 -12
  156. package/src/interfaces/store/member.interface.ts +9 -9
  157. package/src/interfaces/store/menu-export.interface.ts +13 -13
  158. package/src/interfaces/store/specification.interface.ts +17 -17
  159. package/src/interfaces/store/store.interface.ts +316 -316
  160. package/src/interfaces/store/subscription.interface.ts +43 -43
  161. package/src/interfaces/user/user.interface.ts +139 -139
  162. package/src/interfaces/visit-task/visit-task.interface.ts +17 -17
  163. package/src/order/currency-settlement.spec.ts +72 -0
  164. package/src/order/index.ts +91 -91
  165. package/tsconfig.json +12 -12
package/src/index.spec.ts CHANGED
@@ -1,1082 +1,1082 @@
1
- import {
2
- calcTotalPrice,
3
- calcReceivablePrice,
4
- calcReceived,
5
- getReadbleProcess,
6
- calcLeft,
7
- parseMoney,
8
- checkStoreSubscription,
9
- CHECK_STORE_SUBSCRIPTION_REASON,
10
- Store,
11
- getCurrentLangAndRange,
12
- getNameFromNames,
13
- getStoreByLanguage,
14
- getOrderByLanguage,
15
- Order,
16
- getLanguageFromCountryCode,
17
- } from './index';
18
- import * as order1 from '../josn-hub/orders/点了未加价规格的订单';
19
- import * as order2 from '../josn-hub/orders/点了不加价和固定加减价规格的订单';
20
- import * as order3 from '../josn-hub/orders/点了固定加价-百分比加价规格的订单';
21
- import * as order4 from '../josn-hub/orders/有一个菜的价格是负数的情况';
22
- import * as order5 from '../josn-hub/orders/整单价格都是负数的情况';
23
- import * as order6 from '../josn-hub/orders/点了未加价规格的订单并有配送费';
24
- import * as halfRetreatOrder from '../josn-hub/orders/部分退菜的情况';
25
- import * as buffetOrder from '../josn-hub/orders/自助餐的情况';
26
- import * as taxOrder from '../josn-hub/orders/tax-order';
27
- import * as taxHavePriceBindOrder from '../josn-hub/orders/tax-have-price-bind-order';
28
-
29
- import { CONST } from './const/const';
30
-
31
- describe('开始运行单元测试', () => {
32
- // beforeEach(async () => {
33
- // const app: TestingModule = await Test.createTestingModule({
34
- // controllers: [AppController],
35
- // providers: [AppService],
36
- // }).compile();
37
-
38
- // appController = app.get<AppController>(AppController);
39
- // });
40
-
41
- describe('测试计算订单总价:calcTotalPrice', () => {
42
- it('自助餐情况下总价检查', () => {
43
- expect(calcTotalPrice(buffetOrder.order)).toBe(buffetOrder.expectPrice);
44
- });
45
- it('部分退菜情况下总价检查', () => {
46
- expect(calcTotalPrice(halfRetreatOrder.order)).toBe(halfRetreatOrder.expectPrice);
47
- });
48
- it('不加价规格订单总价检查', () => {
49
- expect(calcTotalPrice(order1.order)).toBe(order1.expectPrice);
50
- });
51
- it('点了不加价和固定加减价规格的订单', () => {
52
- expect(calcTotalPrice(order2.order)).toBe(order2.expectPrice);
53
- });
54
- it('点了不加价-固定加价-百分比加价规格的订单', () => {
55
- expect(calcTotalPrice(order3.order)).toBe(order3.expectPrice);
56
- });
57
- it('有一个菜的价格是负数的情况', () => {
58
- expect(calcTotalPrice(order4.order)).toBe(order4.expectPrice);
59
- });
60
- it('整单价格都是负数的情况', () => {
61
- expect(calcTotalPrice(order5.order)).toBe(order5.expectPrice);
62
- });
63
- it('配送费检查', () => {
64
- expect(calcTotalPrice(order6.order)).toBe(order6.expectPrice);
65
- });
66
- });
67
-
68
- describe('测试计算应收金额:calcReceivablePrice', () => {
69
- it('抹零0位', () => {
70
- const result = calcReceivablePrice(order1.order, [
71
- {
72
- type: CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE,
73
- value: 0,
74
- },
75
- ]);
76
- expect(result.totalPrice).toBe(order1.expectPrice);
77
- expect(result.receivablePrice).toBe(order1.expectPrice);
78
- expect(result.resultProcessArr.length).toBe(1);
79
- expect(result.resultProcessArr[0].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE);
80
- expect(result.resultProcessArr[0].volume).toBeCloseTo(0);
81
- });
82
- it('抹零1位', () => {
83
- const result = calcReceivablePrice(order1.order, [
84
- {
85
- type: CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE,
86
- value: 1,
87
- },
88
- ]);
89
- expect(result.receivablePrice).toBe(19.5);
90
- expect(result.resultProcessArr.length).toBe(1);
91
- expect(result.resultProcessArr[0].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE);
92
- expect(result.resultProcessArr[0].volume).toBeCloseTo(-0.05);
93
- });
94
- it('抹零3位', () => {
95
- const result = calcReceivablePrice(order1.order, [
96
- {
97
- type: CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE,
98
- value: 3,
99
- },
100
- ]);
101
- expect(result.receivablePrice).toBe(10);
102
- expect(result.resultProcessArr.length).toBe(1);
103
- expect(result.resultProcessArr[0].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE);
104
- expect(result.resultProcessArr[0].volume).toBeCloseTo(-9.55);
105
- });
106
- it('抹零6位', () => {
107
- const result = calcReceivablePrice(order1.order, [
108
- {
109
- type: CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE,
110
- value: 6,
111
- },
112
- ]);
113
- expect(result.receivablePrice).toBe(0);
114
- expect(result.resultProcessArr.length).toBe(1);
115
- expect(result.resultProcessArr[0].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE);
116
- expect(result.resultProcessArr[0].volume).toBeCloseTo(-19.55);
117
- });
118
- it('抹零3位 + 打9折', () => {
119
- const result = calcReceivablePrice(order1.order, [
120
- {
121
- type: CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE,
122
- value: 3,
123
- },
124
- {
125
- type: CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE,
126
- value: 9,
127
- },
128
- ]);
129
- expect(result.receivablePrice).toBe(10);
130
- expect(result.resultProcessArr.length).toBe(2);
131
- expect(result.resultProcessArr[0].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE);
132
- expect(result.resultProcessArr[0].volume).toBeCloseTo(-1.955);
133
- expect(result.resultProcessArr[1].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE);
134
- expect(result.resultProcessArr[1].volume).toBeCloseTo(-7.595);
135
- });
136
- it('打7.5折 + 抹零2位', () => {
137
- const result = calcReceivablePrice(order1.order, [
138
- {
139
- type: CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE,
140
- value: 7.5,
141
- },
142
- {
143
- type: CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE,
144
- value: 2,
145
- },
146
- ]);
147
- expect(result.receivablePrice).toBe(14);
148
- expect(result.resultProcessArr.length).toBe(2);
149
- expect(result.resultProcessArr[0].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE);
150
- expect(result.resultProcessArr[0].volume).toBeCloseTo(-4.8875);
151
- expect(result.resultProcessArr[1].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE);
152
- expect(result.resultProcessArr[1].volume).toBeCloseTo(-0.6625);
153
- });
154
- it('打8折 + 抹零2位 + 让价10元', () => {
155
- const result = calcReceivablePrice(order1.order, [
156
- {
157
- type: CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE,
158
- value: 8,
159
- },
160
- {
161
- type: CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE,
162
- value: 2,
163
- },
164
- {
165
- type: CONST.RECEIVABLE_PROCESSING_TYPE.MARKDOWN.TYPE,
166
- value: 10,
167
- },
168
- ]);
169
- expect(result.receivablePrice).toBe(5);
170
- expect(result.resultProcessArr.length).toBe(3);
171
- expect(result.resultProcessArr[0].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE);
172
- expect(result.resultProcessArr[0].volume).toBeCloseTo(-3.91);
173
- expect(result.resultProcessArr[1].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.MARKDOWN.TYPE);
174
- expect(result.resultProcessArr[1].volume).toBeCloseTo(-10);
175
- expect(result.resultProcessArr[2].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE);
176
- expect(result.resultProcessArr[2].volume).toBeCloseTo(-0.64);
177
- });
178
- it('打8折 + 抹零2位 + 让价10元, 并且有一部分价格不参与打折, 商品税单价不含税,计算税额', () => {
179
- const result = calcReceivablePrice(taxOrder.order, [
180
- {
181
- type: CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE,
182
- value: 8,
183
- },
184
- {
185
- type: CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE,
186
- value: 2,
187
- },
188
- {
189
- type: CONST.RECEIVABLE_PROCESSING_TYPE.MARKDOWN.TYPE,
190
- value: 10,
191
- },
192
- ]);
193
- expect(result.totalPrice).toBe(20);
194
- expect(result.receivablePrice).toBe(7.76);
195
- expect(result.resultProcessArr.length).toBe(3);
196
- expect(result.resultProcessArr[0].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE);
197
- expect(result.resultProcessArr[0].volume).toBeCloseTo(-3);
198
- expect(result.resultProcessArr[1].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.MARKDOWN.TYPE);
199
- expect(result.resultProcessArr[1].volume).toBeCloseTo(-10);
200
- expect(result.resultProcessArr[2].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE);
201
- expect(result.resultProcessArr[2].volume).toBeCloseTo(-0);
202
- expect(result.taxArr.length).toBe(4);
203
- expect(result.taxArr[0].name).toBe('tax1(10%)');
204
- expect(result.taxArr[0].volume).toBe(0.21);
205
- expect(result.taxArr[1].name).toBe('tax2(5%)');
206
- expect(result.taxArr[1].volume).toBe(0.1);
207
- expect(result.taxArr[2].name).toBe('tax1(5%)');
208
- expect(result.taxArr[2].volume).toBe(0.15);
209
- expect(result.taxArr[3].name).toBe('tax2(10%)');
210
- expect(result.taxArr[3].volume).toBe(0.3);
211
- });
212
- it('打8折 + 抹零2位 + 让价10元, 并且有一部分价格不参与打折, 免税', () => {
213
- const result = calcReceivablePrice(
214
- taxOrder.order,
215
- [
216
- {
217
- type: CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE,
218
- value: 8,
219
- },
220
- {
221
- type: CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE,
222
- value: 2,
223
- },
224
- {
225
- type: CONST.RECEIVABLE_PROCESSING_TYPE.MARKDOWN.TYPE,
226
- value: 10,
227
- },
228
- ],
229
- true,
230
- );
231
- expect(result.totalPrice).toBe(20);
232
- expect(result.receivablePrice).toBe(7);
233
- expect(result.resultProcessArr.length).toBe(3);
234
- expect(result.resultProcessArr[0].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE);
235
- expect(result.resultProcessArr[0].volume).toBeCloseTo(-3);
236
- expect(result.resultProcessArr[1].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.MARKDOWN.TYPE);
237
- expect(result.resultProcessArr[1].volume).toBeCloseTo(-10);
238
- expect(result.resultProcessArr[2].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE);
239
- expect(result.resultProcessArr[2].volume).toBeCloseTo(-0);
240
- });
241
- it('打8折 + 抹零2位 + 让价10元, 并且有一部分价格不参与打折, 整单税单价含税,计算税额', () => {
242
- const result = calcReceivablePrice(taxHavePriceBindOrder.order, [
243
- {
244
- type: CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE,
245
- value: 8,
246
- },
247
- {
248
- type: CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE,
249
- value: 2,
250
- },
251
- {
252
- type: CONST.RECEIVABLE_PROCESSING_TYPE.MARKDOWN.TYPE,
253
- value: 10,
254
- },
255
- ]);
256
- expect(result.totalPrice).toBe(20);
257
- expect(result.receivablePrice).toBe(7);
258
- expect(result.resultProcessArr.length).toBe(3);
259
- expect(result.resultProcessArr[0].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE);
260
- expect(result.resultProcessArr[0].volume).toBeCloseTo(-3);
261
- expect(result.resultProcessArr[1].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.MARKDOWN.TYPE);
262
- expect(result.resultProcessArr[1].volume).toBeCloseTo(-10);
263
- expect(result.resultProcessArr[2].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE);
264
- expect(result.resultProcessArr[2].volume).toBeCloseTo(-0);
265
- expect(result.taxArr.length).toBe(2);
266
- expect(result.taxArr[0].name).toBe('税1(10%)');
267
- expect(result.taxArr[0].volume).toBe(0.61);
268
- expect(result.taxArr[1].name).toBe('税2(5%)');
269
- expect(result.taxArr[1].volume).toBe(0.3);
270
- });
271
- });
272
-
273
- describe('测试计算已收金额:calcReceived', () => {
274
- it('没有该字段返回0', () => {
275
- expect(calcReceived(undefined)).toBe(0);
276
- });
277
- it('计算两笔金额的总数', () => {
278
- expect(
279
- calcReceived([
280
- {
281
- type: CONST.CHECKOUT_TYPE.CASH.TYPE,
282
- amount: 45.64,
283
- },
284
- {
285
- type: CONST.CHECKOUT_TYPE.WECHAT.TYPE,
286
- amount: 66.87,
287
- },
288
- ]),
289
- ).toBe(112.51);
290
- });
291
- it('有退款的情况下计算两笔金额的总数', () => {
292
- expect(
293
- calcReceived([
294
- {
295
- type: CONST.CHECKOUT_TYPE.CASH.TYPE,
296
- amount: 45.64,
297
- },
298
- {
299
- type: CONST.CHECKOUT_TYPE.WECHAT.TYPE,
300
- amount: 66.87,
301
- },
302
- {
303
- type: CONST.CHECKOUT_TYPE.WECHAT.TYPE,
304
- amount: 66.87,
305
- retreated: true,
306
- },
307
- ]),
308
- ).toBe(112.51);
309
- });
310
- });
311
-
312
- describe('测试可读的订单处理过程:getReadbleProcess', () => {
313
- it('输入打折过程,应该返回“打X折字段”', () => {
314
- expect(
315
- getReadbleProcess({
316
- type: 'discount',
317
- value: 9,
318
- volume: -0.8,
319
- }),
320
- ).toBe('打9折');
321
- });
322
- it('输入抹零过程,应该返回“抹零”', () => {
323
- expect(
324
- getReadbleProcess({
325
- type: 'remove_tails',
326
- value: 2,
327
- volume: -0.20000000000000018,
328
- }),
329
- ).toBe('抹零');
330
- });
331
- });
332
-
333
- describe('测试计算剩余金额:calcLeft', () => {
334
- it('去掉因为js计算的尾数 10.56 - 10', () => {
335
- expect(calcLeft(10.56, 10)).toBe(0.56);
336
- });
337
- it('去掉因为js计算的尾数 10.56 - 10 - 0.56', () => {
338
- expect(calcLeft(10.56 - 10, 0.56)).toBe(0);
339
- });
340
- it('负数情况', () => {
341
- expect(calcLeft(10.56, 11)).toBeCloseTo(-0.44);
342
- });
343
- });
344
-
345
- describe('测试格式化金额:parseMoney', () => {
346
- it('尾数高位', () => {
347
- expect(parseMoney(10.5650000000001)).toBe(10.57);
348
- });
349
- it('尾数低位', () => {
350
- expect(parseMoney(10.560000000001)).toBe(10.56);
351
- });
352
- it('负数中位', () => {
353
- expect(parseMoney(10.56499999999)).toBeCloseTo(10.56);
354
- });
355
- });
356
-
357
- describe('测试店铺开通订阅检查:checkStoreSubscription', () => {
358
- it('未购买任何模块的情况', () => {
359
- const store = { subscription: undefined };
360
- const moduleId = 'kds';
361
- expect(checkStoreSubscription(store as Store, moduleId).result).toBe(false);
362
- expect(checkStoreSubscription(store as Store, moduleId).reason).toBe(
363
- CHECK_STORE_SUBSCRIPTION_REASON.NeedBuy,
364
- );
365
- });
366
- it('购买了其他模块的情况', () => {
367
- const store = {
368
- subscription: {
369
- base: {
370
- expires: '2021-06-21T15:59:59.999+00:00',
371
- },
372
- },
373
- };
374
- const moduleId = 'kds';
375
- expect(checkStoreSubscription(store as Store, moduleId).result).toBe(false);
376
- expect(checkStoreSubscription(store as Store, moduleId).reason).toBe(
377
- CHECK_STORE_SUBSCRIPTION_REASON.NeedBuy,
378
- );
379
- });
380
- it('已过期的情况', () => {
381
- const store = {
382
- subscription: {
383
- kds: {
384
- expires: '2000-06-21T15:59:59.999+00:00',
385
- },
386
- },
387
- };
388
- const moduleId = 'kds';
389
- expect(checkStoreSubscription(store as Store, moduleId).result).toBe(false);
390
- expect(checkStoreSubscription(store as Store, moduleId).reason).toBe(
391
- CHECK_STORE_SUBSCRIPTION_REASON.Expires,
392
- );
393
- });
394
- it('永久开通的情况', () => {
395
- const store = {
396
- subscription: {
397
- kds: {
398
- expires: '2000-06-21T15:59:59.999+00:00',
399
- permanent: true,
400
- },
401
- },
402
- };
403
- const moduleId = 'kds';
404
- expect(checkStoreSubscription(store as Store, moduleId).result).toBe(true);
405
- });
406
- it('未过期的情况', () => {
407
- const store = {
408
- subscription: {
409
- kds: {
410
- expires: '2100-06-21T15:59:59.999+00:00',
411
- },
412
- },
413
- };
414
- const moduleId = 'kds';
415
- expect(checkStoreSubscription(store as Store, moduleId).result).toBe(true);
416
- });
417
- it('传入对比时间字符串的情况', () => {
418
- const store = {
419
- subscription: {
420
- kds: {
421
- expires: '2100-06-21T15:59:59.999+00:00',
422
- },
423
- },
424
- };
425
- const moduleId = 'kds';
426
- expect(checkStoreSubscription(store as Store, moduleId, '2101-06-21T15:59:59.999+00:00').result).toBe(
427
- false,
428
- );
429
- });
430
- it('传入对比时间对象的情况', () => {
431
- const store = {
432
- subscription: {
433
- kds: {
434
- expires: '2100-06-21T15:59:59.999+00:00',
435
- },
436
- },
437
- };
438
- const moduleId = 'kds';
439
- expect(
440
- checkStoreSubscription(store as Store, moduleId, new Date('2101-06-21T15:59:59.999+00:00')).result,
441
- ).toBe(false);
442
- });
443
- it('传入当前时间戳的情况', () => {
444
- const store = {
445
- subscription: {
446
- kds: {
447
- expires: '2100-06-21T15:59:59.999+00:00',
448
- },
449
- },
450
- };
451
- const moduleId = 'kds';
452
- expect(checkStoreSubscription(store as Store, moduleId, Date.now()).result).toBe(true);
453
- });
454
- it('传入将来时间戳的情况', () => {
455
- const store = {
456
- subscription: {
457
- kds: {
458
- expires: '2100-06-21T15:59:59.999+00:00',
459
- },
460
- },
461
- };
462
- const moduleId = 'kds';
463
- expect(
464
- checkStoreSubscription(store as Store, moduleId, Date.parse('2101-06-21T15:59:59.999+00:00')).result,
465
- ).toBe(false);
466
- });
467
- });
468
-
469
- describe('根据店铺获取当前应该用的语言:getCurrentLangAndRange', () => {
470
- it('浏览器是中文,店铺默认语言中文,什么包都没开通', () => {
471
- const browserLang = 'zh';
472
- const store = {
473
- subscription: {},
474
- defaultLang: 'zh',
475
- };
476
- const result = getCurrentLangAndRange(store as Store, browserLang);
477
- expect(result.currentLang).toBe('zh');
478
- expect(result.availableLangs.length).toBe(1);
479
- expect(result.availableLangs[0]).toBe('zh');
480
- });
481
- it('浏览器是英语,店铺默认语言中文,什么包都没开通', () => {
482
- const browserLang = 'en';
483
- const store = {
484
- subscription: {},
485
- defaultLang: 'zh',
486
- };
487
- const result = getCurrentLangAndRange(store as Store, browserLang);
488
- expect(result.currentLang).toBe('zh');
489
- expect(result.availableLangs.length).toBe(1);
490
- expect(result.availableLangs[0]).toBe('zh');
491
- });
492
- it('浏览器是英文,开通了标准版语言包,选择语言维语', () => {
493
- const browserLang = 'en';
494
- const store = {
495
- subscription: {
496
- multiLanguage: {
497
- expires: '2100-06-21T15:59:59.999+00:00',
498
- allow: ['zh', 'en', 'ug'],
499
- },
500
- },
501
- };
502
- const result = getCurrentLangAndRange(store as Store, browserLang);
503
- expect(result.currentLang).toBe('en');
504
- expect(result.availableLangs.length).toBe(3);
505
- expect(result.availableLangs.includes('zh')).toBeTruthy();
506
- expect(result.availableLangs.includes('en')).toBeTruthy();
507
- expect(result.availableLangs.includes('ug')).toBeTruthy();
508
- });
509
- it('浏览器是维语,开通了标准版语言包,选择语言维语', () => {
510
- const browserLang = 'ug';
511
- const store = {
512
- subscription: {
513
- multiLanguage: {
514
- expires: '2100-06-21T15:59:59.999+00:00',
515
- allow: ['zh', 'en', 'ug'],
516
- },
517
- },
518
- };
519
- const result = getCurrentLangAndRange(store as Store, browserLang);
520
- expect(result.currentLang).toBe('ug');
521
- expect(result.availableLangs.length).toBe(3);
522
- expect(result.availableLangs.includes('zh')).toBeTruthy();
523
- expect(result.availableLangs.includes('en')).toBeTruthy();
524
- expect(result.availableLangs.includes('ug')).toBeTruthy();
525
- });
526
- it('浏览器是未知语言,默认英文,开通了标准版语言包,选择语言维语', () => {
527
- const browserLang = undefined;
528
- const store = {
529
- subscription: {
530
- multiLanguage: {
531
- expires: '2100-06-21T15:59:59.999+00:00',
532
- allow: ['zh', 'en', 'ug'],
533
- },
534
- },
535
- defaultLang: 'en',
536
- };
537
- const result = getCurrentLangAndRange(store as Store, browserLang);
538
- expect(result.currentLang).toBe('en');
539
- expect(result.availableLangs.length).toBe(3);
540
- expect(result.availableLangs.includes('zh')).toBeTruthy();
541
- expect(result.availableLangs.includes('en')).toBeTruthy();
542
- expect(result.availableLangs.includes('ug')).toBeTruthy();
543
- });
544
- it('标准包过期', () => {
545
- const browserLang = 'ug';
546
- const store = {
547
- subscription: {
548
- multiLanguage: {
549
- expires: '2000-06-21T15:59:59.999+00:00',
550
- allow: ['zh', 'en', 'ug'],
551
- },
552
- },
553
- defaultLang: 'zh',
554
- };
555
- const result = getCurrentLangAndRange(store as Store, browserLang);
556
- expect(result.currentLang).toBe('zh');
557
- expect(result.availableLangs.length).toBe(1);
558
- expect(result.availableLangs[0]).toBe('zh');
559
- });
560
- it('浏览器是中文,开通了无限版语言包', () => {
561
- const browserLang = 'zh';
562
- const store = {
563
- subscription: {
564
- superMultiLanguage: {
565
- expires: '2100-06-21T15:59:59.999+00:00',
566
- },
567
- },
568
- };
569
- const result = getCurrentLangAndRange(store as Store, browserLang);
570
- expect(result.currentLang).toBe('zh');
571
- expect(result.availableLangs.length).toBe(CONST.LANGUAGE.length);
572
- expect(result.availableLangs.includes(CONST.LANGUAGE[0].code)).toBeTruthy();
573
- });
574
- it('浏览器是未知语言,开通了无限版语言包', () => {
575
- const browserLang = undefined;
576
- const store = {
577
- subscription: {
578
- superMultiLanguage: {
579
- expires: '2100-06-21T15:59:59.999+00:00',
580
- },
581
- },
582
- defaultLang: 'en',
583
- };
584
- const result = getCurrentLangAndRange(store as Store, browserLang);
585
- expect(result.currentLang).toBe('en');
586
- expect(result.availableLangs.length).toBe(CONST.LANGUAGE.length);
587
- expect(result.availableLangs.includes(CONST.LANGUAGE[0].code)).toBeTruthy();
588
- });
589
- it('无限版语言包过期', () => {
590
- const browserLang = 'en';
591
- const store = {
592
- subscription: {
593
- superMultiLanguage: {
594
- expires: '2000-06-21T15:59:59.999+00:00',
595
- },
596
- },
597
- defaultLang: 'zh',
598
- };
599
- const result = getCurrentLangAndRange(store as Store, browserLang);
600
- expect(result.currentLang).toBe('zh');
601
- expect(result.availableLangs.length).toBe(1);
602
- expect(result.availableLangs[0]).toBe('zh');
603
- });
604
- });
605
-
606
- describe('在语言对象中找到当前语言最匹配的值:getNameFromNames', () => {
607
- it('目标语言是中文,而且有可用语言有中文', () => {
608
- const currentLang = 'zh';
609
- const defaultLang = 'en';
610
- const names = {
611
- zh: '中文',
612
- en: 'English',
613
- };
614
- const result = getNameFromNames(names, currentLang, defaultLang);
615
- expect(result).toBe('中文');
616
- });
617
- it('目标语言是法语,但是不在可用语言列表中,默认是英文', () => {
618
- const currentLang = 'fr';
619
- const defaultLang = 'en';
620
- const names = {
621
- zh: '中文',
622
- en: 'English',
623
- };
624
- const result = getNameFromNames(names, currentLang, defaultLang);
625
- expect(result).toBe('English');
626
- });
627
- it('目标语言是法语,但是不在可用语言列表中,默认是中文', () => {
628
- const currentLang = 'fr';
629
- const defaultLang = 'zh';
630
- const names = {
631
- zh: '中文',
632
- en: 'English',
633
- };
634
- const result = getNameFromNames(names, currentLang, defaultLang);
635
- expect(result).toBe('中文');
636
- });
637
- it('目标语言是法语,但是不在可用语言列表中,默认是英文,但是英文也不存在', () => {
638
- const currentLang = 'fr';
639
- const defaultLang = 'en';
640
- const names = {
641
- zh: '中文',
642
- ug: 'Uygur',
643
- };
644
- const result = getNameFromNames(names, currentLang, defaultLang);
645
- expect(result).toBe('中文');
646
- });
647
- it('目标语言是法语,但是不在可用语言列表中,默认是英文,但是所有语言都不存在', () => {
648
- const currentLang = 'fr';
649
- const defaultLang = 'en';
650
- const names = {};
651
- const result = getNameFromNames(names, currentLang, defaultLang);
652
- expect(result).toBeUndefined();
653
- });
654
- it('目标语言是法语,但是不在可用语言列表中,默认是英文,但是多语言对象本身不存在', () => {
655
- const currentLang = 'fr';
656
- const defaultLang = 'en';
657
- const names = undefined;
658
- const result = getNameFromNames(names, currentLang, defaultLang);
659
- expect(result).toBeUndefined();
660
- });
661
- });
662
-
663
- describe('根据语言返回处理过的店铺数据:getStoreByLanguage', () => {
664
- const store = {
665
- name: '旧名字',
666
- names: {
667
- zh: '新店名',
668
- en: 'newStoreName',
669
- },
670
- description: '旧描述',
671
- descriptions: {
672
- en: 'newDescriptions',
673
- },
674
- classifications: [
675
- {
676
- name: '分类旧数据',
677
- names: {
678
- zh: '分类中文',
679
- en: 'classEnglish',
680
- },
681
- },
682
- {
683
- name: '分类旧数据2',
684
- names: {
685
- en: 'classEnglish2',
686
- },
687
- },
688
- ],
689
- dishes: [
690
- {
691
- name: '菜品旧数据',
692
- names: {},
693
- description: '旧描述1',
694
- descriptions: {
695
- zh: '新描述',
696
- en: 'newDescriptions',
697
- },
698
- },
699
- {
700
- name: '菜品旧数据2',
701
- description: '旧描述2',
702
- },
703
- ],
704
- specifications: [
705
- {
706
- names: { zh: '中', en: 'EN' },
707
- content: [
708
- {
709
- names: { zh: '中1', en: 'en1' },
710
- },
711
- {
712
- names: { zh: '中2', en: 'en2' },
713
- },
714
- ],
715
- },
716
- {
717
- names: { zh: '中x', en: 'ENx' },
718
- content: [
719
- {
720
- names: { zh: '中x1', en: 'enx1' },
721
- },
722
- {
723
- names: { en: 'enx2' },
724
- },
725
- ],
726
- },
727
- ],
728
- };
729
-
730
- it('目标语言是中文', () => {
731
- const currentLang = 'zh';
732
- const defaultLang = 'en';
733
- const result = getStoreByLanguage(store as Store, currentLang, defaultLang);
734
- expect(result.name).toBe('新店名');
735
- expect(result.description).toBe('newDescriptions');
736
- expect(result.classifications[0].name).toBe('分类中文');
737
- expect(result.classifications[1].name).toBe('classEnglish2');
738
- expect(result.dishes[0].name).toBe('菜品旧数据');
739
- expect(result.dishes[0].description).toBe('新描述');
740
- expect(result.dishes[1].name).toBe('菜品旧数据2');
741
- expect(result.dishes[1].description).toBe('旧描述2');
742
- expect(result.specifications[0].name).toBe('中');
743
- expect(result.specifications[0].content[0].name).toBe('中1');
744
- expect(result.specifications[0].content[1].name).toBe('中2');
745
- expect(result.specifications[1].content[1].name).toBe('enx2');
746
- });
747
-
748
- it('目标语言是法文,默认语言中文', () => {
749
- const currentLang = 'fr';
750
- const defaultLang = 'zh';
751
- const result = getStoreByLanguage(store as Store, currentLang, defaultLang);
752
- expect(result.name).toBe('新店名');
753
- expect(result.description).toBe('newDescriptions');
754
- expect(result.classifications[0].name).toBe('分类中文');
755
- expect(result.classifications[1].name).toBe('classEnglish2');
756
- expect(result.dishes[0].name).toBe('菜品旧数据');
757
- expect(result.dishes[0].description).toBe('新描述');
758
- expect(result.dishes[1].name).toBe('菜品旧数据2');
759
- expect(result.dishes[1].description).toBe('旧描述2');
760
- expect(result.specifications[0].name).toBe('中');
761
- expect(result.specifications[0].content[0].name).toBe('中1');
762
- expect(result.specifications[0].content[1].name).toBe('中2');
763
- expect(result.specifications[1].content[1].name).toBe('enx2');
764
- });
765
- });
766
-
767
- describe('根据语言返回处理过的订单数据:getOrderByLanguage', () => {
768
- const order = {
769
- content: [
770
- {
771
- dishSnapshot: {
772
- name: '菜名旧数据',
773
- names: {
774
- zh: '菜名中文',
775
- en: 'dishEnglish',
776
- },
777
- selectedSpecifications: [
778
- {
779
- name: '规格旧数据',
780
- names: {
781
- zh: '规格中文',
782
- en: 'specificationEnglish',
783
- },
784
- content: [
785
- {
786
- name: '规格选项旧数据',
787
- names: {
788
- zh: '选项中文',
789
- en: 'specificationOptionEnglish',
790
- },
791
- },
792
- {
793
- name: '规格选项旧数据2',
794
- names: {
795
- zh: '选项中文2',
796
- },
797
- },
798
- ],
799
- },
800
- {
801
- name: '规格旧数据2',
802
- names: {
803
- zh: '规格中文2',
804
- },
805
- content: [
806
- {
807
- name: '规格2选项旧数据',
808
- names: {
809
- zh: '选项2中文',
810
- en: 'specification2OptionEnglish',
811
- },
812
- },
813
- ],
814
- },
815
- ],
816
- },
817
- },
818
- {
819
- dishSnapshot: {
820
- name: '菜名旧数据2',
821
- names: {
822
- en: 'classEnglish2',
823
- },
824
- },
825
- },
826
- ],
827
- tasks: [
828
- { _id: '没有content' },
829
- {
830
- content: [
831
- {
832
- dishSnapshot: {
833
- names: { zh: '中', en: 'EN' },
834
- selectedSpecifications: [
835
- {
836
- names: { en: 'EN' },
837
- content: [
838
- {
839
- names: { zh: '中1', en: 'en1' },
840
- },
841
- {
842
- name: '老数据',
843
- },
844
- ],
845
- },
846
- ],
847
- },
848
- },
849
- {
850
- dishSnapshot: {
851
- names: { zh: '中x', en: 'ENx' },
852
- selectedSpecifications: [
853
- {
854
- name: '老名字',
855
- content: [
856
- {
857
- names: { zh: '中x1', en: 'enx1' },
858
- },
859
- {
860
- names: { en: 'enx2' },
861
- },
862
- ],
863
- },
864
- ],
865
- },
866
- },
867
- ],
868
- },
869
- ],
870
- };
871
-
872
- it('目标语言是英文', () => {
873
- const currentLang = 'en';
874
- const defaultLang = 'en';
875
- const result = getOrderByLanguage(order as Order, currentLang, defaultLang);
876
- expect(result.content[0].dishSnapshot.name).toBe('dishEnglish');
877
- expect(result.content[0].dishSnapshot.selectedSpecifications[0].name).toBe('specificationEnglish');
878
- expect(result.content[0].dishSnapshot.selectedSpecifications[0].content[0].name).toBe(
879
- 'specificationOptionEnglish',
880
- );
881
- expect(result.content[0].dishSnapshot.selectedSpecifications[0].content[1].name).toBe('选项中文2');
882
- expect(result.content[0].dishSnapshot.selectedSpecifications[1].name).toBe('规格中文2');
883
- expect(result.content[0].dishSnapshot.selectedSpecifications[1].content[0].name).toBe(
884
- 'specification2OptionEnglish',
885
- );
886
- expect(result.content[1].dishSnapshot.name).toBe('classEnglish2');
887
- expect(result.tasks[0]['name']).toBeUndefined();
888
- expect(result.tasks[1].content[0].dishSnapshot.name).toBe('EN');
889
- expect(result.tasks[1].content[0].dishSnapshot.selectedSpecifications[0].name).toBe('EN');
890
- expect(result.tasks[1].content[0].dishSnapshot.selectedSpecifications[0].content[0].name).toBe('en1');
891
- expect(result.tasks[1].content[0].dishSnapshot.selectedSpecifications[0].content[1].name).toBe('老数据');
892
- expect(result.tasks[1].content[1].dishSnapshot.name).toBe('ENx');
893
- expect(result.tasks[1].content[1].dishSnapshot.selectedSpecifications[0].name).toBe('老名字');
894
- expect(result.tasks[1].content[1].dishSnapshot.selectedSpecifications[0].content[0].name).toBe('enx1');
895
- expect(result.tasks[1].content[1].dishSnapshot.selectedSpecifications[0].content[1].name).toBe('enx2');
896
- });
897
-
898
- it('目标语言是法语,默认语言是中文', () => {
899
- const currentLang = 'fr';
900
- const defaultLang = 'zh';
901
- const result = getOrderByLanguage(order as Order, currentLang, defaultLang);
902
- expect(result.content[0].dishSnapshot.name).toBe('菜名中文');
903
- expect(result.content[0].dishSnapshot.selectedSpecifications[0].name).toBe('规格中文');
904
- expect(result.content[0].dishSnapshot.selectedSpecifications[0].content[0].name).toBe('选项中文');
905
- expect(result.content[0].dishSnapshot.selectedSpecifications[0].content[1].name).toBe('选项中文2');
906
- expect(result.content[0].dishSnapshot.selectedSpecifications[1].name).toBe('规格中文2');
907
- expect(result.content[0].dishSnapshot.selectedSpecifications[1].content[0].name).toBe('选项2中文');
908
- expect(result.content[1].dishSnapshot.name).toBe('classEnglish2');
909
- expect(result.tasks[0]['name']).toBeUndefined();
910
- expect(result.tasks[1].content[0].dishSnapshot.name).toBe('中');
911
- expect(result.tasks[1].content[0].dishSnapshot.selectedSpecifications[0].name).toBe('EN');
912
- expect(result.tasks[1].content[0].dishSnapshot.selectedSpecifications[0].content[0].name).toBe('中1');
913
- expect(result.tasks[1].content[0].dishSnapshot.selectedSpecifications[0].content[1].name).toBe('老数据');
914
- expect(result.tasks[1].content[1].dishSnapshot.name).toBe('中x');
915
- expect(result.tasks[1].content[1].dishSnapshot.selectedSpecifications[0].name).toBe('老名字');
916
- expect(result.tasks[1].content[1].dishSnapshot.selectedSpecifications[0].content[0].name).toBe('中x1');
917
- expect(result.tasks[1].content[1].dishSnapshot.selectedSpecifications[0].content[1].name).toBe('enx2');
918
- });
919
- });
920
- describe('根据语言返回处理过的订单数据:getOrderByLanguage', () => {
921
- const order = {
922
- content: [
923
- {
924
- dishSnapshot: {
925
- name: '菜名旧数据',
926
- names: {
927
- zh: '菜名中文',
928
- en: 'dishEnglish',
929
- },
930
- selectedSpecifications: [
931
- {
932
- name: '规格旧数据',
933
- names: {
934
- zh: '规格中文',
935
- en: 'specificationEnglish',
936
- },
937
- content: [
938
- {
939
- name: '规格选项旧数据',
940
- names: {
941
- zh: '选项中文',
942
- en: 'specificationOptionEnglish',
943
- },
944
- },
945
- {
946
- name: '规格选项旧数据2',
947
- names: {
948
- zh: '选项中文2',
949
- },
950
- },
951
- ],
952
- },
953
- {
954
- name: '规格旧数据2',
955
- names: {
956
- zh: '规格中文2',
957
- },
958
- content: [
959
- {
960
- name: '规格2选项旧数据',
961
- names: {
962
- zh: '选项2中文',
963
- en: 'specification2OptionEnglish',
964
- },
965
- },
966
- ],
967
- },
968
- ],
969
- },
970
- },
971
- {
972
- dishSnapshot: {
973
- name: '菜名旧数据2',
974
- names: {
975
- en: 'classEnglish2',
976
- },
977
- },
978
- },
979
- ],
980
- tasks: [
981
- { _id: '没有content' },
982
- {
983
- content: [
984
- {
985
- dishSnapshot: {
986
- names: { zh: '中', en: 'EN' },
987
- selectedSpecifications: [
988
- {
989
- names: { en: 'EN' },
990
- content: [
991
- {
992
- names: { zh: '中1', en: 'en1' },
993
- },
994
- {
995
- name: '老数据',
996
- },
997
- ],
998
- },
999
- ],
1000
- },
1001
- },
1002
- {
1003
- dishSnapshot: {
1004
- names: { zh: '中x', en: 'ENx' },
1005
- selectedSpecifications: [
1006
- {
1007
- name: '老名字',
1008
- content: [
1009
- {
1010
- names: { zh: '中x1', en: 'enx1' },
1011
- },
1012
- {
1013
- names: { en: 'enx2' },
1014
- },
1015
- ],
1016
- },
1017
- ],
1018
- },
1019
- },
1020
- ],
1021
- },
1022
- ],
1023
- };
1024
-
1025
- it('目标语言是英文', () => {
1026
- const currentLang = 'en';
1027
- const defaultLang = 'en';
1028
- const result = getOrderByLanguage(order as Order, currentLang, defaultLang);
1029
- expect(result.content[0].dishSnapshot.name).toBe('dishEnglish');
1030
- expect(result.content[0].dishSnapshot.selectedSpecifications[0].name).toBe('specificationEnglish');
1031
- expect(result.content[0].dishSnapshot.selectedSpecifications[0].content[0].name).toBe(
1032
- 'specificationOptionEnglish',
1033
- );
1034
- expect(result.content[0].dishSnapshot.selectedSpecifications[0].content[1].name).toBe('选项中文2');
1035
- expect(result.content[0].dishSnapshot.selectedSpecifications[1].name).toBe('规格中文2');
1036
- expect(result.content[0].dishSnapshot.selectedSpecifications[1].content[0].name).toBe(
1037
- 'specification2OptionEnglish',
1038
- );
1039
- expect(result.content[1].dishSnapshot.name).toBe('classEnglish2');
1040
- expect(result.tasks[0]['name']).toBeUndefined();
1041
- expect(result.tasks[1].content[0].dishSnapshot.name).toBe('EN');
1042
- expect(result.tasks[1].content[0].dishSnapshot.selectedSpecifications[0].name).toBe('EN');
1043
- expect(result.tasks[1].content[0].dishSnapshot.selectedSpecifications[0].content[0].name).toBe('en1');
1044
- expect(result.tasks[1].content[0].dishSnapshot.selectedSpecifications[0].content[1].name).toBe('老数据');
1045
- expect(result.tasks[1].content[1].dishSnapshot.name).toBe('ENx');
1046
- expect(result.tasks[1].content[1].dishSnapshot.selectedSpecifications[0].name).toBe('老名字');
1047
- expect(result.tasks[1].content[1].dishSnapshot.selectedSpecifications[0].content[0].name).toBe('enx1');
1048
- expect(result.tasks[1].content[1].dishSnapshot.selectedSpecifications[0].content[1].name).toBe('enx2');
1049
- });
1050
-
1051
- it('目标语言是法语,默认语言是中文', () => {
1052
- const currentLang = 'fr';
1053
- const defaultLang = 'zh';
1054
- const result = getOrderByLanguage(order as Order, currentLang, defaultLang);
1055
- expect(result.content[0].dishSnapshot.name).toBe('菜名中文');
1056
- expect(result.content[0].dishSnapshot.selectedSpecifications[0].name).toBe('规格中文');
1057
- expect(result.content[0].dishSnapshot.selectedSpecifications[0].content[0].name).toBe('选项中文');
1058
- expect(result.content[0].dishSnapshot.selectedSpecifications[0].content[1].name).toBe('选项中文2');
1059
- expect(result.content[0].dishSnapshot.selectedSpecifications[1].name).toBe('规格中文2');
1060
- expect(result.content[0].dishSnapshot.selectedSpecifications[1].content[0].name).toBe('选项2中文');
1061
- expect(result.content[1].dishSnapshot.name).toBe('classEnglish2');
1062
- expect(result.tasks[0]['name']).toBeUndefined();
1063
- expect(result.tasks[1].content[0].dishSnapshot.name).toBe('中');
1064
- expect(result.tasks[1].content[0].dishSnapshot.selectedSpecifications[0].name).toBe('EN');
1065
- expect(result.tasks[1].content[0].dishSnapshot.selectedSpecifications[0].content[0].name).toBe('中1');
1066
- expect(result.tasks[1].content[0].dishSnapshot.selectedSpecifications[0].content[1].name).toBe('老数据');
1067
- expect(result.tasks[1].content[1].dishSnapshot.name).toBe('中x');
1068
- expect(result.tasks[1].content[1].dishSnapshot.selectedSpecifications[0].name).toBe('老名字');
1069
- expect(result.tasks[1].content[1].dishSnapshot.selectedSpecifications[0].content[0].name).toBe('中x1');
1070
- expect(result.tasks[1].content[1].dishSnapshot.selectedSpecifications[0].content[1].name).toBe('enx2');
1071
- });
1072
- });
1073
-
1074
- describe('测试根据区号返回语言码-getLanguageFromCountryCode', () => {
1075
- it('86应该返回zh', () => {
1076
- expect(getLanguageFromCountryCode('86')).toBe('zh');
1077
- });
1078
- it('非86应该返回en', () => {
1079
- expect(getLanguageFromCountryCode('94')).toBe('en');
1080
- });
1081
- });
1082
- });
1
+ import {
2
+ calcTotalPrice,
3
+ calcReceivablePrice,
4
+ calcReceived,
5
+ getReadbleProcess,
6
+ calcLeft,
7
+ parseMoney,
8
+ checkStoreSubscription,
9
+ CHECK_STORE_SUBSCRIPTION_REASON,
10
+ Store,
11
+ getCurrentLangAndRange,
12
+ getNameFromNames,
13
+ getStoreByLanguage,
14
+ getOrderByLanguage,
15
+ Order,
16
+ getLanguageFromCountryCode,
17
+ } from './index';
18
+ import * as order1 from '../josn-hub/orders/点了未加价规格的订单';
19
+ import * as order2 from '../josn-hub/orders/点了不加价和固定加减价规格的订单';
20
+ import * as order3 from '../josn-hub/orders/点了固定加价-百分比加价规格的订单';
21
+ import * as order4 from '../josn-hub/orders/有一个菜的价格是负数的情况';
22
+ import * as order5 from '../josn-hub/orders/整单价格都是负数的情况';
23
+ import * as order6 from '../josn-hub/orders/点了未加价规格的订单并有配送费';
24
+ import * as halfRetreatOrder from '../josn-hub/orders/部分退菜的情况';
25
+ import * as buffetOrder from '../josn-hub/orders/自助餐的情况';
26
+ import * as taxOrder from '../josn-hub/orders/tax-order';
27
+ import * as taxHavePriceBindOrder from '../josn-hub/orders/tax-have-price-bind-order';
28
+
29
+ import { CONST } from './const/const';
30
+
31
+ describe('开始运行单元测试', () => {
32
+ // beforeEach(async () => {
33
+ // const app: TestingModule = await Test.createTestingModule({
34
+ // controllers: [AppController],
35
+ // providers: [AppService],
36
+ // }).compile();
37
+
38
+ // appController = app.get<AppController>(AppController);
39
+ // });
40
+
41
+ describe('测试计算订单总价:calcTotalPrice', () => {
42
+ it('自助餐情况下总价检查', () => {
43
+ expect(calcTotalPrice(buffetOrder.order)).toBe(buffetOrder.expectPrice);
44
+ });
45
+ it('部分退菜情况下总价检查', () => {
46
+ expect(calcTotalPrice(halfRetreatOrder.order)).toBe(halfRetreatOrder.expectPrice);
47
+ });
48
+ it('不加价规格订单总价检查', () => {
49
+ expect(calcTotalPrice(order1.order)).toBe(order1.expectPrice);
50
+ });
51
+ it('点了不加价和固定加减价规格的订单', () => {
52
+ expect(calcTotalPrice(order2.order)).toBe(order2.expectPrice);
53
+ });
54
+ it('点了不加价-固定加价-百分比加价规格的订单', () => {
55
+ expect(calcTotalPrice(order3.order)).toBe(order3.expectPrice);
56
+ });
57
+ it('有一个菜的价格是负数的情况', () => {
58
+ expect(calcTotalPrice(order4.order)).toBe(order4.expectPrice);
59
+ });
60
+ it('整单价格都是负数的情况', () => {
61
+ expect(calcTotalPrice(order5.order)).toBe(order5.expectPrice);
62
+ });
63
+ it('配送费检查', () => {
64
+ expect(calcTotalPrice(order6.order)).toBe(order6.expectPrice);
65
+ });
66
+ });
67
+
68
+ describe('测试计算应收金额:calcReceivablePrice', () => {
69
+ it('抹零0位', () => {
70
+ const result = calcReceivablePrice(order1.order, [
71
+ {
72
+ type: CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE,
73
+ value: 0,
74
+ },
75
+ ]);
76
+ expect(result.totalPrice).toBe(order1.expectPrice);
77
+ expect(result.receivablePrice).toBe(order1.expectPrice);
78
+ expect(result.resultProcessArr.length).toBe(1);
79
+ expect(result.resultProcessArr[0].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE);
80
+ expect(result.resultProcessArr[0].volume).toBeCloseTo(0);
81
+ });
82
+ it('抹零1位', () => {
83
+ const result = calcReceivablePrice(order1.order, [
84
+ {
85
+ type: CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE,
86
+ value: 1,
87
+ },
88
+ ]);
89
+ expect(result.receivablePrice).toBe(19.5);
90
+ expect(result.resultProcessArr.length).toBe(1);
91
+ expect(result.resultProcessArr[0].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE);
92
+ expect(result.resultProcessArr[0].volume).toBeCloseTo(-0.05);
93
+ });
94
+ it('抹零3位', () => {
95
+ const result = calcReceivablePrice(order1.order, [
96
+ {
97
+ type: CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE,
98
+ value: 3,
99
+ },
100
+ ]);
101
+ expect(result.receivablePrice).toBe(10);
102
+ expect(result.resultProcessArr.length).toBe(1);
103
+ expect(result.resultProcessArr[0].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE);
104
+ expect(result.resultProcessArr[0].volume).toBeCloseTo(-9.55);
105
+ });
106
+ it('抹零6位', () => {
107
+ const result = calcReceivablePrice(order1.order, [
108
+ {
109
+ type: CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE,
110
+ value: 6,
111
+ },
112
+ ]);
113
+ expect(result.receivablePrice).toBe(0);
114
+ expect(result.resultProcessArr.length).toBe(1);
115
+ expect(result.resultProcessArr[0].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE);
116
+ expect(result.resultProcessArr[0].volume).toBeCloseTo(-19.55);
117
+ });
118
+ it('抹零3位 + 打9折', () => {
119
+ const result = calcReceivablePrice(order1.order, [
120
+ {
121
+ type: CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE,
122
+ value: 3,
123
+ },
124
+ {
125
+ type: CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE,
126
+ value: 9,
127
+ },
128
+ ]);
129
+ expect(result.receivablePrice).toBe(10);
130
+ expect(result.resultProcessArr.length).toBe(2);
131
+ expect(result.resultProcessArr[0].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE);
132
+ expect(result.resultProcessArr[0].volume).toBeCloseTo(-1.955);
133
+ expect(result.resultProcessArr[1].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE);
134
+ expect(result.resultProcessArr[1].volume).toBeCloseTo(-7.595);
135
+ });
136
+ it('打7.5折 + 抹零2位', () => {
137
+ const result = calcReceivablePrice(order1.order, [
138
+ {
139
+ type: CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE,
140
+ value: 7.5,
141
+ },
142
+ {
143
+ type: CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE,
144
+ value: 2,
145
+ },
146
+ ]);
147
+ expect(result.receivablePrice).toBe(14);
148
+ expect(result.resultProcessArr.length).toBe(2);
149
+ expect(result.resultProcessArr[0].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE);
150
+ expect(result.resultProcessArr[0].volume).toBeCloseTo(-4.8875);
151
+ expect(result.resultProcessArr[1].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE);
152
+ expect(result.resultProcessArr[1].volume).toBeCloseTo(-0.6625);
153
+ });
154
+ it('打8折 + 抹零2位 + 让价10元', () => {
155
+ const result = calcReceivablePrice(order1.order, [
156
+ {
157
+ type: CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE,
158
+ value: 8,
159
+ },
160
+ {
161
+ type: CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE,
162
+ value: 2,
163
+ },
164
+ {
165
+ type: CONST.RECEIVABLE_PROCESSING_TYPE.MARKDOWN.TYPE,
166
+ value: 10,
167
+ },
168
+ ]);
169
+ expect(result.receivablePrice).toBe(5);
170
+ expect(result.resultProcessArr.length).toBe(3);
171
+ expect(result.resultProcessArr[0].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE);
172
+ expect(result.resultProcessArr[0].volume).toBeCloseTo(-3.91);
173
+ expect(result.resultProcessArr[1].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.MARKDOWN.TYPE);
174
+ expect(result.resultProcessArr[1].volume).toBeCloseTo(-10);
175
+ expect(result.resultProcessArr[2].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE);
176
+ expect(result.resultProcessArr[2].volume).toBeCloseTo(-0.64);
177
+ });
178
+ it('打8折 + 抹零2位 + 让价10元, 并且有一部分价格不参与打折, 商品税单价不含税,计算税额', () => {
179
+ const result = calcReceivablePrice(taxOrder.order, [
180
+ {
181
+ type: CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE,
182
+ value: 8,
183
+ },
184
+ {
185
+ type: CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE,
186
+ value: 2,
187
+ },
188
+ {
189
+ type: CONST.RECEIVABLE_PROCESSING_TYPE.MARKDOWN.TYPE,
190
+ value: 10,
191
+ },
192
+ ]);
193
+ expect(result.totalPrice).toBe(20);
194
+ expect(result.receivablePrice).toBe(7.76);
195
+ expect(result.resultProcessArr.length).toBe(3);
196
+ expect(result.resultProcessArr[0].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE);
197
+ expect(result.resultProcessArr[0].volume).toBeCloseTo(-3);
198
+ expect(result.resultProcessArr[1].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.MARKDOWN.TYPE);
199
+ expect(result.resultProcessArr[1].volume).toBeCloseTo(-10);
200
+ expect(result.resultProcessArr[2].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE);
201
+ expect(result.resultProcessArr[2].volume).toBeCloseTo(-0);
202
+ expect(result.taxArr.length).toBe(4);
203
+ expect(result.taxArr[0].name).toBe('tax1(10%)');
204
+ expect(result.taxArr[0].volume).toBe(0.21);
205
+ expect(result.taxArr[1].name).toBe('tax2(5%)');
206
+ expect(result.taxArr[1].volume).toBe(0.1);
207
+ expect(result.taxArr[2].name).toBe('tax1(5%)');
208
+ expect(result.taxArr[2].volume).toBe(0.15);
209
+ expect(result.taxArr[3].name).toBe('tax2(10%)');
210
+ expect(result.taxArr[3].volume).toBe(0.3);
211
+ });
212
+ it('打8折 + 抹零2位 + 让价10元, 并且有一部分价格不参与打折, 免税', () => {
213
+ const result = calcReceivablePrice(
214
+ taxOrder.order,
215
+ [
216
+ {
217
+ type: CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE,
218
+ value: 8,
219
+ },
220
+ {
221
+ type: CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE,
222
+ value: 2,
223
+ },
224
+ {
225
+ type: CONST.RECEIVABLE_PROCESSING_TYPE.MARKDOWN.TYPE,
226
+ value: 10,
227
+ },
228
+ ],
229
+ true,
230
+ );
231
+ expect(result.totalPrice).toBe(20);
232
+ expect(result.receivablePrice).toBe(7);
233
+ expect(result.resultProcessArr.length).toBe(3);
234
+ expect(result.resultProcessArr[0].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE);
235
+ expect(result.resultProcessArr[0].volume).toBeCloseTo(-3);
236
+ expect(result.resultProcessArr[1].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.MARKDOWN.TYPE);
237
+ expect(result.resultProcessArr[1].volume).toBeCloseTo(-10);
238
+ expect(result.resultProcessArr[2].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE);
239
+ expect(result.resultProcessArr[2].volume).toBeCloseTo(-0);
240
+ });
241
+ it('打8折 + 抹零2位 + 让价10元, 并且有一部分价格不参与打折, 整单税单价含税,计算税额', () => {
242
+ const result = calcReceivablePrice(taxHavePriceBindOrder.order, [
243
+ {
244
+ type: CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE,
245
+ value: 8,
246
+ },
247
+ {
248
+ type: CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE,
249
+ value: 2,
250
+ },
251
+ {
252
+ type: CONST.RECEIVABLE_PROCESSING_TYPE.MARKDOWN.TYPE,
253
+ value: 10,
254
+ },
255
+ ]);
256
+ expect(result.totalPrice).toBe(20);
257
+ expect(result.receivablePrice).toBe(7);
258
+ expect(result.resultProcessArr.length).toBe(3);
259
+ expect(result.resultProcessArr[0].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.DISCOUNT.TYPE);
260
+ expect(result.resultProcessArr[0].volume).toBeCloseTo(-3);
261
+ expect(result.resultProcessArr[1].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.MARKDOWN.TYPE);
262
+ expect(result.resultProcessArr[1].volume).toBeCloseTo(-10);
263
+ expect(result.resultProcessArr[2].type).toBe(CONST.RECEIVABLE_PROCESSING_TYPE.REMOVE_TAILS.TYPE);
264
+ expect(result.resultProcessArr[2].volume).toBeCloseTo(-0);
265
+ expect(result.taxArr.length).toBe(2);
266
+ expect(result.taxArr[0].name).toBe('税1(10%)');
267
+ expect(result.taxArr[0].volume).toBe(0.61);
268
+ expect(result.taxArr[1].name).toBe('税2(5%)');
269
+ expect(result.taxArr[1].volume).toBe(0.3);
270
+ });
271
+ });
272
+
273
+ describe('测试计算已收金额:calcReceived', () => {
274
+ it('没有该字段返回0', () => {
275
+ expect(calcReceived(undefined)).toBe(0);
276
+ });
277
+ it('计算两笔金额的总数', () => {
278
+ expect(
279
+ calcReceived([
280
+ {
281
+ type: CONST.CHECKOUT_TYPE.CASH.TYPE,
282
+ amount: 45.64,
283
+ },
284
+ {
285
+ type: CONST.CHECKOUT_TYPE.WECHAT.TYPE,
286
+ amount: 66.87,
287
+ },
288
+ ]),
289
+ ).toBe(112.51);
290
+ });
291
+ it('有退款的情况下计算两笔金额的总数', () => {
292
+ expect(
293
+ calcReceived([
294
+ {
295
+ type: CONST.CHECKOUT_TYPE.CASH.TYPE,
296
+ amount: 45.64,
297
+ },
298
+ {
299
+ type: CONST.CHECKOUT_TYPE.WECHAT.TYPE,
300
+ amount: 66.87,
301
+ },
302
+ {
303
+ type: CONST.CHECKOUT_TYPE.WECHAT.TYPE,
304
+ amount: 66.87,
305
+ retreated: true,
306
+ },
307
+ ]),
308
+ ).toBe(112.51);
309
+ });
310
+ });
311
+
312
+ describe('测试可读的订单处理过程:getReadbleProcess', () => {
313
+ it('输入打折过程,应该返回“打X折字段”', () => {
314
+ expect(
315
+ getReadbleProcess({
316
+ type: 'discount',
317
+ value: 9,
318
+ volume: -0.8,
319
+ }),
320
+ ).toBe('打9折');
321
+ });
322
+ it('输入抹零过程,应该返回“抹零”', () => {
323
+ expect(
324
+ getReadbleProcess({
325
+ type: 'remove_tails',
326
+ value: 2,
327
+ volume: -0.20000000000000018,
328
+ }),
329
+ ).toBe('抹零');
330
+ });
331
+ });
332
+
333
+ describe('测试计算剩余金额:calcLeft', () => {
334
+ it('去掉因为js计算的尾数 10.56 - 10', () => {
335
+ expect(calcLeft(10.56, 10)).toBe(0.56);
336
+ });
337
+ it('去掉因为js计算的尾数 10.56 - 10 - 0.56', () => {
338
+ expect(calcLeft(10.56 - 10, 0.56)).toBe(0);
339
+ });
340
+ it('负数情况', () => {
341
+ expect(calcLeft(10.56, 11)).toBeCloseTo(-0.44);
342
+ });
343
+ });
344
+
345
+ describe('测试格式化金额:parseMoney', () => {
346
+ it('尾数高位', () => {
347
+ expect(parseMoney(10.5650000000001)).toBe(10.57);
348
+ });
349
+ it('尾数低位', () => {
350
+ expect(parseMoney(10.560000000001)).toBe(10.56);
351
+ });
352
+ it('负数中位', () => {
353
+ expect(parseMoney(10.56499999999)).toBeCloseTo(10.56);
354
+ });
355
+ });
356
+
357
+ describe('测试店铺开通订阅检查:checkStoreSubscription', () => {
358
+ it('未购买任何模块的情况', () => {
359
+ const store = { subscription: undefined };
360
+ const moduleId = 'kds';
361
+ expect(checkStoreSubscription(store as Store, moduleId).result).toBe(false);
362
+ expect(checkStoreSubscription(store as Store, moduleId).reason).toBe(
363
+ CHECK_STORE_SUBSCRIPTION_REASON.NeedBuy,
364
+ );
365
+ });
366
+ it('购买了其他模块的情况', () => {
367
+ const store = {
368
+ subscription: {
369
+ base: {
370
+ expires: '2021-06-21T15:59:59.999+00:00',
371
+ },
372
+ },
373
+ };
374
+ const moduleId = 'kds';
375
+ expect(checkStoreSubscription(store as Store, moduleId).result).toBe(false);
376
+ expect(checkStoreSubscription(store as Store, moduleId).reason).toBe(
377
+ CHECK_STORE_SUBSCRIPTION_REASON.NeedBuy,
378
+ );
379
+ });
380
+ it('已过期的情况', () => {
381
+ const store = {
382
+ subscription: {
383
+ kds: {
384
+ expires: '2000-06-21T15:59:59.999+00:00',
385
+ },
386
+ },
387
+ };
388
+ const moduleId = 'kds';
389
+ expect(checkStoreSubscription(store as Store, moduleId).result).toBe(false);
390
+ expect(checkStoreSubscription(store as Store, moduleId).reason).toBe(
391
+ CHECK_STORE_SUBSCRIPTION_REASON.Expires,
392
+ );
393
+ });
394
+ it('永久开通的情况', () => {
395
+ const store = {
396
+ subscription: {
397
+ kds: {
398
+ expires: '2000-06-21T15:59:59.999+00:00',
399
+ permanent: true,
400
+ },
401
+ },
402
+ };
403
+ const moduleId = 'kds';
404
+ expect(checkStoreSubscription(store as Store, moduleId).result).toBe(true);
405
+ });
406
+ it('未过期的情况', () => {
407
+ const store = {
408
+ subscription: {
409
+ kds: {
410
+ expires: '2100-06-21T15:59:59.999+00:00',
411
+ },
412
+ },
413
+ };
414
+ const moduleId = 'kds';
415
+ expect(checkStoreSubscription(store as Store, moduleId).result).toBe(true);
416
+ });
417
+ it('传入对比时间字符串的情况', () => {
418
+ const store = {
419
+ subscription: {
420
+ kds: {
421
+ expires: '2100-06-21T15:59:59.999+00:00',
422
+ },
423
+ },
424
+ };
425
+ const moduleId = 'kds';
426
+ expect(checkStoreSubscription(store as Store, moduleId, '2101-06-21T15:59:59.999+00:00').result).toBe(
427
+ false,
428
+ );
429
+ });
430
+ it('传入对比时间对象的情况', () => {
431
+ const store = {
432
+ subscription: {
433
+ kds: {
434
+ expires: '2100-06-21T15:59:59.999+00:00',
435
+ },
436
+ },
437
+ };
438
+ const moduleId = 'kds';
439
+ expect(
440
+ checkStoreSubscription(store as Store, moduleId, new Date('2101-06-21T15:59:59.999+00:00')).result,
441
+ ).toBe(false);
442
+ });
443
+ it('传入当前时间戳的情况', () => {
444
+ const store = {
445
+ subscription: {
446
+ kds: {
447
+ expires: '2100-06-21T15:59:59.999+00:00',
448
+ },
449
+ },
450
+ };
451
+ const moduleId = 'kds';
452
+ expect(checkStoreSubscription(store as Store, moduleId, Date.now()).result).toBe(true);
453
+ });
454
+ it('传入将来时间戳的情况', () => {
455
+ const store = {
456
+ subscription: {
457
+ kds: {
458
+ expires: '2100-06-21T15:59:59.999+00:00',
459
+ },
460
+ },
461
+ };
462
+ const moduleId = 'kds';
463
+ expect(
464
+ checkStoreSubscription(store as Store, moduleId, Date.parse('2101-06-21T15:59:59.999+00:00')).result,
465
+ ).toBe(false);
466
+ });
467
+ });
468
+
469
+ describe('根据店铺获取当前应该用的语言:getCurrentLangAndRange', () => {
470
+ it('浏览器是中文,店铺默认语言中文,什么包都没开通', () => {
471
+ const browserLang = 'zh';
472
+ const store = {
473
+ subscription: {},
474
+ defaultLang: 'zh',
475
+ };
476
+ const result = getCurrentLangAndRange(store as Store, browserLang);
477
+ expect(result.currentLang).toBe('zh');
478
+ expect(result.availableLangs.length).toBe(1);
479
+ expect(result.availableLangs[0]).toBe('zh');
480
+ });
481
+ it('浏览器是英语,店铺默认语言中文,什么包都没开通', () => {
482
+ const browserLang = 'en';
483
+ const store = {
484
+ subscription: {},
485
+ defaultLang: 'zh',
486
+ };
487
+ const result = getCurrentLangAndRange(store as Store, browserLang);
488
+ expect(result.currentLang).toBe('zh');
489
+ expect(result.availableLangs.length).toBe(1);
490
+ expect(result.availableLangs[0]).toBe('zh');
491
+ });
492
+ it('浏览器是英文,开通了标准版语言包,选择语言维语', () => {
493
+ const browserLang = 'en';
494
+ const store = {
495
+ subscription: {
496
+ multiLanguage: {
497
+ expires: '2100-06-21T15:59:59.999+00:00',
498
+ allow: ['zh', 'en', 'ug'],
499
+ },
500
+ },
501
+ };
502
+ const result = getCurrentLangAndRange(store as Store, browserLang);
503
+ expect(result.currentLang).toBe('en');
504
+ expect(result.availableLangs.length).toBe(3);
505
+ expect(result.availableLangs.includes('zh')).toBeTruthy();
506
+ expect(result.availableLangs.includes('en')).toBeTruthy();
507
+ expect(result.availableLangs.includes('ug')).toBeTruthy();
508
+ });
509
+ it('浏览器是维语,开通了标准版语言包,选择语言维语', () => {
510
+ const browserLang = 'ug';
511
+ const store = {
512
+ subscription: {
513
+ multiLanguage: {
514
+ expires: '2100-06-21T15:59:59.999+00:00',
515
+ allow: ['zh', 'en', 'ug'],
516
+ },
517
+ },
518
+ };
519
+ const result = getCurrentLangAndRange(store as Store, browserLang);
520
+ expect(result.currentLang).toBe('ug');
521
+ expect(result.availableLangs.length).toBe(3);
522
+ expect(result.availableLangs.includes('zh')).toBeTruthy();
523
+ expect(result.availableLangs.includes('en')).toBeTruthy();
524
+ expect(result.availableLangs.includes('ug')).toBeTruthy();
525
+ });
526
+ it('浏览器是未知语言,默认英文,开通了标准版语言包,选择语言维语', () => {
527
+ const browserLang = undefined;
528
+ const store = {
529
+ subscription: {
530
+ multiLanguage: {
531
+ expires: '2100-06-21T15:59:59.999+00:00',
532
+ allow: ['zh', 'en', 'ug'],
533
+ },
534
+ },
535
+ defaultLang: 'en',
536
+ };
537
+ const result = getCurrentLangAndRange(store as Store, browserLang);
538
+ expect(result.currentLang).toBe('en');
539
+ expect(result.availableLangs.length).toBe(3);
540
+ expect(result.availableLangs.includes('zh')).toBeTruthy();
541
+ expect(result.availableLangs.includes('en')).toBeTruthy();
542
+ expect(result.availableLangs.includes('ug')).toBeTruthy();
543
+ });
544
+ it('标准包过期', () => {
545
+ const browserLang = 'ug';
546
+ const store = {
547
+ subscription: {
548
+ multiLanguage: {
549
+ expires: '2000-06-21T15:59:59.999+00:00',
550
+ allow: ['zh', 'en', 'ug'],
551
+ },
552
+ },
553
+ defaultLang: 'zh',
554
+ };
555
+ const result = getCurrentLangAndRange(store as Store, browserLang);
556
+ expect(result.currentLang).toBe('zh');
557
+ expect(result.availableLangs.length).toBe(1);
558
+ expect(result.availableLangs[0]).toBe('zh');
559
+ });
560
+ it('浏览器是中文,开通了无限版语言包', () => {
561
+ const browserLang = 'zh';
562
+ const store = {
563
+ subscription: {
564
+ superMultiLanguage: {
565
+ expires: '2100-06-21T15:59:59.999+00:00',
566
+ },
567
+ },
568
+ };
569
+ const result = getCurrentLangAndRange(store as Store, browserLang);
570
+ expect(result.currentLang).toBe('zh');
571
+ expect(result.availableLangs.length).toBe(CONST.LANGUAGE.length);
572
+ expect(result.availableLangs.includes(CONST.LANGUAGE[0].code)).toBeTruthy();
573
+ });
574
+ it('浏览器是未知语言,开通了无限版语言包', () => {
575
+ const browserLang = undefined;
576
+ const store = {
577
+ subscription: {
578
+ superMultiLanguage: {
579
+ expires: '2100-06-21T15:59:59.999+00:00',
580
+ },
581
+ },
582
+ defaultLang: 'en',
583
+ };
584
+ const result = getCurrentLangAndRange(store as Store, browserLang);
585
+ expect(result.currentLang).toBe('en');
586
+ expect(result.availableLangs.length).toBe(CONST.LANGUAGE.length);
587
+ expect(result.availableLangs.includes(CONST.LANGUAGE[0].code)).toBeTruthy();
588
+ });
589
+ it('无限版语言包过期', () => {
590
+ const browserLang = 'en';
591
+ const store = {
592
+ subscription: {
593
+ superMultiLanguage: {
594
+ expires: '2000-06-21T15:59:59.999+00:00',
595
+ },
596
+ },
597
+ defaultLang: 'zh',
598
+ };
599
+ const result = getCurrentLangAndRange(store as Store, browserLang);
600
+ expect(result.currentLang).toBe('zh');
601
+ expect(result.availableLangs.length).toBe(1);
602
+ expect(result.availableLangs[0]).toBe('zh');
603
+ });
604
+ });
605
+
606
+ describe('在语言对象中找到当前语言最匹配的值:getNameFromNames', () => {
607
+ it('目标语言是中文,而且有可用语言有中文', () => {
608
+ const currentLang = 'zh';
609
+ const defaultLang = 'en';
610
+ const names = {
611
+ zh: '中文',
612
+ en: 'English',
613
+ };
614
+ const result = getNameFromNames(names, currentLang, defaultLang);
615
+ expect(result).toBe('中文');
616
+ });
617
+ it('目标语言是法语,但是不在可用语言列表中,默认是英文', () => {
618
+ const currentLang = 'fr';
619
+ const defaultLang = 'en';
620
+ const names = {
621
+ zh: '中文',
622
+ en: 'English',
623
+ };
624
+ const result = getNameFromNames(names, currentLang, defaultLang);
625
+ expect(result).toBe('English');
626
+ });
627
+ it('目标语言是法语,但是不在可用语言列表中,默认是中文', () => {
628
+ const currentLang = 'fr';
629
+ const defaultLang = 'zh';
630
+ const names = {
631
+ zh: '中文',
632
+ en: 'English',
633
+ };
634
+ const result = getNameFromNames(names, currentLang, defaultLang);
635
+ expect(result).toBe('中文');
636
+ });
637
+ it('目标语言是法语,但是不在可用语言列表中,默认是英文,但是英文也不存在', () => {
638
+ const currentLang = 'fr';
639
+ const defaultLang = 'en';
640
+ const names = {
641
+ zh: '中文',
642
+ ug: 'Uygur',
643
+ };
644
+ const result = getNameFromNames(names, currentLang, defaultLang);
645
+ expect(result).toBe('中文');
646
+ });
647
+ it('目标语言是法语,但是不在可用语言列表中,默认是英文,但是所有语言都不存在', () => {
648
+ const currentLang = 'fr';
649
+ const defaultLang = 'en';
650
+ const names = {};
651
+ const result = getNameFromNames(names, currentLang, defaultLang);
652
+ expect(result).toBeUndefined();
653
+ });
654
+ it('目标语言是法语,但是不在可用语言列表中,默认是英文,但是多语言对象本身不存在', () => {
655
+ const currentLang = 'fr';
656
+ const defaultLang = 'en';
657
+ const names = undefined;
658
+ const result = getNameFromNames(names, currentLang, defaultLang);
659
+ expect(result).toBeUndefined();
660
+ });
661
+ });
662
+
663
+ describe('根据语言返回处理过的店铺数据:getStoreByLanguage', () => {
664
+ const store = {
665
+ name: '旧名字',
666
+ names: {
667
+ zh: '新店名',
668
+ en: 'newStoreName',
669
+ },
670
+ description: '旧描述',
671
+ descriptions: {
672
+ en: 'newDescriptions',
673
+ },
674
+ classifications: [
675
+ {
676
+ name: '分类旧数据',
677
+ names: {
678
+ zh: '分类中文',
679
+ en: 'classEnglish',
680
+ },
681
+ },
682
+ {
683
+ name: '分类旧数据2',
684
+ names: {
685
+ en: 'classEnglish2',
686
+ },
687
+ },
688
+ ],
689
+ dishes: [
690
+ {
691
+ name: '菜品旧数据',
692
+ names: {},
693
+ description: '旧描述1',
694
+ descriptions: {
695
+ zh: '新描述',
696
+ en: 'newDescriptions',
697
+ },
698
+ },
699
+ {
700
+ name: '菜品旧数据2',
701
+ description: '旧描述2',
702
+ },
703
+ ],
704
+ specifications: [
705
+ {
706
+ names: { zh: '中', en: 'EN' },
707
+ content: [
708
+ {
709
+ names: { zh: '中1', en: 'en1' },
710
+ },
711
+ {
712
+ names: { zh: '中2', en: 'en2' },
713
+ },
714
+ ],
715
+ },
716
+ {
717
+ names: { zh: '中x', en: 'ENx' },
718
+ content: [
719
+ {
720
+ names: { zh: '中x1', en: 'enx1' },
721
+ },
722
+ {
723
+ names: { en: 'enx2' },
724
+ },
725
+ ],
726
+ },
727
+ ],
728
+ };
729
+
730
+ it('目标语言是中文', () => {
731
+ const currentLang = 'zh';
732
+ const defaultLang = 'en';
733
+ const result = getStoreByLanguage(store as Store, currentLang, defaultLang);
734
+ expect(result.name).toBe('新店名');
735
+ expect(result.description).toBe('newDescriptions');
736
+ expect(result.classifications[0].name).toBe('分类中文');
737
+ expect(result.classifications[1].name).toBe('classEnglish2');
738
+ expect(result.dishes[0].name).toBe('菜品旧数据');
739
+ expect(result.dishes[0].description).toBe('新描述');
740
+ expect(result.dishes[1].name).toBe('菜品旧数据2');
741
+ expect(result.dishes[1].description).toBe('旧描述2');
742
+ expect(result.specifications[0].name).toBe('中');
743
+ expect(result.specifications[0].content[0].name).toBe('中1');
744
+ expect(result.specifications[0].content[1].name).toBe('中2');
745
+ expect(result.specifications[1].content[1].name).toBe('enx2');
746
+ });
747
+
748
+ it('目标语言是法文,默认语言中文', () => {
749
+ const currentLang = 'fr';
750
+ const defaultLang = 'zh';
751
+ const result = getStoreByLanguage(store as Store, currentLang, defaultLang);
752
+ expect(result.name).toBe('新店名');
753
+ expect(result.description).toBe('newDescriptions');
754
+ expect(result.classifications[0].name).toBe('分类中文');
755
+ expect(result.classifications[1].name).toBe('classEnglish2');
756
+ expect(result.dishes[0].name).toBe('菜品旧数据');
757
+ expect(result.dishes[0].description).toBe('新描述');
758
+ expect(result.dishes[1].name).toBe('菜品旧数据2');
759
+ expect(result.dishes[1].description).toBe('旧描述2');
760
+ expect(result.specifications[0].name).toBe('中');
761
+ expect(result.specifications[0].content[0].name).toBe('中1');
762
+ expect(result.specifications[0].content[1].name).toBe('中2');
763
+ expect(result.specifications[1].content[1].name).toBe('enx2');
764
+ });
765
+ });
766
+
767
+ describe('根据语言返回处理过的订单数据:getOrderByLanguage', () => {
768
+ const order = {
769
+ content: [
770
+ {
771
+ dishSnapshot: {
772
+ name: '菜名旧数据',
773
+ names: {
774
+ zh: '菜名中文',
775
+ en: 'dishEnglish',
776
+ },
777
+ selectedSpecifications: [
778
+ {
779
+ name: '规格旧数据',
780
+ names: {
781
+ zh: '规格中文',
782
+ en: 'specificationEnglish',
783
+ },
784
+ content: [
785
+ {
786
+ name: '规格选项旧数据',
787
+ names: {
788
+ zh: '选项中文',
789
+ en: 'specificationOptionEnglish',
790
+ },
791
+ },
792
+ {
793
+ name: '规格选项旧数据2',
794
+ names: {
795
+ zh: '选项中文2',
796
+ },
797
+ },
798
+ ],
799
+ },
800
+ {
801
+ name: '规格旧数据2',
802
+ names: {
803
+ zh: '规格中文2',
804
+ },
805
+ content: [
806
+ {
807
+ name: '规格2选项旧数据',
808
+ names: {
809
+ zh: '选项2中文',
810
+ en: 'specification2OptionEnglish',
811
+ },
812
+ },
813
+ ],
814
+ },
815
+ ],
816
+ },
817
+ },
818
+ {
819
+ dishSnapshot: {
820
+ name: '菜名旧数据2',
821
+ names: {
822
+ en: 'classEnglish2',
823
+ },
824
+ },
825
+ },
826
+ ],
827
+ tasks: [
828
+ { _id: '没有content' },
829
+ {
830
+ content: [
831
+ {
832
+ dishSnapshot: {
833
+ names: { zh: '中', en: 'EN' },
834
+ selectedSpecifications: [
835
+ {
836
+ names: { en: 'EN' },
837
+ content: [
838
+ {
839
+ names: { zh: '中1', en: 'en1' },
840
+ },
841
+ {
842
+ name: '老数据',
843
+ },
844
+ ],
845
+ },
846
+ ],
847
+ },
848
+ },
849
+ {
850
+ dishSnapshot: {
851
+ names: { zh: '中x', en: 'ENx' },
852
+ selectedSpecifications: [
853
+ {
854
+ name: '老名字',
855
+ content: [
856
+ {
857
+ names: { zh: '中x1', en: 'enx1' },
858
+ },
859
+ {
860
+ names: { en: 'enx2' },
861
+ },
862
+ ],
863
+ },
864
+ ],
865
+ },
866
+ },
867
+ ],
868
+ },
869
+ ],
870
+ };
871
+
872
+ it('目标语言是英文', () => {
873
+ const currentLang = 'en';
874
+ const defaultLang = 'en';
875
+ const result = getOrderByLanguage(order as Order, currentLang, defaultLang);
876
+ expect(result.content[0].dishSnapshot.name).toBe('dishEnglish');
877
+ expect(result.content[0].dishSnapshot.selectedSpecifications[0].name).toBe('specificationEnglish');
878
+ expect(result.content[0].dishSnapshot.selectedSpecifications[0].content[0].name).toBe(
879
+ 'specificationOptionEnglish',
880
+ );
881
+ expect(result.content[0].dishSnapshot.selectedSpecifications[0].content[1].name).toBe('选项中文2');
882
+ expect(result.content[0].dishSnapshot.selectedSpecifications[1].name).toBe('规格中文2');
883
+ expect(result.content[0].dishSnapshot.selectedSpecifications[1].content[0].name).toBe(
884
+ 'specification2OptionEnglish',
885
+ );
886
+ expect(result.content[1].dishSnapshot.name).toBe('classEnglish2');
887
+ expect(result.tasks[0]['name']).toBeUndefined();
888
+ expect(result.tasks[1].content[0].dishSnapshot.name).toBe('EN');
889
+ expect(result.tasks[1].content[0].dishSnapshot.selectedSpecifications[0].name).toBe('EN');
890
+ expect(result.tasks[1].content[0].dishSnapshot.selectedSpecifications[0].content[0].name).toBe('en1');
891
+ expect(result.tasks[1].content[0].dishSnapshot.selectedSpecifications[0].content[1].name).toBe('老数据');
892
+ expect(result.tasks[1].content[1].dishSnapshot.name).toBe('ENx');
893
+ expect(result.tasks[1].content[1].dishSnapshot.selectedSpecifications[0].name).toBe('老名字');
894
+ expect(result.tasks[1].content[1].dishSnapshot.selectedSpecifications[0].content[0].name).toBe('enx1');
895
+ expect(result.tasks[1].content[1].dishSnapshot.selectedSpecifications[0].content[1].name).toBe('enx2');
896
+ });
897
+
898
+ it('目标语言是法语,默认语言是中文', () => {
899
+ const currentLang = 'fr';
900
+ const defaultLang = 'zh';
901
+ const result = getOrderByLanguage(order as Order, currentLang, defaultLang);
902
+ expect(result.content[0].dishSnapshot.name).toBe('菜名中文');
903
+ expect(result.content[0].dishSnapshot.selectedSpecifications[0].name).toBe('规格中文');
904
+ expect(result.content[0].dishSnapshot.selectedSpecifications[0].content[0].name).toBe('选项中文');
905
+ expect(result.content[0].dishSnapshot.selectedSpecifications[0].content[1].name).toBe('选项中文2');
906
+ expect(result.content[0].dishSnapshot.selectedSpecifications[1].name).toBe('规格中文2');
907
+ expect(result.content[0].dishSnapshot.selectedSpecifications[1].content[0].name).toBe('选项2中文');
908
+ expect(result.content[1].dishSnapshot.name).toBe('classEnglish2');
909
+ expect(result.tasks[0]['name']).toBeUndefined();
910
+ expect(result.tasks[1].content[0].dishSnapshot.name).toBe('中');
911
+ expect(result.tasks[1].content[0].dishSnapshot.selectedSpecifications[0].name).toBe('EN');
912
+ expect(result.tasks[1].content[0].dishSnapshot.selectedSpecifications[0].content[0].name).toBe('中1');
913
+ expect(result.tasks[1].content[0].dishSnapshot.selectedSpecifications[0].content[1].name).toBe('老数据');
914
+ expect(result.tasks[1].content[1].dishSnapshot.name).toBe('中x');
915
+ expect(result.tasks[1].content[1].dishSnapshot.selectedSpecifications[0].name).toBe('老名字');
916
+ expect(result.tasks[1].content[1].dishSnapshot.selectedSpecifications[0].content[0].name).toBe('中x1');
917
+ expect(result.tasks[1].content[1].dishSnapshot.selectedSpecifications[0].content[1].name).toBe('enx2');
918
+ });
919
+ });
920
+ describe('根据语言返回处理过的订单数据:getOrderByLanguage', () => {
921
+ const order = {
922
+ content: [
923
+ {
924
+ dishSnapshot: {
925
+ name: '菜名旧数据',
926
+ names: {
927
+ zh: '菜名中文',
928
+ en: 'dishEnglish',
929
+ },
930
+ selectedSpecifications: [
931
+ {
932
+ name: '规格旧数据',
933
+ names: {
934
+ zh: '规格中文',
935
+ en: 'specificationEnglish',
936
+ },
937
+ content: [
938
+ {
939
+ name: '规格选项旧数据',
940
+ names: {
941
+ zh: '选项中文',
942
+ en: 'specificationOptionEnglish',
943
+ },
944
+ },
945
+ {
946
+ name: '规格选项旧数据2',
947
+ names: {
948
+ zh: '选项中文2',
949
+ },
950
+ },
951
+ ],
952
+ },
953
+ {
954
+ name: '规格旧数据2',
955
+ names: {
956
+ zh: '规格中文2',
957
+ },
958
+ content: [
959
+ {
960
+ name: '规格2选项旧数据',
961
+ names: {
962
+ zh: '选项2中文',
963
+ en: 'specification2OptionEnglish',
964
+ },
965
+ },
966
+ ],
967
+ },
968
+ ],
969
+ },
970
+ },
971
+ {
972
+ dishSnapshot: {
973
+ name: '菜名旧数据2',
974
+ names: {
975
+ en: 'classEnglish2',
976
+ },
977
+ },
978
+ },
979
+ ],
980
+ tasks: [
981
+ { _id: '没有content' },
982
+ {
983
+ content: [
984
+ {
985
+ dishSnapshot: {
986
+ names: { zh: '中', en: 'EN' },
987
+ selectedSpecifications: [
988
+ {
989
+ names: { en: 'EN' },
990
+ content: [
991
+ {
992
+ names: { zh: '中1', en: 'en1' },
993
+ },
994
+ {
995
+ name: '老数据',
996
+ },
997
+ ],
998
+ },
999
+ ],
1000
+ },
1001
+ },
1002
+ {
1003
+ dishSnapshot: {
1004
+ names: { zh: '中x', en: 'ENx' },
1005
+ selectedSpecifications: [
1006
+ {
1007
+ name: '老名字',
1008
+ content: [
1009
+ {
1010
+ names: { zh: '中x1', en: 'enx1' },
1011
+ },
1012
+ {
1013
+ names: { en: 'enx2' },
1014
+ },
1015
+ ],
1016
+ },
1017
+ ],
1018
+ },
1019
+ },
1020
+ ],
1021
+ },
1022
+ ],
1023
+ };
1024
+
1025
+ it('目标语言是英文', () => {
1026
+ const currentLang = 'en';
1027
+ const defaultLang = 'en';
1028
+ const result = getOrderByLanguage(order as Order, currentLang, defaultLang);
1029
+ expect(result.content[0].dishSnapshot.name).toBe('dishEnglish');
1030
+ expect(result.content[0].dishSnapshot.selectedSpecifications[0].name).toBe('specificationEnglish');
1031
+ expect(result.content[0].dishSnapshot.selectedSpecifications[0].content[0].name).toBe(
1032
+ 'specificationOptionEnglish',
1033
+ );
1034
+ expect(result.content[0].dishSnapshot.selectedSpecifications[0].content[1].name).toBe('选项中文2');
1035
+ expect(result.content[0].dishSnapshot.selectedSpecifications[1].name).toBe('规格中文2');
1036
+ expect(result.content[0].dishSnapshot.selectedSpecifications[1].content[0].name).toBe(
1037
+ 'specification2OptionEnglish',
1038
+ );
1039
+ expect(result.content[1].dishSnapshot.name).toBe('classEnglish2');
1040
+ expect(result.tasks[0]['name']).toBeUndefined();
1041
+ expect(result.tasks[1].content[0].dishSnapshot.name).toBe('EN');
1042
+ expect(result.tasks[1].content[0].dishSnapshot.selectedSpecifications[0].name).toBe('EN');
1043
+ expect(result.tasks[1].content[0].dishSnapshot.selectedSpecifications[0].content[0].name).toBe('en1');
1044
+ expect(result.tasks[1].content[0].dishSnapshot.selectedSpecifications[0].content[1].name).toBe('老数据');
1045
+ expect(result.tasks[1].content[1].dishSnapshot.name).toBe('ENx');
1046
+ expect(result.tasks[1].content[1].dishSnapshot.selectedSpecifications[0].name).toBe('老名字');
1047
+ expect(result.tasks[1].content[1].dishSnapshot.selectedSpecifications[0].content[0].name).toBe('enx1');
1048
+ expect(result.tasks[1].content[1].dishSnapshot.selectedSpecifications[0].content[1].name).toBe('enx2');
1049
+ });
1050
+
1051
+ it('目标语言是法语,默认语言是中文', () => {
1052
+ const currentLang = 'fr';
1053
+ const defaultLang = 'zh';
1054
+ const result = getOrderByLanguage(order as Order, currentLang, defaultLang);
1055
+ expect(result.content[0].dishSnapshot.name).toBe('菜名中文');
1056
+ expect(result.content[0].dishSnapshot.selectedSpecifications[0].name).toBe('规格中文');
1057
+ expect(result.content[0].dishSnapshot.selectedSpecifications[0].content[0].name).toBe('选项中文');
1058
+ expect(result.content[0].dishSnapshot.selectedSpecifications[0].content[1].name).toBe('选项中文2');
1059
+ expect(result.content[0].dishSnapshot.selectedSpecifications[1].name).toBe('规格中文2');
1060
+ expect(result.content[0].dishSnapshot.selectedSpecifications[1].content[0].name).toBe('选项2中文');
1061
+ expect(result.content[1].dishSnapshot.name).toBe('classEnglish2');
1062
+ expect(result.tasks[0]['name']).toBeUndefined();
1063
+ expect(result.tasks[1].content[0].dishSnapshot.name).toBe('中');
1064
+ expect(result.tasks[1].content[0].dishSnapshot.selectedSpecifications[0].name).toBe('EN');
1065
+ expect(result.tasks[1].content[0].dishSnapshot.selectedSpecifications[0].content[0].name).toBe('中1');
1066
+ expect(result.tasks[1].content[0].dishSnapshot.selectedSpecifications[0].content[1].name).toBe('老数据');
1067
+ expect(result.tasks[1].content[1].dishSnapshot.name).toBe('中x');
1068
+ expect(result.tasks[1].content[1].dishSnapshot.selectedSpecifications[0].name).toBe('老名字');
1069
+ expect(result.tasks[1].content[1].dishSnapshot.selectedSpecifications[0].content[0].name).toBe('中x1');
1070
+ expect(result.tasks[1].content[1].dishSnapshot.selectedSpecifications[0].content[1].name).toBe('enx2');
1071
+ });
1072
+ });
1073
+
1074
+ describe('测试根据区号返回语言码-getLanguageFromCountryCode', () => {
1075
+ it('86应该返回zh', () => {
1076
+ expect(getLanguageFromCountryCode('86')).toBe('zh');
1077
+ });
1078
+ it('非86应该返回en', () => {
1079
+ expect(getLanguageFromCountryCode('94')).toBe('en');
1080
+ });
1081
+ });
1082
+ });