Files
dashlibstorage/scripts/test-order-create-from-quote.js
2026-10-15 15:54:59 +02:00

123 lines
4.1 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 store.order.createFromQuote in dashdbschema ---');
const tempDir = mkdtempSync(join(tmpdir(), 'test-order-create-from-quote-'));
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('order-from-quote-test@example.com');
const company = await store.company.create({
name: 'Order Quote Corp',
iso639: 'de',
taxrate: 19,
reducedtaxrate: 7,
googleAuthId,
});
await store.google_auth.setSelectedCompany(googleAuthId, company.id);
const groups = await store.customergroup.list(googleAuthId);
const customer = await store.entity.create(googleAuthId, {
customergroupId: groups[0].id,
firstName: 'Alice',
name: 'Wonderland',
});
const art = await store.article.createUnderParent({
googleAuthId,
parentId: company.rootCategoryId,
name: 'Gadget',
track_stock: 0,
});
// 1. Create a quote
const quote = await store.quote.create(googleAuthId, {
number: 'Q-2026-001',
date: '2026-09-01T10:00:00Z',
entityId: customer.id,
externalNumber: 'EXT-QUOTE-123',
lines: [
{ sku: art.sku, name: 'Gadget', pu: 1, amount: 5, net: 20, rebate: 10, taxrate: 19, comment: 'test item' },
],
});
assert.equal(quote.number, 'Q-2026-001');
assert.equal(quote.lines.length, 1);
// 2. Create order from quote with default auto-allocated number & inherited fields
const order1 = await store.order.createFromQuote(googleAuthId, quote.id);
assert.ok(order1.id, 'Order must have an id');
assert.equal(order1.type, 'order');
assert.equal(order1.entityId, customer.id);
assert.equal(order1.externalNumber, 'EXT-QUOTE-123');
assert.ok(order1.number, 'Order must have auto-allocated number');
assert.equal(order1.lines.length, 1);
assert.equal(order1.lines[0].sku, art.sku);
assert.equal(order1.lines[0].amount, 5);
assert.equal(order1.lines[0].net, 20);
assert.equal(order1.lines[0].rebate, 10);
assert.equal(order1.lines[0].taxrate, 19);
assert.equal(order1.lines[0].comment, 'test item');
// Verify ordersummary row
const summaryRows = provider.db.prepare('SELECT * FROM ordersummary WHERE manifest_id = ?').all(order1.id);
assert.equal(summaryRows.length, 1);
assert.equal(summaryRows[0].customer_name, 'Alice Wonderland');
assert.equal(summaryRows[0].positions, 1);
assert.equal(summaryRows[0].ordered_quantity, 5);
// 3. Create order from quote with custom overrides (number, externalNumber, date)
const order2 = await store.order.createFromQuote(googleAuthId, quote.id, {
number: 'ORD-CUSTOM-999',
date: '2026-09-15T12:00:00Z',
externalNumber: 'CUSTOM-EXT',
});
assert.equal(order2.number, 'ORD-CUSTOM-999');
assert.equal(order2.externalNumber, 'CUSTOM-EXT');
assert.equal(order2.lines.length, 1);
// 4. Non-existent quote should throw 'Quote not found'
await assert.rejects(
async () => {
await store.order.createFromQuote(googleAuthId, 999999);
},
{ message: 'Quote not found' }
);
// 5. Invalid quoteId should throw 'Quote not found'
await assert.rejects(
async () => {
await store.order.createFromQuote(googleAuthId, 'invalid');
},
{ message: 'Quote not found' }
);
console.log('PASS: All order.createFromQuote tests passed successfully!');
} finally {
try {
rmSync(tempDir, { recursive: true, force: true });
} catch {
// ignore cleanup errors
}
}
}
run().catch((err) => {
console.error('FAIL: Test failed:', err);
process.exit(1);
});