task(F1): wcadlib export/import endpoints + fix gfolder/gblock id collisions
This commit is contained in:
@@ -424,3 +424,104 @@ describe('Global Blocks API', () => {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// ─── Task F1: Library-Paket Export/Import (.wcadlib) ──────
|
||||
|
||||
describe('Global Blocks API – F1 export/import', () => {
|
||||
let app: FastifyInstance;
|
||||
let db: SqliteAdapter;
|
||||
let authToken: string;
|
||||
|
||||
beforeAll(async () => {
|
||||
db = new SqliteAdapter(':memory:');
|
||||
await db.init();
|
||||
app = await createServer({ db, port: 0 });
|
||||
await app.ready();
|
||||
const regRes = await app.inject({
|
||||
method: 'POST',
|
||||
url: '/api/auth/register',
|
||||
payload: { email: 'f1-export@example.com', password: 'Password123!', name: 'F1 Test', role: 'admin' },
|
||||
});
|
||||
authToken = JSON.parse(regRes.body).session.token;
|
||||
});
|
||||
|
||||
afterAll(async () => {
|
||||
await app.close();
|
||||
db.close();
|
||||
});
|
||||
|
||||
it('GET /api/global-blocks/export liefert wcadlib-Paket mit folders+blocks', async () => {
|
||||
// Setup: 1 Ordner + 1 Block
|
||||
const folder = await app.inject({
|
||||
method: 'POST',
|
||||
url: '/api/global-folders',
|
||||
headers: { authorization: `Bearer ${authToken}` },
|
||||
payload: { name: 'F1-Ordner' },
|
||||
});
|
||||
const folderId = JSON.parse(folder.body).id;
|
||||
await app.inject({
|
||||
method: 'POST',
|
||||
url: '/api/global-blocks',
|
||||
headers: { authorization: `Bearer ${authToken}` },
|
||||
payload: { name: 'F1-Block', folder_id: folderId, block_data: '{"type":"rect"}' },
|
||||
});
|
||||
|
||||
const res = await app.inject({
|
||||
method: 'GET',
|
||||
url: '/api/global-blocks/export',
|
||||
headers: { authorization: `Bearer ${authToken}` },
|
||||
});
|
||||
expect(res.statusCode).toBe(200);
|
||||
const pkg = JSON.parse(res.body);
|
||||
expect(pkg.format).toBe('wcadlib');
|
||||
expect(Array.isArray(pkg.folders)).toBe(true);
|
||||
expect(Array.isArray(pkg.blocks)).toBe(true);
|
||||
expect(pkg.folders.length).toBeGreaterThanOrEqual(1);
|
||||
expect(pkg.blocks.length).toBeGreaterThanOrEqual(1);
|
||||
});
|
||||
|
||||
it('POST /api/global-blocks/import spielt Paket mit Ordner-Mapping ein', async () => {
|
||||
const pkg = {
|
||||
format: 'wcadlib',
|
||||
version: 1,
|
||||
folders: [
|
||||
{ id: 'src-folder-1', name: 'Import-Ordner', parent_id: null },
|
||||
],
|
||||
blocks: [
|
||||
{ name: 'Import-Block', folder_id: 'src-folder-1', block_data: '{"type":"circle"}', svg_data: null },
|
||||
{ name: 'Import-Block-Root', folder_id: null, block_data: '{}', svg_data: null },
|
||||
],
|
||||
};
|
||||
const res = await app.inject({
|
||||
method: 'POST',
|
||||
url: '/api/global-blocks/import',
|
||||
headers: { authorization: `Bearer ${authToken}` },
|
||||
payload: pkg,
|
||||
});
|
||||
expect(res.statusCode, res.body).toBe(201);
|
||||
const body = JSON.parse(res.body);
|
||||
expect(body.imported_blocks).toBe(2);
|
||||
expect(body.imported_folders).toBe(1);
|
||||
|
||||
// Block im importierten Ordner auffindbar:
|
||||
const blocks = await app.inject({
|
||||
method: 'GET',
|
||||
url: '/api/global-blocks',
|
||||
headers: { authorization: `Bearer ${authToken}` },
|
||||
});
|
||||
const list = JSON.parse(blocks.body) as Array<{ name: string; folder_id: string | null }>;
|
||||
const importedBlock = list.find((b) => b.name === 'Import-Block');
|
||||
expect(importedBlock).toBeDefined();
|
||||
expect(importedBlock!.folder_id).not.toBeNull(); // Mapping erhalten
|
||||
});
|
||||
|
||||
it('Import mit falschem format liefert 400', async () => {
|
||||
const res = await app.inject({
|
||||
method: 'POST',
|
||||
url: '/api/global-blocks/import',
|
||||
headers: { authorization: `Bearer ${authToken}` },
|
||||
payload: { format: 'wrong', blocks: [] },
|
||||
});
|
||||
expect(res.statusCode).toBe(400);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user