# ============================================ # SnapOtter - Test Dockerfile # Runs the full test suite (unit + integration) # ============================================ # ============================================ # Stage 1: Build libheif from source # ============================================ FROM node:22-bookworm@sha256:1031993481795705055273f2eef0c24597abdcb277d6e058c82f78cbbdef92a6 AS libheif-builder ARG LIBHEIF_VERSION=1.21.2 RUN apt-get update && apt-get install -y --no-install-recommends \ cmake pkg-config gcc g++ make curl ca-certificates \ libde265-dev libx265-dev libjpeg-dev libpng-dev \ && rm -rf /var/lib/apt/lists/* RUN curl -fsSL "https://github.com/strukturag/libheif/releases/download/v${LIBHEIF_VERSION}/libheif-${LIBHEIF_VERSION}.tar.gz" \ | tar xz \ && cmake -B build -S "libheif-${LIBHEIF_VERSION}" \ -DCMAKE_INSTALL_PREFIX=/opt/libheif \ -DWITH_EXAMPLES=ON \ -DWITH_GDK_PIXBUF=OFF \ -DWITH_AOM_DECODER=OFF \ -DWITH_AOM_ENCODER=OFF \ -DWITH_DAV1D=OFF \ && cmake --build build -j$(nproc) \ && cmake --install build # ============================================ # Stage 2: Test runner # ============================================ FROM node:22-bookworm@sha256:1031993481795705055273f2eef0c24597abdcb277d6e058c82f78cbbdef92a6 RUN corepack enable && corepack prepare pnpm@9.15.4 --activate RUN apt-get update && apt-get install -y --no-install-recommends \ libde265-0 \ libimage-exiftool-perl \ imagemagick \ libraw-dev \ && if apt-cache show libx265-199 >/dev/null 2>&1; then \ apt-get install -y --no-install-recommends libx265-199; \ elif apt-cache show libx265-209 >/dev/null 2>&1; then \ apt-get install -y --no-install-recommends libx265-209; \ fi \ && rm -rf /var/lib/apt/lists/* COPY --from=libheif-builder /opt/libheif/bin/ /usr/local/bin/ COPY --from=libheif-builder /opt/libheif/lib/ /usr/local/lib/ RUN ldconfig WORKDIR /app # Copy workspace config first (for layer caching) COPY pnpm-workspace.yaml pnpm-lock.yaml package.json turbo.json tsconfig.base.json vitest.config.ts ./ # Copy all package.json files COPY apps/web/package.json apps/web/tsconfig.json apps/web/vite.config.ts ./apps/web/ COPY apps/api/package.json apps/api/tsconfig.json ./apps/api/ COPY packages/shared/package.json packages/shared/tsconfig.json ./packages/shared/ COPY packages/image-engine/package.json packages/image-engine/tsconfig.json ./packages/image-engine/ COPY packages/ai/package.json packages/ai/tsconfig.json ./packages/ai/ # Install ALL dependencies (including devDependencies for testing) RUN pnpm install --frozen-lockfile # Copy source code COPY . . # Environment for tests ENV NODE_ENV=test \ AUTH_ENABLED=true \ DEFAULT_USERNAME=admin \ DEFAULT_PASSWORD=admin \ WORKSPACE_PATH=/tmp/test-workspace \ MAX_MEGAPIXELS=100 \ MAX_UPLOAD_SIZE_MB=100 \ MAX_BATCH_SIZE=200 \ CONCURRENT_JOBS=3 \ RATE_LIMIT_PER_MIN=1000 \ FILE_MAX_AGE_HOURS=1 \ CLEANUP_INTERVAL_MINUTES=60 # Run unit + integration tests with coverage CMD ["pnpm", "test:all"]