Files
dokku/tests/unit/certs.bats
2026-05-13 00:09:47 -04:00

231 lines
6.6 KiB
Bash

#!/usr/bin/env bats
load test_helper
setup_local_tls() {
TLS=$BATS_TMPDIR/tls
mkdir -p $TLS
tar xf $BATS_TEST_DIRNAME/server_ssl.tar -C $TLS
tar xf $BATS_TEST_DIRNAME/domain_ssl.tar -C $TLS
sudo chown -R dokku:dokku $TLS
}
teardown_local_tls() {
TLS=$BATS_TMPDIR/tls
rm -R $TLS
}
setup() {
global_setup
create_app
setup_local_tls
}
teardown() {
destroy_app
teardown_local_tls
global_teardown
}
@test "(certs) certs:help" {
run /bin/bash -c "dokku certs"
echo "output: $output"
echo "status: $status"
assert_output_contains "Manage SSL (TLS) certs"
help_output="$output"
run /bin/bash -c "dokku certs:help"
echo "output: $output"
echo "status: $status"
assert_output_contains "Manage SSL (TLS) certs"
assert_output "$help_output"
}
@test "(certs:report) info-flag works before deploy" {
run /bin/bash -c "dokku certs:report $TEST_APP --ssl-hostnames"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "dokku certs:report $TEST_APP --ssl-dir"
echo "output: $output"
echo "status: $status"
assert_success
assert_output_contains "/$TEST_APP/tls"
run /bin/bash -c "dokku certs:report $TEST_APP --ssl-invalid-flag"
echo "output: $output"
echo "status: $status"
assert_failure
assert_output_contains "Invalid flag passed"
}
@test "(certs:report) --global --format json" {
run /bin/bash -c "dokku certs:report --global --format json | jq -e ."
echo "output: $output"
echo "status: $status"
assert_success
assert_output "{}"
run /bin/bash -c "dokku certs:report --global"
echo "output: $output"
echo "status: $status"
assert_success
assert_output_contains "global ssl information"
run /bin/bash -c "dokku certs:report --global --ssl-bogus"
echo "output: $output"
echo "status: $status"
assert_failure
assert_output_contains "Invalid flag passed"
}
@test "(certs) certs:add" {
run /bin/bash -c "dokku certs:add $TEST_APP $BATS_TMPDIR/tls/server.crt $BATS_TMPDIR/tls/server.key"
echo "output: $output"
echo "status: $status"
assert_success
}
@test "(certs:add) preserves explicit https:443 port mapping" {
run /bin/bash -c "dokku ports:set $TEST_APP http:80:80 https:443:443"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "dokku certs:add $TEST_APP $BATS_TMPDIR/tls/server.crt $BATS_TMPDIR/tls/server.key"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "dokku --quiet ports:report $TEST_APP --ports-map"
echo "output: $output"
echo "status: $status"
assert_output "http:80:80 https:443:443"
}
@test "(certs:add) adds default https:443 mapping when none exists" {
run /bin/bash -c "dokku ports:set $TEST_APP http:80:5000"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "dokku certs:add $TEST_APP $BATS_TMPDIR/tls/server.crt $BATS_TMPDIR/tls/server.key"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "dokku --quiet ports:report $TEST_APP --ports-map"
echo "output: $output"
echo "status: $status"
assert_output "http:80:5000 https:443:5000"
}
@test "(certs) certs:add with multiple dots in the filename" {
run /bin/bash -c "dokku certs:add $TEST_APP $BATS_TMPDIR/tls/domain.com.crt $BATS_TMPDIR/tls/domain.com.key"
echo "output: $output"
echo "status: $status"
assert_success
}
@test "(certs) certs:add tar:in" {
run /bin/bash -c "dokku certs:add $TEST_APP < $BATS_TEST_DIRNAME/server_ssl.tar"
echo "output: $output"
echo "status: $status"
assert_success
}
@test "(certs) certs:add tar:in should ignore OSX hidden files" {
run /bin/bash -c "dokku certs:add $TEST_APP < $BATS_TEST_DIRNAME/osx_ssl_tarred.tar"
echo "output: $output"
echo "status: $status"
assert_success
}
@test "(certs) certs:add with symbolic link for certificate" {
ln -s $BATS_TMPDIR/tls/server.crt $BATS_TMPDIR/tls/linked_server.crt
run /bin/bash -c "dokku certs:add $TEST_APP $BATS_TMPDIR/tls/linked_server.crt $BATS_TMPDIR/tls/server.key"
echo "output: $output"
echo "status: $status"
assert_success
}
@test "(certs) certs:add with symbolic link for private key" {
ln -s $BATS_TMPDIR/tls/server.key $BATS_TMPDIR/tls/linked_server.key
run /bin/bash -c "dokku certs:add $TEST_APP $BATS_TMPDIR/tls/server.crt $BATS_TMPDIR/tls/linked_server.key"
echo "output: $output"
echo "status: $status"
assert_success
}
@test "(certs) certs:remove" {
run /bin/bash -c "dokku certs:add $TEST_APP < $BATS_TEST_DIRNAME/server_ssl.tar && dokku certs:remove $TEST_APP"
echo "output: $output"
echo "status: $status"
assert_success
}
@test "(certs) certs-set plugin trigger" {
run_plugn_trigger certs-set "$TEST_APP" "$BATS_TMPDIR/tls/server.crt" "$BATS_TMPDIR/tls/server.key"
echo "output: $output"
echo "status: $status"
assert_success
[[ -f "$DOKKU_ROOT/$TEST_APP/tls/server.crt" ]]
[[ -f "$DOKKU_ROOT/$TEST_APP/tls/server.key" ]]
}
@test "(certs) certs-set plugin trigger missing key file" {
run_plugn_trigger certs-set "$TEST_APP" "$BATS_TMPDIR/tls/server.crt" "/nonexistent/server.key"
echo "output: $output"
echo "status: $status"
assert_failure
assert_output_contains "KEY file specified not found"
}
@test "(certs) certs-remove plugin trigger" {
run /bin/bash -c "dokku certs:add $TEST_APP $BATS_TMPDIR/tls/server.crt $BATS_TMPDIR/tls/server.key"
echo "output: $output"
echo "status: $status"
assert_success
run_plugn_trigger certs-remove "$TEST_APP"
echo "output: $output"
echo "status: $status"
assert_success
[[ ! -d "$DOKKU_ROOT/$TEST_APP/tls" ]]
}
@test "(certs) certs-remove plugin trigger without endpoint" {
run_plugn_trigger certs-remove "$TEST_APP"
echo "output: $output"
echo "status: $status"
assert_failure
assert_output_contains "An app-specific SSL endpoint is not defined"
}
@test "(certs) certs:show" {
run /bin/bash -c "dokku certs:show fake-app-name 2>&1"
echo "output: $output"
echo "status: $status"
assert_output_contains "App fake-app-name does not exist"
assert_failure
run /bin/bash -c "dokku certs:show $TEST_APP fake-var-name"
echo "output: $output"
echo "status: $status"
assert_output_contains "specify either 'key' or 'crt'"
assert_failure
run /bin/bash -c "dokku certs:add $TEST_APP < $BATS_TEST_DIRNAME/server_ssl.tar && dokku certs:show $TEST_APP crt"
echo "output: $output"
echo "status: $status"
assert_output_contains "-----END CERTIFICATE-----"
assert_success
run /bin/bash -c "dokku certs:add $TEST_APP < $BATS_TEST_DIRNAME/server_ssl.tar && dokku certs:show $TEST_APP key"
echo "output: $output"
echo "status: $status"
assert_output_contains "-----END PRIVATE KEY-----"
assert_success
}