Files
dokku/tests/unit/docker-options-2.bats
Jose Diaz-Gonzalez 4652749b5b feat: expose docker-options as structured lists in JSON report
Add parallel -list keys to docker-options:report --format json so export
tools can round-trip options without splitting space-joined strings.

Closes #8799
2026-07-07 19:49:17 -04:00

327 lines
11 KiB
Bash

#!/usr/bin/env bats
load test_helper
setup() {
global_setup
create_app
}
teardown() {
destroy_app
global_teardown
}
@test "(docker-options:add) --process scopes option to one process type" {
run /bin/bash -c "dokku docker-options:add --process web $TEST_APP deploy '-p 8080:5000'"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "dokku docker-options:list $TEST_APP --process web --phase deploy"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "-p 8080:5000"
run /bin/bash -c "dokku docker-options:list $TEST_APP --phase deploy"
echo "output: $output"
echo "status: $status"
assert_success
assert_output_contains "-p 8080:5000" 0
}
@test "(docker-options:add) multiple --process flags add to each process" {
run /bin/bash -c "dokku docker-options:add --process web --process worker $TEST_APP deploy '-v /shared:/shared'"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "dokku docker-options:list $TEST_APP --process web --phase deploy"
echo "output: $output"
assert_output "-v /shared:/shared"
run /bin/bash -c "dokku docker-options:list $TEST_APP --process worker --phase deploy"
echo "output: $output"
assert_output "-v /shared:/shared"
}
@test "(docker-options:add) without --process keeps default-scope behaviour" {
run /bin/bash -c "dokku docker-options:add $TEST_APP deploy '-v /tmp/shared:/shared'"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "dokku docker-options:list $TEST_APP --phase deploy"
echo "output: $output"
assert_output_contains "-v /tmp/shared:/shared"
run /bin/bash -c "dokku docker-options:report $TEST_APP --docker-options-deploy"
echo "output: $output"
assert_output_contains "-v /tmp/shared:/shared"
}
@test "(docker-options:add) rejects --process for non-deploy phases" {
run /bin/bash -c "dokku docker-options:add --process web $TEST_APP build '--shm-size 256m'"
echo "output: $output"
echo "status: $status"
assert_failure
assert_output_contains "deploy phase"
run /bin/bash -c "dokku docker-options:add --process web $TEST_APP run '--shm-size 256m'"
echo "output: $output"
echo "status: $status"
assert_failure
run /bin/bash -c "dokku docker-options:add --process web $TEST_APP build,deploy '--shm-size 256m'"
echo "output: $output"
echo "status: $status"
assert_failure
}
@test "(docker-options:add) rejects reserved _default_ process name" {
run /bin/bash -c "dokku docker-options:add --process _default_ $TEST_APP deploy '-v /tmp:/tmp'"
echo "output: $output"
echo "status: $status"
assert_failure
assert_output_contains "_default_"
}
@test "(docker-options:add) warns on process types missing from Procfile" {
run deploy_app python dokku@$DOKKU_DOMAIN:$TEST_APP
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "dokku docker-options:add --process nonexistent $TEST_APP deploy '-v /tmp:/tmp'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output_contains "nonexistent"
}
@test "(docker-options:remove) --process removes from a single process" {
run /bin/bash -c "dokku docker-options:add --process web $TEST_APP deploy '-p 8080:5000'"
echo "output: $output"
assert_success
run /bin/bash -c "dokku docker-options:add --process worker $TEST_APP deploy '-p 9000:9000'"
echo "output: $output"
assert_success
run /bin/bash -c "dokku docker-options:remove --process web $TEST_APP deploy '-p 8080:5000'"
echo "output: $output"
assert_success
run /bin/bash -c "dokku docker-options:list $TEST_APP --process web --phase deploy"
echo "output: $output"
assert_output ""
run /bin/bash -c "dokku docker-options:list $TEST_APP --process worker --phase deploy"
echo "output: $output"
assert_output "-p 9000:9000"
}
@test "(docker-options:clear) --process clears only that process" {
run /bin/bash -c "dokku docker-options:add --process web $TEST_APP deploy '-p 8080:5000'"
echo "output: $output"
assert_success
run /bin/bash -c "dokku docker-options:add --process worker $TEST_APP deploy '-p 9000:9000'"
echo "output: $output"
assert_success
run /bin/bash -c "dokku docker-options:clear --process web $TEST_APP deploy"
echo "output: $output"
assert_success
run /bin/bash -c "dokku docker-options:list $TEST_APP --process web --phase deploy"
echo "output: $output"
assert_output ""
run /bin/bash -c "dokku docker-options:list $TEST_APP --process worker --phase deploy"
echo "output: $output"
assert_output "-p 9000:9000"
}
@test "(docker-options:list) --phase is required" {
run /bin/bash -c "dokku docker-options:list $TEST_APP"
echo "output: $output"
echo "status: $status"
assert_failure
assert_output_contains "phase"
}
@test "(docker-options:report) exposes dynamic per-process keys" {
run /bin/bash -c "dokku docker-options:add --process web $TEST_APP deploy '-p 8080:5000'"
echo "output: $output"
assert_success
run /bin/bash -c "dokku docker-options:report $TEST_APP --docker-options-deploy.web"
echo "output: $output"
echo "status: $status"
assert_success
assert_output_contains "-p 8080:5000"
run /bin/bash -c "dokku docker-options:report $TEST_APP"
echo "output: $output"
assert_success
assert_output_contains "Docker options deploy web"
assert_output_contains "-p 8080:5000"
}
@test "(docker-options:report) --format json carries process-scoped options" {
run /bin/bash -c "dokku docker-options:add --process web $TEST_APP deploy '-p 8080:5000'"
echo "output: $output"
assert_success
run /bin/bash -c "dokku docker-options:add $TEST_APP deploy '-v /logs:/logs'"
echo "output: $output"
assert_success
run /bin/bash -c "dokku docker-options:report $TEST_APP --format json"
echo "output: $output"
echo "status: $status"
assert_success
assert_output_contains '"docker-options-deploy.web"'
assert_output_contains '"deploy.web"'
assert_output_contains '"deploy.web-list"'
assert_output_contains "-p 8080:5000" 3
assert_output_contains '"docker-options-deploy"'
assert_output_contains '"deploy"'
assert_output_contains '"deploy-list"'
assert_output_contains "-v /logs:/logs" 3
}
@test "(docker-options:report) --format json exposes structured -list keys" {
run /bin/bash -c "dokku docker-options:add $TEST_APP build --build-arg X=Y --link foo --link bar"
echo "output: $output"
assert_success
run /bin/bash -c "dokku docker-options:add --process web $TEST_APP deploy '-p 8080:5000'"
echo "output: $output"
assert_success
run /bin/bash -c "dokku docker-options:add $TEST_APP deploy '-v /logs:/logs' '--memory=512m'"
echo "output: $output"
assert_success
run /bin/bash -c "dokku docker-options:add $TEST_APP deploy --label 'com.example.description=my app'"
echo "output: $output"
assert_success
run /bin/bash -c "dokku docker-options:report $TEST_APP --format json | jq -e '.\"build-list\" | length == 3'"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "dokku docker-options:report $TEST_APP --format json | jq -e '.\"deploy-list\" | length == 3'"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "dokku docker-options:report $TEST_APP --format json | jq -e '.\"deploy-list\" | index(\"--memory=512m\") != null'"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "dokku docker-options:report $TEST_APP --format json | jq -e '.\"deploy-list\"[] | select(test(\"my app\"))'"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "dokku docker-options:report $TEST_APP --format json | jq -e '.\"deploy.web-list\"[]'"
echo "output: $output"
echo "status: $status"
assert_success
assert_output_contains "-p 8080:5000"
run /bin/bash -c "dokku docker-options:report $TEST_APP --format json | jq -e 'has(\"docker-options-deploy-list\") | not'"
echo "output: $output"
echo "status: $status"
assert_success
}
@test "(docker-options:report) --format json emits empty -list arrays for unset phases" {
run /bin/bash -c "dokku docker-options:report $TEST_APP --format json | jq -e '.\"build-list\" == [] and .\"deploy-list\" == [] and .\"run-list\" == []'"
echo "output: $output"
echo "status: $status"
assert_success
}
@test "(docker-options) clone copies default and per-process options" {
local CLONE_APP="${TEST_APP}-clone"
run /bin/bash -c "dokku docker-options:add --process web $TEST_APP deploy '-p 8080:5000'"
assert_success
run /bin/bash -c "dokku docker-options:add $TEST_APP deploy '-v /logs:/logs'"
assert_success
run /bin/bash -c "dokku apps:clone --skip-deploy $TEST_APP $CLONE_APP"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "dokku docker-options:list $CLONE_APP --process web --phase deploy"
echo "output: $output"
assert_output "-p 8080:5000"
run /bin/bash -c "dokku docker-options:list $CLONE_APP --phase deploy"
echo "output: $output"
assert_output_contains "-v /logs:/logs"
dokku --force apps:destroy "$CLONE_APP" || true
}
@test "(docker-options) rename moves default and per-process options" {
local RENAMED_APP="${TEST_APP}-renamed"
run /bin/bash -c "dokku docker-options:add --process web $TEST_APP deploy '-p 8080:5000'"
assert_success
run /bin/bash -c "dokku docker-options:add $TEST_APP deploy '-v /logs:/logs'"
assert_success
run /bin/bash -c "dokku apps:rename $TEST_APP $RENAMED_APP"
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "dokku docker-options:list $RENAMED_APP --process web --phase deploy"
assert_output "-p 8080:5000"
run /bin/bash -c "dokku docker-options:list $RENAMED_APP --phase deploy"
assert_output_contains "-v /logs:/logs"
[[ ! -d "/var/lib/dokku/config/docker-options/$TEST_APP" ]]
TEST_APP="$RENAMED_APP"
}
@test "(docker-options) deploy with web-only port mapping does not break worker" {
run /bin/bash -c "dokku docker-options:add --process web $TEST_APP deploy '-p 8080:5000'"
echo "output: $output"
assert_success
run deploy_app python dokku@$DOKKU_DOMAIN:$TEST_APP web_worker_callback
echo "output: $output"
echo "status: $status"
assert_success
assert_output_contains "App container failed to start" 0
assert_output_contains "all ports are allocated" 0
run /bin/bash -c "dokku ps:report $TEST_APP --ps-status-web-1"
echo "output: $output"
assert_output_contains "running"
run /bin/bash -c "dokku ps:report $TEST_APP --ps-status-worker-1"
echo "output: $output"
assert_output_contains "running"
}
web_worker_callback() {
local APP="$1"
local APP_REPO_DIR="$2"
cat >"$APP_REPO_DIR/Procfile" <<EOF
web: python3 -u web.py
worker: python3 -u worker.py
EOF
}