#!/usr/bin/env bats load test_helper setup() { global_setup [[ -f "$DOKKU_ROOT/VHOST" ]] && cp -fp "$DOKKU_ROOT/VHOST" "$DOKKU_ROOT/VHOST.bak" create_app dokku --force postgres:destroy $TEST_APP 2>/dev/null || true dokku --force redis:destroy $TEST_APP 2>/dev/null || true dokku --force postgres:destroy $TEST_APP-other 2>/dev/null || true dokku --force redis:destroy $TEST_APP-other 2>/dev/null || true } teardown() { destroy_app dokku --force postgres:destroy $TEST_APP 2>/dev/null || true dokku --force redis:destroy $TEST_APP 2>/dev/null || true dokku --force postgres:destroy $TEST_APP-other 2>/dev/null || true dokku --force redis:destroy $TEST_APP-other 2>/dev/null || true [[ -f "$DOKKU_ROOT/VHOST.bak" ]] && mv "$DOKKU_ROOT/VHOST.bak" "$DOKKU_ROOT/VHOST" && chown dokku:dokku "$DOKKU_ROOT/VHOST" global_teardown } @test "(ports) ports:help" { run /bin/bash -c "dokku ports" echo "output: $output" echo "status: $status" assert_output_contains "Manage ports for an app" help_output="$output" run /bin/bash -c "dokku ports:help" echo "output: $output" echo "status: $status" assert_output_contains "Manage ports for an app" assert_output "$help_output" } @test "(ports) ports subcommands (list/add/set/remove/clear)" { run /bin/bash -c "dokku ports:set $TEST_APP http:1234:5001" 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:1234:5001" run /bin/bash -c "dokku --quiet ports:report $TEST_APP --ports-map-json | jq -e 'length == 1 and .[0].scheme == \"http\" and .[0].host_port == 1234 and .[0].container_port == 5001'" echo "output: $output" echo "status: $status" assert_success run /bin/bash -c "dokku ports:add $TEST_APP http:8080:5002 https:8443:5003" 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:1234:5001 http:8080:5002 https:8443:5003" run /bin/bash -c "dokku --quiet ports:report $TEST_APP --ports-map-json | jq -e 'length == 3 and any(.scheme == \"http\" and .host_port == 1234 and .container_port == 5001) and any(.scheme == \"http\" and .host_port == 8080 and .container_port == 5002) and any(.scheme == \"https\" and .host_port == 8443 and .container_port == 5003)'" echo "output: $output" echo "status: $status" assert_success run /bin/bash -c "dokku ports:set $TEST_APP http:8080:5000 https:8443:5000 http:1234:5001" echo "output: $output" echo "status: $status" assert_success run /bin/bash -c "dokku ports:set $TEST_APP http:8080:5000 https:8443:5000 http:1234:5001 http:1234:5002" echo "output: $output" echo "status: $status" assert_failure run /bin/bash -c "dokku ports:add $TEST_APP http:12345:5002 http:12345:5004" echo "output: $output" echo "status: $status" assert_failure run /bin/bash -c "dokku ports:add $TEST_APP http:1234:5003 http:12345:5004" echo "output: $output" echo "status: $status" assert_failure run /bin/bash -c "dokku ports:add $TEST_APP http:1234:5001" echo "output: $output" echo "status: $status" assert_failure run /bin/bash -c "dokku --quiet ports:report $TEST_APP --ports-map" echo "output: $output" echo "status: $status" assert_output "http:1234:5001 http:8080:5000 https:8443:5000" run /bin/bash -c "dokku --quiet ports:report $TEST_APP --ports-map-json | jq -e 'length == 3 and any(.scheme == \"http\" and .host_port == 1234 and .container_port == 5001) and any(.scheme == \"http\" and .host_port == 8080 and .container_port == 5000) and any(.scheme == \"https\" and .host_port == 8443 and .container_port == 5000)'" echo "output: $output" echo "status: $status" assert_success run /bin/bash -c "dokku ports:remove $TEST_APP 8080" 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:1234:5001 https:8443:5000" run /bin/bash -c "dokku --quiet ports:report $TEST_APP --ports-map-json | jq -e 'length == 2 and any(.scheme == \"http\" and .host_port == 1234 and .container_port == 5001) and any(.scheme == \"https\" and .host_port == 8443 and .container_port == 5000)'" echo "output: $output" echo "status: $status" assert_success run /bin/bash -c "dokku ports:remove $TEST_APP http:1234:5001" 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 "https:8443:5000" run /bin/bash -c "dokku --quiet ports:report $TEST_APP --ports-map-json | jq -e 'length == 1 and .[0].scheme == \"https\" and .[0].host_port == 8443 and .[0].container_port == 5000'" echo "output: $output" echo "status: $status" assert_success run /bin/bash -c "dokku ports:clear $TEST_APP" 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_not_exists run /bin/bash -c "dokku --quiet ports:report $TEST_APP --ports-map-json | jq -e '. == [] or . == null'" echo "output: $output" echo "status: $status" assert_success run /bin/bash -c "dokku --quiet ports:report $TEST_APP --ports-map-detected" echo "output: $output" echo "status: $status" assert_output "http:80:5000" run /bin/bash -c "dokku --quiet ports:report $TEST_APP --ports-map-detected-json | jq -e 'length == 1 and .[0].scheme == \"http\" and .[0].host_port == 80 and .[0].container_port == 5000'" echo "output: $output" echo "status: $status" assert_success } @test "(ports:add) post-deploy add" { run deploy_app echo "output: $output" echo "status: $status" assert_success run /bin/bash -c "dokku ports:add $TEST_APP http:8080:5000 http:8081:5000" echo "output: $output" echo "status: $status" assert_success URLS="$(dokku --quiet urls "$TEST_APP")" for URL in $URLS; do assert_http_success $URL done assert_http_success "http://$TEST_APP.${DOKKU_DOMAIN}:8080" assert_http_success "http://$TEST_APP.${DOKKU_DOMAIN}:8081" } @test "(ports:report) herokuish tls" { run /bin/bash -c "dokku builder-herokuish:set $TEST_APP allowed true" echo "output: $output" echo "status: $status" assert_success run /bin/bash -c "dokku ports:report $TEST_APP --ports-map" echo "output: $output" echo "status: $status" assert_output_not_exists run /bin/bash -c "dokku ports:report $TEST_APP --ports-map-detected" echo "output: $output" echo "status: $status" assert_output "http:80:5000" run setup_test_tls echo "output: $output" echo "status: $status" assert_success run deploy_app echo "output: $output" echo "status: $status" assert_success run /bin/bash -c "dokku ports:report $TEST_APP --ports-map" echo "output: $output" echo "status: $status" assert_output_not_exists run /bin/bash -c "dokku ports:report $TEST_APP --ports-map-detected" echo "output: $output" echo "status: $status" assert_output "http:80:5000 https:443:5000" } @test "(ports:report) dockerfile tls" { run deploy_app python dokku@$DOKKU_DOMAIN:$TEST_APP move_expose_dockerfile_into_place echo "output: $output" echo "status: $status" assert_success run /bin/bash -c "dokku ports:report $TEST_APP --ports-map" echo "output: $output" echo "status: $status" assert_output_not_exists run /bin/bash -c "dokku ports:report $TEST_APP --ports-map-detected" echo "output: $output" echo "status: $status" assert_output "http:3000:3000 http:3003:3003 udp:3001:3001" run setup_test_tls echo "output: $output" echo "status: $status" assert_success run /bin/bash -c "dokku ports:report $TEST_APP --ports-map" echo "output: $output" echo "status: $status" assert_output_not_exists run /bin/bash -c "dokku ports:report $TEST_APP --ports-map-detected" echo "output: $output" echo "status: $status" assert_output "https:3000:3000 https:3003:3003 udp:3001:3001" } @test "(ports:rename) renamed app persists ports" { if ! dokku plugin:installed postgres; then run /bin/bash -c "dokku plugin:install https://github.com/dokku/dokku-postgres.git" echo "output: $output" echo "status: $status" assert_success fi if ! dokku plugin:installed redis; then run /bin/bash -c "dokku plugin:install https://github.com/dokku/dokku-redis.git" echo "output: $output" echo "status: $status" assert_success fi run /bin/bash -c "dokku ports:set $TEST_APP http:80:3000" echo "output: $output" echo "status: $status" assert_success run /bin/bash -c "dokku config:set $TEST_APP APP_SECRET=REPLACE_WITH_LONG_SECRET_REPLACE_WITH_LONG_SECRET" echo "output: $output" echo "status: $status" assert_success run /bin/bash -c "dokku postgres:create $TEST_APP $TEST_APP" echo "output: $output" echo "status: $status" assert_success run /bin/bash -c "dokku postgres:link $TEST_APP $TEST_APP" echo "output: $output" echo "status: $status" assert_success run /bin/bash -c "dokku redis:create $TEST_APP $TEST_APP" echo "output: $output" echo "status: $status" assert_success run /bin/bash -c "dokku redis:link $TEST_APP $TEST_APP" echo "output: $output" echo "status: $status" assert_success dokku git:from-image $TEST_APP docmost/docmost:latest echo "output: $output" echo "status: $status" assert_success run /bin/bash -c "dokku ports:report $TEST_APP --ports-map" echo "output: $output" echo "status: $status" assert_success assert_output "http:80:3000" run /bin/bash -c "dokku ports:report $TEST_APP --ports-map-detected" echo "output: $output" echo "status: $status" assert_success assert_output "http:3000:3000" run /bin/bash -c "dokku apps:rename $TEST_APP $TEST_APP-other" echo "output: $output" echo "status: $status" assert_success assert_output_contains "Application deployed" run /bin/bash -c "dokku ports:report $TEST_APP-other --ports-map" echo "output: $output" echo "status: $status" assert_success assert_output "http:80:3000" run /bin/bash -c "dokku ports:report $TEST_APP-other --ports-map-detected" echo "output: $output" echo "status: $status" assert_success assert_output "http:3000:3000" } @test "(ports) ports not reinitialized on upgrade" { run /bin/bash -c "dokku domains:clear-global" echo "output: $output" echo "status: $status" assert_success run /bin/bash -c "dokku domains:disable $TEST_APP" echo "output: $output" echo "status: $status" assert_success run /bin/bash -c "dokku ports:add $TEST_APP http:3001:3001" echo "output: $output" echo "status: $status" assert_success run /bin/bash -c "dokku checks:disable $TEST_APP" echo "output: $output" echo "status: $status" assert_success run /bin/bash -c "dokku domains:report $TEST_APP --domains-global-enabled" echo "output: $output" echo "status: $status" assert_success assert_output_contains "false" run /bin/bash -c "dokku git:from-image $TEST_APP louislam/uptime-kuma:2" echo "output: $output" echo "status: $status" assert_success run /bin/bash -c "dokku ports:report $TEST_APP" echo "output: $output" echo "status: $status" assert_success run /bin/bash -c "dokku ports:report $TEST_APP --ports-map" echo "output: $output" echo "status: $status" assert_success assert_output "http:3001:3001" run /bin/bash -c "dokku ports:report $TEST_APP --ports-map-detected" echo "output: $output" echo "status: $status" assert_success assert_output "http:3001:3001" run /bin/bash -c "dokku domains:report $TEST_APP --domains-global-enabled" echo "output: $output" echo "status: $status" assert_success assert_output_contains "false" run /bin/bash -c "dokku domains:setup $TEST_APP" echo "output: $output" echo "status: $status" assert_success assert_output_contains "Global server virtual host not set, disabling app vhost" assert_output_not_contains "No port set, setting to random open high port" assert_output_not_contains "Random port" run /bin/bash -c "dokku ports:report $TEST_APP --ports-map" echo "output: $output" echo "status: $status" assert_success assert_output "http:3001:3001" run /bin/bash -c "dokku ports:report $TEST_APP --ports-map-detected" echo "output: $output" echo "status: $status" assert_success assert_output "http:3001:3001" } @test "(ports:report) emits new stripped JSON keys alongside legacy" { run /bin/bash -c "dokku ports:report $TEST_APP --format json | jq -r 'has(\"map\") and has(\"ports-map\")'" assert_success assert_output "true" run /bin/bash -c "dokku ports:report $TEST_APP --format json | jq -r 'has(\"map-detected\") and has(\"ports-map-detected\")'" assert_success assert_output "true" }