From 94ac908a372e5c6d11ab42eea80df90be552eb22 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Mon, 1 Jul 2024 17:15:11 -0700 Subject: [PATCH] fix(api): fix tests for mode --- packages/api/src/config.js | 14 ++++++++++++ packages/api/test/config.spec.js | 21 ++++++++++++++++-- packages/api/test/maintenance.spec.js | 32 ++++++++++++++++++++++++++- packages/api/test/scripts/globals.js | 2 +- 4 files changed, 65 insertions(+), 4 deletions(-) diff --git a/packages/api/src/config.js b/packages/api/src/config.js index 50603f5259..a23c45fd07 100644 --- a/packages/api/src/config.js +++ b/packages/api/src/config.js @@ -1,6 +1,9 @@ import { modes as MaintenanceModes, DEFAULT_MODE, + NO_READ_OR_WRITE, + READ_ONLY, + READ_WRITE_ONLY, } from './middleware/maintenance.js' /** @@ -193,6 +196,17 @@ function maintenanceModeFromString(s) { return m } } + /** @type {Record} */ + const legacyModeMappings = { + '--': NO_READ_OR_WRITE, + 'r-': READ_ONLY, + rw: READ_WRITE_ONLY, + } + for (const [key, value] of Object.entries(legacyModeMappings)) { + if (s === key) { + return value + } + } throw new Error( `invalid maintenance mode value "${s}". valid choices: ${MaintenanceModes}` ) diff --git a/packages/api/test/config.spec.js b/packages/api/test/config.spec.js index 7bd7919eca..76f7e11039 100644 --- a/packages/api/test/config.spec.js +++ b/packages/api/test/config.spec.js @@ -26,7 +26,7 @@ const BASE_CONFIG = { DATABASE_TOKEN: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTYwMzk2ODgzNCwiZXhwIjoyNTUwNjUzNjM0LCJyb2xlIjoic2VydmljZV9yb2xlIn0.necIJaiP7X2T2QjGeV-FhpkizcNTX8HjDDBAxpgQTEI', DATABASE_CONNECTION: 'postgresql://postgres:postgres@localhost:5432/postgres', - MAINTENANCE_MODE: 'rw', + MAINTENANCE_MODE: 'rwc', S3_REGION: 'us-east-1', S3_ACCESS_KEY_ID: 'minioadmin', S3_SECRET_ACCESS_KEY: 'minioadmin', @@ -145,7 +145,7 @@ test.serial( test.serial( 'serviceConfigFromVariables sets MAINTENANCE_MODE if it contains a valid mode string', (t) => { - const modes = ['--', 'r-', 'rw'] + const modes = ['---', 'r--', 'rw-', 'rwc'] for (const m of modes) { t.is( serviceConfigFromVariables( @@ -159,6 +159,23 @@ test.serial( } ) +test.serial( + 'serviceConfigFromVariables sets MAINTENANCE_MODE if it contains a valid legacy mode string', + (t) => { + const modes = ['--', 'r-', 'rw'] + for (const m of modes) { + t.is( + serviceConfigFromVariables( + override({ + MAINTENANCE_MODE: m, + }) + ).MAINTENANCE_MODE.toString(), + m + '-' + ) + } + } +) + test.serial( 'serviceConfigFromVariables uses unaltered values for string config variables', (t) => { diff --git a/packages/api/test/maintenance.spec.js b/packages/api/test/maintenance.spec.js index 086575bd2a..5a4b171870 100644 --- a/packages/api/test/maintenance.spec.js +++ b/packages/api/test/maintenance.spec.js @@ -3,6 +3,7 @@ import { READ_ONLY, READ_WRITE_ONLY, NO_READ_OR_WRITE, + READ_WRITE_CREATE, } from '../src/middleware/maintenance.js' import { createClientWithUser } from './scripts/helpers.js' @@ -46,17 +47,25 @@ test('maintenance middleware should throw error when in maintenance mode', async const expectedError = { message: /API undergoing maintenance/ } + await setMode(t, READ_WRITE_CREATE) + await t.notThrowsAsync(tryRead(t, token)) + await t.notThrowsAsync(tryWrite(t, token)) + await t.notThrowsAsync(tryCreate(t, token)) + await setMode(t, READ_WRITE_ONLY) await t.notThrowsAsync(tryRead(t, token)) await t.notThrowsAsync(tryWrite(t, token)) + await t.throwsAsync(tryCreate(t, token), expectedError) await setMode(t, READ_ONLY) await t.notThrowsAsync(tryRead(t, token)) await t.throwsAsync(tryWrite(t, token), expectedError) + await t.throwsAsync(tryCreate(t, token), expectedError) await setMode(t, NO_READ_OR_WRITE) await t.throwsAsync(tryRead(t, token), expectedError) await t.throwsAsync(tryWrite(t, token), expectedError) + await t.throwsAsync(tryCreate(t, token), expectedError) }) /** @@ -64,7 +73,7 @@ test('maintenance middleware should throw error when in maintenance mode', async * @param {import('ava').ExecutionContext} t * @param {string} token */ -async function tryWrite(t, token) { +async function tryCreate(t, token) { const mf = getMiniflareContext(t) const res = await mf.dispatchFetch('http://miniflare.test/upload', { headers: { authorization: `Bearer ${token}` }, @@ -77,6 +86,27 @@ async function tryWrite(t, token) { } } +/** + * + * @param {import('ava').ExecutionContext} t + * @param {string} token + */ +async function tryWrite(t, token) { + const mf = getMiniflareContext(t) + const res = await mf.dispatchFetch('http://miniflare.test/upload', { + headers: { + authorization: `Bearer ${token}`, + 'Content-type': 'application/json', + }, + method: 'POST', + body: JSON.stringify({ name: `new key ${new Date().toISOString()}` }), + }) + if (!res.ok) { + const { error } = await res.json() + throw new Error(error.message) + } +} + /** * * @param {import('ava').ExecutionContext} t diff --git a/packages/api/test/scripts/globals.js b/packages/api/test/scripts/globals.js index e670fe1099..d2ca6eed6e 100644 --- a/packages/api/test/scripts/globals.js +++ b/packages/api/test/scripts/globals.js @@ -17,7 +17,7 @@ globalThis.PICKUP_API_URL = 'http://127.0.0.1:9094' // will be used with we can active auth in cluster base64 of test:test globalThis.PICKUP_BASIC_AUTH_TOKEN = 'dGVzdDp0ZXN0' -globalThis.MAINTENANCE_MODE = 'rw' +globalThis.MAINTENANCE_MODE = 'rwc' globalThis.S3_ENDPOINT = 'http://127.0.0.1:9000' globalThis.S3_REGION = 'us-east-1'