From d5ecca0fd44f66e256bddaf07f33aaf65e696916 Mon Sep 17 00:00:00 2001 From: Donal McBreen Date: Wed, 14 Aug 2024 09:49:36 +0100 Subject: [PATCH] Add tests --- lib/kamal/cli/secrets.rb | 8 +++---- test/cli/secrets_test.rb | 50 ++++++++++++++++++---------------------- test/test_helper.rb | 17 ++++++++++++++ 3 files changed, 44 insertions(+), 31 deletions(-) diff --git a/lib/kamal/cli/secrets.rb b/lib/kamal/cli/secrets.rb index 1b192b0a..5becfdc5 100644 --- a/lib/kamal/cli/secrets.rb +++ b/lib/kamal/cli/secrets.rb @@ -1,21 +1,21 @@ class Kamal::Cli::Secrets < Kamal::Cli::Base desc "login", "Login to a secrets vault" option :adapter, type: :string, aliases: "-a", required: true, desc: "Which vault adapter to use" - option :adapter_options, type: :hash, aliases: "-O", required: true, desc: "Options to pass to the vault adapter" + option :adapter_options, type: :hash, aliases: "-O", required: false, desc: "Options to pass to the vault adapter" def login puts adapter(options).login(**adapter_options(options)) end desc "fetch", "Fetch a secret from a vault" option :adapter, type: :string, aliases: "-a", required: true, desc: "Which vault adapter to use" - option :adapter_options, type: :hash, aliases: "-O", required: true, desc: "Options to pass to the vault adapter" + option :adapter_options, type: :hash, aliases: "-O", required: false, desc: "Options to pass to the vault adapter" def fetch(name) puts adapter(options).fetch(name, **adapter_options(options)) end desc "fetch_all", "Fetch multiple secrets from a vault" option :adapter, type: :string, aliases: "-a", required: true, desc: "Which vault adapter to use" - option :adapter_options, type: :hash, aliases: "-O", required: true, desc: "Options to pass to the vault adapter" + option :adapter_options, type: :hash, aliases: "-O", required: false, desc: "Options to pass to the vault adapter" def fetch_all(*names) puts JSON.dump(adapter(options).fetch_all(*names, **adapter_options(options))).shellescape end @@ -31,6 +31,6 @@ class Kamal::Cli::Secrets < Kamal::Cli::Base end def adapter_options(options) - options[:adapter_options].transform_keys(&:to_sym) + options.fetch(:adapter_options, {}).transform_keys(&:to_sym) end end diff --git a/test/cli/secrets_test.rb b/test/cli/secrets_test.rb index 0fa78eb6..7ac5f9d7 100644 --- a/test/cli/secrets_test.rb +++ b/test/cli/secrets_test.rb @@ -2,45 +2,41 @@ require_relative "cli_test_case" class CliSecretsTest < CliTestCase test "login" do - run_command("login").tap do |output| - assert_match /docker login -u \[REDACTED\] -p \[REDACTED\] as .*@localhost/, output - assert_match /docker login -u \[REDACTED\] -p \[REDACTED\] on 1.1.1.\d/, output + assert_equal "LOGIN_TOKEN", run_command("login", "--adapter", "test") + end + + test "login failed" do + assert_raises("Boom!") do + run_command("login", "--adapter", "test", "--adapter-options", "boom:true") end end test "fetch" do - run_command("login", "-L").tap do |output| - assert_no_match /docker login -u \[REDACTED\] -p \[REDACTED\] as .*@localhost/, output - assert_match /docker login -u \[REDACTED\] -p \[REDACTED\] on 1.1.1.\d/, output + assert_equal "oof", run_command("fetch", "foo", "--adapter", "test") + end + + test "fetch failed" do + assert_raises("Boom!") do + run_command("fetch", "foo", "--adapter", "test", "--adapter-options", "boom:true") end end test "fetch_all" do - run_command("login", "-R").tap do |output| - assert_match /docker login -u \[REDACTED\] -p \[REDACTED\] as .*@localhost/, output - assert_no_match /docker login -u \[REDACTED\] -p \[REDACTED\] on 1.1.1.\d/, output + assert_equal \ + "\\{\\\"foo\\\":\\\"oof\\\",\\\"bar\\\":\\\"rab\\\",\\\"baz\\\":\\\"zab\\\"\\}", + run_command("fetch_all", "foo", "bar", "baz", "--adapter", "test") + end + + test "fetch_all failed" do + assert_raises("Boom!") do + assert_equal \ + "\\{\\\"foo\\\":\\\"oof\\\",\\\"bar\\\":\\\"rab\\\",\\\"baz\\\":\\\"zab\\\"\\}", + run_command("fetch_all", "foo", "bar", "baz", "--adapter", "test", "--adapter-options", "boom:true") end end test "extract" do - run_command("logout").tap do |output| - assert_match /docker logout as .*@localhost/, output - assert_match /docker logout on 1.1.1.\d/, output - end - end - - test "logout skip local" do - run_command("logout", "-L").tap do |output| - assert_no_match /docker logout as .*@localhost/, output - assert_match /docker logout on 1.1.1.\d/, output - end - end - - test "logout skip remote" do - run_command("logout", "-R").tap do |output| - assert_match /docker logout as .*@localhost/, output - assert_no_match /docker logout on 1.1.1.\d/, output - end + assert_equal "oof", run_command("extract", "foo", "{\"foo\":\"oof\", \"bar\":\"rab\", \"baz\":\"zab\"}") end private diff --git a/test/test_helper.rb b/test/test_helper.rb index ff1ad43a..10063acc 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -63,3 +63,20 @@ class ActiveSupport::TestCase FileUtils.rm_rf(@secrets_tmpdir) end end + +class Kamal::Secrets::Adapters::Test + def login(boom: false) + raise "Boom!" if boom + "LOGIN_TOKEN" + end + + def fetch(name, boom: false) + raise "Boom!" if boom + name.reverse + end + + def fetch_all(*names, boom: false) + raise "Boom!" if boom + names.to_h { |name| [ name, name.reverse ] } + end +end