Files
links/scripts/ci/test.sh
Andrey K. Choi d5f1809f5a
Some checks failed
continuous-integration/drone Build is failing
Drone CD/CD PipeLine added
2025-11-02 06:23:39 +09:00

202 lines
6.6 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# scripts/ci/test.sh - Запуск тестов
set -e
echo "🧪 Running CatLink tests..."
# Проверка наличия контейнеров
if ! docker-compose ps | grep -q "Up"; then
echo "📦 Starting containers for testing..."
docker-compose up -d
sleep 30
fi
# Подготовка базы данных для тестов
echo "🗄️ Preparing test database..."
docker-compose exec -T web python manage.py migrate --noinput
docker-compose exec -T web python manage.py collectstatic --noinput
# Создание тестового пользователя
echo "👤 Creating test user..."
docker-compose exec -T web python manage.py shell << 'EOF'
from django.contrib.auth import get_user_model
User = get_user_model()
if not User.objects.filter(username='testuser').exists():
User.objects.create_user(username='testuser', email='test@example.com', password='testpass123')
print("Test user created")
else:
print("Test user already exists")
EOF
# Backend тесты
echo "🔧 Running backend tests..."
echo " • Django unit tests..."
docker-compose exec -T web python manage.py test --verbosity=2 --keepdb || {
echo "❌ Backend tests failed"
docker-compose logs web | tail -50
exit 1
}
# API тесты
echo "🌐 Running API tests..."
echo " • Testing API endpoints..."
# Проверка основных API эндпоинтов
api_base="http://localhost:8000/api"
# Тест API root
api_root=$(curl -s -o /dev/null -w "%{http_code}" "$api_base/")
echo " - API root: $api_root"
# Тест регистрации
echo " - Testing user registration..."
register_response=$(curl -s -X POST "$api_base/auth/register/" \
-H "Content-Type: application/json" \
-d '{
"username": "testuser2",
"email": "testuser2@example.com",
"password": "testpass123",
"password2": "testpass123"
}' \
-w "%{http_code}")
if echo "$register_response" | grep -q "200\|201"; then
echo " ✅ Registration test passed"
else
echo " ⚠️ Registration test failed: $register_response"
fi
# Тест логина
echo " - Testing user login..."
login_response=$(curl -s -X POST "$api_base/auth/login/" \
-H "Content-Type: application/json" \
-d '{
"username": "testuser",
"password": "testpass123"
}')
if echo "$login_response" | grep -q "access"; then
echo " ✅ Login test passed"
# Извлечение токена для дальнейших тестов
token=$(echo "$login_response" | grep -o '"access":"[^"]*"' | cut -d'"' -f4)
else
echo " ⚠️ Login test failed: $login_response"
token=""
fi
# Тесты авторизованных эндпоинтов
if [ -n "$token" ]; then
echo " - Testing authorized endpoints..."
# Тест создания группы
group_response=$(curl -s -X POST "$api_base/groups/" \
-H "Authorization: Bearer $token" \
-H "Content-Type: application/json" \
-d '{
"name": "Test Group",
"description": "Test group for CI"
}' \
-w "%{http_code}")
if echo "$group_response" | grep -q "200\|201"; then
echo " ✅ Group creation test passed"
else
echo " ⚠️ Group creation test failed: $group_response"
fi
# Тест получения групп
groups_response=$(curl -s -H "Authorization: Bearer $token" "$api_base/groups/" -w "%{http_code}")
if echo "$groups_response" | grep -q "200"; then
echo " ✅ Groups list test passed"
else
echo " ⚠️ Groups list test failed: $groups_response"
fi
fi
# Frontend тесты
echo "💻 Running frontend tests..."
echo " • NextJS build test..."
docker-compose exec -T frontend npm run build || {
echo "❌ Frontend build test failed"
docker-compose logs frontend | tail -50
exit 1
}
echo " • Frontend unit tests..."
docker-compose exec -T frontend npm test -- --passWithNoTests --watchAll=false || {
echo "⚠️ Frontend unit tests failed or no tests found"
}
# E2E тесты (если доступны)
echo "🌍 Running E2E tests..."
if [ -f "frontend/linktree-frontend/package.json" ] && grep -q "cypress\|playwright" "frontend/linktree-frontend/package.json"; then
echo " • Running end-to-end tests..."
docker-compose exec -T frontend npm run test:e2e || {
echo "⚠️ E2E tests failed"
}
else
echo " • No E2E tests configured, skipping..."
fi
# Интеграционные тесты
echo "🔗 Running integration tests..."
echo " • Testing frontend-backend integration..."
# Проверка что фронтенд может загрузиться
frontend_status=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:3000)
echo " - Frontend accessibility: $frontend_status"
# Проверка что фронтенд может обращаться к API
api_from_frontend=$(docker-compose exec -T frontend sh -c "
curl -s -o /dev/null -w '%{http_code}' http://web:8000/api/
") || echo "000"
echo " - API accessibility from frontend: $api_from_frontend"
# Производительные тесты (базовые)
echo "⚡ Running basic performance tests..."
echo " • API response time test..."
api_time=$(curl -s -o /dev/null -w "%{time_total}" "$api_base/")
echo " - API response time: ${api_time}s"
if (( $(echo "$api_time < 2.0" | bc -l) )); then
echo " ✅ API response time is acceptable"
else
echo " ⚠️ API response time is slow"
fi
# Проверка использования памяти
echo " • Memory usage check..."
docker stats --no-stream --format "table {{.Name}}\t{{.MemUsage}}" | grep -E "(web|frontend)"
# Генерация отчета о тестах
echo "📊 Generating test report..."
mkdir -p /tmp/test-reports
cat > /tmp/test-reports/test-summary.txt << EOF
CatLink Test Summary
==================
Date: $(date)
Commit: ${DRONE_COMMIT_SHA:-"local"}
Branch: ${DRONE_BRANCH:-"local"}
API Tests:
- Root endpoint: $api_root
- Registration: $(echo "$register_response" | grep -q "200\|201" && echo "PASS" || echo "FAIL")
- Login: $([ -n "$token" ] && echo "PASS" || echo "FAIL")
- Groups CRUD: $(echo "$group_response" | grep -q "200\|201" && echo "PASS" || echo "FAIL")
Frontend Tests:
- Build: PASS
- Accessibility: $frontend_status
Integration Tests:
- Frontend-Backend: $([ "$api_from_frontend" = "200" ] && echo "PASS" || echo "FAIL")
Performance:
- API Response Time: ${api_time}s
EOF
echo "✅ All tests completed!"
echo "📁 Test reports saved to /tmp/test-reports/"
cat /tmp/test-reports/test-summary.txt