diff --git a/src/bash-aliases/devcontainer-feature.json b/src/bash-aliases/devcontainer-feature.json index 9fcee55..c970b3d 100644 --- a/src/bash-aliases/devcontainer-feature.json +++ b/src/bash-aliases/devcontainer-feature.json @@ -1,9 +1,9 @@ { "id": "bash-aliases", - "version": "1.0.0", + "version": "1.0.3", "name": "Bash Aliases", "description": "Loads custom bash aliases from your project's `.devcontainer/etc/bash-aliases` directory.", - "installsAfter": [ - "ghcr.io/devcontainers/features/common-utils" - ] + "dependsOn": { + "ghcr.io/devcontainers/features/common-utils": {} + } } \ No newline at end of file diff --git a/src/bash-aliases/install.sh b/src/bash-aliases/install.sh index 2ccf1e3..576ac98 100644 --- a/src/bash-aliases/install.sh +++ b/src/bash-aliases/install.sh @@ -24,8 +24,8 @@ updaterc() { # Bash-aliases loader SNIPPET_CONTENT=$(cat <<'EOF' -# Only runs on terminal from inside the vscode editor -if [ -t 1 ] && [ "${TERM_PROGRAM}" = "vscode" ]; then +# Only runs on terminal from inside vscode editor, or in CI +if [[ ( -t 1 && "${TERM_PROGRAM}" = "vscode" ) || "${CI}" = "true" ]]; then ALIASES_FOLDER="$PWD/.devcontainer/etc/bash-aliases" # Dynamically load all *.sh files from ALIASES_FOLDER diff --git a/src/uv/devcontainer-feature.json b/src/uv/devcontainer-feature.json index 9ab34a8..f8c872b 100644 --- a/src/uv/devcontainer-feature.json +++ b/src/uv/devcontainer-feature.json @@ -1,6 +1,6 @@ { "id": "uv", - "version": "1.0.0", + "version": "1.0.3", "name": "UV", "description": "A fast Python package manager written in Rust. Replaces pip, poetry, virtualenv, and more.", "options": { @@ -13,7 +13,7 @@ "description": "Select or enter an UV version." } }, - "installsAfter": [ - "ghcr.io/devcontainers/features/common-utils" - ] + "dependsOn": { + "ghcr.io/devcontainers/features/common-utils": {} + } } \ No newline at end of file diff --git a/src/uv/install.sh b/src/uv/install.sh index a3522c5..f3fff2c 100644 --- a/src/uv/install.sh +++ b/src/uv/install.sh @@ -67,7 +67,7 @@ if ! uv --version &> /dev/null ; then check_packages curl unzip tar ca-certificates UV_CACHE_SCRIPT="$(cat << 'EOF' -if [ -t 1 ] && [ "${TERM_PROGRAM}" = "vscode" ]; then +if [[ ( -t 1 && "${TERM_PROGRAM}" = "vscode" ) || "${CI}" = "true" ]]; then export UV_CACHE_DIR="$PWD/.uv_cache" mkdir -p "$UV_CACHE_DIR" fi diff --git a/test/bash-aliases/cases/00-test-setup.sh b/test/bash-aliases/cases/00-test-setup.sh new file mode 100644 index 0000000..a13db37 --- /dev/null +++ b/test/bash-aliases/cases/00-test-setup.sh @@ -0,0 +1,24 @@ +#!/bin/zsh + +set -euo pipefail + +# Import test library bundled with the devcontainer CLI +source dev-container-features-test-lib + +# Info about the environment +check "Environment Info" echo "\ + PWD: $PWD\n\ + USER: $USER\n\ + HOME: $HOME\n\ + TERM_PROGRAM: $TERM_PROGRAM\n\ + CI: $CI\n\ + ALIASES_DIR: $ALIASES_DIR\n" + +# Environment Vars +check "TERM_PROGRAM is vscode" test "$TERM_PROGRAM" = "vscode" +check "CI is true" test "$CI" = "true" +check "ALIASES_DIR is set" test -n "$ALIASES_DIR" + +# Aliases directory +check "aliases directory" ls -lha "$ALIASES_DIR" +check "testalias.sh" cat "$ALIASES_DIR/testalias.sh" diff --git a/test/bash-aliases/cases/10-test-alias.sh b/test/bash-aliases/cases/10-test-alias.sh new file mode 100644 index 0000000..ef44764 --- /dev/null +++ b/test/bash-aliases/cases/10-test-alias.sh @@ -0,0 +1,11 @@ +#!/bin/zsh + +set -euo pipefail + +# Import test library bundled with the devcontainer CLI +source dev-container-features-test-lib + +# Tests +check "testalias exists" command -v testalias +check "testalias works" echo "$(testalias)" +check "testalias result" test "$(testalias)" = 'Hello, World!' diff --git a/test/bash-aliases/cases/20-test-no-aliases-folder.sh b/test/bash-aliases/cases/20-test-no-aliases-folder.sh new file mode 100644 index 0000000..357284d --- /dev/null +++ b/test/bash-aliases/cases/20-test-no-aliases-folder.sh @@ -0,0 +1,19 @@ +#!/bin/zsh + +set -euo pipefail + +# Import test library bundled with the devcontainer CLI +source dev-container-features-test-lib + +# Tests before removing aliases directory +check "directory exists" ls -lha "$ALIASES_DIR" +check "testalias exists" zsh -ic "command -v testalias" +check "testalias works" zsh -ic "testalias" +check "testalias result" zsh -ic "test \"\$(testalias)\" = 'Hello, World!'" + +# Remove aliases directory +rm -rf "$ALIASES_DIR" + +# Tests after removing aliases directory +check "directory should NOT exist" test ! -d "$ALIASES_DIR" +check "testalias should NOT exist" test ! -n "$(zsh -ic 'command -v testalias')" diff --git a/test/bash-aliases/cases/__before.sh b/test/bash-aliases/cases/__before.sh new file mode 100644 index 0000000..a3c093e --- /dev/null +++ b/test/bash-aliases/cases/__before.sh @@ -0,0 +1,13 @@ +#!/bin/zsh + +## +# This file runs before each test case. +## + +# Exit on error +set -euo pipefail + +# Create aliases directory +export ALIASES_DIR="$PWD/.devcontainer/etc/bash-aliases" +rm -Rf "$ALIASES_DIR" && mkdir -p "$ALIASES_DIR" +cp ./stubs/* "$ALIASES_DIR" diff --git a/test/bash-aliases/setup.sh b/test/bash-aliases/setup.sh new file mode 100644 index 0000000..d889651 --- /dev/null +++ b/test/bash-aliases/setup.sh @@ -0,0 +1,7 @@ +#!/bin/zsh + +set -euo pipefail + +# Simulate VS Code terminal and CI environment +export TERM_PROGRAM="vscode" +export CI="true" diff --git a/test/bash-aliases/stubs/testalias.sh b/test/bash-aliases/stubs/testalias.sh new file mode 100644 index 0000000..7f8dfcc --- /dev/null +++ b/test/bash-aliases/stubs/testalias.sh @@ -0,0 +1 @@ +alias testalias='echo Hello, World!' diff --git a/test/bash-aliases/test.sh b/test/bash-aliases/test.sh index e9ff9f7..4bd85c1 100644 --- a/test/bash-aliases/test.sh +++ b/test/bash-aliases/test.sh @@ -1,29 +1,41 @@ -#!/bin/bash +#!/bin/zsh -set -e +set -euo pipefail # Import test library bundled with the devcontainer CLI source dev-container-features-test-lib -# Simulate VS Code terminal by setting TERM_PROGRAM -export TERM_PROGRAM="vscode" +# Setup +source ./setup.sh -# Create the bash-aliases directory -mkdir -p "$PWD/.devcontainer/etc/bash-aliases" +get_title() { + local filename="$1" -# Create a test alias file -echo "alias testalias='echo Hello, World!'" > "$PWD/.devcontainer/etc/bash-aliases/test-aliases.sh" + # Extract the base filename without extension + title="$(basename "$file" .sh)" + # Remove optional prefix: number and dash (e.g., "00-"), and "test-" + title="${title#*[-]}" + title="${title#test-}" + # Replace non-alphanumeric characters with spaces + title="$(echo "$title" | sed 's/[^a-zA-Z0-9]/ /g')" + # Capitalize each word + title="$(echo "$title" | awk '{for(i=1;i<=NF;i++) $i=toupper(substr($i,1,1)) substr($i,2)}1')" -# Feature-specific tests -check "alias is loaded" bash -ic "alias testalias | grep 'echo Hello, World!'" -check "alias works" bash -ic "testalias | grep 'Hello, World!'" + echo "$title" +} -# Test when there's no bash-aliases directory. -rm -rf "$PWD/.devcontainer/etc/bash-aliases" -check "no bash-aliases directory" bash -ic "echo 'No errors'" +# Run test cases +for file in ./cases/*.sh; do + if [[ "$(basename "$file")" == "__before.sh" ]]; then + continue + fi -# "testalias" alias should not be available anymore -check "alias is not loaded" bash -ic "alias testalias 2>&1 | grep 'not found'" + title="$(get_title "$file")" + + source ./cases/__before.sh + + check "[$title]" zsh -i "$file" +done # Report result -reportResults \ No newline at end of file +reportResults