Skip to content

Commit 774579c

Browse files
committed
feat: introduce an easy way of running tests locally
1 parent 69661dd commit 774579c

File tree

1 file changed

+193
-0
lines changed

1 file changed

+193
-0
lines changed

utils/run_tests.sh

Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
#!/bin/bash
2+
3+
# Exit on any error
4+
set -euo pipefail
5+
6+
# Define constants
7+
readonly PREFIX="laravel-query-builder"
8+
readonly DEFAULT_PHP_VERSION="8.3"
9+
readonly DEFAULT_LARAVEL_VERSION="11.*"
10+
11+
# Function to display help message
12+
show_help() {
13+
echo "Usage: $0 [options]"
14+
echo ""
15+
echo "Options:"
16+
echo " -h, --help Display this help message"
17+
echo " -v, --version Display version information"
18+
echo " -p PHP_VERSION Set the PHP version (default: ${DEFAULT_PHP_VERSION})"
19+
echo " -l LARAVEL_VERSION Set the Laravel version (default: ${DEFAULT_LARAVEL_VERSION})"
20+
echo " --filter FILTER Specify test filter(s)"
21+
echo ""
22+
echo "Example:"
23+
echo " $0 --filter FieldsTest"
24+
}
25+
26+
# Parse command-line arguments
27+
while [[ $# -gt 0 ]]; do
28+
case "$1" in
29+
-h|--help)
30+
show_help
31+
exit 0
32+
;;
33+
-v|--version)
34+
echo "Version: 1.0"
35+
exit 0
36+
;;
37+
-p|--php-version)
38+
shift
39+
PHP_VERSION="$1"
40+
;;
41+
-l|--laravel-version)
42+
shift
43+
LARAVEL_VERSION="$1"
44+
;;
45+
--filter)
46+
shift
47+
FILTER="$1"
48+
;;
49+
*)
50+
echo "Unknown option: $1" >&2
51+
exit 1
52+
;;
53+
esac
54+
shift
55+
done
56+
57+
# Set default values if not provided
58+
PHP_VERSION="${PHP_VERSION:-$DEFAULT_PHP_VERSION}"
59+
LARAVEL_VERSION="${LARAVEL_VERSION:-$DEFAULT_LARAVEL_VERSION}"
60+
61+
# Ensure we're in the project root
62+
cd "$(dirname "$0")"
63+
64+
# Create a custom Docker network
65+
DOCKER_NETWORK_NAME="${PREFIX}-network"
66+
docker network create "${DOCKER_NETWORK_NAME}" || true
67+
68+
# Function to remove and recreate a container if it exists
69+
recreate_container() {
70+
local container_name="$1"
71+
72+
# Remove the container if it exists (forcefully)
73+
if docker ps -a --format '{{.Names}}' | grep -q "^${container_name}$"; then
74+
echo "Removing existing container: ${container_name}"
75+
docker rm -f "${container_name}"
76+
fi
77+
}
78+
79+
# Prepare container names with prefix
80+
MYSQL_CONTAINER_NAME="${PREFIX}-mysql"
81+
REDIS_CONTAINER_NAME="${PREFIX}-redis"
82+
TEST_RUNNER_IMAGE_NAME="${PREFIX}-test-runner"
83+
TEST_CONTAINER_NAME="${PREFIX}-test-runner-container"
84+
85+
# Recreate containers
86+
recreate_container "${MYSQL_CONTAINER_NAME}"
87+
recreate_container "${REDIS_CONTAINER_NAME}"
88+
recreate_container "${TEST_CONTAINER_NAME}"
89+
90+
# Set project root (parent of script directory)
91+
PROJECT_ROOT="$(dirname "$(pwd)")"
92+
93+
# Build the Docker image
94+
docker build -t "${TEST_RUNNER_IMAGE_NAME}" -f - "$PROJECT_ROOT" <<EOF
95+
FROM php:$PHP_VERSION-cli
96+
97+
# Install system dependencies
98+
RUN apt-get update && apt-get install -y \
99+
git \
100+
unzip \
101+
libzip-dev \
102+
libpng-dev \
103+
libonig-dev \
104+
libxml2-dev \
105+
libcurl4-openssl-dev \
106+
libmagickwand-dev \
107+
libmcrypt-dev \
108+
libreadline-dev \
109+
libfreetype6-dev \
110+
libjpeg62-turbo-dev \
111+
default-mysql-client \
112+
redis-tools
113+
114+
# Install PHP extensions
115+
RUN docker-php-ext-install \
116+
dom \
117+
curl \
118+
xml \
119+
mbstring \
120+
zip \
121+
pcntl \
122+
pdo \
123+
pdo_mysql \
124+
bcmath \
125+
intl \
126+
gd \
127+
exif \
128+
iconv
129+
130+
# Install Composer
131+
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
132+
133+
# Copy project files
134+
COPY . /app
135+
136+
# Set working directory
137+
WORKDIR /app
138+
139+
# Install dependencies
140+
RUN composer require "laravel/framework:${LARAVEL_VERSION}" "orchestra/testbench:9.*" --no-interaction --no-update
141+
RUN composer update --prefer-dist --no-interaction
142+
EOF
143+
144+
# Run MySQL container
145+
docker run -d --name "${MYSQL_CONTAINER_NAME}" \
146+
--network "${DOCKER_NETWORK_NAME}" \
147+
-e MYSQL_ROOT_PASSWORD=secretroot \
148+
-e MYSQL_DATABASE=laravel_query_builder \
149+
-e MYSQL_USER=user \
150+
-e MYSQL_PASSWORD=secret \
151+
mysql:8.0
152+
153+
# Run Redis container
154+
docker run -d --name "${REDIS_CONTAINER_NAME}" \
155+
--network "${DOCKER_NETWORK_NAME}" \
156+
redis
157+
158+
# Wait for MySQL to be fully ready
159+
max_tries=30
160+
tries=0
161+
while [ $tries -lt $max_tries ]; do
162+
if docker exec "${MYSQL_CONTAINER_NAME}" mysql -h localhost -u user -psecret -e "SELECT 1" laravel_query_builder 2>/dev/null; then
163+
echo "MySQL is ready!"
164+
break
165+
fi
166+
sleep 4
167+
tries=$((tries+1))
168+
done
169+
170+
if [ $tries -eq $max_tries ]; then
171+
echo "MySQL did not become ready in time"
172+
exit 1
173+
fi
174+
175+
# Run tests in Docker
176+
docker run --rm \
177+
--name "${TEST_CONTAINER_NAME}" \
178+
--network "${DOCKER_NETWORK_NAME}" \
179+
-e DB_HOST="${MYSQL_CONTAINER_NAME}" \
180+
-e DB_PORT=3306 \
181+
-e DB_USERNAME=user \
182+
-e DB_PASSWORD=secret \
183+
-e REDIS_HOST="${REDIS_CONTAINER_NAME}" \
184+
-e REDIS_PORT=6379 \
185+
"${TEST_RUNNER_IMAGE_NAME}" \
186+
vendor/bin/pest ${FILTER:+--filter "$FILTER"}
187+
188+
# Cleanup containers
189+
docker stop "${MYSQL_CONTAINER_NAME}" "${REDIS_CONTAINER_NAME}" "${TEST_CONTAINER_NAME}"
190+
docker rm "${MYSQL_CONTAINER_NAME}" "${REDIS_CONTAINER_NAME}" "${TEST_CONTAINER_NAME}"
191+
docker network rm "${DOCKER_NETWORK_NAME}"
192+
193+
echo "Tests completed successfully!"

0 commit comments

Comments
 (0)