146 lines
5.0 KiB
TypeScript
146 lines
5.0 KiB
TypeScript
import { Test } from '@nestjs/testing';
|
|
import { OriginGoodsService } from './origin-goods.service';
|
|
import { PrismaService } from '../prisma/prisma.service';
|
|
|
|
describe('OriginGoodsService', () => {
|
|
let service: OriginGoodsService;
|
|
let prisma: PrismaService;
|
|
const stamp = Date.now();
|
|
const createdSds: string[] = [];
|
|
|
|
beforeAll(async () => {
|
|
const moduleRef = await Test.createTestingModule({
|
|
providers: [OriginGoodsService, PrismaService],
|
|
}).compile();
|
|
service = moduleRef.get(OriginGoodsService);
|
|
prisma = moduleRef.get(PrismaService);
|
|
await prisma.onModuleInit();
|
|
|
|
// Seed 25 rows with sequential goodNames so we can paginate/filter.
|
|
const rows = Array.from({ length: 25 }).map((_, i) => ({
|
|
sdsGoodId: `sds-${stamp}-${i}`,
|
|
goodName: `Origin Good ${stamp} ${i.toString().padStart(2, '0')}`,
|
|
sdsCategoryId: `cat-${stamp}-${i % 3}`,
|
|
}));
|
|
await prisma.originGood.createMany({ data: rows });
|
|
createdSds.push(...rows.map((r) => r.sdsGoodId));
|
|
});
|
|
|
|
afterAll(async () => {
|
|
if (createdSds.length) {
|
|
await prisma.originGood.deleteMany({
|
|
where: { sdsGoodId: { in: createdSds } },
|
|
});
|
|
}
|
|
await prisma.onModuleDestroy();
|
|
});
|
|
|
|
it('should be defined', () => {
|
|
expect(service).toBeDefined();
|
|
});
|
|
|
|
it('returns paginated results', async () => {
|
|
const page1 = await service.findAll({
|
|
page: 1,
|
|
pageSize: 10,
|
|
keyword: `Origin Good ${stamp}`,
|
|
});
|
|
expect(page1.total).toBe(25);
|
|
expect(page1.items.length).toBe(10);
|
|
expect(page1.page).toBe(1);
|
|
expect(page1.pageSize).toBe(10);
|
|
|
|
const page3 = await service.findAll({
|
|
page: 3,
|
|
pageSize: 10,
|
|
keyword: `Origin Good ${stamp}`,
|
|
});
|
|
expect(page3.items.length).toBe(5);
|
|
});
|
|
|
|
it('searches by keyword (case insensitive)', async () => {
|
|
const result = await service.findAll({
|
|
page: 1,
|
|
pageSize: 5,
|
|
keyword: `origin good ${stamp} 05`,
|
|
});
|
|
expect(result.items.length).toBe(1);
|
|
expect(result.items[0].goodName).toContain('05');
|
|
});
|
|
|
|
it('returns empty page when no matches', async () => {
|
|
const result = await service.findAll({
|
|
page: 1,
|
|
pageSize: 5,
|
|
keyword: 'definitely-does-not-exist',
|
|
});
|
|
expect(result.total).toBe(0);
|
|
expect(result.items.length).toBe(0);
|
|
});
|
|
|
|
describe('getTree merged references', () => {
|
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
function findOgNode(
|
|
treeResponse: { tree: any[] },
|
|
ogId: string,
|
|
): { configuredCount: number; configuredCountries: string[] } {
|
|
let found: { configuredCount: number; configuredCountries: string[] } | null = null;
|
|
const walk = (nodes: any[]) => {
|
|
for (const n of nodes) {
|
|
const hit = (n.originGoods ?? []).find((o: any) => o.id === ogId);
|
|
if (hit) {
|
|
found = hit;
|
|
return;
|
|
}
|
|
if (n.children?.length) walk(n.children);
|
|
}
|
|
};
|
|
walk(treeResponse.tree);
|
|
if (!found) throw new Error(`og node ${ogId} not found in tree`);
|
|
return found;
|
|
}
|
|
|
|
it('counts secondary references as configured', async () => {
|
|
const sdsCat = `tree-cat-${stamp}`;
|
|
await prisma.originGood.createMany({
|
|
data: [
|
|
{ sdsGoodId: `tree-a-${stamp}`, goodName: `Tree A ${stamp}`, sdsCategoryId: sdsCat },
|
|
{ sdsGoodId: `tree-b-${stamp}`, goodName: `Tree B ${stamp}`, sdsCategoryId: sdsCat },
|
|
],
|
|
});
|
|
createdSds.push(`tree-a-${stamp}`, `tree-b-${stamp}`);
|
|
const originA = await prisma.originGood.findUniqueOrThrow({ where: { sdsGoodId: `tree-a-${stamp}` } });
|
|
const originB = await prisma.originGood.findUniqueOrThrow({ where: { sdsGoodId: `tree-b-${stamp}` } });
|
|
|
|
const cat = await prisma.category.create({
|
|
data: { categoryName: `Tree Cat ${stamp}`, sdsCategoryId: sdsCat },
|
|
});
|
|
const country = await prisma.country.create({
|
|
data: { countryName: `Tree Country ${stamp}` },
|
|
});
|
|
const good = await prisma.good.create({
|
|
data: {
|
|
goodName: `Tree Good ${stamp}`,
|
|
originGoodId: originA.id,
|
|
countryId: country.id,
|
|
categoryId: cat.id,
|
|
},
|
|
});
|
|
await prisma.goodOriginGood.create({
|
|
data: { goodId: good.id, originGoodId: originB.id },
|
|
});
|
|
|
|
try {
|
|
const tree = await service.getTree();
|
|
const nodeB = findOgNode(tree, originB.id.toString());
|
|
expect(nodeB.configuredCount).toBeGreaterThanOrEqual(1);
|
|
expect(nodeB.configuredCountries).toContain(`Tree Country ${stamp}`);
|
|
} finally {
|
|
await prisma.good.delete({ where: { id: good.id } }).catch(() => undefined);
|
|
await prisma.country.delete({ where: { id: country.id } }).catch(() => undefined);
|
|
await prisma.category.delete({ where: { id: cat.id } }).catch(() => undefined);
|
|
}
|
|
});
|
|
});
|
|
});
|