Skip to content

Commit 781dde2

Browse files
committed
add spec for entityTypeColumn and entityIdColumn
1 parent 9dff289 commit 781dde2

File tree

4 files changed

+84
-0
lines changed

4 files changed

+84
-0
lines changed

src/__tests__/entities/advert.entity.ts

+13
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,17 @@ export class AdvertEntity {
1818

1919
@Column({ nullable: true })
2020
entityType: string;
21+
22+
@PolymorphicParent(() => [UserEntity, MerchantEntity], {
23+
entityTypeColumn: 'creatorType',
24+
entityIdColumn: 'creatorId',
25+
eager: true,
26+
})
27+
creator: UserEntity | MerchantEntity;
28+
29+
@Column({ nullable: true })
30+
creatorId: number;
31+
32+
@Column({ nullable: true })
33+
creatorType: string;
2134
}

src/__tests__/entities/merchant.entity.ts

+7
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,11 @@ export class MerchantEntity {
1111
eager: false,
1212
})
1313
adverts: AdvertEntity[];
14+
15+
@PolymorphicChildren(() => AdvertEntity, {
16+
entityTypeColumn: 'creatorType',
17+
entityIdColumn: 'creatorId',
18+
eager: false,
19+
})
20+
createdAdverts: AdvertEntity[];
1421
}

src/__tests__/entities/user.entity.ts

+7
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,11 @@ export class UserEntity {
1111
eager: false,
1212
})
1313
adverts: AdvertEntity[];
14+
15+
@PolymorphicChildren(() => AdvertEntity, {
16+
entityTypeColumn: 'creatorType',
17+
entityIdColumn: 'creatorId',
18+
eager: false,
19+
})
20+
createdAdverts: AdvertEntity[];
1421
}

src/__tests__/polymorphic.repository.spec.ts

+57
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,31 @@ describe('AbstractPolymorphicRepository', () => {
179179
expect(result?.entityId).toBeNull();
180180
expect(result?.entityType).toBeNull();
181181
});
182+
183+
it('Can find entity with customized entity and id columns', async () => {
184+
const repository = AbstractPolymorphicRepository.createRepository(
185+
connection,
186+
AdvertRepository,
187+
);
188+
const userRepository = connection.getRepository(UserEntity);
189+
190+
const user = await userRepository.save(new UserEntity());
191+
192+
const advert = await repository.save(
193+
repository.create({
194+
creator: user,
195+
}),
196+
);
197+
198+
const result = await repository.findOne({ where: { id: advert.id } });
199+
200+
expect(result).toBeInstanceOf(AdvertEntity);
201+
202+
expect(result?.creator).toBeInstanceOf(UserEntity);
203+
expect(result?.creator.id).toBe(result?.creatorId);
204+
expect(result?.creatorType).toBe(UserEntity.name);
205+
expect(result?.creatorId).toBe(result?.creator.id);
206+
});
182207
});
183208

184209
describe('find', () => {
@@ -265,6 +290,38 @@ describe('AbstractPolymorphicRepository', () => {
265290
expect(result?.adverts[0].entityType).toBe(UserEntity.name);
266291
expect(result?.adverts[0].entityId).toBe(user.id);
267292
});
293+
294+
it('Can find parent entity with children with customized entity and id columns', async () => {
295+
const repository = AbstractPolymorphicRepository.createRepository(
296+
connection,
297+
UserRepository,
298+
);
299+
const advertRepository = AbstractPolymorphicRepository.createRepository(
300+
connection,
301+
AdvertRepository,
302+
);
303+
304+
const user = await repository.save(new UserEntity());
305+
306+
const advert = await advertRepository.save(
307+
advertRepository.create({
308+
creator: user,
309+
}),
310+
);
311+
312+
let result = await repository.findOne({
313+
where: { id: user.id },
314+
});
315+
316+
result = await repository.hydrateOne(result);
317+
318+
expect(result).toBeInstanceOf(UserEntity);
319+
expect(result?.createdAdverts).toHaveLength(1);
320+
expect(result?.createdAdverts[0]).toBeInstanceOf(AdvertEntity);
321+
expect(result?.createdAdverts[0].id).toBe(advert.id);
322+
expect(result?.createdAdverts[0].creatorType).toBe(UserEntity.name);
323+
expect(result?.createdAdverts[0].creatorId).toBe(user.id);
324+
});
268325
});
269326
});
270327
});

0 commit comments

Comments
 (0)