71 lines
2.8 KiB
JavaScript
71 lines
2.8 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import fs from 'node:fs/promises';
|
|
import path from 'node:path';
|
|
import test from 'node:test';
|
|
|
|
const root = path.resolve(import.meta.dirname, '..');
|
|
const read = relativePath => fs.readFile(path.join(root, relativePath), 'utf8');
|
|
|
|
test('complete REST API documentation is kept outside the README', async () => {
|
|
const readme = await read('README.md');
|
|
const api = await read('docs/REST-API.md');
|
|
|
|
assert.match(readme, /\[.*REST-API.*\]\(docs\/REST-API\.md\)/i);
|
|
assert.doesNotMatch(readme, /^## REST-API$/m);
|
|
assert.doesNotMatch(readme, /curl .*\/api\//);
|
|
|
|
for (const endpoint of [
|
|
'GET /api/health',
|
|
'GET /api/routes',
|
|
'GET /api/routes/:id',
|
|
'GET /api/routes/:id/pois',
|
|
'GET /api/pois/:id',
|
|
'POST /api/routes',
|
|
'PUT /api/routes/:id',
|
|
'POST /api/routes/:id/append',
|
|
'POST /api/routes/:id/pois',
|
|
'PUT /api/pois/:id',
|
|
'GET /api/routes/:id/pictures',
|
|
'GET /api/routes/:id/pictures/:pictureId',
|
|
'POST /api/routes/:id/pictures',
|
|
'PUT /api/routes/:id/pictures/:pictureId',
|
|
'DELETE /api/routes/:id/pictures/:pictureId',
|
|
'GET /api/routes/:id/audio',
|
|
'POST /api/routes/:id/audio',
|
|
'PUT /api/routes/:id/audio',
|
|
'DELETE /api/routes/:id/audio',
|
|
'DELETE /api/routes/:id',
|
|
'POST /api/routes/:id/restore'
|
|
]) {
|
|
assert.ok(api.includes(endpoint), `missing API documentation: ${endpoint}`);
|
|
}
|
|
|
|
for (const parameter of [
|
|
'lat', 'lon', 'radiusKm', 'includeDeleted', 'gpx', 'name', 'slug',
|
|
'description', 'schoolName', 'title', 'triggerRadiusM', 'sequence',
|
|
'picture', 'pictureId', 'caption', 'audio', 'poiId'
|
|
]) {
|
|
assert.match(api, new RegExp(`\\b${parameter}\\b`), `missing parameter documentation: ${parameter}`);
|
|
}
|
|
});
|
|
|
|
test('POI media uploads use dedicated single-resource endpoints', async () => {
|
|
const router = await read('src/routes/api.js');
|
|
const routesService = await read('src/services/routes-service.js');
|
|
const mediaService = await read('src/services/media-service.js');
|
|
|
|
assert.match(router, /post\('\/routes\/:id\/pictures', upload\.single\('picture'\)/);
|
|
assert.match(router, /put\('\/routes\/:id\/pictures\/:pictureId', upload\.single\('picture'\)/);
|
|
assert.match(router, /delete\('\/routes\/:id\/pictures\/:pictureId'/);
|
|
assert.match(router, /post\('\/routes\/:id\/audio', upload\.single\('audio'\)/);
|
|
assert.match(router, /put\('\/routes\/:id\/audio', upload\.single\('audio'\)/);
|
|
assert.match(router, /delete\('\/routes\/:id\/audio'/);
|
|
assert.match(router, /post\('\/routes\/:id\/pois', upload\.none\(\)/);
|
|
assert.doesNotMatch(routesService, /files\.images|files\.audio/);
|
|
assert.match(mediaService, /caption/);
|
|
assert.match(mediaService, /removeStoredFile/);
|
|
assert.match(mediaService, /pictureApiUrl/);
|
|
assert.match(mediaService, /audioApiUrl/);
|
|
assert.doesNotMatch(router, /audio\/:poiId/);
|
|
});
|