@loopback/repository-tests 0.20.2 → 0.21.2

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 (187) hide show
  1. package/LICENSE +2 -2
  2. package/dist/crud/create-retrieve.suite.js +1 -1
  3. package/dist/crud/create-retrieve.suite.js.map +1 -1
  4. package/dist/crud/freeform-properties.suite.js +2 -2
  5. package/dist/crud/freeform-properties.suite.js.map +1 -1
  6. package/dist/crud/nested-model-properties.suite.js +1 -1
  7. package/dist/crud/nested-model-properties.suite.js.map +1 -1
  8. package/dist/crud/relations/acceptance/belongs-to.inclusion-resolver.polymorphic.relation.acceptance.d.ts +2 -0
  9. package/dist/crud/relations/acceptance/belongs-to.inclusion-resolver.polymorphic.relation.acceptance.js +170 -0
  10. package/dist/crud/relations/acceptance/belongs-to.inclusion-resolver.polymorphic.relation.acceptance.js.map +1 -0
  11. package/dist/crud/relations/acceptance/belongs-to.inclusion-resolver.relation.acceptance.js +1 -1
  12. package/dist/crud/relations/acceptance/belongs-to.inclusion-resolver.relation.acceptance.js.map +1 -1
  13. package/dist/crud/relations/acceptance/belongs-to.polymorphic.relation.acceptance.d.ts +2 -0
  14. package/dist/crud/relations/acceptance/belongs-to.polymorphic.relation.acceptance.js +55 -0
  15. package/dist/crud/relations/acceptance/belongs-to.polymorphic.relation.acceptance.js.map +1 -0
  16. package/dist/crud/relations/acceptance/belongs-to.relation.acceptance.js +1 -1
  17. package/dist/crud/relations/acceptance/belongs-to.relation.acceptance.js.map +1 -1
  18. package/dist/crud/relations/acceptance/has-many-inclusion-resolver.relation.acceptance.js +1 -1
  19. package/dist/crud/relations/acceptance/has-many-inclusion-resolver.relation.acceptance.js.map +1 -1
  20. package/dist/crud/relations/acceptance/has-many-through-inclusion-resolver.acceptance.js +1 -1
  21. package/dist/crud/relations/acceptance/has-many-through-inclusion-resolver.acceptance.js.map +1 -1
  22. package/dist/crud/relations/acceptance/has-many-through-inclusion-resolver.polymorphic.acceptance.d.ts +2 -0
  23. package/dist/crud/relations/acceptance/has-many-through-inclusion-resolver.polymorphic.acceptance.js +170 -0
  24. package/dist/crud/relations/acceptance/has-many-through-inclusion-resolver.polymorphic.acceptance.js.map +1 -0
  25. package/dist/crud/relations/acceptance/has-many-through.relation.acceptance.js +1 -1
  26. package/dist/crud/relations/acceptance/has-many-through.relation.acceptance.js.map +1 -1
  27. package/dist/crud/relations/acceptance/has-many-through.relation.polymorphic.acceptance.d.ts +2 -0
  28. package/dist/crud/relations/acceptance/has-many-through.relation.polymorphic.acceptance.js +361 -0
  29. package/dist/crud/relations/acceptance/has-many-through.relation.polymorphic.acceptance.js.map +1 -0
  30. package/dist/crud/relations/acceptance/has-many.relation.acceptance.js +1 -1
  31. package/dist/crud/relations/acceptance/has-many.relation.acceptance.js.map +1 -1
  32. package/dist/crud/relations/acceptance/has-one.inclusion-resolver.acceptance.js +1 -1
  33. package/dist/crud/relations/acceptance/has-one.inclusion-resolver.acceptance.js.map +1 -1
  34. package/dist/crud/relations/acceptance/has-one.inclusion-resolver.polymorphic.acceptance.d.ts +2 -0
  35. package/dist/crud/relations/acceptance/has-one.inclusion-resolver.polymorphic.acceptance.js +161 -0
  36. package/dist/crud/relations/acceptance/has-one.inclusion-resolver.polymorphic.acceptance.js.map +1 -0
  37. package/dist/crud/relations/acceptance/has-one.relation.acceptance.js +1 -1
  38. package/dist/crud/relations/acceptance/has-one.relation.acceptance.js.map +1 -1
  39. package/dist/crud/relations/acceptance/has-one.relation.polymorphic.acceptance.d.ts +2 -0
  40. package/dist/crud/relations/acceptance/has-one.relation.polymorphic.acceptance.js +190 -0
  41. package/dist/crud/relations/acceptance/has-one.relation.polymorphic.acceptance.js.map +1 -0
  42. package/dist/crud/relations/acceptance/multi-relations-inclusion-resolver.relation.acceptance.js +1 -1
  43. package/dist/crud/relations/acceptance/multi-relations-inclusion-resolver.relation.acceptance.js.map +1 -1
  44. package/dist/crud/relations/fixtures/models/address.model.js +1 -1
  45. package/dist/crud/relations/fixtures/models/address.model.js.map +1 -1
  46. package/dist/crud/relations/fixtures/models/cart-item.model.js +1 -1
  47. package/dist/crud/relations/fixtures/models/cart-item.model.js.map +1 -1
  48. package/dist/crud/relations/fixtures/models/contact.model.d.ts +18 -0
  49. package/dist/crud/relations/fixtures/models/contact.model.js +49 -0
  50. package/dist/crud/relations/fixtures/models/contact.model.js.map +1 -0
  51. package/dist/crud/relations/fixtures/models/customer-cart-item-link.model.js +1 -1
  52. package/dist/crud/relations/fixtures/models/customer-cart-item-link.model.js.map +1 -1
  53. package/dist/crud/relations/fixtures/models/customer-promotion-link.model.d.ts +14 -0
  54. package/dist/crud/relations/fixtures/models/customer-promotion-link.model.js +46 -0
  55. package/dist/crud/relations/fixtures/models/customer-promotion-link.model.js.map +1 -0
  56. package/dist/crud/relations/fixtures/models/customer.model.d.ts +16 -3
  57. package/dist/crud/relations/fixtures/models/customer.model.js +28 -10
  58. package/dist/crud/relations/fixtures/models/customer.model.js.map +1 -1
  59. package/dist/crud/relations/fixtures/models/index.d.ts +6 -0
  60. package/dist/crud/relations/fixtures/models/index.js +7 -1
  61. package/dist/crud/relations/fixtures/models/index.js.map +1 -1
  62. package/dist/crud/relations/fixtures/models/order.model.js +1 -1
  63. package/dist/crud/relations/fixtures/models/order.model.js.map +1 -1
  64. package/dist/crud/relations/fixtures/models/payment-method.model.d.ts +47 -0
  65. package/dist/crud/relations/fixtures/models/payment-method.model.js +87 -0
  66. package/dist/crud/relations/fixtures/models/payment-method.model.js.map +1 -0
  67. package/dist/crud/relations/fixtures/models/promotion.model.d.ts +27 -0
  68. package/dist/crud/relations/fixtures/models/promotion.model.js +54 -0
  69. package/dist/crud/relations/fixtures/models/promotion.model.js.map +1 -0
  70. package/dist/crud/relations/fixtures/models/shipment.model.js +1 -1
  71. package/dist/crud/relations/fixtures/models/shipment.model.js.map +1 -1
  72. package/dist/crud/relations/fixtures/models/stakeholder.model.d.ts +7 -0
  73. package/dist/crud/relations/fixtures/models/stakeholder.model.js +38 -0
  74. package/dist/crud/relations/fixtures/models/stakeholder.model.js.map +1 -0
  75. package/dist/crud/relations/fixtures/models/supplier.model.d.ts +15 -0
  76. package/dist/crud/relations/fixtures/models/supplier.model.js +23 -0
  77. package/dist/crud/relations/fixtures/models/supplier.model.js.map +1 -0
  78. package/dist/crud/relations/fixtures/models/user-link.model.js +1 -1
  79. package/dist/crud/relations/fixtures/models/user-link.model.js.map +1 -1
  80. package/dist/crud/relations/fixtures/models/user.model.js +1 -1
  81. package/dist/crud/relations/fixtures/models/user.model.js.map +1 -1
  82. package/dist/crud/relations/fixtures/repositories/address.repository.js +1 -1
  83. package/dist/crud/relations/fixtures/repositories/address.repository.js.map +1 -1
  84. package/dist/crud/relations/fixtures/repositories/cart-item.repository.js +1 -1
  85. package/dist/crud/relations/fixtures/repositories/cart-item.repository.js.map +1 -1
  86. package/dist/crud/relations/fixtures/repositories/contact.repository.d.ts +30 -0
  87. package/dist/crud/relations/fixtures/repositories/contact.repository.js +21 -0
  88. package/dist/crud/relations/fixtures/repositories/contact.repository.js.map +1 -0
  89. package/dist/crud/relations/fixtures/repositories/customer-cart-item-link.repository.js +1 -1
  90. package/dist/crud/relations/fixtures/repositories/customer-cart-item-link.repository.js.map +1 -1
  91. package/dist/crud/relations/fixtures/repositories/customer-promotion-link.repository.d.ts +26 -0
  92. package/dist/crud/relations/fixtures/repositories/customer-promotion-link.repository.js +18 -0
  93. package/dist/crud/relations/fixtures/repositories/customer-promotion-link.repository.js.map +1 -0
  94. package/dist/crud/relations/fixtures/repositories/customer.repository.d.ts +9 -2
  95. package/dist/crud/relations/fixtures/repositories/customer.repository.js +8 -2
  96. package/dist/crud/relations/fixtures/repositories/customer.repository.js.map +1 -1
  97. package/dist/crud/relations/fixtures/repositories/index.d.ts +6 -1
  98. package/dist/crud/relations/fixtures/repositories/index.js +7 -2
  99. package/dist/crud/relations/fixtures/repositories/index.js.map +1 -1
  100. package/dist/crud/relations/fixtures/repositories/order.repository.js +1 -1
  101. package/dist/crud/relations/fixtures/repositories/order.repository.js.map +1 -1
  102. package/dist/crud/relations/fixtures/repositories/payment-method.repository.d.ts +77 -0
  103. package/dist/crud/relations/fixtures/repositories/payment-method.repository.js +45 -0
  104. package/dist/crud/relations/fixtures/repositories/payment-method.repository.js.map +1 -0
  105. package/dist/crud/relations/fixtures/repositories/promotion.repository.d.ts +49 -0
  106. package/dist/crud/relations/fixtures/repositories/promotion.repository.js +25 -0
  107. package/dist/crud/relations/fixtures/repositories/promotion.repository.js.map +1 -0
  108. package/dist/crud/relations/fixtures/repositories/shipment.repository.js +1 -1
  109. package/dist/crud/relations/fixtures/repositories/shipment.repository.js.map +1 -1
  110. package/dist/crud/relations/fixtures/repositories/supplier.repository.d.ts +28 -0
  111. package/dist/crud/relations/fixtures/repositories/supplier.repository.js +21 -0
  112. package/dist/crud/relations/fixtures/repositories/supplier.repository.js.map +1 -0
  113. package/dist/crud/relations/fixtures/repositories/user-link.repository.js +1 -1
  114. package/dist/crud/relations/fixtures/repositories/user-link.repository.js.map +1 -1
  115. package/dist/crud/relations/fixtures/repositories/user.repository.js +1 -1
  116. package/dist/crud/relations/fixtures/repositories/user.repository.js.map +1 -1
  117. package/dist/crud/relations/helpers.d.ts +9 -1
  118. package/dist/crud/relations/helpers.js +86 -11
  119. package/dist/crud/relations/helpers.js.map +1 -1
  120. package/dist/crud/replace-by-id.suite.js +1 -1
  121. package/dist/crud/replace-by-id.suite.js.map +1 -1
  122. package/dist/crud/transactions.suite.js +1 -1
  123. package/dist/crud/transactions.suite.js.map +1 -1
  124. package/dist/crud-test-suite.js +1 -1
  125. package/dist/crud-test-suite.js.map +1 -1
  126. package/dist/helpers.repository-tests.d.ts +1 -1
  127. package/dist/helpers.repository-tests.js +1 -1
  128. package/dist/helpers.repository-tests.js.map +1 -1
  129. package/dist/index.js +1 -1
  130. package/dist/index.js.map +1 -1
  131. package/dist/types.repository-tests.js +1 -1
  132. package/dist/types.repository-tests.js.map +1 -1
  133. package/package.json +14 -14
  134. package/src/crud/create-retrieve.suite.ts +1 -1
  135. package/src/crud/freeform-properties.suite.ts +10 -6
  136. package/src/crud/nested-model-properties.suite.ts +1 -1
  137. package/src/crud/relations/acceptance/belongs-to.inclusion-resolver.polymorphic.relation.acceptance.ts +221 -0
  138. package/src/crud/relations/acceptance/belongs-to.inclusion-resolver.relation.acceptance.ts +1 -1
  139. package/src/crud/relations/acceptance/belongs-to.polymorphic.relation.acceptance.ts +88 -0
  140. package/src/crud/relations/acceptance/belongs-to.relation.acceptance.ts +1 -1
  141. package/src/crud/relations/acceptance/has-many-inclusion-resolver.relation.acceptance.ts +1 -1
  142. package/src/crud/relations/acceptance/has-many-through-inclusion-resolver.acceptance.ts +1 -1
  143. package/src/crud/relations/acceptance/has-many-through-inclusion-resolver.polymorphic.acceptance.ts +255 -0
  144. package/src/crud/relations/acceptance/has-many-through.relation.acceptance.ts +2 -2
  145. package/src/crud/relations/acceptance/has-many-through.relation.polymorphic.acceptance.ts +494 -0
  146. package/src/crud/relations/acceptance/has-many.relation.acceptance.ts +1 -1
  147. package/src/crud/relations/acceptance/has-one.inclusion-resolver.acceptance.ts +1 -1
  148. package/src/crud/relations/acceptance/has-one.inclusion-resolver.polymorphic.acceptance.ts +208 -0
  149. package/src/crud/relations/acceptance/has-one.relation.acceptance.ts +1 -1
  150. package/src/crud/relations/acceptance/has-one.relation.polymorphic.acceptance.ts +328 -0
  151. package/src/crud/relations/acceptance/multi-relations-inclusion-resolver.relation.acceptance.ts +1 -1
  152. package/src/crud/relations/fixtures/models/address.model.ts +1 -1
  153. package/src/crud/relations/fixtures/models/cart-item.model.ts +1 -1
  154. package/src/crud/relations/fixtures/models/contact.model.ts +56 -0
  155. package/src/crud/relations/fixtures/models/customer-cart-item-link.model.ts +1 -1
  156. package/src/crud/relations/fixtures/models/customer-promotion-link.model.ts +52 -0
  157. package/src/crud/relations/fixtures/models/customer.model.ts +40 -10
  158. package/src/crud/relations/fixtures/models/index.ts +7 -1
  159. package/src/crud/relations/fixtures/models/order.model.ts +1 -1
  160. package/src/crud/relations/fixtures/models/payment-method.model.ts +118 -0
  161. package/src/crud/relations/fixtures/models/promotion.model.ts +67 -0
  162. package/src/crud/relations/fixtures/models/shipment.model.ts +1 -1
  163. package/src/crud/relations/fixtures/models/stakeholder.model.ts +33 -0
  164. package/src/crud/relations/fixtures/models/supplier.model.ts +35 -0
  165. package/src/crud/relations/fixtures/models/user-link.model.ts +1 -1
  166. package/src/crud/relations/fixtures/models/user.model.ts +1 -1
  167. package/src/crud/relations/fixtures/repositories/address.repository.ts +1 -1
  168. package/src/crud/relations/fixtures/repositories/cart-item.repository.ts +1 -1
  169. package/src/crud/relations/fixtures/repositories/contact.repository.ts +44 -0
  170. package/src/crud/relations/fixtures/repositories/customer-cart-item-link.repository.ts +1 -1
  171. package/src/crud/relations/fixtures/repositories/customer-promotion-link.repository.ts +20 -0
  172. package/src/crud/relations/fixtures/repositories/customer.repository.ts +48 -1
  173. package/src/crud/relations/fixtures/repositories/index.ts +7 -2
  174. package/src/crud/relations/fixtures/repositories/order.repository.ts +1 -1
  175. package/src/crud/relations/fixtures/repositories/payment-method.repository.ts +118 -0
  176. package/src/crud/relations/fixtures/repositories/promotion.repository.ts +37 -0
  177. package/src/crud/relations/fixtures/repositories/shipment.repository.ts +1 -1
  178. package/src/crud/relations/fixtures/repositories/supplier.repository.ts +40 -0
  179. package/src/crud/relations/fixtures/repositories/user-link.repository.ts +1 -1
  180. package/src/crud/relations/fixtures/repositories/user.repository.ts +1 -1
  181. package/src/crud/relations/helpers.ts +201 -31
  182. package/src/crud/replace-by-id.suite.ts +1 -1
  183. package/src/crud/transactions.suite.ts +1 -1
  184. package/src/crud-test-suite.ts +1 -1
  185. package/src/helpers.repository-tests.ts +2 -2
  186. package/src/index.ts +1 -1
  187. package/src/types.repository-tests.ts +1 -1
