Release v2.5.6

This commit is contained in:
2026-08-05 19:38:16 +01:00
parent a8ef35b287
commit 9f831f04bc
161 changed files with 8487 additions and 1295 deletions
+62
View File
@@ -0,0 +1,62 @@
const test = require('node:test');
const assert = require('node:assert/strict');
const fs = require('node:fs');
const path = require('node:path');
const { buildDuplicateApiSourceName, buildDuplicateApiSource } = require('../src/web/routes/data-sources/api-sources/duplicate');
const { buildApiSourceFormViewModel } = require('../src/web/routes/data-sources/api-sources/form-view-model');
test('api source duplicate helper copies editable fields and resets runtime state', () => {
const source = {
id: 9,
name: 'Source A',
api_url: 'https://example.com/api',
auth_method: 'bearer',
auth_username: 'user',
auth_password: 'pass',
auth_bearer_token: 'token',
auth_header_name: 'X-API-Key',
auth_header_value: 'secret',
items_path: 'items',
update_interval_value: 15,
update_interval_unit: 'minutes',
last_pulled_at: '2026-08-01T12:00:00.000Z',
last_pull_error: 'Bad response',
last_response_status: 500,
last_response_content_type: 'application/json',
last_response_json: '{"ok":false}'
};
const duplicate = buildDuplicateApiSource(source, buildDuplicateApiSourceName(source.name));
assert.equal(duplicate.id, null);
assert.equal(duplicate.name, 'Copy of Source A');
assert.equal(duplicate.api_url, 'https://example.com/api');
assert.equal(duplicate.apiUrl, 'https://example.com/api');
assert.equal(duplicate.authMethod, 'bearer');
assert.equal(duplicate.authUsername, 'user');
assert.equal(duplicate.authPassword, 'pass');
assert.equal(duplicate.authBearerToken, 'token');
assert.equal(duplicate.authHeaderName, 'X-API-Key');
assert.equal(duplicate.authHeaderValue, 'secret');
assert.equal(duplicate.itemsPath, 'items');
assert.equal(duplicate.lastPulledAt, null);
assert.equal(duplicate.lastPullError, '');
assert.equal(duplicate.lastResponseStatus, null);
assert.equal(duplicate.lastResponseContentType, '');
assert.equal(duplicate.lastResponseJson, '');
});
test('api source duplicate form model keeps info toast variant', () => {
const model = buildApiSourceFormViewModel({ id: null, name: 'Source A' }, 'Review the copied values and save when ready.', { permissionKeys: ['api-sources.create'] }, { messageVariant: 'info', showSaveSecondaryActions: true }, false);
assert.equal(model.messageVariant, 'info');
assert.equal(model.showSaveSecondaryActions, true);
});
test('api source list template includes duplicate action', () => {
const template = fs.readFileSync(path.join(__dirname, '..', 'src', 'web', 'views', 'data-sources', 'api-sources', 'list.hbs'), 'utf8');
assert.match(template, /\/data-sources\/api-sources\/{\{id\}\}\/duplicate/);
assert.match(template, />Dupe<\/a>/);
});