@antelopejs/interface-data-api 0.4.0 → 0.6.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/README.md +26 -22
  2. package/dist/antelope.test.js +1 -5
  3. package/dist/antelope.test.js.map +1 -1
  4. package/dist/components.d.ts +67 -39
  5. package/dist/components.js +106 -685
  6. package/dist/components.js.map +1 -1
  7. package/dist/index.d.ts +57 -68
  8. package/dist/index.js +114 -100
  9. package/dist/index.js.map +1 -1
  10. package/dist/internal/computed.d.ts +6 -0
  11. package/dist/internal/computed.js +51 -0
  12. package/dist/internal/computed.js.map +1 -0
  13. package/dist/internal/controller-types.d.ts +34 -0
  14. package/dist/internal/controller-types.js +4 -0
  15. package/dist/internal/controller-types.js.map +1 -0
  16. package/dist/internal/default-filter.d.ts +4 -0
  17. package/dist/internal/default-filter.js +29 -0
  18. package/dist/internal/default-filter.js.map +1 -0
  19. package/dist/internal/deferred-joined-stream.d.ts +11 -0
  20. package/dist/internal/deferred-joined-stream.js +125 -0
  21. package/dist/internal/deferred-joined-stream.js.map +1 -0
  22. package/dist/internal/extractors.d.ts +25 -0
  23. package/dist/internal/extractors.js +31 -0
  24. package/dist/internal/extractors.js.map +1 -0
  25. package/dist/internal/field-types.d.ts +199 -0
  26. package/dist/internal/field-types.js +4 -0
  27. package/dist/internal/field-types.js.map +1 -0
  28. package/dist/internal/filters.d.ts +6 -0
  29. package/dist/internal/filters.js +22 -0
  30. package/dist/internal/filters.js.map +1 -0
  31. package/dist/internal/foreign.d.ts +6 -0
  32. package/dist/internal/foreign.js +116 -0
  33. package/dist/internal/foreign.js.map +1 -0
  34. package/dist/internal/guards.d.ts +39 -0
  35. package/dist/internal/guards.js +116 -0
  36. package/dist/internal/guards.js.map +1 -0
  37. package/dist/internal/joined.d.ts +28 -0
  38. package/dist/internal/joined.js +127 -0
  39. package/dist/internal/joined.js.map +1 -0
  40. package/dist/internal/list.d.ts +16 -0
  41. package/dist/internal/list.js +182 -0
  42. package/dist/internal/list.js.map +1 -0
  43. package/dist/internal/meta-records.d.ts +19 -0
  44. package/dist/internal/meta-records.js +78 -0
  45. package/dist/internal/meta-records.js.map +1 -0
  46. package/dist/internal/properties.d.ts +4 -0
  47. package/dist/internal/properties.js +45 -0
  48. package/dist/internal/properties.js.map +1 -0
  49. package/dist/internal/prototypes.d.ts +14 -0
  50. package/dist/internal/prototypes.js +38 -0
  51. package/dist/internal/prototypes.js.map +1 -0
  52. package/dist/internal/read-properties.d.ts +3 -0
  53. package/dist/internal/read-properties.js +29 -0
  54. package/dist/internal/read-properties.js.map +1 -0
  55. package/dist/internal/table-reference.d.ts +11 -0
  56. package/dist/internal/table-reference.js +46 -0
  57. package/dist/internal/table-reference.js.map +1 -0
  58. package/dist/internal/tables.d.ts +28 -0
  59. package/dist/internal/tables.js +48 -0
  60. package/dist/internal/tables.js.map +1 -0
  61. package/dist/internal/validation.d.ts +12 -0
  62. package/dist/internal/validation.js +100 -0
  63. package/dist/internal/validation.js.map +1 -0
  64. package/dist/metadata.d.ts +27 -228
  65. package/dist/metadata.js +84 -213
  66. package/dist/metadata.js.map +1 -1
  67. package/dist/tests/components/access_control.test.js +28 -20
  68. package/dist/tests/components/access_control.test.js.map +1 -1
  69. package/dist/tests/components/computed.test.js +36 -27
  70. package/dist/tests/components/computed.test.js.map +1 -1
  71. package/dist/tests/components/cross_instance.test.js +8 -6
  72. package/dist/tests/components/cross_instance.test.js.map +1 -1
  73. package/dist/tests/components/deferred_joined.test.js +57 -54
  74. package/dist/tests/components/deferred_joined.test.js.map +1 -1
  75. package/dist/tests/components/extract_generic.test.d.ts +1 -0
  76. package/dist/tests/components/extract_generic.test.js +64 -0
  77. package/dist/tests/components/extract_generic.test.js.map +1 -0
  78. package/dist/tests/components/filter_comparisons.test.d.ts +1 -0
  79. package/dist/tests/components/filter_comparisons.test.js +34 -0
  80. package/dist/tests/components/filter_comparisons.test.js.map +1 -0
  81. package/dist/tests/components/filter_list_route.test.d.ts +1 -0
  82. package/dist/tests/components/filter_list_route.test.js +182 -0
  83. package/dist/tests/components/filter_list_route.test.js.map +1 -0
  84. package/dist/tests/components/filter_options.test.js +11 -10
  85. package/dist/tests/components/filter_options.test.js.map +1 -1
  86. package/dist/tests/components/foreign_computed.test.js +23 -14
  87. package/dist/tests/components/foreign_computed.test.js.map +1 -1
  88. package/dist/tests/components/foreign_joined.test.js +31 -27
  89. package/dist/tests/components/foreign_joined.test.js.map +1 -1
  90. package/dist/tests/components/joined.test.js +59 -45
  91. package/dist/tests/components/joined.test.js.map +1 -1
  92. package/dist/tests/components/listable.test.js +78 -58
  93. package/dist/tests/components/listable.test.js.map +1 -1
  94. package/dist/tests/components/localized_sort.test.js +14 -11
  95. package/dist/tests/components/localized_sort.test.js.map +1 -1
  96. package/dist/tests/components/mandatory.test.js +25 -25
  97. package/dist/tests/components/mandatory.test.js.map +1 -1
  98. package/dist/tests/components/modifier_key.test.js +27 -18
  99. package/dist/tests/components/modifier_key.test.js.map +1 -1
  100. package/dist/tests/components/parse_body.test.d.ts +1 -0
  101. package/dist/tests/components/parse_body.test.js +76 -0
  102. package/dist/tests/components/parse_body.test.js.map +1 -0
  103. package/dist/tests/components/parsed_value.test.js +23 -21
  104. package/dist/tests/components/parsed_value.test.js.map +1 -1
  105. package/dist/tests/components/partial_edit.test.js +38 -32
  106. package/dist/tests/components/partial_edit.test.js.map +1 -1
  107. package/dist/tests/components/per_action_access.test.js +20 -12
  108. package/dist/tests/components/per_action_access.test.js.map +1 -1
  109. package/dist/tests/components/prototype_named_filter.test.d.ts +1 -0
  110. package/dist/tests/components/prototype_named_filter.test.js +87 -0
  111. package/dist/tests/components/prototype_named_filter.test.js.map +1 -0
  112. package/dist/tests/components/validator.test.js +45 -37
  113. package/dist/tests/components/validator.test.js.map +1 -1
  114. package/dist/tests/components/written_row.test.d.ts +1 -0
  115. package/dist/tests/components/written_row.test.js +99 -0
  116. package/dist/tests/components/written_row.test.js.map +1 -0
  117. package/dist/tests/helpers/other-instance.d.ts +11 -1
  118. package/dist/tests/helpers/other-instance.js +35 -9
  119. package/dist/tests/helpers/other-instance.js.map +1 -1
  120. package/dist/tests/index/field_decorator_target.test.d.ts +1 -0
  121. package/dist/tests/index/field_decorator_target.test.js +20 -0
  122. package/dist/tests/index/field_decorator_target.test.js.map +1 -0
  123. package/dist/tests/index/get_guard.test.js +6 -6
  124. package/dist/tests/index/get_guard.test.js.map +1 -1
  125. package/dist/tests/index/inheritance.test.js +14 -9
  126. package/dist/tests/index/inheritance.test.js.map +1 -1
  127. package/dist/tests/index/metadata_names.test.d.ts +1 -0
  128. package/dist/tests/index/metadata_names.test.js +91 -0
  129. package/dist/tests/index/metadata_names.test.js.map +1 -0
  130. package/dist/tests/index/routes.test.js +49 -44
  131. package/dist/tests/index/routes.test.js.map +1 -1
  132. package/dist/tests/integration.test.d.ts +1 -1
  133. package/dist/tests/integration.test.js +66 -729
  134. package/dist/tests/integration.test.js.map +1 -1
  135. package/dist/tests/internal/controller-fields.test.d.ts +1 -0
  136. package/dist/tests/internal/controller-fields.test.js +25 -0
  137. package/dist/tests/internal/controller-fields.test.js.map +1 -0
  138. package/dist/tests/internal/http.d.ts +35 -0
  139. package/dist/tests/internal/http.js +56 -0
  140. package/dist/tests/internal/http.js.map +1 -0
  141. package/dist/tests/internal/shop-api.d.ts +1 -0
  142. package/dist/tests/internal/shop-api.js +331 -0
  143. package/dist/tests/internal/shop-api.js.map +1 -0
  144. package/dist/tests/internal/shop-schema.d.ts +162 -0
  145. package/dist/tests/internal/shop-schema.js +387 -0
  146. package/dist/tests/internal/shop-schema.js.map +1 -0
  147. package/dist/tests/utils.d.ts +8 -10
  148. package/dist/tests/utils.js +1 -3
  149. package/dist/tests/utils.js.map +1 -1
  150. package/dist/tests/utils.test.js +10 -11
  151. package/dist/tests/utils.test.js.map +1 -1
  152. package/docs/1.introduction.md +38 -35
  153. package/docs/10.joined.md +51 -40
  154. package/docs/11.computed.md +91 -47
  155. package/docs/2.data-controllers.md +50 -42
  156. package/docs/3.routes.md +156 -134
  157. package/docs/4.access-rights.md +48 -44
  158. package/docs/5.validators.md +65 -47
  159. package/docs/6.listable.md +53 -49
  160. package/docs/7.foreign-keys.md +55 -48
  161. package/docs/8.filters.md +65 -54
  162. package/docs/9.modifiers.md +29 -25
  163. package/package.json +34 -13
  164. package/skills/data-api-interface/SKILL.md +13 -3
  165. package/skills/data-api-interface/cases.json +99 -0
