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",