148 lines
6.2 KiB
JavaScript
148 lines
6.2 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import { mkdtempSync, rmSync } from 'node:fs';
|
|
import { tmpdir } from 'node:os';
|
|
import { join } from 'node:path';
|
|
import LibDashStore from '../src/index.js';
|
|
import { BetterSqlite3Provider } from '../src/providers/sqlite3/index.js';
|
|
|
|
async function run() {
|
|
console.log('--- Testing Unique Slugs Disambiguation ---');
|
|
|
|
const tempDir = mkdtempSync(join(tmpdir(), 'test-slugs-'));
|
|
const dbFile = join(tempDir, 'test.db');
|
|
const storageDir = join(tempDir, 'storage');
|
|
|
|
const provider = new BetterSqlite3Provider({
|
|
filename: dbFile,
|
|
storageDir,
|
|
});
|
|
|
|
await provider.initialize();
|
|
const store = await new LibDashStore(provider);
|
|
|
|
try {
|
|
const googleAuthId = await store.google_auth.add('slug-tester@example.com');
|
|
const company = await store.company.create({
|
|
name: 'Slug Corp',
|
|
iso639: 'de',
|
|
taxrate: 19,
|
|
reducedtaxrate: 7,
|
|
googleAuthId,
|
|
});
|
|
await store.google_auth.setSelectedCompany(googleAuthId, company.id);
|
|
|
|
console.log('1. Testing createUnderParent duplicate slugs...');
|
|
const art1 = await store.article.createUnderParent({
|
|
googleAuthId,
|
|
parentId: company.rootCategoryId,
|
|
name: 'Root Parent Shirt',
|
|
});
|
|
const art1Res = await store.article.getBySku(googleAuthId, art1.sku);
|
|
assert.equal(art1Res.article.slug, 'root-parent-shirt', `Expected slug 'root-parent-shirt', got '${art1Res.article.slug}'`);
|
|
|
|
const art2 = await store.article.createUnderParent({
|
|
googleAuthId,
|
|
parentId: company.rootCategoryId,
|
|
name: 'Root Parent Shirt',
|
|
});
|
|
const art2Res = await store.article.getBySku(googleAuthId, art2.sku);
|
|
assert.equal(art2Res.article.slug, 'root-parent-shirt-2', `Expected slug 'root-parent-shirt-2', got '${art2Res.article.slug}'`);
|
|
|
|
const art3 = await store.article.createUnderParent({
|
|
googleAuthId,
|
|
parentId: company.rootCategoryId,
|
|
name: 'Root Parent Shirt',
|
|
});
|
|
const art3Res = await store.article.getBySku(googleAuthId, art3.sku);
|
|
assert.equal(art3Res.article.slug, 'root-parent-shirt-3', `Expected slug 'root-parent-shirt-3', got '${art3Res.article.slug}'`);
|
|
|
|
console.log('2. Testing updateBySku self-collision and renaming...');
|
|
// Update art2 without changing name
|
|
await store.article.updateBySku(googleAuthId, art2.sku, { unitamount: 2 });
|
|
let updated2 = await store.article.getBySku(googleAuthId, art2.sku);
|
|
assert.equal(updated2.article.slug, 'root-parent-shirt-2', `Expected unchanged slug, got '${updated2.article.slug}'`);
|
|
|
|
// Update art2 with same name
|
|
await store.article.updateBySku(googleAuthId, art2.sku, { name: 'Root Parent Shirt' });
|
|
updated2 = await store.article.getBySku(googleAuthId, art2.sku);
|
|
assert.equal(updated2.article.slug, 'root-parent-shirt-2', `Expected slug to remain 'root-parent-shirt-2', got '${updated2.article.slug}'`);
|
|
|
|
// Rename art2 to something else
|
|
await store.article.updateBySku(googleAuthId, art2.sku, { name: 'Unique Shirt' });
|
|
updated2 = await store.article.getBySku(googleAuthId, art2.sku);
|
|
assert.equal(updated2.article.slug, 'unique-shirt', `Expected slug 'unique-shirt', got '${updated2.article.slug}'`);
|
|
|
|
// Rename art3 to 'Root Parent Shirt' again: should take root-parent-shirt-2 now that it is free
|
|
await store.article.updateBySku(googleAuthId, art3.sku, { name: 'Root Parent Shirt' });
|
|
const updated3 = await store.article.getBySku(googleAuthId, art3.sku);
|
|
assert.equal(updated3.article.slug, 'root-parent-shirt-2', `Expected slug to fill gap 'root-parent-shirt-2', got '${updated3.article.slug}'`);
|
|
|
|
console.log('3. Testing addChild duplicate slugs...');
|
|
const attrName = await store.attributename.create(googleAuthId, { name: 'Größe' });
|
|
await store.article.toggleParent(googleAuthId, art1.sku, {
|
|
isParent: true,
|
|
attributeNameId: attrName.id,
|
|
});
|
|
const child1 = await store.article.addChild(googleAuthId, art1.sku, {
|
|
value: 'M',
|
|
});
|
|
assert.equal(child1.article.slug, 'root-parent-shirt-m', `Expected child slug 'root-parent-shirt-m', got '${child1.article.slug}'`);
|
|
|
|
// Add another child with name that yields same slug
|
|
const child2 = await store.article.addChild(googleAuthId, art1.sku, {
|
|
value: 'L',
|
|
name: 'Root Parent Shirt - M',
|
|
});
|
|
assert.equal(child2.article.slug, 'root-parent-shirt-m-2', `Expected child slug 'root-parent-shirt-m-2', got '${child2.article.slug}'`);
|
|
|
|
console.log('4. Testing importRows duplicate slugs in same batch...');
|
|
const importRes = await store.article.importRows({
|
|
googleAuthId,
|
|
rows: [
|
|
{ sku: 'IMP-1', name: 'Batch Shirt', parentId: company.rootCategoryId },
|
|
{ sku: 'IMP-2', name: 'Batch Shirt', parentId: company.rootCategoryId },
|
|
{ sku: 'IMP-3', name: 'Batch Shirt', parentId: company.rootCategoryId },
|
|
],
|
|
});
|
|
assert.equal(importRes.errors.length, 0, `Import had errors: ${JSON.stringify(importRes.errors)}`);
|
|
assert.equal(importRes.imported.length, 3);
|
|
|
|
const imp1 = await store.article.getBySku(googleAuthId, 'IMP-1');
|
|
const imp2 = await store.article.getBySku(googleAuthId, 'IMP-2');
|
|
const imp3 = await store.article.getBySku(googleAuthId, 'IMP-3');
|
|
|
|
assert.equal(imp1.article.slug, 'batch-shirt');
|
|
assert.equal(imp2.article.slug, 'batch-shirt-2');
|
|
assert.equal(imp3.article.slug, 'batch-shirt-3');
|
|
|
|
console.log('5. Testing company isolation...');
|
|
const company2 = await store.company.create({
|
|
name: 'Other Corp',
|
|
iso639: 'de',
|
|
taxrate: 19,
|
|
reducedtaxrate: 7,
|
|
googleAuthId,
|
|
});
|
|
await store.google_auth.setSelectedCompany(googleAuthId, company2.id);
|
|
|
|
const artCompany2 = await store.article.createUnderParent({
|
|
googleAuthId,
|
|
parentId: company2.rootCategoryId,
|
|
name: 'Root Parent Shirt',
|
|
});
|
|
const artCompany2Detail = await store.article.getBySku(googleAuthId, artCompany2.sku);
|
|
assert.equal(artCompany2Detail.article.slug, 'root-parent-shirt', `Expected 'root-parent-shirt' in company 2, got '${artCompany2Detail.article.slug}'`);
|
|
|
|
console.log('✅ ALL SLUG TESTS PASSED');
|
|
} finally {
|
|
try {
|
|
rmSync(tempDir, { recursive: true, force: true });
|
|
} catch {}
|
|
}
|
|
}
|
|
|
|
run().catch((err) => {
|
|
console.error('Test failed:', err);
|
|
process.exit(1);
|
|
});
|