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>/); });