Files
dokku/tests/unit/client.bats
Jose Diaz-Gonzalez 8240790381 fix: correct argument handling when setting the --app flag
When setting the `--app` flag, there was a special case for the config plugin. This plugin used to take the `--no-restart` flag as the first argument - and still did until this change - resulting in an invalid call to the plugin subcommands. What is worse is that this functionality carried over to all other plugins as they were rewritten in golang, and thus the issue spread without us knowing.

The fix is to support GNU flag parsing rules, which Golang does not do by default (Because Of Reasons™). Switching to `github.com/spf13/pflag` fixes this issue, and also allows positional arguments to be placed wherever, even in the middle of flags.

Closes #4255
2020-12-20 22:06:33 -05:00

220 lines
6.9 KiB
Bash

#!/usr/bin/env bats
load test_helper
setup() {
global_setup
export DOKKU_HOST=dokku.me
create_app
}
teardown() {
destroy_app
unset DOKKU_HOST
global_teardown
}
@test "(client) unconfigured DOKKU_HOST" {
unset DOKKU_HOST
run /bin/bash -c "${BATS_TEST_DIRNAME}/../../contrib/dokku_client.sh apps"
echo "output: $output"
echo "status: $status"
assert_exit_status 20
}
@test "(client) no args should print help" {
run /bin/bash -c "${BATS_TEST_DIRNAME}/../../contrib/dokku_client.sh | head -1 | grep -E 'Usage: dokku \[.+\] COMMAND <app>.*'"
echo "output: $output"
echo "status: $status"
assert_success
}
@test "(client) arg parsing" {
run /bin/bash -c "dokku config:set --global GLOBAL_KEY=VALUE"
echo "output: $output"
echo "status: $status"
run /bin/bash -c "dokku config:set $TEST_APP GLOBAL_KEY=VALUE"
echo "output: $output"
echo "status: $status"
run /bin/bash -c "${BATS_TEST_DIRNAME}/../../contrib/dokku_client.sh config:export --merged --format shell"
echo "output: $output"
echo "status: $status"
assert_success
common_output="$output"
run /bin/bash -c "dokku config:export $TEST_APP --merged --format shell"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "$common_output"
run /bin/bash -c "dokku config:export --merged $TEST_APP --format shell"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "$common_output"
run /bin/bash -c "dokku config:export --merged --format shell $TEST_APP"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "$common_output"
run /bin/bash -c "dokku --app $TEST_APP config:export --merged --format shell"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "$common_output"
}
@test "(client) apps:create AND apps:destroy with random name" {
setup_client_repo
run /bin/bash -c "${BATS_TEST_DIRNAME}/../../contrib/dokku_client.sh apps:create"
echo "output: $output"
echo "status: $status"
assert_success
git remote | grep dokku
run /bin/bash -c "${BATS_TEST_DIRNAME}/../../contrib/dokku_client.sh apps:destroy --force"
echo "output: $output"
echo "status: $status"
assert_success
}
@test "(client) apps:create AND apps:destroy with name" {
setup_client_repo
local test_app_name=test-apps-create-with-name
run /bin/bash -c "${BATS_TEST_DIRNAME}/../../contrib/dokku_client.sh apps:create $test_app_name"
echo "output: $output"
echo "status: $status"
assert_success
git remote | grep dokku
git remote -v | grep $test_app_name
run /bin/bash -c "${BATS_TEST_DIRNAME}/../../contrib/dokku_client.sh apps:destroy --force"
echo "output: $output"
echo "status: $status"
assert_success
}
@test "(client) config:set" {
run ${BATS_TEST_DIRNAME}/../../contrib/dokku_client.sh config:set $TEST_APP test_var=true test_var2=\"hello world\"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "${BATS_TEST_DIRNAME}/../../contrib/dokku_client.sh config:get $TEST_APP test_var2 | grep -q 'hello world'"
echo "output: $output"
echo "status: $status"
assert_success
}
@test "(client) config:unset" {
run ${BATS_TEST_DIRNAME}/../../contrib/dokku_client.sh config:set $TEST_APP test_var=true test_var2=\"hello world\"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "${BATS_TEST_DIRNAME}/../../contrib/dokku_client.sh config:get $TEST_APP test_var"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "${BATS_TEST_DIRNAME}/../../contrib/dokku_client.sh config:unset $TEST_APP test_var"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "${BATS_TEST_DIRNAME}/../../contrib/dokku_client.sh config:get $TEST_APP test_var | grep test_var"
echo "output: $output"
echo "status: $status"
assert_failure
}
@test "(client) domains:add" {
run /bin/bash -c "${BATS_TEST_DIRNAME}/../../contrib/dokku_client.sh domains:add $TEST_APP www.test.app.dokku.me"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "${BATS_TEST_DIRNAME}/../../contrib/dokku_client.sh domains:add $TEST_APP test.app.dokku.me"
echo "output: $output"
echo "status: $status"
assert_success
}
@test "(client) domains:remove" {
run /bin/bash -c "${BATS_TEST_DIRNAME}/../../contrib/dokku_client.sh domains:add $TEST_APP test.app.dokku.me"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "${BATS_TEST_DIRNAME}/../../contrib/dokku_client.sh domains:remove $TEST_APP test.app.dokku.me"
echo "output: $output"
echo "status: $status"
refute_line "test.app.dokku.me"
}
@test "(client) domains:clear" {
run /bin/bash -c "${BATS_TEST_DIRNAME}/../../contrib/dokku_client.sh domains:add $TEST_APP test.app.dokku.me"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "${BATS_TEST_DIRNAME}/../../contrib/dokku_client.sh domains:clear $TEST_APP"
echo "output: $output"
echo "status: $status"
assert_success
}
# @test "(client) ps" {
# # CI support: 'Ah. I just spoke with our Docker expert --
# # looks like docker exec is built to work with docker-under-libcontainer,
# # but we're using docker-under-lxc. I don't have an estimated time for the fix, sorry
# skip "circleci does not support docker exec at the moment."
# deploy_app
# run /bin/bash -c "${BATS_TEST_DIRNAME}/../../contrib/dokku_client.sh ps $TEST_APP | grep -q 'node web.js'"
# echo "output: $output"
# echo "status: $status"
# assert_success
# }
@test "(client) ps:start" {
deploy_app
run /bin/bash -c "${BATS_TEST_DIRNAME}/../../contrib/dokku_client.sh ps:stop $TEST_APP"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "${BATS_TEST_DIRNAME}/../../contrib/dokku_client.sh ps:start $TEST_APP"
echo "output: $output"
echo "status: $status"
assert_success
for CID_FILE in $DOKKU_ROOT/$TEST_APP/CONTAINER.*; do
run /bin/bash -c "docker ps -q --no-trunc | grep -q $(< $CID_FILE)"
echo "output: $output"
echo "status: $status"
assert_success
done
}
@test "(client) ps:stop" {
deploy_app
run /bin/bash -c "${BATS_TEST_DIRNAME}/../../contrib/dokku_client.sh ps:stop $TEST_APP"
echo "output: $output"
echo "status: $status"
assert_success
for CID_FILE in $DOKKU_ROOT/$TEST_APP/CONTAINER.*; do
run /bin/bash -c "docker ps -q --no-trunc | grep -q $(< $CID_FILE)"
echo "output: $output"
echo "status: $status"
assert_failure
done
}
@test "(client) ps:restart" {
deploy_app
run /bin/bash -c "${BATS_TEST_DIRNAME}/../../contrib/dokku_client.sh ps:restart $TEST_APP"
echo "output: $output"
echo "status: $status"
assert_success
for CID_FILE in $DOKKU_ROOT/$TEST_APP/CONTAINER.*; do
run /bin/bash -c "docker ps -q --no-trunc | grep -q $(< $CID_FILE)"
echo "output: $output"
echo "status: $status"
assert_success
done
}