diff --git a/jest.config.js b/jest.config.js index 7775d675d09982b7aa270c9f0acd60d561063ec9..bba2d6da0e034ce259130df8ca2f86a5e88661ab 100644 --- a/jest.config.js +++ b/jest.config.js @@ -70,6 +70,7 @@ export default { // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. // maxWorkers: "50%", + maxWorkers: 1, // An array of directory names to be searched recursively up from the requiring module's location // moduleDirectories: [ diff --git a/spec/server_test.js b/spec/server_test.js index 20129253ad86038efd1fcf22b8de9e7b53d77260..9c7ac5c57f7a3b74de2527fe35b3636e5da87e36 100644 --- a/spec/server_test.js +++ b/spec/server_test.js @@ -2,7 +2,7 @@ import { describe, it, expect, beforeAll, afterAll, beforeEach, afterEach } from import mockfs from 'mock-fs' import request from 'supertest' import { createApp } from '../src/createApp' -import { createMockServer, getRandomPort } from './util.js' +import { createMockServer, generateSimpleViteManifest, getRandomPort } from './util.js' describe('Manifest service', () => { let app @@ -26,13 +26,13 @@ describe('Manifest service', () => { beforeEach(async () => { mockserver = await createMockServer({ port }) mockserver.respondWith({ - '/api/manifest.json': { some: 'thing' } + '/api/manifest.json': generateSimpleViteManifest({ 'example.js': 'test' }) }) }) afterEach(() => { mockserver.close() - app.timeout = 30000 + process.env.CACHE_TTL = 30000 }) it('is healthy', async () => { @@ -43,53 +43,47 @@ describe('Manifest service', () => { it('fetches manifest data', async () => { const response = await request(app).get('/api/manifest.json') expect(response.statusCode).toBe(200) - expect(response.body).toEqual([{ some: 'thing' }]) + expect(response.body).toEqual([{ namespace: 'test', path: 'example' }]) }) it('caches manifest data', async () => { - await request(app) - .get('/api/manifest.json') - .then(response => { - expect(response.statusCode).toBe(200) - expect(response.body).toEqual([{ some: 'thing' }]) - }) + const response = await request(app).get('/api/manifest.json') + expect(response.statusCode).toBe(200) + expect(response.body).toEqual([{ namespace: 'test', path: 'example' }]) mockserver.close() mockserver = await createMockServer({ port }) - mockserver.respondWith({ '/api/manifest.json': { some: 'different' } }) + mockserver.respondWith({ + '/api/manifest.json': generateSimpleViteManifest({ 'example.js': 'other' }) + }) - await new Promise((resolve, reject) => setTimeout(resolve, 150)) + await new Promise(resolve => setTimeout(resolve, 150)) - await request(app) - .get('/api/manifest.json') - .then(response => { - expect(response.statusCode).toBe(200) - expect(response.body).toEqual([{ some: 'thing' }]) - }) + const response2 = await request(app).get('/api/manifest.json') + expect(response2.statusCode).toBe(200) + expect(response2.body).toEqual([{ namespace: 'test', path: 'example' }]) }) it('refreshes manifest data after caching timeout', async () => { - app.timeout = 100 + process.env.CACHE_TTL = 1 + app = createApp() - await request(app) - .get('/api/manifest.json') - .then(response => { - expect(response.statusCode).toBe(200) - expect(response.body).toEqual([{ some: 'thing' }]) - }) + const response = await request(app).get('/api/manifest.json') + expect(response.statusCode).toBe(200) + expect(response.body).toEqual([{ namespace: 'test', path: 'example' }]) mockserver.close() mockserver = await createMockServer({ port }) - mockserver.respondWith({ '/api/manifest.json': { some: 'different' } }) + mockserver.respondWith({ + '/api/manifest.json': generateSimpleViteManifest({ 'example.js': 'other' }) + }) - await new Promise((resolve, reject) => setTimeout(resolve, 150)) + // wait some time + await new Promise(resolve => setTimeout(resolve, 10)) - await request(app) - .get('/api/manifest.json') - .then(response => { - expect(response.statusCode).toBe(200) - expect(response.body).toEqual([{ some: 'different' }]) - }) + const response2 = await request(app).get('/api/manifest.json') + expect(response2.statusCode).toBe(200) + expect(response2.body).toEqual([{ namespace: 'other', path: 'example' }]) }) it.skip('can load multiple configurations', async () => { diff --git a/spec/util.js b/spec/util.js index 7fe1ae9f46920357f3e6d9f8514788914ef835e4..cd78917e26d22d4267a7739756124a81dfd506cd 100644 --- a/spec/util.js +++ b/spec/util.js @@ -16,3 +16,14 @@ export async function createMockServer ({ port }) { } return server } + +export function generateSimpleViteManifest (mapping) { + const viteManifest = {} + for (const [file, namespace] of Object.entries(mapping)) { + viteManifest[file] = { + file, + meta: namespace ? { manifests: [{ namespace }] } : {} + } + } + return viteManifest +} diff --git a/src/manifests.js b/src/manifests.js index d84d783331278874894ba156c1a84ae5bc14a669..5a3f3acaa105053f4fdc8c64a02774628a5af999 100644 --- a/src/manifests.js +++ b/src/manifests.js @@ -3,13 +3,13 @@ import yaml from 'js-yaml' import fetch from 'node-fetch' import path from 'path' -const CACHE_TTL = parseInt(process.env.CACHE_TTL) - export const loadViteManifests = (() => { let cache let lastCacheTime return async function loadViteManifests ({ useCache = true } = {}) { + const CACHE_TTL = parseInt(process.env.CACHE_TTL) + if (!cache || useCache === false || +new Date() > lastCacheTime + CACHE_TTL) { const urlsSource = await fs.readFile('./config/manifests/urls.yaml', 'utf8') const urls = yaml.load(urlsSource).manifests