require "test_helper"

class ConfigurationEnvTest < ActiveSupport::TestCase
  require "test_helper"

  test "simple" do
    assert_config \
      config: { "foo" => "bar", "baz" => "haz" },
      clear: { "foo" => "bar", "baz" => "haz" }
  end

  test "clear" do
    assert_config \
      config: { "clear" => { "foo" => "bar", "baz" => "haz" } },
      clear: { "foo" => "bar", "baz" => "haz" }
  end

  test "secret" do
    with_test_secrets("secrets" => "PASSWORD=hello") do
      assert_config \
        config: { "secret" => [ "PASSWORD" ] },
        secrets: { "PASSWORD" => "hello" }
    end
  end

  test "missing secret" do
    env = {
      "secret" => [ "PASSWORD" ]
    }

    assert_raises(Kamal::ConfigurationError) { Kamal::Configuration::Env.new(config: { "secret" => [ "PASSWORD" ] }, secrets: Kamal::Secrets.new).secrets_io }
  end

  test "secret and clear" do
    with_test_secrets("secrets" => "PASSWORD=hello") do
      config = {
        "secret" => [ "PASSWORD" ],
        "clear" => {
          "foo" => "bar",
          "baz" => "haz"
        }
      }

      assert_config \
        config: config,
        clear: { "foo" => "bar", "baz" => "haz" },
        secrets: { "PASSWORD" => "hello" }
    end
  end

  test "aliased secrets" do
    with_test_secrets("secrets" => "ALIASED_PASSWORD=hello") do
      config = {
        "secret" => [ "PASSWORD:ALIASED_PASSWORD" ],
        "clear" => {}
      }

      assert_config \
        config: config,
        clear: {},
        secrets: { "PASSWORD" => "hello" }
    end
  end

  private
    def assert_config(config:, clear: {}, secrets: {})
      env = Kamal::Configuration::Env.new config: config, secrets: Kamal::Secrets.new
      expected_clear_args = clear.to_a.flat_map { |key, value| [ "--env", "#{key}=\"#{value}\"" ] }
      assert_equal expected_clear_args, env.clear_args.map(&:to_s) #  to_s removes the redactions
      expected_secrets = secrets.to_a.flat_map { |key, value| "#{key}=#{value}" }.join("\n") + "\n"
      assert_equal expected_secrets, env.secrets_io.string
    end
end