@@ -0,0 +1,221 @@
1
+ // Copyright IBM Corp. and LoopBack contributors 2019,2020. All Rights Reserved.
2
+ // Node module: @loopback/repository-tests
3
+ // This file is licensed under the MIT License.
4
+ // License text available at https://opensource.org/licenses/MIT
5
+
6
+ import {expect, skipIf, toJSON} from '@loopback/testlab';
7
+ import {Suite} from 'mocha';
8
+ import {
9
+ CrudFeatures,
10
+ CrudRepositoryCtor,
11
+ CrudTestContext,
12
+ DataSourceOptions,
13
+ } from '../../..';
14
+ import {
15
+ deleteAllModelsInDefaultDataSource,
16
+ withCrudCtx,
17
+ } from '../../../helpers.repository-tests';
18
+ import {
19
+ Contact,
20
+ ContactRepository,
21
+ Customer,
22
+ CustomerRepository,
23
+ Supplier,
24
+ SupplierRepository,
25
+ } from '../fixtures/models';
26
+ import {givenBoundCrudRepositories} from '../helpers';
27
+
28
+ export function belongsToInclusionResolverPolymorphicAcceptance(
29
+ dataSourceOptions: DataSourceOptions,
30
+ repositoryClass: CrudRepositoryCtor,
31
+ features: CrudFeatures,
32
+ ) {
33
+ skipIf<[(this: Suite) => void], void>(
34
+ !features.supportsInclusionResolvers,
35
+ describe,
36
+ 'BelongsTo inclusion resolvers - polymorphic - acceptance',
37
+ suite,
38
+ );
39
+ function suite() {
40
+ before(deleteAllModelsInDefaultDataSource);
41
+ let customerRepo: CustomerRepository;
42
+ let supplierRepo: SupplierRepository;
43
+ let contactRepo: ContactRepository;
44
+
45
+ before(
46
+ withCrudCtx(async function setupRepository(ctx: CrudTestContext) {
47
+ // this helper should create the inclusion resolvers and also
48
+ // register inclusion resolvers for us
49
+ ({customerRepo, supplierRepo, contactRepo} = givenBoundCrudRepositories(
50
+ ctx.dataSource,
51
+ repositoryClass,
52
+ features,
53
+ ));
54
+ expect(customerRepo.contact.inclusionResolver).to.be.Function();
55
+ expect(supplierRepo.contact.inclusionResolver).to.be.Function();
56
+ expect(contactRepo.stakeholder.inclusionResolver).to.be.Function();
57
+
58
+ await ctx.dataSource.automigrate([
59
+ Customer.name,
60
+ Supplier.name,
61
+ Contact.name,
62
+ ]);
63
+ }),
64
+ );
65
+
66
+ beforeEach(async () => {
67
+ await customerRepo.deleteAll();
68
+ await supplierRepo.deleteAll();
69
+ await contactRepo.deleteAll();
70
+ });
71
+
72
+ it('throws an error if it tries to query nonexistent relation names', async () => {
73
+ const customer = await customerRepo.create({name: 'customer'});
74
+ await contactRepo.create({
75
+ stakeholderId: customer.id,
76
+ });
77
+ await expect(
78
+ contactRepo.find({include: ['shipment']}),
79
+ ).to.be.rejectedWith(`Invalid "filter.include" entries: "shipment"`);
80
+ });
81
+
82
+ it('returns single model instance including single related instance', async () => {
83
+ const thor = await customerRepo.create({name: 'Thor'});
84
+ const contact = await contactRepo.create({
85
+ stakeholderId: thor.id,
86
+ });
87
+ const result = await contactRepo.find({
88
+ include: ['stakeholder'],
89
+ });
90
+
91
+ const expected = {
92
+ ...contact,
93
+ isShipped: features.emptyValue,
94
+ shipmentInfo: features.emptyValue,
95
+ stakeholder: {
96
+ ...thor,
97
+ parentId: features.emptyValue,
98
+ },
99
+ };
100
+ expect(toJSON(result)).to.deepEqual([toJSON(expected)]);
101
+ });
102
+
103
+ it('returns multiple model instances including related instances', async () => {
104
+ const thor = await customerRepo.create({
105
+ name: 'Thor',
106
+ paymentMethodType: 'CreditCard',
107
+ });
108
+ const odin = await supplierRepo.create({name: 'Odin'});
109
+ const thorContact = await contactRepo.create({
110
+ stakeholderId: thor.id,
111
+ });
112
+ const odinContact = await contactRepo.create({
113
+ stakeholderId: odin.id,
114
+ stakeholderType: 'Supplier',
115
+ });
116
+
117
+ const result = await contactRepo.find({
118
+ include: ['stakeholder'],
119
+ });
120
+
121
+ const expected = [
122
+ {
123
+ ...thorContact,
124
+ isShipped: features.emptyValue,
125
+ shipmentInfo: features.emptyValue,
126
+ stakeholder: {
127
+ ...thor,
128
+ parentId: features.emptyValue,
129
+ },
130
+ },
131
+ {
132
+ ...odinContact,
133
+ isShipped: features.emptyValue,
134
+ shipmentInfo: features.emptyValue,
135
+ stakeholder: {
136
+ ...odin,
137
+ parentId: features.emptyValue,
138
+ },
139
+ },
140
+ ];
141
+ expect(toJSON(result)).to.deepEqual(toJSON(expected));
142
+ });
143
+
144
+ it('returns a specified instance including its related model instances', async () => {
145
+ const thor = await customerRepo.create({name: 'Thor'});
146
+ const odin = await supplierRepo.create({name: 'Odin'});
147
+ const bella = await supplierRepo.create({name: 'Bella'});
148
+ await contactRepo.create({
149
+ stakeholderId: thor.id,
150
+ });
151
+ await contactRepo.create({
152
+ stakeholderId: bella.id,
153
+ stakeholderType: 'Supplier',
154
+ });
155
+ const odinContact = await contactRepo.create({
156
+ stakeholderId: odin.id,
157
+ stakeholderType: 'Supplier',
158
+ });
159
+
160
+ const result = await contactRepo.findById(odinContact.id, {
161
+ include: ['stakeholder'],
162
+ });
163
+ const expected = {
164
+ ...odinContact,
165
+ isShipped: features.emptyValue,
166
+ shipmentInfo: features.emptyValue,
167
+ stakeholder: {
168
+ ...odin,
169
+ parentId: features.emptyValue,
170
+ },
171
+ };
172
+ expect(toJSON(result)).to.deepEqual(toJSON(expected));
173
+ });
174
+
175
+ it('queries entities with null foreign key', async () => {
176
+ const customer = await customerRepo.create({
177
+ name: 'Thor',
178
+ });
179
+
180
+ const contact1 = await contactRepo.create({
181
+ stakeholderId: customer.id,
182
+ });
183
+
184
+ const contact2 = await contactRepo.create({});
185
+
186
+ const expected = [
187
+ {
188
+ ...contact1,
189
+ isShipped: features.emptyValue,
190
+ shipmentInfo: features.emptyValue,
191
+ stakeholder: {
192
+ ...customer,
193
+ parentId: features.emptyValue,
194
+ },
195
+ },
196
+ {
197
+ ...contact2,
198
+ stakeholderId: features.emptyValue,
199
+ isShipped: features.emptyValue,
200
+ shipmentInfo: features.emptyValue,
201
+ },
202
+ ];
203
+
204
+ const result = await contactRepo.find({include: ['stakeholder']});
205
+ expect(toJSON(result)).to.deepEqual(toJSON(expected));
206
+ });
207
+
208
+ it('throws error if the target repository does not have the registered resolver', async () => {
209
+ const customer = await customerRepo.create({name: 'customer'});
210
+ await contactRepo.create({
211
+ stakeholderId: customer.id,
212
+ });
213
+ // unregister the resolver
214
+ contactRepo.inclusionResolvers.delete('stakeholder');
215
+
216
+ await expect(
217
+ contactRepo.find({include: ['stakeholder']}),
218
+ ).to.be.rejectedWith(`Invalid "filter.include" entries: "stakeholder"`);
219
+ });
220
+ }
221
+ }
@@ -1,4 +1,4 @@
1
- // Copyright IBM Corp. 2019,2020. All Rights Reserved.
1
+ // Copyright IBM Corp. and LoopBack contributors 2019,2020. All Rights Reserved.
2
2
  // Node module: @loopback/repository-tests
