From 02758b8125dbf38763cfd5d4f91c7c803e9bd0ad Mon Sep 17 00:00:00 2001 From: kyle Date: Tue, 6 Nov 2018 01:57:20 +0000 Subject: [PATCH] bugfix: legacy Docker variables being overridden by default values (via #5006) * add `onFound` callback to schemas * add warning to method docs (for #4957) * implement Docker OAuth2 init block support * update docs * add OAUTH_SCOPE_SEPARATOR * drop OAuth env from Dockerfile and run script * don't indent the first oauth block line * drop unused `dedent` import * touch up warning message * add more test cases * return an empty block if no OAuth content is generated * fix broken doc line * allow legacy values to override base values --- docker/configurator/translator.js | 25 ++++++---- test/docker/translator.js | 83 +++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 9 deletions(-) diff --git a/docker/configurator/translator.js b/docker/configurator/translator.js index 1671672e..22ecb216 100644 --- a/docker/configurator/translator.js +++ b/docker/configurator/translator.js @@ -1,46 +1,52 @@ // Converts an object of environment variables into a Swagger UI config object const configSchema = require("./variables") -const baseConfig = { +const defaultBaseConfig = { url: { value: "https://petstore.swagger.io/v2/swagger.json", schema: { - type: "string" + type: "string", + base: true } }, dom_id: { value: "#swagger-ui", schema: { - type: "string" + type: "string", + base: true } }, deepLinking: { value: "true", schema: { - type: "boolean" + type: "boolean", + base: true } }, presets: { value: `[\n SwaggerUIBundle.presets.apis,\n SwaggerUIStandalonePreset\n]`, schema: { - type: "array" + type: "array", + base: true } }, plugins: { value: `[\n SwaggerUIBundle.plugins.DownloadUrl\n]`, schema: { - type: "array" + type: "array", + base: true } }, layout: { value: "StandaloneLayout", schema: { - type: "string" + type: "string", + base: true } } } -function objectToKeyValueString(env, { injectBaseConfig = false, schema = configSchema } = {}) { +function objectToKeyValueString(env, { injectBaseConfig = false, schema = configSchema, baseConfig = defaultBaseConfig } = {}) { let valueStorage = injectBaseConfig ? Object.assign({}, baseConfig) : {} const keys = Object.keys(env) @@ -62,8 +68,9 @@ function objectToKeyValueString(env, { injectBaseConfig = false, schema = config const storageContents = valueStorage[varSchema.name] if(storageContents) { - if(varSchema.legacy === true) { + if (varSchema.legacy === true && !storageContents.schema.base) { // If we're looking at a legacy var, it should lose out to any already-set value + // except for base values return } delete valueStorage[varSchema.name] diff --git a/test/docker/translator.js b/test/docker/translator.js index bf7597e7..6e1344aa 100644 --- a/test/docker/translator.js +++ b/test/docker/translator.js @@ -32,6 +32,65 @@ describe("docker: env translator", function() { expect(onFoundSpy.calls.length).toEqual(1) }) + + it("should use a regular value over a legacy one, regardless of order", function () { + const schema = { + MY_THING: { + type: "string", + name: "myThing" + }, + MY_OTHER_THING: { + type: "string", + name: "myThing", + legacy: true + } + } + + // Regular value provided first + expect(translator({ + MY_THING: "hey", + MY_OTHER_THING: "hello" + }, { + schema + })).toEqual(`myThing: "hey",`) + + // Legacy value provided first + expect(translator({ + MY_OTHER_THING: "hello", + MY_THING: "hey" + }, { + schema + })).toEqual(`myThing: "hey",`) + }) + + it("should use a legacy value over a base one, regardless of order", function () { + const schema = { + MY_THING: { + type: "string", + name: "myThing", + legacy: true + } + } + + const baseConfig = { + myThing: { + value: "base", + schema: { + type: "string", + base: true + } + } + } + + // Regular value provided first + expect(translator({ + MY_THING: "legacy" + }, { + injectBaseConfig: true, + schema, + baseConfig + })).toEqual(`myThing: "legacy",`) + }) }) describe("Swagger UI configuration", function() { it("should generate a base config including the base content", function () { @@ -138,6 +197,30 @@ describe("docker: env translator", function() { ).trim()) }) + + it("should pick up legacy variables when using base config", function () { + const input = { + API_URL: "/swagger.json", + API_URLS: `["/one", "/two"]`, + } + + expect(translator(input, { injectBaseConfig: true })).toEqual(dedent(` + "dom_id": "#swagger-ui", + deepLinking: true, + presets: [ + SwaggerUIBundle.presets.apis, + SwaggerUIStandalonePreset + ], + plugins: [ + SwaggerUIBundle.plugins.DownloadUrl + ], + layout: "StandaloneLayout", + url: "/swagger.json", + urls: ["/one", "/two"],` + + ).trim()) + }) + it("should generate a full config k:v string", function () { const input = { API_URL: "/old.yaml",