54 lines
2.8 KiB
JavaScript
54 lines
2.8 KiB
JavaScript
const test = require('node:test');
|
|
const assert = require('node:assert/strict');
|
|
|
|
const { getDataSourceUsageMaps: getRssUsage } = require('../src/web/routes/data-sources/rss-feeds/routes');
|
|
const { getDataSourceUsageMaps: getTimetableUsage } = require('../src/web/routes/data-sources/timetables/routes');
|
|
const { getWeatherLocationUsageIds } = require('../src/web/routes/data-sources/weather');
|
|
const { isWeatherIconSetUsed } = require('../src/web/routes/settings/weather-icons');
|
|
const { collectContentReferences } = require('../src/data/content-references');
|
|
|
|
function createPool(slideContent, templateContent) {
|
|
const references = collectContentReferences('slide', 1, { slide: slideContent })
|
|
.concat(collectContentReferences('template', 2, { region: templateContent }));
|
|
return {
|
|
async query(sql, params) {
|
|
if (!sql.includes('FROM c_content_references')) throw new Error('Unexpected query: ' + sql);
|
|
const referenceType = params[0];
|
|
const matching = references.filter(function (reference) {
|
|
return reference.reference_type === referenceType && (params.length < 2 || reference.reference_value === String(params[1]));
|
|
});
|
|
if (sql.includes('COUNT(DISTINCT')) return [[{ owner_count: matching.length ? 1 : 0 }]];
|
|
if (sql.includes('GROUP BY reference_value')) {
|
|
const counts = new Map();
|
|
matching.forEach(function (reference) { counts.set(reference.reference_value, (counts.get(reference.reference_value) || 0) + 1); });
|
|
return [Array.from(counts, ([reference_value, owner_count]) => ({ reference_value, owner_count }))];
|
|
}
|
|
return [Array.from(new Set(matching.map(reference => reference.reference_value)), reference_value => ({ reference_value }))];
|
|
}
|
|
};
|
|
}
|
|
|
|
const common = {
|
|
parseJsonSafe(value) {
|
|
if (typeof value === 'string') return JSON.parse(value);
|
|
return value;
|
|
}
|
|
};
|
|
|
|
test('data-source and weather-icon usage includes template default content', async function () {
|
|
const pool = createPool(
|
|
{ slide: { feed_id: 1, timetable_group_id: 3, weather_location_id: 5, weather_icon_set_id: 'classic' } },
|
|
{ feed_id: 2, timetable_group_id: 4, weather_location_id: 6, weather_icon_set_id: 'template-icons' }
|
|
);
|
|
|
|
const rssUsage = await getRssUsage(pool, common);
|
|
const timetableUsage = await getTimetableUsage(pool, common);
|
|
const weatherUsage = await getWeatherLocationUsageIds(pool, common);
|
|
|
|
assert.deepEqual(Array.from(rssUsage).sort((a, b) => a - b), [1, 2]);
|
|
assert.deepEqual(Array.from(timetableUsage).sort((a, b) => a - b), [3, 4]);
|
|
assert.deepEqual(Array.from(weatherUsage).sort((a, b) => a - b), [5, 6]);
|
|
assert.equal(await isWeatherIconSetUsed(pool, 'classic'), true);
|
|
assert.equal(await isWeatherIconSetUsed(pool, 'template-icons'), true);
|
|
assert.equal(await isWeatherIconSetUsed(pool, 'unused'), false);
|
|
}); |