text: const expect = require("expect")
  const translator = require("../../../docker/configurator/translator")
  const dedent = require("dedent")
  
  describe("docker: env translator", function() {
    describe("fundamentals", function() {
      it("should generate an empty baseline config", function () {
        const input = {}
  
        expect(translator(input)).toEqual(``)
      })
  
      it("should call an onFound callback", function () {
        const input = {
          MY_THING: "hey"
        }
  
        const onFoundSpy = expect.createSpy()
  
        const schema = {
          MY_THING: {
            type: "string",
            name: "myThing",
            onFound: onFoundSpy
          }
        }
  
        const res = translator(input, {
          schema
        })
        expect(res).toEqual(`myThing: "hey",`)
        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 () {
        const input = {}
  
        expect(translator(input, {
          injectBaseConfig: true
        })).toEqual(dedent(`
      url: "https://raw.githubusercontent.com/aeeem/Docs/master/docs.yml",
      "dom_id": "#swagger-ui",
      deepLinking: true,
      presets: [
        SwaggerUIBundle.presets.apis,
        SwaggerUIStandalonePreset
      ],
      plugins: [
        SwaggerUIBundle.plugins.DownloadUrl
      ],
      layout: "StandaloneLayout",
      `))
      })
  
      it("should ignore an unknown config", function () {
        const input = {
          ASDF1234: "wow hello"
        }
  
        expect(translator(input)).toEqual(dedent(``))
      })
  
      it("should generate a string config", function () {
        const input = {
          URL: "http://petstore.swagger.io/v2/swagger.json",
          FILTER: ""
        }
  
        expect(translator(input)).toEqual(dedent(`
        url: "http://petstore.swagger.io/v2/swagger.json",
        filter: "",`
        ).trim())
      })
  
      it("should generate a boolean config", function () {
        const input = {
          DEEP_LINKING: "true",
          SHOW_EXTENSIONS: "false",
          SHOW_COMMON_EXTENSIONS: ""
        }
  
        expect(translator(input)).toEqual(dedent(`
        deepLinking: true,
        showExtensions: false,
        showCommonExtensions: undefined,`
        ))
      })
  
      it("should generate an object config", function () {
        const input = {
          SPEC: `{ swagger: "2.0" }`
        }
  
        expect(translator(input)).toEqual(dedent(`
        spec: { swagger: "2.0" },`
        ).trim())
      })
  
      it("should generate an array config", function () {
        const input = {
          URLS: `["/one", "/two"]`,
          SUPPORTED_SUBMIT_METHODS: ""
        }
  
        expect(translator(input)).toEqual(dedent(`
        urls: ["/one", "/two"],
        supportedSubmitMethods: undefined,`
        ).trim())
      })
  
      it("should properly escape key names when necessary", function () {
        const input = {
          URLS: `["/one", "/two"]`,
          URLS_PRIMARY_NAME: "one",
        }
  
        expect(translator(input)).toEqual(dedent(`
        urls: ["/one", "/two"],
        "urls.primaryName": "one",`
        ).trim())
      })
  
      it("should disregard a legacy variable in favor of a regular one", function () {
        const input = {
          // Order is important to this test... legacy vars should be
          // superseded regardless of what is fed in first.
          API_URL: "/old.json",
          URL: "/swagger.json",
          URLS: `["/one", "/two"]`,
          API_URLS: `["/three", "/four"]`,
        }
  
        expect(translator(input)).toEqual(dedent(`
        url: "/swagger.json",
        urls: ["/one", "/two"],`
        ).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",
          API_URLS: `["/old", "/older"]`,
          CONFIG_URL: "/wow",
          DOM_ID: "#swagger_ui",
          SPEC: `{ swagger: "2.0" }`,
          URL: "/swagger.json",
          URLS: `["/one", "/two"]`,
          URLS_PRIMARY_NAME: "one",
          LAYOUT: "BaseLayout",
          DEEP_LINKING: "false",
          DISPLAY_OPERATION_ID: "true",
          DEFAULT_MODELS_EXPAND_DEPTH: "0",
          DEFAULT_MODEL_EXPAND_DEPTH: "1",
          DEFAULT_MODEL_RENDERING: "example",
          DISPLAY_REQUEST_DURATION: "true",
          DOC_EXPANSION: "full",
          FILTER: "wowee",
          MAX_DISPLAYED_TAGS: "4",
          SHOW_EXTENSIONS: "true",
          SHOW_COMMON_EXTENSIONS: "false",
          OAUTH2_REDIRECT_URL: "http://google.com/",
          SHOW_MUTATED_REQUEST: "true",
          SUPPORTED_SUBMIT_METHODS: `["get", "post"]`,
          VALIDATOR_URL: "http://smartbear.com/"
        }
  
        expect(translator(input)).toEqual(dedent(`
        configUrl: "/wow",
        "dom_id": "#swagger_ui",
        spec: { swagger: "2.0" },
        url: "/swagger.json",
        urls: ["/one", "/two"],
        "urls.primaryName": "one",
        layout: "BaseLayout",
        deepLinking: false,
        displayOperationId: true,
        defaultModelsExpandDepth: 0,
        defaultModelExpandDepth: 1,
        defaultModelRendering: "example",
        displayRequestDuration: true,
        docExpansion: "full",
        filter: "wowee",
        maxDisplayedTags: 4,
        showExtensions: true,
        showCommonExtensions: false,
        oauth2RedirectUrl: "http://google.com/",
        showMutatedRequest: true,
        supportedSubmitMethods: ["get", "post"],
        validatorUrl: "http://smartbear.com/",`
        ).trim())
      })
  
      it("should generate a full config k:v string including base config", function () {
        const input = {
          API_URL: "/old.yaml",
          API_URLS: `["/old", "/older"]`,
          CONFIG_URL: "/wow",
          DOM_ID: "#swagger_ui",
          SPEC: `{ swagger: "2.0" }`,
          URL: "/swagger.json",
          URLS: `["/one", "/two"]`,
          URLS_PRIMARY_NAME: "one",
          LAYOUT: "BaseLayout",
          DEEP_LINKING: "false",
          DISPLAY_OPERATION_ID: "true",
          DEFAULT_MODELS_EXPAND_DEPTH: "0",
          DEFAULT_MODEL_EXPAND_DEPTH: "1",
          DEFAULT_MODEL_RENDERING: "example",
          DISPLAY_REQUEST_DURATION: "true",
          DOC_EXPANSION: "full",
          FILTER: "wowee",
          MAX_DISPLAYED_TAGS: "4",
          SHOW_EXTENSIONS: "true",
          SHOW_COMMON_EXTENSIONS: "false",
          OAUTH2_REDIRECT_URL: "http://google.com/",
          SHOW_MUTATED_REQUEST: "true",
          SUPPORTED_SUBMIT_METHODS: `["get", "post"]`,
          VALIDATOR_URL: "http://smartbear.com/"
        }
  
        expect(translator(input, { injectBaseConfig: true })).toEqual(dedent(`
        presets: [
          SwaggerUIBundle.presets.apis,
          SwaggerUIStandalonePreset
        ],
        plugins: [
          SwaggerUIBundle.plugins.DownloadUrl
        ],
        configUrl: "/wow",
        "dom_id": "#swagger_ui",
        spec: { swagger: "2.0" },
        url: "/swagger.json",
        urls: ["/one", "/two"],
        "urls.primaryName": "one",
        layout: "BaseLayout",
        deepLinking: false,
        displayOperationId: true,
        defaultModelsExpandDepth: 0,
        defaultModelExpandDepth: 1,
        defaultModelRendering: "example",
        displayRequestDuration: true,
        docExpansion: "full",
        filter: "wowee",
        maxDisplayedTags: 4,
        showExtensions: true,
        showCommonExtensions: false,
        oauth2RedirectUrl: "http://google.com/",
        showMutatedRequest: true,
        supportedSubmitMethods: ["get", "post"],
        validatorUrl: "http://smartbear.com/",`
        ).trim())
      })
    })
  })
  