diff --git a/getpkg/test.sh b/getpkg/test.sh index 0ddb1e4..35c5bf2 100755 --- a/getpkg/test.sh +++ b/getpkg/test.sh @@ -417,6 +417,112 @@ else echo "To run full tests, set SOS_WRITE_TOKEN environment variable" fi +# Test 13d: Comprehensive uninstall test +if [ -n "${SOS_WRITE_TOKEN:-}" ]; then + echo -e "\nTest 13d: Comprehensive uninstall test" + TEST_UNINSTALL_TOOL="test-uninstall-$RANDOM" + UNINSTALL_DIR="${TEST_DIR}/${TEST_UNINSTALL_TOOL}" + mkdir -p "$UNINSTALL_DIR" + + # Create test tool with multiple executables + cat > "$UNINSTALL_DIR/${TEST_UNINSTALL_TOOL}" << 'EOF' +#!/bin/bash +case "$1" in + version) echo "1.0.0" ;; + autocomplete) echo "help version" ;; + *) echo "Test uninstall tool" ;; +esac +EOF + chmod +x "$UNINSTALL_DIR/${TEST_UNINSTALL_TOOL}" + + # Create a second executable in the tool + cat > "$UNINSTALL_DIR/${TEST_UNINSTALL_TOOL}-helper" << 'EOF' +#!/bin/bash +echo "Helper tool" +EOF + chmod +x "$UNINSTALL_DIR/${TEST_UNINSTALL_TOOL}-helper" + + # Publish and install the tool + PUBLISH_OUTPUT=$(timeout 3 "$GETPKG" publish "${TEST_UNINSTALL_TOOL}:${TEST_ARCH}" "$UNINSTALL_DIR" 2>&1) + if [[ "$PUBLISH_OUTPUT" =~ Published! ]]; then + INSTALL_OUTPUT=$(timeout 3 "$GETPKG" install "$TEST_UNINSTALL_TOOL" 2>&1) + if [[ "$INSTALL_OUTPUT" =~ Installed\ ${TEST_UNINSTALL_TOOL}\ successfully ]]; then + # Count bashrc entries before uninstall + BASHRC_ENTRIES_BEFORE=$(grep -c "$TEST_UNINSTALL_TOOL" ~/.bashrc_getpkg 2>/dev/null || true) + BASHRC_ENTRIES_BEFORE=${BASHRC_ENTRIES_BEFORE:-0} + + # Verify all components exist + CONFIG_EXISTS=false + TOOL_DIR_EXISTS=false + SYMLINK_EXISTS=false + HELPER_SYMLINK_EXISTS=false + + [ -f ~/.config/getpkg/"${TEST_UNINSTALL_TOOL}.json" ] && CONFIG_EXISTS=true + [ -d ~/.getpkg/"$TEST_UNINSTALL_TOOL" ] && TOOL_DIR_EXISTS=true + [ -L ~/.local/bin/getpkg/"$TEST_UNINSTALL_TOOL" ] && SYMLINK_EXISTS=true + [ -L ~/.local/bin/getpkg/"${TEST_UNINSTALL_TOOL}-helper" ] && HELPER_SYMLINK_EXISTS=true + + if $CONFIG_EXISTS && $TOOL_DIR_EXISTS && $SYMLINK_EXISTS; then + # Now uninstall + UNINSTALL_OUTPUT=$(timeout 3 "$GETPKG" uninstall "$TEST_UNINSTALL_TOOL" 2>&1) + if [[ "$UNINSTALL_OUTPUT" =~ Uninstalled\ ${TEST_UNINSTALL_TOOL}\ successfully ]]; then + # Check all components are removed + ALL_REMOVED=true + + # Check config file removed + if [ -f ~/.config/getpkg/"${TEST_UNINSTALL_TOOL}.json" ]; then + echo "ERROR: Config file still exists after uninstall" + ALL_REMOVED=false + fi + + # Check tool directory removed + if [ -d ~/.getpkg/"$TEST_UNINSTALL_TOOL" ]; then + echo "ERROR: Tool directory still exists after uninstall" + ALL_REMOVED=false + fi + + # Check symlinks removed + if [ -L ~/.local/bin/getpkg/"$TEST_UNINSTALL_TOOL" ]; then + echo "ERROR: Main symlink still exists after uninstall" + ALL_REMOVED=false + fi + + if [ -L ~/.local/bin/getpkg/"${TEST_UNINSTALL_TOOL}-helper" ]; then + echo "ERROR: Helper symlink still exists after uninstall" + ALL_REMOVED=false + fi + + # Check bashrc entries removed + BASHRC_ENTRIES_AFTER=$(grep -c "$TEST_UNINSTALL_TOOL" ~/.bashrc_getpkg 2>/dev/null || true) + BASHRC_ENTRIES_AFTER=${BASHRC_ENTRIES_AFTER:-0} + if [ "$BASHRC_ENTRIES_AFTER" -ne 0 ]; then + echo "ERROR: Bashrc entries still exist after uninstall (found $BASHRC_ENTRIES_AFTER entries)" + ALL_REMOVED=false + fi + + if $ALL_REMOVED; then + print_test_result "Complete uninstall removes all components" 0 + else + print_test_result "Complete uninstall removes all components" 1 + fi + else + print_test_result "Complete uninstall removes all components" 1 + fi + else + echo "ERROR: Not all components were created during install" + print_test_result "Complete uninstall removes all components" 1 + fi + + # Cleanup from server + $GETPKG unpublish "${TEST_UNINSTALL_TOOL}:${TEST_ARCH}" 2>/dev/null || true + else + print_test_result "Complete uninstall removes all components" 1 + fi + else + print_test_result "Complete uninstall removes all components" 1 + fi +fi + # Test 14: Invalid tool name validation echo -e "\nTest 14: Invalid tool name validation" INVALID_OUTPUT=$(timeout 3 "$GETPKG" install "../evil-tool" 2>&1)