/
belongs-to.relation.acceptance.ts
122 lines (111 loc) · 3.58 KB
/
belongs-to.relation.acceptance.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// Copyright IBM Corp. 2019. All Rights Reserved.
// Node module: @loopback/repository-tests
// This file is licensed under the MIT License.
// License text available at https://opensource.org/licenses/MIT
import {
BelongsToAccessor,
BelongsToDefinition,
createBelongsToAccessor,
EntityNotFoundError,
Getter,
} from '@loopback/repository';
import {expect, toJSON} from '@loopback/testlab';
import {
deleteAllModelsInDefaultDataSource,
withCrudCtx,
} from '../../../helpers.repository-tests';
import {
CrudFeatures,
CrudRepositoryCtor,
CrudTestContext,
DataSourceOptions,
} from '../../../types.repository-tests';
import {
Customer,
CustomerRepository,
Order,
OrderRepository,
Shipment,
ShipmentRepository,
} from '../fixtures/models';
import {givenBoundCrudRepositories} from '../helpers';
export function belongsToRelationAcceptance(
dataSourceOptions: DataSourceOptions,
repositoryClass: CrudRepositoryCtor,
features: CrudFeatures,
) {
describe('BelongsTo relation (acceptance)', () => {
before(deleteAllModelsInDefaultDataSource);
let findCustomerOfOrder: BelongsToAccessor<
Customer,
typeof Order.prototype.id
>;
let customerRepo: CustomerRepository;
let orderRepo: OrderRepository;
let shipmentRepo: ShipmentRepository;
before(
withCrudCtx(async function setupRepository(ctx: CrudTestContext) {
({customerRepo, orderRepo, shipmentRepo} = givenBoundCrudRepositories(
ctx.dataSource,
repositoryClass,
features,
));
const models = [Customer, Order, Shipment];
await ctx.dataSource.automigrate(models.map(m => m.name));
}),
);
before(givenAccessor);
beforeEach(async () => {
await orderRepo.deleteAll();
});
it('can find customer of order', async () => {
const customer = await customerRepo.create({
name: 'Order McForder',
});
const order = await orderRepo.create({
customerId: customer.id,
description: 'Order from Order McForder, the hoarder of Mordor',
});
const result = await orderRepo.customer(order.id);
// adding parentId to customer so MySQL doesn't complain about null vs
// undefined
expect(toJSON(result)).to.deepEqual(
toJSON({...customer, parentId: features.emptyValue}),
);
});
it('can find shipment of order with a custom foreign key name', async () => {
const shipment = await shipmentRepo.create({
name: 'Tuesday morning shipment',
});
const order = await orderRepo.create({
// eslint-disable-next-line @typescript-eslint/camelcase
shipment_id: shipment.id,
description: 'Order that is shipped Tuesday morning',
});
const result = await orderRepo.shipment(order.id);
expect(result).to.deepEqual(shipment);
});
it('throws EntityNotFound error when the related model does not exist', async () => {
const deletedCustomer = await customerRepo.create({
name: 'Order McForder',
});
const order = await orderRepo.create({
customerId: deletedCustomer.id,
description: 'custotmer will be deleted',
});
await customerRepo.deleteAll();
await orderRepo.deleteAll();
await expect(findCustomerOfOrder(order.id)).to.be.rejectedWith(
EntityNotFoundError,
);
});
// helpers
function givenAccessor() {
findCustomerOfOrder = createBelongsToAccessor(
Order.definition.relations.customer as BelongsToDefinition,
Getter.fromValue(customerRepo),
orderRepo,
);
}
});
}