diff --git a/Dockerfile.test b/Dockerfile.test new file mode 100644 index 0000000..7764cd9 --- /dev/null +++ b/Dockerfile.test @@ -0,0 +1,32 @@ +FROM ubuntu:24.04 + +# Avoid interactive prompts during package installation +ENV DEBIAN_FRONTEND=noninteractive + +# Install basic dependencies +RUN apt-get update && apt-get install -y \ + curl \ + bash \ + python3 \ + python3-pip \ + git \ + sudo \ + && rm -rf /var/lib/apt/lists/* + +# Install Node.js 22.x +RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \ + && apt-get install -y nodejs \ + && rm -rf /var/lib/apt/lists/* + +# Create a non-root user (setup script refuses to run as root) +RUN useradd -m -s /bin/bash tester + +# Switch to tester user +USER tester +WORKDIR /home/tester + +# Copy project files +COPY --chown=tester:tester . /home/tester/project/ + +# Run setup script +CMD ["bash", "/home/tester/project/claude_setup.sh"] diff --git a/test_isolated.sh b/test_isolated.sh new file mode 100644 index 0000000..9b657dd --- /dev/null +++ b/test_isolated.sh @@ -0,0 +1,81 @@ +#!/usr/bin/env bash +# test_isolated.sh — проверка логики автоустановки без реальных скачиваний +# Использует mock для curl, чтобы проверить, что скрипты вызывают правильные URL + +set -euo pipefail + +TMPDIR=$(mktemp -d) +trap 'rm -rf "$TMPDIR"' EXIT + +# Генерируем скрипты из claude_setup.sh в изолированную директорию +BIN_DIR="$TMPDIR/bin" +mkdir -p "$BIN_DIR" + +# Извлекаем claude_gpt +awk '/^cat > "\$BIN_DIR\/claude_gpt"/,/^GPTEOF/' claude_setup.sh | \ + sed "s|\\\$BIN_DIR|$BIN_DIR|g" | bash +chmod +x "$BIN_DIR/claude_gpt" + +# Извлекаем claude_kimi +awk '/^cat > "\$BIN_DIR\/claude_kimi"/,/^KIMIEOF/' claude_setup.sh | \ + sed "s|\\\$BIN_DIR|$BIN_DIR|g" | bash +chmod +x "$BIN_DIR/claude_kimi" + +echo "=== Test 1: claude_gpt calls codex install URL when missing ===" +MOCK_LOG="$TMPDIR/mock_curl.log" + +# Создаём mock curl, который логирует вызовы +cat > "$TMPDIR/curl" << CURLEOF +#!/usr/bin/env bash +echo "\$@" >> "$MOCK_LOG" +# Притворяемся, что install.sh отработал (создаём фейковый codex) +if [[ "\$*" == *"chatgpt.com/codex/install.sh"* ]]; then + mkdir -p "\$HOME/.npm-global/bin" + echo '#!/usr/bin/env bash +echo "codex mock \$*"' > "\$HOME/.npm-global/bin/codex" + chmod +x "\$HOME/.npm-global/bin/codex" +fi +CURLEOF +chmod +x "$TMPDIR/curl" + +# Запускаем claude_gpt с mock curl (чистый PATH, без системного codex) +HOME="$TMPDIR" PATH="$TMPDIR:/usr/bin:/bin" "$BIN_DIR/claude_gpt" --version 2>&1 || true + +if grep -q "chatgpt.com/codex/install.sh" "$MOCK_LOG"; then + echo "[PASS] claude_gpt вызвал установку Codex" +else + echo "[FAIL] claude_gpt НЕ вызвал установку Codex" + echo "curl log:" + cat "$MOCK_LOG" 2>/dev/null || echo "(пусто)" + exit 1 +fi + +echo "" +echo "=== Test 2: claude_kimi calls kimi install URL when missing ===" +MOCK_LOG="$TMPDIR/mock_curl2.log" + +cat > "$TMPDIR/curl" << CURLEOF +#!/usr/bin/env bash +echo "\$@" >> "$MOCK_LOG" +if [[ "\$*" == *"code.kimi.com/kimi-code/install.sh"* ]]; then + mkdir -p "\$HOME/.kimi-code/bin" + echo '#!/usr/bin/env bash +echo "kimi mock \$*"' > "\$HOME/.kimi-code/bin/kimi" + chmod +x "\$HOME/.kimi-code/bin/kimi" +fi +CURLEOF +chmod +x "$TMPDIR/curl" + +HOME="$TMPDIR" PATH="$TMPDIR:/usr/bin:/bin" "$BIN_DIR/claude_kimi" --version 2>&1 || true + +if grep -q "code.kimi.com/kimi-code/install.sh" "$MOCK_LOG"; then + echo "[PASS] claude_kimi вызвал установку Kimi" +else + echo "[FAIL] claude_kimi НЕ вызвал установку Kimi" + echo "curl log:" + cat "$MOCK_LOG" 2>/dev/null || echo "(пусто)" + exit 1 +fi + +echo "" +echo "=== All tests passed ==="