-
-
Notifications
You must be signed in to change notification settings - Fork 495
/
GH529.test.ts
120 lines (87 loc) · 2.48 KB
/
GH529.test.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
import { Collection, Entity, ManyToOne, MikroORM, OneToMany, PrimaryKey, PrimaryKeyType, Property, ReflectMetadataProvider } from '@mikro-orm/core';
import { PostgreSqlDriver } from '@mikro-orm/postgresql';
@Entity()
export class Customer {
@PrimaryKey()
id!: number;
}
@Entity()
export class Order {
@PrimaryKey()
id!: number;
@ManyToOne()
customer: Customer;
@OneToMany('OrderItem', 'order')
items = new Collection<OrderItem>(this);
@Property()
paid = false;
@Property()
shipped = false;
@Property()
created: Date = new Date();
constructor(customer: Customer) {
this.customer = customer;
}
}
@Entity()
export class Product {
@PrimaryKey()
id!: number;
@Property()
name: string;
@Property()
currentPrice: number;
constructor(name: string, currentPrice: number) {
this.name = name;
this.currentPrice = currentPrice;
}
}
@Entity()
export class OrderItem {
@ManyToOne({ primary: true })
order: Order;
@ManyToOne({ primary: true })
product: Product;
@Property()
amount: number = 1;
@Property()
offeredPrice: number;
[PrimaryKeyType]: [number, number]; // this is needed for proper type checks in `FilterQuery`
constructor(order: Order, product: Product, amount = 1) {
this.order = order;
this.product = product;
this.offeredPrice = product.currentPrice;
this.amount = amount;
}
}
describe('GH issue 529', () => {
let orm: MikroORM<PostgreSqlDriver>;
beforeAll(async () => {
orm = await MikroORM.init({
entities: [Customer, Order, OrderItem, Product],
dbName: `mikro_orm_test_gh_529`,
type: 'postgresql',
});
await orm.getSchemaGenerator().ensureDatabase();
await orm.getSchemaGenerator().dropSchema();
await orm.getSchemaGenerator().createSchema();
});
afterAll(async () => {
await orm.close(true);
});
test(`GH issue 529`, async () => {
const order = new Order(new Customer());
order.items.add(new OrderItem(order, new Product('a', 55)));
order.items.add(new OrderItem(order, new Product('b', 66)));
order.items.add(new OrderItem(order, new Product('c', 77)));
await orm.em.persistAndFlush(order);
orm.em.clear();
const orders = await orm.em.find(Order, {}, ['items']);
expect(orders).toHaveLength(1);
expect(orders[0].items.getItems()).toHaveLength(3);
orm.em.clear();
const o = await orm.em.findOneOrFail(Order, order.id);
await o.items.init();
expect(o.items.getItems()).toHaveLength(3);
});
});