@@ -1,716 +1,42 @@
1
1
  "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
2
  Object.defineProperty(exports, "__esModule", { value: true });
15
- const node_path_1 = __importDefault(require("node:path"));
16
3
  const chai_1 = require("chai");
17
- const interface_api_1 = require("@antelopejs/interface-api");
18
- const interface_data_api_1 = require("@antelopejs/interface-data-api");
19
- const metadata_1 = require("@antelopejs/interface-data-api/metadata");
20
- const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
4
+ const zod_1 = require("zod");
5
+ const common_1 = require("@antelopejs/interface-database-decorators/modifiers/common");
6
+ const http_1 = require("./internal/http");
7
+ require("./internal/shop-api");
8
+ const shop_schema_1 = require("./internal/shop-schema");
21
9
  const utils_1 = require("./utils");
22
- const currentTestName = node_path_1.default
23
- .basename(__filename)
24
- .replace(/\.test\.(ts|js)$/, "");
25
- const customerTableName = `customers-${currentTestName}`;
26
- const productTableName = `products-${currentTestName}`;
27
- const orderTableName = `orders-${currentTestName}`;
28
- const orderItemTableName = `order_items-${currentTestName}`;
29
- const schemaName = "default";
30
- let Customer = class Customer extends interface_database_decorators_1.Table {
31
- };
32
- __decorate([
33
- (0, interface_database_decorators_1.Index)(),
34
- (0, interface_database_decorators_1.Field)("string"),
35
- __metadata("design:type", String)
36
- ], Customer.prototype, "email", void 0);
37
- __decorate([
38
- (0, interface_database_decorators_1.Field)("string"),
39
- __metadata("design:type", String)
40
- ], Customer.prototype, "firstName", void 0);
41
- __decorate([
42
- (0, interface_database_decorators_1.Field)("string"),
43
- __metadata("design:type", String)
44
- ], Customer.prototype, "lastName", void 0);
45
- __decorate([
46
- (0, interface_database_decorators_1.Field)("string"),
47
- __metadata("design:type", String)
48
- ], Customer.prototype, "phone", void 0);
49
- __decorate([
50
- (0, interface_database_decorators_1.Field)("string"),
51
- __metadata("design:type", String)
52
- ], Customer.prototype, "address", void 0);
53
- __decorate([
54
- (0, interface_database_decorators_1.Field)("string"),
55
- __metadata("design:type", String)
56
- ], Customer.prototype, "city", void 0);
57
- __decorate([
58
- (0, interface_database_decorators_1.Field)("string"),
59
- __metadata("design:type", String)
60
- ], Customer.prototype, "postalCode", void 0);
61
- __decorate([
62
- (0, interface_database_decorators_1.Field)("string"),
63
- __metadata("design:type", String)
64
- ], Customer.prototype, "country", void 0);
65
- __decorate([
66
- (0, interface_database_decorators_1.Field)("date"),
67
- __metadata("design:type", Date)
68
- ], Customer.prototype, "registrationDate", void 0);
69
- __decorate([
70
- (0, interface_database_decorators_1.Field)("boolean"),
71
- __metadata("design:type", Boolean)
72
- ], Customer.prototype, "isActive", void 0);
73
- __decorate([
74
- (0, interface_database_decorators_1.Field)("number"),
75
- __metadata("design:type", Number)
76
- ], Customer.prototype, "loyaltyPoints", void 0);
77
- __decorate([
78
- (0, interface_database_decorators_1.Field)(["string"]),
79
- __metadata("design:type", Array)
80
- ], Customer.prototype, "preferences", void 0);
81
- Customer = __decorate([
82
- (0, interface_database_decorators_1.RegisterTable)(customerTableName, schemaName)
83
- ], Customer);
84
- let Product = class Product extends interface_database_decorators_1.Table {
85
- };
86
- __decorate([
87
- (0, interface_database_decorators_1.Index)(),
88
- (0, interface_database_decorators_1.Field)("string"),
89
- __metadata("design:type", String)
90
- ], Product.prototype, "sku", void 0);
91
- __decorate([
92
- (0, interface_database_decorators_1.Field)("string"),
93
- __metadata("design:type", String)
94
- ], Product.prototype, "name", void 0);
95
- __decorate([
96
- (0, interface_database_decorators_1.Field)("string"),
97
- __metadata("design:type", String)
98
- ], Product.prototype, "description", void 0);
99
- __decorate([
100
- (0, interface_database_decorators_1.Field)("number"),
101
- __metadata("design:type", Number)
102
- ], Product.prototype, "price", void 0);
103
- __decorate([
104
- (0, interface_database_decorators_1.Field)("number"),
105
- __metadata("design:type", Number)
106
- ], Product.prototype, "costPrice", void 0);
107
- __decorate([
108
- (0, interface_database_decorators_1.Field)("number"),
109
- __metadata("design:type", Number)
110
- ], Product.prototype, "stockQuantity", void 0);
111
- __decorate([
112
- (0, interface_database_decorators_1.Field)("string"),
113
- __metadata("design:type", String)
114
- ], Product.prototype, "category", void 0);
115
- __decorate([
116
- (0, interface_database_decorators_1.Field)("string"),
117
- __metadata("design:type", String)
118
- ], Product.prototype, "brand", void 0);
119
- __decorate([
120
- (0, interface_database_decorators_1.Field)(["string"]),
121
- __metadata("design:type", Array)
122
- ], Product.prototype, "tags", void 0);
123
- __decorate([
124
- (0, interface_database_decorators_1.Field)(["string"]),
125
- __metadata("design:type", Array)
126
- ], Product.prototype, "images", void 0);
127
- __decorate([
128
- (0, interface_database_decorators_1.Field)("boolean"),
129
- __metadata("design:type", Boolean)
130
- ], Product.prototype, "isActive", void 0);
131
- __decorate([
132
- (0, interface_database_decorators_1.Field)("date"),
133
- __metadata("design:type", Date)
134
- ], Product.prototype, "createdAt", void 0);
135
- __decorate([
136
- (0, interface_database_decorators_1.Field)("date"),
137
- __metadata("design:type", Date)
138
- ], Product.prototype, "updatedAt", void 0);
139
- Product = __decorate([
140
- (0, interface_database_decorators_1.RegisterTable)(productTableName, schemaName)
141
- ], Product);
142
- let Order = class Order extends interface_database_decorators_1.Table {
143
- };
144
- __decorate([
145
- (0, interface_database_decorators_1.Index)(),
146
- (0, interface_database_decorators_1.Field)("string"),
147
- __metadata("design:type", String)
148
- ], Order.prototype, "orderNumber", void 0);
149
- __decorate([
150
- (0, interface_database_decorators_1.Index)(),
151
- (0, interface_database_decorators_1.Field)("string"),
152
- (0, interface_database_decorators_1.Relation)({ to: () => Customer }),
153
- __metadata("design:type", String)
154
- ], Order.prototype, "customerId", void 0);
155
- __decorate([
156
- (0, interface_database_decorators_1.Field)("string"),
157
- __metadata("design:type", String)
158
- ], Order.prototype, "status", void 0);
159
- __decorate([
160
- (0, interface_database_decorators_1.Field)("number"),
161
- __metadata("design:type", Number)
162
- ], Order.prototype, "totalAmount", void 0);
163
- __decorate([
164
- (0, interface_database_decorators_1.Field)("number"),
165
- __metadata("design:type", Number)
166
- ], Order.prototype, "shippingCost", void 0);
167
- __decorate([
168
- (0, interface_database_decorators_1.Field)("number"),
169
- __metadata("design:type", Number)
170
- ], Order.prototype, "taxAmount", void 0);
171
- __decorate([
172
- (0, interface_database_decorators_1.Field)("number"),
173
- __metadata("design:type", Number)
174
- ], Order.prototype, "discountAmount", void 0);
175
- __decorate([
176
- (0, interface_database_decorators_1.Field)("number"),
177
- __metadata("design:type", Number)
178
- ], Order.prototype, "finalAmount", void 0);
179
- __decorate([
180
- (0, interface_database_decorators_1.Field)("string"),
181
- __metadata("design:type", String)
182
- ], Order.prototype, "shippingAddress", void 0);
183
- __decorate([
184
- (0, interface_database_decorators_1.Field)("string"),
185
- __metadata("design:type", String)
186
- ], Order.prototype, "billingAddress", void 0);
187
- __decorate([
188
- (0, interface_database_decorators_1.Field)("string"),
189
- __metadata("design:type", String)
190
- ], Order.prototype, "paymentMethod", void 0);
191
- __decorate([
192
- (0, interface_database_decorators_1.Field)("string"),
193
- __metadata("design:type", String)
194
- ], Order.prototype, "notes", void 0);
195
- __decorate([
196
- (0, interface_database_decorators_1.Field)("date"),
197
- __metadata("design:type", Date)
198
- ], Order.prototype, "createdAt", void 0);
199
- __decorate([
200
- (0, interface_database_decorators_1.Field)("date"),
201
- __metadata("design:type", Date)
202
- ], Order.prototype, "updatedAt", void 0);
203
- Order = __decorate([
204
- (0, interface_database_decorators_1.RegisterTable)(orderTableName, schemaName)
205
- ], Order);
206
- let OrderItem = class OrderItem extends interface_database_decorators_1.Table {
207
- };
208
- __decorate([
209
- (0, interface_database_decorators_1.Index)(),
210
- (0, interface_database_decorators_1.Field)("string"),
211
- (0, interface_database_decorators_1.Relation)({ to: () => Order }),
212
- __metadata("design:type", String)
213
- ], OrderItem.prototype, "orderId", void 0);
214
- __decorate([
215
- (0, interface_database_decorators_1.Index)(),
216
- (0, interface_database_decorators_1.Field)("string"),
217
- (0, interface_database_decorators_1.Relation)({ to: () => Product }),
218
- __metadata("design:type", String)
219
- ], OrderItem.prototype, "productId", void 0);
220
- __decorate([
221
- (0, interface_database_decorators_1.Field)("number"),
222
- __metadata("design:type", Number)
223
- ], OrderItem.prototype, "quantity", void 0);
224
- __decorate([
225
- (0, interface_database_decorators_1.Field)("number"),
226
- __metadata("design:type", Number)
227
- ], OrderItem.prototype, "unitPrice", void 0);
228
- __decorate([
229
- (0, interface_database_decorators_1.Field)("number"),
230
- __metadata("design:type", Number)
231
- ], OrderItem.prototype, "totalPrice", void 0);
232
- __decorate([
233
- (0, interface_database_decorators_1.Field)("number"),
234
- __metadata("design:type", Number)
235
- ], OrderItem.prototype, "finalPrice", void 0);
236
- __decorate([
237
- (0, interface_database_decorators_1.Field)("number"),
238
- __metadata("design:type", Number)
239
- ], OrderItem.prototype, "discount", void 0);
240
- OrderItem = __decorate([
241
- (0, interface_database_decorators_1.RegisterTable)(orderItemTableName, schemaName)
242
- ], OrderItem);
243
- class CustomerModel extends (0, interface_database_decorators_1.BasicDataModel)(Customer, customerTableName) {
10
+ function plainRow(row) {
11
+ return row ? (0, common_1.toPlainData)(row) : {};
244
12
  }
245
- class ProductModel extends (0, interface_database_decorators_1.BasicDataModel)(Product, productTableName) {
246
- }
247
- class OrderModel extends (0, interface_database_decorators_1.BasicDataModel)(Order, orderTableName) {
248
- }
249
- class OrderItemModel extends (0, interface_database_decorators_1.BasicDataModel)(OrderItem, orderItemTableName) {
250
- }
251
- const testCustomers = [
252
- {
253
- firstName: "Bob",
254
- lastName: "Bobberson",
255
- email: "bob.bobberson@email.com",
256
- phone: "+1234567890",
257
- address: "123 Poutine Square",
258
- city: "Quebec City",
259
- postalCode: "G1K 1K1",
260
- country: "Canada",
261
- registrationDate: new Date("2023-01-15"),
262
- isActive: true,
263
- loyaltyPoints: 150,
264
- preferences: ["electronics", "books"],
265
- },
266
- {
267
- firstName: "Alice",
268
- lastName: "Alison",
269
- email: "alice.alison@email.com",
270
- phone: "+33123456789",
271
- address: "456 Baguette Street",
272
- city: "Lyon",
273
- postalCode: "69001",
274
- country: "France",
275
- registrationDate: new Date("2023-03-20"),
276
- isActive: true,
277
- loyaltyPoints: 75,
278
- preferences: ["fashion", "home"],
279
- },
280
- {
281
- firstName: "John",
282
- lastName: "Doe",
283
- email: "john.doe@email.com",
284
- phone: "+32123456789",
285
- address: "789 Fries Avenue",
286
- city: "Brussels",
287
- postalCode: "1000",
288
- country: "Belgium",
289
- registrationDate: new Date("2023-06-10"),
290
- isActive: false,
291
- loyaltyPoints: 0,
292
- preferences: ["sports"],
293
- },
294
- ];
295
- const testProducts = [
296
- {
297
- sku: "LAPTOP-001",
298
- name: "Gaming Laptop",
299
- description: "High performance gaming laptop",
300
- price: 1299.99,
301
- costPrice: 899.99,
302
- stockQuantity: 15,
303
- category: "electronics",
304
- brand: "TechCorp",
305
- tags: ["gaming", "laptop", "high-performance"],
306
- images: ["laptop1.jpg", "laptop2.jpg"],
307
- isActive: true,
308
- createdAt: new Date("2023-01-01"),
309
- updatedAt: new Date("2023-12-01"),
310
- },
311
- {
312
- sku: "PHONE-002",
313
- name: "Premium Smartphone",
314
- description: "Professional camera smartphone",
315
- price: 899.99,
316
- costPrice: 599.99,
317
- stockQuantity: 25,
318
- category: "electronics",
319
- brand: "MobileTech",
320
- tags: ["smartphone", "camera", "premium"],
321
- images: ["phone1.jpg", "phone2.jpg"],
322
- isActive: true,
323
- createdAt: new Date("2023-02-15"),
324
- updatedAt: new Date("2023-11-15"),
325
- },
326
- {
327
- sku: "BOOK-003",
328
- name: "The Soldering Bible",
329
- description: "Complete guide to soldering components",
330
- price: 49.99,
331
- costPrice: 25.99,
332
- stockQuantity: 50,
333
- category: "books",
334
- brand: "TechBooks",
335
- tags: ["soldering", "electronics", "education"],
336
- images: ["book1.jpg"],
337
- isActive: true,
338
- createdAt: new Date("2023-03-01"),
339
- updatedAt: new Date("2023-10-01"),
340
- },
341
- {
342
- sku: "SHIRT-004",
343
- name: "Organic Cotton T-shirt",
344
- description: "Comfortable organic cotton t-shirt",
345
- price: 29.99,
346
- costPrice: 15.99,
347
- stockQuantity: 100,
348
- category: "fashion",
349
- brand: "EcoFashion",
350
- tags: ["cotton", "organic", "comfortable"],
351
- images: ["shirt1.jpg", "shirt2.jpg"],
352
- isActive: true,
353
- createdAt: new Date("2023-04-10"),
354
- updatedAt: new Date("2023-09-10"),
355
- },
356
- ];
13
+ const customerSchema = zod_1.z.looseObject({
14
+ _id: zod_1.z.string(),
15
+ firstName: zod_1.z.string(),
16
+ lastName: zod_1.z.string(),
17
+ email: zod_1.z.string(),
18
+ city: zod_1.z.string(),
19
+ });
20
+ const productSchema = zod_1.z.looseObject({ _id: zod_1.z.string() });
21
+ const customerListSchema = (0, http_1.listResponseSchema)(customerSchema);
22
+ const productListSchema = (0, http_1.listResponseSchema)(productSchema);
357
23
  describe("Integration tests", () => {
358
24
  before(async () => {
359
- await initializeDatabase();
25
+ await (0, shop_schema_1.initializeDatabase)();
360
26
  });
361
27
  beforeEach(async () => {
362
- await cleanTables();
28
+ await (0, shop_schema_1.cleanTables)();
363
29
  });
364
- it("workflow complete of customer management", async () => await workflowCustomerManagement());
365
- it("workflow complete of product management", async () => await workflowProductManagement());
366
- it("workflow complete of order management", async () => await workflowOrderManagement());
367
- it("stock management and automatic update", async () => await stockManagementAndAutomaticUpdate());
368
- it("advanced search and filtering", async () => await advancedSearchAndFiltering());
369
- it("client preferences management and recommendations", async () => await clientPreferencesManagement());
370
- it("error management and complex validation", async () => await errorManagementAndComplexValidation());
371
- after(async () => { });
30
+ it("workflow complete of customer management", async () => await expectCustomerWorkflow());
31
+ it("workflow complete of product management", async () => await expectProductWorkflow());
32
+ it("workflow complete of order management", async () => await expectOrderWorkflow());
33
+ it("stock management and automatic update", async () => await expectStockUpdates());
34
+ it("advanced search and filtering", async () => await expectSearchAndFilters());
35
+ it("client preferences management and recommendations", async () => await expectClientPreferences());
36
+ it("error management and complex validation", async () => await expectErrorsAndValidation());
372
37
  });
373
- let _CustomerAPI = class _CustomerAPI extends (0, interface_data_api_1.DataController)(Customer, interface_data_api_1.DefaultRoutes.All, (0, interface_api_1.Controller)("/customers")) {
374
- };
375
- __decorate([
376
- (0, metadata_1.ModelReference)(),
377
- (0, interface_database_decorators_1.Model)(CustomerModel),
378
- __metadata("design:type", CustomerModel)
379
- ], _CustomerAPI.prototype, "customerModel", void 0);
380
- __decorate([
381
- (0, metadata_1.Listable)(),
382
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadOnly),
383
- __metadata("design:type", String)
384
- ], _CustomerAPI.prototype, "_id", void 0);
385
- __decorate([
386
- (0, metadata_1.Listable)(),
387
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
388
- (0, metadata_1.Mandatory)("new", "edit"),
389
- (0, metadata_1.Validator)((value) => typeof value === "string" && value.length >= 2),
390
- __metadata("design:type", String)
391
- ], _CustomerAPI.prototype, "firstName", void 0);
392
- __decorate([
393
- (0, metadata_1.Listable)(),
394
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
395
- (0, metadata_1.Mandatory)("new", "edit"),
396
- (0, metadata_1.Validator)((value) => typeof value === "string" && value.length >= 2),
397
- __metadata("design:type", String)
398
- ], _CustomerAPI.prototype, "lastName", void 0);
399
- __decorate([
400
- (0, metadata_1.Listable)(),
401
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
402
- (0, metadata_1.Mandatory)("new", "edit"),
403
- (0, metadata_1.Validator)((value) => {
404
- if (typeof value !== "string")
405
- return false;
406
- const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
407
- return emailRegex.test(value);
408
- }),
409
- __metadata("design:type", String)
410
- ], _CustomerAPI.prototype, "email", void 0);
411
- __decorate([
412
- (0, metadata_1.Listable)(),
413
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
414
- (0, metadata_1.Validator)((value) => typeof value === "string" && value.length >= 10),
415
- __metadata("design:type", String)
416
- ], _CustomerAPI.prototype, "phone", void 0);
417
- __decorate([
418
- (0, metadata_1.Listable)(),
419
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
420
- __metadata("design:type", String)
421
- ], _CustomerAPI.prototype, "address", void 0);
422
- __decorate([
423
- (0, metadata_1.Listable)(),
424
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
425
- __metadata("design:type", String)
426
- ], _CustomerAPI.prototype, "city", void 0);
427
- __decorate([
428
- (0, metadata_1.Listable)(),
429
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
430
- __metadata("design:type", String)
431
- ], _CustomerAPI.prototype, "postalCode", void 0);
432
- __decorate([
433
- (0, metadata_1.Listable)(),
434
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
435
- __metadata("design:type", String)
436
- ], _CustomerAPI.prototype, "country", void 0);
437
- __decorate([
438
- (0, metadata_1.Listable)(),
439
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadOnly),
440
- (0, metadata_1.Sortable)({ noIndex: true }),
441
- __metadata("design:type", Date)
442
- ], _CustomerAPI.prototype, "registrationDate", void 0);
443
- __decorate([
444
- (0, metadata_1.Listable)(),
445
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
446
- __metadata("design:type", Boolean)
447
- ], _CustomerAPI.prototype, "isActive", void 0);
448
- __decorate([
449
- (0, metadata_1.Listable)(),
450
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
451
- (0, metadata_1.Sortable)({ noIndex: true }),
452
- __metadata("design:type", Number)
453
- ], _CustomerAPI.prototype, "loyaltyPoints", void 0);
454
- __decorate([
455
- (0, metadata_1.Listable)(),
456
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
457
- __metadata("design:type", Array)
458
- ], _CustomerAPI.prototype, "preferences", void 0);
459
- _CustomerAPI = __decorate([
460
- (0, interface_data_api_1.RegisterDataController)()
461
- ], _CustomerAPI);
462
- let _ProductAPI = class _ProductAPI extends (0, interface_data_api_1.DataController)(Product, interface_data_api_1.DefaultRoutes.All, (0, interface_api_1.Controller)("/products")) {
463
- };
464
- __decorate([
465
- (0, metadata_1.ModelReference)(),
466
- (0, interface_database_decorators_1.Model)(ProductModel),
467
- __metadata("design:type", ProductModel)
468
- ], _ProductAPI.prototype, "productModel", void 0);
469
- __decorate([
470
- (0, metadata_1.Listable)(),
471
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadOnly),
472
- __metadata("design:type", String)
473
- ], _ProductAPI.prototype, "_id", void 0);
474
- __decorate([
475
- (0, metadata_1.Listable)(),
476
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
477
- (0, metadata_1.Mandatory)("new", "edit"),
478
- (0, metadata_1.Validator)((value) => typeof value === "string" && value.length >= 3),
479
- __metadata("design:type", String)
480
- ], _ProductAPI.prototype, "sku", void 0);
481
- __decorate([
482
- (0, metadata_1.Listable)(),
483
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
484
- (0, metadata_1.Mandatory)("new", "edit"),
485
- (0, metadata_1.Validator)((value) => typeof value === "string" && value.length >= 3),
486
- __metadata("design:type", String)
487
- ], _ProductAPI.prototype, "name", void 0);
488
- __decorate([
489
- (0, metadata_1.Listable)(),
490
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
491
- __metadata("design:type", String)
492
- ], _ProductAPI.prototype, "description", void 0);
493
- __decorate([
494
- (0, metadata_1.Listable)(),
495
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
496
- (0, metadata_1.Mandatory)("new", "edit"),
497
- (0, metadata_1.Validator)((value) => typeof value === "number" && value >= 0),
498
- (0, metadata_1.Sortable)({ noIndex: true }),
499
- __metadata("design:type", Number)
500
- ], _ProductAPI.prototype, "price", void 0);
501
- __decorate([
502
- (0, metadata_1.Access)(metadata_1.AccessMode.WriteOnly),
503
- (0, metadata_1.Validator)((value) => typeof value === "number" && value >= 0),
504
- (0, metadata_1.Sortable)({ noIndex: true }),
505
- __metadata("design:type", Number)
506
- ], _ProductAPI.prototype, "costPrice", void 0);
507
- __decorate([
508
- (0, metadata_1.Listable)(),
509
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
510
- (0, metadata_1.Mandatory)("new", "edit"),
511
- (0, metadata_1.Validator)((value) => typeof value === "number" && value >= 0),
512
- (0, metadata_1.Sortable)({ noIndex: true }),
513
- __metadata("design:type", Number)
514
- ], _ProductAPI.prototype, "stockQuantity", void 0);
515
- __decorate([
516
- (0, metadata_1.Listable)(),
517
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
518
- (0, metadata_1.Mandatory)("new", "edit"),
519
- __metadata("design:type", String)
520
- ], _ProductAPI.prototype, "category", void 0);
521
- __decorate([
522
- (0, metadata_1.Listable)(),
523
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
524
- __metadata("design:type", String)
525
- ], _ProductAPI.prototype, "brand", void 0);
526
- __decorate([
527
- (0, metadata_1.Listable)(),
528
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
529
- __metadata("design:type", Array)
530
- ], _ProductAPI.prototype, "tags", void 0);
531
- __decorate([
532
- (0, metadata_1.Listable)(),
533
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
534
- __metadata("design:type", Array)
535
- ], _ProductAPI.prototype, "images", void 0);
536
- __decorate([
537
- (0, metadata_1.Listable)(),
538
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
539
- __metadata("design:type", Boolean)
540
- ], _ProductAPI.prototype, "isActive", void 0);
541
- __decorate([
542
- (0, metadata_1.Listable)(),
543
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadOnly),
544
- (0, metadata_1.Sortable)({ noIndex: true }),
545
- __metadata("design:type", Date)
546
- ], _ProductAPI.prototype, "createdAt", void 0);
547
- __decorate([
548
- (0, metadata_1.Listable)(),
549
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadOnly),
550
- (0, metadata_1.Sortable)({ noIndex: true }),
551
- __metadata("design:type", Date)
552
- ], _ProductAPI.prototype, "updatedAt", void 0);
553
- _ProductAPI = __decorate([
554
- (0, interface_data_api_1.RegisterDataController)()
555
- ], _ProductAPI);
556
- let _OrderAPI = class _OrderAPI extends (0, interface_data_api_1.DataController)(Order, interface_data_api_1.DefaultRoutes.All, (0, interface_api_1.Controller)("/orders")) {
557
- };
558
- __decorate([
559
- (0, metadata_1.ModelReference)(),
560
- (0, interface_database_decorators_1.Model)(OrderModel),
561
- __metadata("design:type", OrderModel)
562
- ], _OrderAPI.prototype, "orderModel", void 0);
563
- __decorate([
564
- (0, metadata_1.Listable)(),
565
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadOnly),
566
- __metadata("design:type", String)
567
- ], _OrderAPI.prototype, "_id", void 0);
568
- __decorate([
569
- (0, metadata_1.Listable)(),
570
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
571
- (0, metadata_1.Mandatory)("new", "edit"),
572
- __metadata("design:type", String)
573
- ], _OrderAPI.prototype, "orderNumber", void 0);
574
- __decorate([
575
- (0, metadata_1.Listable)(),
576
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
577
- (0, metadata_1.Mandatory)("new", "edit"),
578
- __metadata("design:type", String)
579
- ], _OrderAPI.prototype, "customerId", void 0);
580
- __decorate([
581
- (0, metadata_1.Listable)(),
582
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
583
- (0, metadata_1.Mandatory)("new", "edit"),
584
- (0, metadata_1.Validator)((value) => ["pending", "processing", "shipped", "delivered", "cancelled"].includes(value)),
585
- __metadata("design:type", String)
586
- ], _OrderAPI.prototype, "status", void 0);
587
- __decorate([
588
- (0, metadata_1.Listable)(),
589
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
590
- (0, metadata_1.Sortable)({ noIndex: true }),
591
- __metadata("design:type", Number)
592
- ], _OrderAPI.prototype, "totalAmount", void 0);
593
- __decorate([
594
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
595
- __metadata("design:type", Number)
596
- ], _OrderAPI.prototype, "shippingCost", void 0);
597
- __decorate([
598
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
599
- __metadata("design:type", Number)
600
- ], _OrderAPI.prototype, "taxAmount", void 0);
601
- __decorate([
602
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
603
- __metadata("design:type", Number)
604
- ], _OrderAPI.prototype, "discountAmount", void 0);
605
- __decorate([
606
- (0, metadata_1.Listable)(),
607
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
608
- (0, metadata_1.Sortable)({ noIndex: true }),
609
- __metadata("design:type", Number)
610
- ], _OrderAPI.prototype, "finalAmount", void 0);
611
- __decorate([
612
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
613
- __metadata("design:type", String)
614
- ], _OrderAPI.prototype, "shippingAddress", void 0);
615
- __decorate([
616
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
617
- __metadata("design:type", String)
618
- ], _OrderAPI.prototype, "billingAddress", void 0);
619
- __decorate([
620
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
621
- __metadata("design:type", String)
622
- ], _OrderAPI.prototype, "paymentMethod", void 0);
623
- __decorate([
624
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
625
- __metadata("design:type", String)
626
- ], _OrderAPI.prototype, "notes", void 0);
627
- __decorate([
628
- (0, metadata_1.Listable)(),
629
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadOnly),
630
- (0, metadata_1.Sortable)({ noIndex: true }),
631
- __metadata("design:type", Date)
632
- ], _OrderAPI.prototype, "createdAt", void 0);
633
- __decorate([
634
- (0, metadata_1.Listable)(),
635
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadOnly),
636
- (0, metadata_1.Sortable)({ noIndex: true }),
637
- __metadata("design:type", Date)
638
- ], _OrderAPI.prototype, "updatedAt", void 0);
639
- _OrderAPI = __decorate([
640
- (0, interface_data_api_1.RegisterDataController)()
641
- ], _OrderAPI);
642
- let _OrderItemAPI = class _OrderItemAPI extends (0, interface_data_api_1.DataController)(OrderItem, interface_data_api_1.DefaultRoutes.All, (0, interface_api_1.Controller)("/order-items")) {
643
- };
644
- __decorate([
645
- (0, metadata_1.ModelReference)(),
646
- (0, interface_database_decorators_1.Model)(OrderItemModel),
647
- __metadata("design:type", OrderItemModel)
648
- ], _OrderItemAPI.prototype, "orderItemModel", void 0);
649
- __decorate([
650
- (0, metadata_1.Listable)(),
651
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadOnly),
652
- __metadata("design:type", String)
653
- ], _OrderItemAPI.prototype, "_id", void 0);
654
- __decorate([
655
- (0, metadata_1.Listable)(),
656
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
657
- (0, metadata_1.Mandatory)("new", "edit"),
658
- __metadata("design:type", String)
659
- ], _OrderItemAPI.prototype, "orderId", void 0);
660
- __decorate([
661
- (0, metadata_1.Listable)(),
662
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
663
- (0, metadata_1.Mandatory)("new", "edit"),
664
- __metadata("design:type", String)
665
- ], _OrderItemAPI.prototype, "productId", void 0);
666
- __decorate([
667
- (0, metadata_1.Listable)(),
668
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
669
- (0, metadata_1.Mandatory)("new", "edit"),
670
- (0, metadata_1.Validator)((value) => typeof value === "number" && value > 0),
671
- __metadata("design:type", Number)
672
- ], _OrderItemAPI.prototype, "quantity", void 0);
673
- __decorate([
674
- (0, metadata_1.Listable)(),
675
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadOnly),
676
- __metadata("design:type", Number)
677
- ], _OrderItemAPI.prototype, "unitPrice", void 0);
678
- __decorate([
679
- (0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
680
- __metadata("design:type", Number)
681
- ], _OrderItemAPI.prototype, "discount", void 0);
682
- _OrderItemAPI = __decorate([
683
- (0, interface_data_api_1.RegisterDataController)()
684
- ], _OrderItemAPI);
685
- async function initializeDatabase() {
686
- await (0, interface_database_decorators_1.RegisterSchema)(schemaName);
687
- }
688
- async function cleanTables() {
689
- const db = (0, utils_1.getSchemaInstance)(schemaName);
690
- await Promise.all([
691
- db.table(customerTableName).delete(),
692
- db.table(productTableName).delete(),
693
- db.table(orderTableName).delete(),
694
- db.table(orderItemTableName).delete(),
695
- ]);
696
- }
697
- async function createTestData() {
698
- const db = (0, utils_1.getSchemaInstance)(schemaName);
699
- const customerModel = new CustomerModel(db);
700
- const productModel = new ProductModel(db);
701
- const orderModel = new OrderModel(db);
702
- const customerResults = await customerModel.insert(testCustomers);
703
- const productResults = await productModel.insert(testProducts);
704
- return {
705
- customerIds: customerResults,
706
- productIds: productResults,
707
- customerModel,
708
- productModel,
709
- orderModel,
710
- };
711
- }
712
- async function workflowCustomerManagement() {
713
- const { customerModel } = await createTestData();
38
+ async function expectCustomerWorkflow() {
39
+ const { customerModel } = await (0, shop_schema_1.createTestData)();
714
40
  const newCustomer = {
715
41
  firstName: "Sophie",
716
42
  lastName: "Marrone",
@@ -726,12 +52,12 @@ async function workflowCustomerManagement() {
726
52
  };
727
53
  const createResponse = await (0, utils_1.newRequest)("customers", newCustomer);
728
54
  (0, chai_1.expect)(createResponse.status).to.equal(200);
729
- const created = (await createResponse.json());
55
+ const created = await (0, http_1.readJson)(http_1.createdRowSchema, createResponse);
730
56
  (0, chai_1.expect)(created._id).to.be.a("string");
731
57
  const createdIds = [created._id];
732
58
  const getResponse = await (0, utils_1.getRequest)("customers", { id: createdIds[0] });
733
59
  (0, chai_1.expect)(getResponse.status).to.equal(200);
734
- const customer = (await getResponse.json());
60
+ const customer = await (0, http_1.readJson)(customerSchema, getResponse);
735
61
  await (0, utils_1.validateObject)(customer, newCustomer, [
736
62
  "firstName",
737
63
  "lastName",
@@ -756,11 +82,13 @@ async function workflowCustomerManagement() {
756
82
  limit: "2",
757
83
  });
758
84
  (0, chai_1.expect)(listResponse.status).to.equal(200);
759
- const listData = (await listResponse.json());
85
+ const listData = await (0, http_1.readJson)(customerListSchema, listResponse);
760
86
  (0, chai_1.expect)(listData.results).to.have.length(2);
87
+ const [ascending, unknownDirection] = await Promise.all(["asc", "sideways"].map((sortDirection) => (0, utils_1.listRequest)("customers", { sortKey: "registrationDate", sortDirection })));
88
+ (0, chai_1.expect)(await (0, http_1.readJson)(zod_1.z.unknown(), unknownDirection)).to.deep.equal(await (0, http_1.readJson)(zod_1.z.unknown(), ascending));
761
89
  }
762
- async function workflowProductManagement() {
763
- const { productModel } = await createTestData();
90
+ async function expectProductWorkflow() {
91
+ const { productModel } = await (0, shop_schema_1.createTestData)();
764
92
  const newProduct = {
765
93
  sku: "HEADPHONES-005",
766
94
  name: "Casque audio sans fil",
@@ -776,7 +104,7 @@ async function workflowProductManagement() {
776
104
  };
777
105
  const createResponse = await (0, utils_1.newRequest)("products", newProduct);
778
106
  (0, chai_1.expect)(createResponse.status).to.equal(200);
779
- const createdIds = [(await createResponse.json())._id];
107
+ const createdIds = [(await (0, http_1.readJson)(http_1.createdRowSchema, createResponse))._id];
780
108
  const stockUpdate = { ...newProduct, stockQuantity: 25 };
781
109
  const updateResponse = await (0, utils_1.editRequest)("products", stockUpdate, {
782
110
  id: createdIds[0],
@@ -790,17 +118,17 @@ async function workflowProductManagement() {
790
118
  limit: "3",
791
119
  });
792
120
  (0, chai_1.expect)(listResponse.status).to.equal(200);
793
- const listData = (await listResponse.json());
121
+ const listData = await (0, http_1.readJson)(productListSchema, listResponse);
794
122
  (0, chai_1.expect)(listData.results).to.have.length(3);
795
123
  const categoryResponse = await (0, utils_1.listRequest)("products", {
796
124
  category: "electronics",
797
125
  });
798
126
  (0, chai_1.expect)(categoryResponse.status).to.equal(200);
799
- const categoryData = (await categoryResponse.json());
127
+ const categoryData = await (0, http_1.readJson)(productListSchema, categoryResponse);
800
128
  (0, chai_1.expect)(categoryData.results.length).to.be.greaterThan(0);
801
129
  }
802
- async function workflowOrderManagement() {
803
- const { customerIds, productIds, orderModel } = await createTestData();
130
+ async function expectOrderWorkflow() {
131
+ const { customerIds, productIds, orderModel } = await (0, shop_schema_1.createTestData)();
804
132
  const orderData = {
805
133
  orderNumber: "ORD-2024-001",
806
134
  customerId: customerIds[0],
@@ -817,7 +145,7 @@ async function workflowOrderManagement() {
817
145
  };
818
146
  const orderResponse = await (0, utils_1.newRequest)("orders", orderData);
819
147
  (0, chai_1.expect)(orderResponse.status).to.equal(200);
820
- const orderIds = [(await orderResponse.json())._id];
148
+ const orderIds = [(await (0, http_1.readJson)(http_1.createdRowSchema, orderResponse))._id];
821
149
  const orderItem1 = {
822
150
  orderId: orderIds[0],
823
151
  productId: productIds[0],
@@ -862,11 +190,14 @@ async function workflowOrderManagement() {
862
190
  const finalOrder = await orderModel.get(orderIds[0]);
863
191
  (0, chai_1.expect)(finalOrder?.status).to.equal("processing");
864
192
  }
865
- async function stockManagementAndAutomaticUpdate() {
866
- const { productIds, productModel } = await createTestData();
193
+ async function expectStockUpdates() {
194
+ const { productIds, productModel } = await (0, shop_schema_1.createTestData)();
867
195
  const initialProduct = await productModel.get(productIds[0]);
868
196
  const initialStock = initialProduct?.stockQuantity || 0;
869
- const stockReduction = { ...initialProduct, stockQuantity: initialStock - 3 };
197
+ const stockReduction = {
198
+ ...plainRow(initialProduct),
199
+ stockQuantity: initialStock - 3,
200
+ };
870
201
  const updateResponse = await (0, utils_1.editRequest)("products", stockReduction, {
871
202
  id: productIds[0],
872
203
  });
@@ -878,7 +209,10 @@ async function stockManagementAndAutomaticUpdate() {
878
209
  id: productIds[0],
879
210
  });
880
211
  (0, chai_1.expect)(invalidResponse.status).to.equal(400);
881
- const restock = { ...initialProduct, stockQuantity: initialStock + 10 };
212
+ const restock = {
213
+ ...plainRow(initialProduct),
214
+ stockQuantity: initialStock + 10,
215
+ };
882
216
  const restockResponse = await (0, utils_1.editRequest)("products", restock, {
883
217
  id: productIds[0],
884
218
  });
@@ -886,15 +220,15 @@ async function stockManagementAndAutomaticUpdate() {
886
220
  const restockedProduct = await productModel.get(productIds[0]);
887
221
  (0, chai_1.expect)(restockedProduct?.stockQuantity).to.equal(initialStock + 10);
888
222
  }
889
- async function advancedSearchAndFiltering() {
890
- await createTestData();
223
+ async function expectSearchAndFilters() {
224
+ await (0, shop_schema_1.createTestData)();
891
225
  const categoryResponse = await (0, utils_1.listRequest)("products", {
892
226
  category: "electronics",
893
227
  sortKey: "price",
894
228
  sortDirection: "desc",
895
229
  });
896
230
  (0, chai_1.expect)(categoryResponse.status).to.equal(200);
897
- const categoryData = (await categoryResponse.json());
231
+ const categoryData = await (0, http_1.readJson)(productListSchema, categoryResponse);
898
232
  (0, chai_1.expect)(categoryData.results.length).to.be.greaterThan(0);
899
233
  const activeCustomersResponse = await (0, utils_1.listRequest)("customers", {
900
234
  isActive: "true",
@@ -902,14 +236,14 @@ async function advancedSearchAndFiltering() {
902
236
  sortDirection: "desc",
903
237
  });
904
238
  (0, chai_1.expect)(activeCustomersResponse.status).to.equal(200);
905
- const activeCustomersData = (await activeCustomersResponse.json());
239
+ const activeCustomersData = await (0, http_1.readJson)(customerListSchema, activeCustomersResponse);
906
240
  (0, chai_1.expect)(activeCustomersData.results.length).to.be.greaterThan(0);
907
241
  const paginatedResponse = await (0, utils_1.listRequest)("products", {
908
242
  limit: "2",
909
243
  offset: "1",
910
244
  });
911
245
  (0, chai_1.expect)(paginatedResponse.status).to.equal(200);
912
- const paginatedData = (await paginatedResponse.json());
246
+ const paginatedData = await (0, http_1.readJson)(productListSchema, paginatedResponse);
913
247
  (0, chai_1.expect)(paginatedData.results).to.have.length(2);
914
248
  (0, chai_1.expect)(paginatedData.total).to.be.greaterThan(2);
915
249
  const pendingOrdersResponse = await (0, utils_1.listRequest)("orders", {
@@ -919,11 +253,14 @@ async function advancedSearchAndFiltering() {
919
253
  });
920
254
  (0, chai_1.expect)(pendingOrdersResponse.status).to.equal(200);
921
255
  }
922
- async function clientPreferencesManagement() {
923
- const { customerIds, customerModel } = await createTestData();
256
+ async function expectClientPreferences() {
257
+ const { customerIds, customerModel } = await (0, shop_schema_1.createTestData)();
924
258
  const customer = await customerModel.get(customerIds[0]);
925
259
  const newPreferences = ["electronics", "gaming", "tech"];
926
- const preferenceUpdate = { ...customer, preferences: newPreferences };
260
+ const preferenceUpdate = {
261
+ ...plainRow(customer),
262
+ preferences: newPreferences,
263
+ };
927
264
  const updateResponse = await (0, utils_1.editRequest)("customers", preferenceUpdate, {
928
265
  id: customerIds[0],
929
266
  });
@@ -936,9 +273,9 @@ async function clientPreferencesManagement() {
936
273
  sortDirection: "asc",
937
274
  });
938
275
  (0, chai_1.expect)(electronicsResponse.status).to.equal(200);
939
- const electronicsData = (await electronicsResponse.json());
276
+ const electronicsData = await (0, http_1.readJson)(productListSchema, electronicsResponse);
940
277
  (0, chai_1.expect)(electronicsData.results.length).to.be.greaterThan(0);
941
- const loyaltyUpdate = { ...updatedCustomer, loyaltyPoints: 200 };
278
+ const loyaltyUpdate = { ...plainRow(updatedCustomer), loyaltyPoints: 200 };
942
279
  const loyaltyResponse = await (0, utils_1.editRequest)("customers", loyaltyUpdate, {
943
280
  id: customerIds[0],
944
281
  });
@@ -946,7 +283,7 @@ async function clientPreferencesManagement() {
946
283
  const customerWithLoyalty = await customerModel.get(customerIds[0]);
947
284
  (0, chai_1.expect)(customerWithLoyalty?.loyaltyPoints).to.equal(200);
948
285
  }
949
- async function errorManagementAndComplexValidation() {
286
+ async function expectErrorsAndValidation() {
950
287
  const invalidCustomer = {
951
288
  firstName: "Test",
952
289
  lastName: "User",
@@ -984,7 +321,7 @@ async function errorManagementAndComplexValidation() {
984
321
  (0, chai_1.expect)(invalidQuantityResponse.status).to.equal(400);
985
322
  const quantityError = await invalidQuantityResponse.text();
986
323
  (0, chai_1.expect)(quantityError).to.include("quantity");
987
- const { customerIds } = await createTestData();
324
+ const { customerIds } = await (0, shop_schema_1.createTestData)();
988
325
  const invalidStatusUpdate = { status: "invalid_status" };
989
326
  const invalidStatusResponse = await (0, utils_1.editRequest)("orders", invalidStatusUpdate, { id: customerIds[0] });
990
327
  (0, chai_1.expect)(invalidStatusResponse.status).to.equal(400);