diff --git a/docs/deployment/methods/buildpacks.md b/docs/deployment/methods/buildpacks.md index 0af7355f6..57a036240 100644 --- a/docs/deployment/methods/buildpacks.md +++ b/docs/deployment/methods/buildpacks.md @@ -72,7 +72,7 @@ Buildpacks are executed in order, may be inserted at a specified index via the ` ```shell # will add the golang buildpack at the second position, bumping all proceeding ones by 1 position -dokku buildpacks:add node-js-app --index 2 https://github.com/heroku/heroku-buildpack-golang.git +dokku buildpacks:add --index 2 node-js-app https://github.com/heroku/heroku-buildpack-golang.git ``` ### Overwriting a buildpack position diff --git a/plugins/buildpacks/subcommands.go b/plugins/buildpacks/subcommands.go index 3e42d2bfa..88a3e0856 100644 --- a/plugins/buildpacks/subcommands.go +++ b/plugins/buildpacks/subcommands.go @@ -35,7 +35,8 @@ func CommandClear(args []string) (err error) { return } - return common.PropertyDelete("buildpacks", appName, "buildpacks") + common.PropertyDelete("buildpacks", appName, "buildpacks") + return } // CommandList implements buildpacks:list diff --git a/plugins/common/properties.go b/plugins/common/properties.go index 6bf63d2eb..f09d02b84 100644 --- a/plugins/common/properties.go +++ b/plugins/common/properties.go @@ -114,7 +114,7 @@ func PropertyListAdd(pluginName string, appName string, property string, value s lines = append(lines, line) } - if index == 0 { + if index == 0 || index > len(scannedLines) { lines = append(lines, value) } diff --git a/tests/unit/30_buildpacks.bats b/tests/unit/30_buildpacks.bats new file mode 100644 index 000000000..687da8f41 --- /dev/null +++ b/tests/unit/30_buildpacks.bats @@ -0,0 +1,211 @@ +#!/usr/bin/env bats + +load test_helper + +setup() { + global_setup + deploy_app +} + +teardown() { + destroy_app + global_teardown +} + +@test "(buildpacks) buildpacks:help" { + run /bin/bash -c "dokku buildpacks" + echo "output: $output" + echo "status: $status" + assert_output_contains "Manages buildpacks settings for an app" + help_output="$output" + + run /bin/bash -c "dokku buildpacks:help" + echo "output: $output" + echo "status: $status" + assert_output_contains "Manages buildpacks settings for an app" + assert_output "$help_output" +} + +@test "(buildpacks) buildpacks:add" { + run /bin/bash -c "dokku buildpacks:add $TEST_APP heroku/nodejs" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku --quiet buildpacks:list $TEST_APP | xargs" + echo "output: $output" + echo "status: $status" + assert_output_contains "heroku/nodejs" + + run /bin/bash -c "dokku buildpacks:add $TEST_APP heroku/ruby" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku --quiet buildpacks:list $TEST_APP | xargs" + echo "output: $output" + echo "status: $status" + assert_output "heroku/nodejs heroku/ruby" + + run /bin/bash -c "dokku buildpacks:add --index 1 $TEST_APP heroku/golang" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku --quiet buildpacks:list $TEST_APP | xargs" + echo "output: $output" + echo "status: $status" + assert_output "heroku/golang heroku/nodejs heroku/ruby" + + run /bin/bash -c "dokku buildpacks:add --index 2 $TEST_APP heroku/python" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku --quiet buildpacks:list $TEST_APP | xargs" + echo "output: $output" + echo "status: $status" + assert_output "heroku/golang heroku/python heroku/nodejs heroku/ruby" + + run /bin/bash -c "dokku buildpacks:add --index 100 $TEST_APP heroku/php" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku --quiet buildpacks:list $TEST_APP | xargs" + echo "output: $output" + echo "status: $status" + assert_output "heroku/golang heroku/python heroku/nodejs heroku/ruby heroku/php" +} + +@test "(buildpacks) buildpacks:set" { + run /bin/bash -c "dokku buildpacks:set $TEST_APP heroku/nodejs" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku --quiet buildpacks:list $TEST_APP | xargs" + echo "output: $output" + echo "status: $status" + assert_output_contains "heroku/nodejs" + + run /bin/bash -c "dokku buildpacks:set $TEST_APP heroku/ruby" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku --quiet buildpacks:list $TEST_APP | xargs" + echo "output: $output" + echo "status: $status" + assert_output "heroku/ruby" + + run /bin/bash -c "dokku buildpacks:set --index 1 $TEST_APP heroku/golang" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku --quiet buildpacks:list $TEST_APP | xargs" + echo "output: $output" + echo "status: $status" + assert_output "heroku/golang" + + run /bin/bash -c "dokku buildpacks:set --index 2 $TEST_APP heroku/python" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku --quiet buildpacks:list $TEST_APP | xargs" + echo "output: $output" + echo "status: $status" + assert_output "heroku/golang heroku/python" + + run /bin/bash -c "dokku buildpacks:set --index 100 $TEST_APP heroku/php" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku --quiet buildpacks:list $TEST_APP | xargs" + echo "output: $output" + echo "status: $status" + assert_output "heroku/golang heroku/python heroku/php" +} + +@test "(buildpacks) buildpacks:remove" { + run /bin/bash -c "dokku buildpacks:set $TEST_APP heroku/nodejs" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku buildpacks:set --index 2 $TEST_APP heroku/ruby" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku --quiet buildpacks:list $TEST_APP | xargs" + echo "output: $output" + echo "status: $status" + assert_output_contains "heroku/nodejs heroku/ruby" + + run /bin/bash -c "dokku buildpacks:remove $TEST_APP heroku/nodejs" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku --quiet buildpacks:list $TEST_APP | xargs" + echo "output: $output" + echo "status: $status" + assert_output_contains "heroku/ruby" + + run /bin/bash -c "dokku buildpacks:remove $TEST_APP heroku/php" + echo "output: $output" + echo "status: $status" + assert_failure + + run /bin/bash -c "dokku buildpacks:remove $TEST_APP heroku/ruby" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku --quiet buildpacks:list $TEST_APP" + echo "output: $output" + echo "status: $status" + assert_output_not_exists +} + + +@test "(buildpacks) buildpacks:clear" { + run /bin/bash -c "dokku buildpacks:set $TEST_APP heroku/nodejs" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku buildpacks:set --index 2 $TEST_APP heroku/ruby" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku buildpacks:clear $TEST_APP" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku --quiet buildpacks:list $TEST_APP" + echo "output: $output" + echo "status: $status" + assert_output_not_exists + + run /bin/bash -c "dokku buildpacks:clear $TEST_APP" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku buildpacks:clear $TEST_APP" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku --quiet buildpacks:list $TEST_APP" + echo "output: $output" + echo "status: $status" + assert_output_not_exists +} diff --git a/tests/unit/test_helper.bash b/tests/unit/test_helper.bash index e09af6ab0..d9e747382 100644 --- a/tests/unit/test_helper.bash +++ b/tests/unit/test_helper.bash @@ -82,6 +82,12 @@ assert_output_exists() { [[ -n "$output" ]] || flunk "expected output, found none" } +# ShellCheck doesn't know about $output from Bats +# shellcheck disable=SC2154 +assert_output_not_exists() { + [[ -z "$output" ]] || flunk "expected no output, found some" +} + # ShellCheck doesn't know about $output from Bats # shellcheck disable=SC2154 assert_output_contains() {