feat(平台): 补齐服务端持久化和AI拆解契约

This commit is contained in:
Script Generator
2026-06-25 15:21:32 +08:00
parent 5723356d08
commit 5adc7759ad
73 changed files with 5599 additions and 368 deletions

View File

@@ -0,0 +1,66 @@
import { BadRequestException } from '@nestjs/common';
import { DataService } from './data.service';
describe('DataService', () => {
const makeService = () => {
const prisma = {
appData: {
findUnique: jest.fn(),
upsert: jest.fn(),
},
};
return {
prisma,
service: new DataService(prisma as any),
};
};
it('returns null for an allowed key with no stored value', async () => {
const { prisma, service } = makeService();
prisma.appData.findUnique.mockResolvedValue(null);
await expect(service.get('products-overview')).resolves.toEqual({
key: 'products-overview',
value: null,
});
});
it('rejects unknown keys', async () => {
const { service } = makeService();
await expect(service.get('unknown-key')).rejects.toBeInstanceOf(BadRequestException);
});
it('upserts JSON values for allowed keys', async () => {
const { prisma, service } = makeService();
const value = [{ id: 'p1', name: 'Product 1' }];
prisma.appData.upsert.mockResolvedValue({ key: 'products-overview', value });
await expect(service.put('products-overview', value)).resolves.toEqual({
key: 'products-overview',
value,
});
expect(prisma.appData.upsert).toHaveBeenCalledWith({
where: { key: 'products-overview' },
update: { value },
create: { key: 'products-overview', value },
});
});
it('allows supporting business data keys migrated from browser storage', async () => {
const { prisma, service } = makeService();
const value: unknown[] = [];
prisma.appData.upsert.mockImplementation(({ where }) =>
Promise.resolve({ key: where.key, value }),
);
await expect(service.put('task-worklogs', value)).resolves.toEqual({
key: 'task-worklogs',
value,
});
await expect(service.put('overtime', { records: [], reasons: [] })).resolves.toEqual({
key: 'overtime',
value,
});
});
});