3
3
  // This file is licensed under the MIT License.
4
4
  // License text available at https://opensource.org/licenses/MIT
@@ -0,0 +1,88 @@
1
+ // Copyright IBM Corp. and LoopBack contributors 2019,2020. All Rights Reserved.
2
+ // Node module: @loopback/repository-tests
3
+ // This file is licensed under the MIT License.
4
+ // License text available at https://opensource.org/licenses/MIT
5
+
6
+ import {expect, toJSON} from '@loopback/testlab';
7
+ import {
8
+ deleteAllModelsInDefaultDataSource,
9
+ withCrudCtx,
10
+ } from '../../../helpers.repository-tests';
11
+ import {
12
+ CrudFeatures,
13
+ CrudRepositoryCtor,
14
+ CrudTestContext,
15
+ DataSourceOptions,
16
+ } from '../../../types.repository-tests';
17
+ import {
18
+ Contact,
19
+ ContactRepository,
20
+ Customer,
21
+ CustomerRepository,
22
+ Supplier,
23
+ SupplierRepository,
24
+ } from '../fixtures/models';
25
+ import {givenBoundCrudRepositories} from '../helpers';
26
+
27
+ export function belongsToRelationPolymorphicAcceptance(
28
+ dataSourceOptions: DataSourceOptions,
29
+ repositoryClass: CrudRepositoryCtor,
30
+ features: CrudFeatures,
31
+ ) {
32
+ describe('BelongsTo relation (acceptance)', () => {
33
+ before(deleteAllModelsInDefaultDataSource);
34
+
35
+ let customerRepo: CustomerRepository;
36
+ let supplierRepo: SupplierRepository;
37
+ let contactRepo: ContactRepository;
38
+
39
+ before(
40
+ withCrudCtx(async function setupRepository(ctx: CrudTestContext) {
41
+ ({customerRepo, supplierRepo, contactRepo} = givenBoundCrudRepositories(
42
+ ctx.dataSource,
43
+ repositoryClass,
44
+ features,
45
+ ));
46
+ const models = [Customer, Supplier, Contact];
47
+ await ctx.dataSource.automigrate(models.map(m => m.name));
48
+ }),
49
+ );
50
+ beforeEach(async () => {
51
+ await contactRepo.deleteAll();
52
+ });
53
+
54
+ it('can find customer from contact', async () => {
55
+ const customer = await customerRepo.create({
56
+ name: 'McForder customer',
57
+ });
58
+ const contact = await contactRepo.create({
59
+ stakeholderId: customer.id,
60
+ stakeholderType: 'Customer',
61
+ });
62
+
63
+ const result = await contactRepo.stakeholder(contact.id, 'Customer');
64
+ // adding parentId to customer so MySQL doesn't complain about null vs
65
+ // undefined
66
+ expect(toJSON(result)).to.deepEqual(
67
+ toJSON({...customer, parentId: features.emptyValue}),
68
+ );
69
+ });
70
+
71
+ it('can find supplier from contact', async () => {
72
+ const supplier = await supplierRepo.create({
73
+ name: 'McForder supplier',
74
+ });
75
+ const contact = await contactRepo.create({
76
+ stakeholderId: supplier.id,
77
+ stakeholderType: 'Supplier',
78
+ });
79
+
80
+ const result = await contactRepo.stakeholder(contact.id, 'Supplier');
81
+ // adding parentId to customer so MySQL doesn't complain about null vs
82
+ // undefined
83
+ expect(toJSON(result)).to.deepEqual(
84
+ toJSON({...supplier, parentId: features.emptyValue}),
85
+ );
86
+ });
87
+ });
88
+ }
@@ -1,4 +1,4 @@
1
- // Copyright IBM Corp. 2019,2020. All Rights Reserved.
1
+ // Copyright IBM Corp. and LoopBack contributors 2019,2020. All Rights Reserved.
2
2
  // Node module: @loopback/repository-tests
3
3
  // This file is licensed under the MIT License.
4
4
  // License text available at https://opensource.org/licenses/MIT
@@ -1,4 +1,4 @@
1
- // Copyright IBM Corp. 2019,2020. All Rights Reserved.
1
+ // Copyright IBM Corp. and LoopBack contributors 2019,2020. All Rights Reserved.
2
2
  // Node module: @loopback/repository-tests
3
3
  // This file is licensed under the MIT License.
4
4
  // License text available at https://opensource.org/licenses/MIT
@@ -1,4 +1,4 @@
1
- // Copyright IBM Corp. 2020. All Rights Reserved.
1
+ // Copyright IBM Corp. and LoopBack contributors 2020. All Rights Reserved.
2
2
  // Node module: @loopback/repository-tests
3
3
  // This file is licensed under the MIT License.
4
4
  // License text available at https://opensource.org/licenses/MIT
@@ -0,0 +1,255 @@
1
+ // Copyright IBM Corp. and LoopBack contributors 2020. All Rights Reserved.
2
+ // Node module: @loopback/repository-tests
3
+ // This file is licensed under the MIT License.
4
+ // License text available at https://opensource.org/licenses/MIT
5
+
6
+ import {expect, skipIf, toJSON} from '@loopback/testlab';
7
+ import {Suite} from 'mocha';
8
+ import {
9
+ CrudFeatures,
10
+ CrudRepositoryCtor,
11
+ CrudTestContext,
12
+ DataSourceOptions,
13
+ } from '../../..';
14
+ import {
15
+ deleteAllModelsInDefaultDataSource,
16
+ withCrudCtx,
17
+ } from '../../../helpers.repository-tests';
18
+ import {
19
+ Customer,
20
+ CustomerPromotionLink,
21
+ CustomerPromotionLinkRepository,
22
+ CustomerRepository,
23
+ FreeDelivery,
24
+ FreeDeliveryRepository,
25
+ HalfPrice,
26
+ HalfPriceRepository,
27
+ } from '../fixtures/models';
28
+ import {givenBoundCrudRepositories} from '../helpers';
29
+
30
+ export function hasManyThroughInclusionResolverPolymorphicAcceptance(
31
+ dataSourceOptions: DataSourceOptions,
32
+ repositoryClass: CrudRepositoryCtor,
33
+ features: CrudFeatures,
34
+ ) {
35
+ skipIf<[(this: Suite) => void], void>(
36
+ !features.supportsInclusionResolvers,
37
+ describe,
38
+ 'HasManyThrough inclusion resolvers - polymorphic - acceptance',
39
+ suite,
40
+ );
41
+ function suite() {
42
+ describe('HasManyThrough inclusion resolver', () => {
43
+ before(deleteAllModelsInDefaultDataSource);
44
+ let customerRepo: CustomerRepository;
45
+ let freeDeliveryRepo: FreeDeliveryRepository;
46
+ let halfPriceRepo: HalfPriceRepository;
47
+ let customerPromotionLinkRepo: CustomerPromotionLinkRepository;
48
+
49
+ before(
50
+ withCrudCtx(async function setupRepository(ctx: CrudTestContext) {
51
+ // this helper should create the inclusion resolvers and also
52
+ // register inclusion resolvers for us
53
+ ({
54
+ customerRepo,
55
+ freeDeliveryRepo,
56
+ halfPriceRepo,
57
+ customerPromotionLinkRepo,
58
+ } = givenBoundCrudRepositories(
59
+ ctx.dataSource,
60
+ repositoryClass,
61
+ features,
62
+ ));
63
+ expect(customerRepo.promotions.inclusionResolver).to.be.Function();
64
+
65
+ await ctx.dataSource.automigrate([
66
+ Customer.name,
67
+ FreeDelivery.name,
68
+ HalfPrice.name,
69
+ CustomerPromotionLink.name,
70
+ ]);
71
+ }),
72
+ );
73
+
74
+ beforeEach(async () => {
75
+ await customerRepo.deleteAll();
76
+ await freeDeliveryRepo.deleteAll();
77
+ await halfPriceRepo.deleteAll();
78
+ await customerPromotionLinkRepo.deleteAll();
79
+ });
80
+
81
+ it('throws an error if tries to query nonexistent relation names', async () => {
82
+ const customer = await customerRepo.create({name: 'customer'});
83
+ await customerRepo
84
+ .promotions(customer.id)
85
+ .create({description: 'crown'}, {polymorphicType: 'HalfPrice'});
86
+
87
+ await expect(
88
+ customerRepo.find({include: ['crown']}),
89
+ ).to.be.rejectedWith(`Invalid "filter.include" entries: "crown"`);
90
+ });
91
+
92
+ it('returns single model instance including single related instance', async () => {
93
+ const zelda = await customerRepo.create({name: 'Zelda'});
94
+ const freeDelivery = await customerRepo.promotions(zelda.id).create(
95
+ {description: 'crown'},
96
+ {
97
+ throughData: {promotiontype: 'FreeDelivery'},
98
+ polymorphicType: 'FreeDelivery',
99
+ },
100
+ );
101
+
102
+ const result = await customerRepo.find({
103
+ include: ['promotions'],
104
+ });
105
+
106
+ expect(toJSON(result)).to.deepEqual([
107
+ toJSON({
108
+ ...zelda,
109
+ parentId: features.emptyValue,
110
+ promotions: [freeDelivery],
111
+ }),
112
+ ]);
113
+ });
114
+
115
+ it('returns multiple model instances including related instances', async () => {
116
+ const link = await customerRepo.create({name: 'Link'});
117
+ const halfPrice = await customerRepo.promotions(link.id).create(
118
+ {description: 'halfPrice'},
119
+ {
120
+ throughData: {promotiontype: 'HalfPrice'},
121
+ polymorphicType: 'HalfPrice',
122
+ },
123
+ );
124
+ const freeDelivery = await customerRepo.promotions(link.id).create(
125
+ {description: 'freeDelivery'},
126
+ {
127
+ throughData: {promotiontype: 'FreeDelivery'},
128
+ polymorphicType: 'FreeDelivery',
129
+ },
130
+ );
131
+ const freeDelivery2 = await customerRepo.promotions(link.id).create(
132
+ {description: 'freeDelivery 2'},
133
+ {
134
+ throughData: {promotiontype: 'FreeDelivery'},
135
+ polymorphicType: 'FreeDelivery',
136
+ },
137
+ );
138
+
139
+ const result = await customerRepo.find({
140
+ include: ['promotions'],
141
+ });
142
+
143
+ const expected = [
144
+ {
145
+ ...link,
146
+ parentId: features.emptyValue,
147
+ promotions: [halfPrice, freeDelivery, freeDelivery2],
148
+ },
149
+ ];
150
+
151
+ expect(toJSON(result)).to.deepEqual(toJSON(expected));
152
+ });
153
+
154
+ it('returns a specified instance including its related model instances', async () => {
155
+ const link = await customerRepo.create({name: 'Link'});
156
+ const zelda = await customerRepo.create({name: 'Zelda'});
157
+
158
+ await customerRepo.promotions(link.id).create(
159
+ {description: 'crown'},
160
+ {
161
+ throughData: {promotiontype: 'HalfPrice'},
162
+ polymorphicType: 'HalfPrice',
163
+ },
164
+ );
165
+ const zeldaPromotion1 = await customerRepo.promotions(zelda.id).create(
166
+ {description: 'shield'},
167
+ {
168
+ throughData: {promotiontype: 'FreeDelivery'},
169
+ polymorphicType: 'FreeDelivery',
170
+ },
171
+ );
172
+ const zeldaPromotion2 = await customerRepo.promotions(zelda.id).create(
173
+ {description: 'green hat'},
174
+ {
175
+ throughData: {promotiontype: 'FreeDelivery'},
176
+ polymorphicType: 'FreeDelivery',
177
+ },
178
+ );
179
+
180
+ const result = await customerRepo.findById(zelda.id, {
181
+ include: ['promotions'],
182
+ });
183
+ const expected = {
184
+ ...zelda,
185
+ parentId: features.emptyValue,
186
+ promotions: [zeldaPromotion1, zeldaPromotion2],
187
+ };
188
+ expect(toJSON(result)).to.deepEqual(toJSON(expected));
189
+ });
190
+
191
+ it('honours field scope when returning a model', async () => {
192
+ const link = await customerRepo.create({name: 'Link'});
193
+ const zelda = await customerRepo.create({name: 'Zelda'});
194
+ const sword = await customerRepo.promotions(link.id).create(
195
+ {description: 'master sword'},
196
+ {
197
+ throughData: {promotiontype: 'HalfPrice'},
198
+ polymorphicType: 'HalfPrice',
199
+ },
200
+ );
201
+ const shield = await customerRepo.promotions(zelda.id).create(
202
+ {description: 'shield'},
203
+ {
204
+ throughData: {promotiontype: 'FreeDelivery'},
205
+ polymorphicType: 'FreeDelivery',
206
+ },
207
+ );
208
+ const hat = await customerRepo.promotions(zelda.id).create(
209
+ {description: 'hat'},
210
+ {
211
+ throughData: {promotiontype: 'HalfPrice'},
212
+ polymorphicType: 'HalfPrice',
213
+ },
214
+ );
215
+
216
+ const result = await customerRepo.find({
217
+ include: [{relation: 'promotions', scope: {fields: {id: false}}}],
218
+ });
219
+
220
+ const expected = [
221
+ {
222
+ ...link,
223
+ parentId: features.emptyValue,
224
+ promotions: [{description: sword.description}],
225
+ },
226
+ {
227
+ ...zelda,
228
+ parentId: features.emptyValue,
229
+ promotions: [
230
+ {description: shield.description},
231
+ {description: hat.description},
232
+ ],
233
+ },
234
+ ];
235
+
236
+ expect(toJSON(result)).to.deepEqual(toJSON(expected));
237
+ });
238
+
239
+ it('honours limit scope when returning a model', async () => {
240
+ const link = await customerRepo.create({name: 'Link'});
241
+ await customerRepo
242
+ .cartItems(link.id)
243
+ .create({description: 'master sword'});
244
+ await customerRepo.cartItems(link.id).create({description: 'shield'});
245
+
246
+ const result = await customerRepo.find({
247
+ include: [{relation: 'cartItems', scope: {limit: 1}}],
248
+ });
249
+
250
+ expect(result.length).to.eql(1);
251
+ expect(result[0].cartItems.length).to.eql(1);
252
+ });
253
+ });
254
+ }
255
+ }
@@ -1,4 +1,4 @@
1
- // Copyright IBM Corp. 2020. All Rights Reserved.
1
+ // Copyright IBM Corp. and LoopBack contributors 2020. All Rights Reserved.
2
2
  // Node module: @loopback/repository-tests
3
3
  // This file is licensed under the MIT License.
4
4
  // License text available at https://opensource.org/licenses/MIT
@@ -23,9 +23,9 @@ import {
23
23
  CustomerCartItemLinkRepository,
24
24
  CustomerRepository,
25
25
  User,
26
- UserRepository,
27
26
  UserLink,
28
27
  UserLinkRepository,
28
+ UserRepository,
29
29
  } from '../fixtures/models';
30
30
  import {givenBoundCrudRepositories} from '../helpers';
31
31