Compare commits
9 Commits
c993852147
...
v0.1.4
| Author | SHA1 | Date | |
|---|---|---|---|
| 04dfdfa378 | |||
| 2cf832eeac | |||
| 967bdc1b89 | |||
| a3cd46e39a | |||
| 42902106e6 | |||
| 1503420519 | |||
| f8f9c205be | |||
| d8a8931bc3 | |||
| e921f17d2c |
@@ -0,0 +1,15 @@
|
||||
# Development environment configuration for EuchreCamp
|
||||
# Copy this file to .env.development and fill in your values
|
||||
|
||||
# Database Configuration
|
||||
DATABASE_PROVIDER=postgresql
|
||||
# Development database URL - must contain "_dev" to pass safety checks
|
||||
DATABASE_URL="postgresql://euchre_camp:password@localhost:5432/euchre_camp_dev"
|
||||
|
||||
# Authentication
|
||||
BETTER_AUTH_SECRET="your-secret-key-change-this"
|
||||
BETTER_AUTH_URL="http://localhost:3000"
|
||||
|
||||
# Application Configuration
|
||||
NODE_ENV=development
|
||||
TRUSTED_ORIGINS="http://localhost:3000,http://127.0.0.1:3000"
|
||||
@@ -0,0 +1,54 @@
|
||||
# EuchreCamp Environment Configuration
|
||||
# Copy this file to .env and fill in your values
|
||||
|
||||
# ============================================
|
||||
# Database Configuration
|
||||
# ============================================
|
||||
# PostgreSQL connection string
|
||||
# Format: postgresql://username:password@host:port/database
|
||||
DATABASE_URL=postgresql://euchre:euchrepassword@localhost:5432/euchre_camp
|
||||
|
||||
# Shadow database for Prisma migrations (optional for PostgreSQL)
|
||||
DATABASE_SHADOW_URL=postgresql://euchre:euchrepassword@localhost:5432/euchre_camp_shadow
|
||||
|
||||
# Database provider (postgresql, mysql, sqlite, etc.)
|
||||
DATABASE_PROVIDER=postgresql
|
||||
|
||||
# ============================================
|
||||
# Better Auth Configuration
|
||||
# ============================================
|
||||
# Secret key for session encryption (generate a strong random string)
|
||||
# Run: openssl rand -base64 32
|
||||
BETTER_AUTH_SECRET=your-secret-key-change-in-production
|
||||
|
||||
# Base URL for authentication callbacks
|
||||
# For production: https://your-domain.com
|
||||
BETTER_AUTH_URL=http://localhost:3000
|
||||
|
||||
# ============================================
|
||||
# Application Configuration
|
||||
# ============================================
|
||||
# Environment: development, production, test
|
||||
NODE_ENV=production
|
||||
|
||||
# Trusted origins for CORS and authentication
|
||||
# Add your domain(s) for production
|
||||
TRUSTED_ORIGINS=http://localhost:3000,http://127.0.0.1:3000
|
||||
|
||||
# ============================================
|
||||
# Optional: External Services
|
||||
# ============================================
|
||||
# If using external database (e.g., Supabase, Railway)
|
||||
# DATABASE_URL=postgresql://user:pass@host:port/db
|
||||
|
||||
# If using external auth provider
|
||||
# BETTER_AUTH_URL=https://your-app.com
|
||||
|
||||
# ============================================
|
||||
# CasaOS Deployment Notes
|
||||
# ============================================
|
||||
# When deploying to CasaOS, set these via the UI:
|
||||
# 1. DATABASE_URL: Your PostgreSQL connection string
|
||||
# 2. BETTER_AUTH_SECRET: Generate with: openssl rand -base64 32
|
||||
# 3. BETTER_AUTH_URL: Your app's public URL
|
||||
# 4. TRUSTED_ORIGINS: Your app's public URL(s)
|
||||
@@ -0,0 +1,71 @@
|
||||
name: Build CI Images
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- 'Dockerfile.ci-base'
|
||||
- 'package.json'
|
||||
- 'bun.lockb'
|
||||
- '.gitea/workflows/build-ci-images.yml'
|
||||
schedule:
|
||||
# Weekly rebuild to get latest Playwright/Bun versions
|
||||
- cron: '0 2 * * 0' # Every Sunday at 2 AM
|
||||
workflow_dispatch: # Manual trigger
|
||||
|
||||
env:
|
||||
REGISTRY: docker.notsosm.art
|
||||
IMAGE_NAME: euchre-camp
|
||||
|
||||
jobs:
|
||||
build-ci-base:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Login to Registry
|
||||
run: |
|
||||
echo "${{ secrets.DOCKER_PASSWORD }}" | docker login ${{ env.REGISTRY }} -u ${{ secrets.DOCKER_LOGIN }} --password-stdin
|
||||
|
||||
- name: Extract metadata for CI base image
|
||||
id: meta
|
||||
run: |
|
||||
# Get Playwright version from package.json
|
||||
PLAYWRIGHT_VERSION=$(grep -o '"@playwright/test": "[^"]*"' package.json | cut -d'"' -f4)
|
||||
echo "playwright_version=${PLAYWRIGHT_VERSION}" >> $GITHUB_OUTPUT
|
||||
|
||||
# Get Bun version (latest)
|
||||
BUN_VERSION=$(bun --version 2>/dev/null || echo "latest")
|
||||
echo "bun_version=${BUN_VERSION}" >> $GITHUB_OUTPUT
|
||||
|
||||
# Set tags
|
||||
echo "tags=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/ci-base:latest,${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/ci-base:playwright-${PLAYWRIGHT_VERSION},${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/ci-base:${{ github.sha }}" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Build and push CI base image
|
||||
run: |
|
||||
# Build with multiple tags
|
||||
docker build \
|
||||
--file Dockerfile.ci-base \
|
||||
--tag ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/ci-base:latest \
|
||||
--tag ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/ci-base:playwright-${{ steps.meta.outputs.playwright_version }} \
|
||||
--tag ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/ci-base:${{ github.sha }} \
|
||||
.
|
||||
|
||||
# Push all tags
|
||||
docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/ci-base:latest
|
||||
docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/ci-base:playwright-${{ steps.meta.outputs.playwright_version }}
|
||||
docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/ci-base:${{ github.sha }}
|
||||
|
||||
- name: Clean up
|
||||
if: always()
|
||||
run: |
|
||||
docker logout ${{ env.REGISTRY }}
|
||||
+4
-41
@@ -9,7 +9,7 @@ jobs:
|
||||
unit-tests:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: oven/bun:alpine
|
||||
image: docker.notsosm.art/euchre-camp/ci-base:latest
|
||||
options: --user root
|
||||
|
||||
steps:
|
||||
@@ -19,54 +19,17 @@ jobs:
|
||||
- name: Install dependencies
|
||||
run: bun install
|
||||
|
||||
- name: Run unit tests
|
||||
run: bun test src/__tests__/unit/ src/__tests__/*.test.tsx src/__tests__/auth-simple.test.ts
|
||||
|
||||
acceptance-tests:
|
||||
runs-on: ubuntu-latest
|
||||
needs: unit-tests
|
||||
container:
|
||||
image: mcr.microsoft.com/playwright:v1.58.0-jammy
|
||||
options: --user root
|
||||
env:
|
||||
DATABASE_PROVIDER: sqlite
|
||||
DATABASE_URL: file:./prisma/ci.db
|
||||
BETTER_AUTH_SECRET: test-secret-key-for-ci-only
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Bun
|
||||
uses: oven/setup-bun@v2
|
||||
with:
|
||||
bun-version: latest
|
||||
|
||||
- name: Install dependencies
|
||||
run: bun install
|
||||
|
||||
- name: Generate Prisma client
|
||||
run: bun x prisma generate
|
||||
env:
|
||||
DATABASE_URL: postgresql://user:pass@localhost:5432/dummy
|
||||
|
||||
- name: Setup SQLite database
|
||||
run: |
|
||||
# Create SQLite database file
|
||||
mkdir -p prisma
|
||||
bun x prisma migrate deploy
|
||||
|
||||
- name: Run acceptance tests
|
||||
run: bun run test:acceptance
|
||||
env:
|
||||
DATABASE_PROVIDER: sqlite
|
||||
DATABASE_URL: file:./prisma/ci.db
|
||||
BETTER_AUTH_SECRET: test-secret-key-for-ci-only
|
||||
HOME: /root
|
||||
- name: Run unit tests
|
||||
run: bun test src/__tests__/unit/ src/__tests__/*.test.tsx src/__tests__/auth-simple.test.ts
|
||||
|
||||
analyze-bump-type:
|
||||
runs-on: ubuntu-latest
|
||||
needs: acceptance-tests
|
||||
needs: unit-tests
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
|
||||
@@ -14,6 +14,9 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
# Skip if this is an auto-generated version bump commit
|
||||
if: "!contains(github.event.head_commit.message, 'chore: bump version')"
|
||||
container:
|
||||
image: docker.notsosm.art/euchre-camp/ci-base:latest
|
||||
options: --user root
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
@@ -63,11 +66,6 @@ jobs:
|
||||
fi
|
||||
fi
|
||||
|
||||
- name: Setup Bun
|
||||
uses: oven/setup-bun@v2
|
||||
with:
|
||||
bun-version: latest
|
||||
|
||||
- name: Bump version
|
||||
id: version
|
||||
run: |
|
||||
@@ -109,10 +107,6 @@ jobs:
|
||||
git push origin "$TAG_NAME"
|
||||
fi
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
if: steps.commit.outputs.committed == 'true'
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Build test-capable image
|
||||
if: steps.commit.outputs.committed == 'true'
|
||||
run: |
|
||||
@@ -165,8 +159,30 @@ jobs:
|
||||
echo " docker push ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest"
|
||||
fi
|
||||
|
||||
- name: Deploy to dev (placeholder)
|
||||
- name: Deploy to dev environment
|
||||
if: steps.commit.outputs.committed == 'true'
|
||||
run: |
|
||||
echo "Deploying version ${{ steps.version.outputs.new_version }} to dev environment..."
|
||||
# TODO: Add actual deployment steps
|
||||
|
||||
# Update docker-compose.yml with new image tag using full registry path
|
||||
# The registry is docker.notsosm.art and image is euchre-camp
|
||||
IMAGE_TAG="${{ steps.version.outputs.new_version }}"
|
||||
sed -i "s|image: docker.notsosm.art/euchre-camp:[0-9.]*|image: docker.notsosm.art/euchre-camp:${IMAGE_TAG}|" docker-compose.yml
|
||||
|
||||
# Pull and restart the dev container
|
||||
cd /home/euchre_camp
|
||||
docker-compose pull app
|
||||
docker-compose up -d app
|
||||
|
||||
# Wait for container to be healthy
|
||||
echo "Waiting for container to start..."
|
||||
sleep 10
|
||||
|
||||
# Check if container is running
|
||||
if docker ps --filter "name=euchre-camp-app" --format "{{.Status}}" | grep -q "Up"; then
|
||||
echo "✅ Dev environment successfully deployed with version ${{ steps.version.outputs.new_version }}"
|
||||
else
|
||||
echo "❌ Dev environment deployment failed"
|
||||
docker-compose logs app
|
||||
exit 1
|
||||
fi
|
||||
|
||||
+8
-1
@@ -34,7 +34,14 @@ yarn-error.log*
|
||||
.pnpm-debug.log*
|
||||
|
||||
# env files (can opt-in for committing if needed)
|
||||
.env*
|
||||
.env
|
||||
.env.local
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
# Allow example env files to be tracked
|
||||
!.env.example
|
||||
!.env.development.example
|
||||
|
||||
# vercel
|
||||
.vercel
|
||||
|
||||
@@ -1,3 +1,31 @@
|
||||
## [0.1.4] - 2026-04-02
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- ci: remove acceptance tests and add dev deployment
|
||||
- fix(tests): resolve password validation, csv upload, and admin auth issues
|
||||
- fix(ci): correct playwright config paths and add env example files
|
||||
- fix(ci): use existing PostgreSQL server at dhg.lol
|
||||
- fix(ci): use PostgreSQL in acceptance-tests with dev credentials
|
||||
- feat(ci): build custom Docker images for Gitea Actions compatibility
|
||||
- fix(tests): add @prisma/client mock for test isolation
|
||||
- fix(ci): add prisma generate step to unit-tests job
|
||||
- fix: downgrade ESLint to v8.57.1 for LSP compatibility
|
||||
- fix: improve TypeScript types for better IDE code hinting
|
||||
- feat: migrate to ESLint flat config (eslint.config.js)
|
||||
- Revert "fix: downgrade ESLint to v8.x for .eslintrc.json compatibility"
|
||||
- fix: downgrade ESLint to v8.x for .eslintrc.json compatibility
|
||||
- fix: update PR workflow to exclude e2e tests from unit test phase
|
||||
- fix: avoid global mock clearing in EditTournamentForm tests
|
||||
- fix: avoid global mock clearing in Navigation tests
|
||||
- fix: add DOM cleanup to bun-setup.ts
|
||||
- fix: disable test isolation in bunfig.toml
|
||||
- refactor: improve test structure for Bun compatibility
|
||||
- feat: update CI/CD to use Bun
|
||||
- feat: migrate from npm to Bun
|
||||
- docs: update TODO list with recent fix
|
||||
- fix: add defensive checks to prisma.ts to prevent build failures
|
||||
|
||||
## [0.1.3] - 2026-04-01
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
# Base CI image with Bun, Node.js, Playwright, and build tools
|
||||
# Used for Gitea Actions CI workflows
|
||||
# Uses Microsoft Playwright image as base (Ubuntu-based) with Bun added
|
||||
|
||||
FROM mcr.microsoft.com/playwright:v1.58.0-jammy AS base
|
||||
|
||||
# Install unzip (required for Bun installation) and other tools
|
||||
RUN apt-get update && apt-get install -y unzip && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Install Bun (latest version)
|
||||
# Note: The playwright image already has Node.js pre-installed
|
||||
RUN curl -fsSL https://bun.sh/install | bash
|
||||
|
||||
# Add Bun to PATH for subsequent commands
|
||||
ENV PATH="/root/.bun/bin:$PATH"
|
||||
|
||||
# Verify installations
|
||||
RUN echo "=== Bun Version ===" && bun --version && \
|
||||
echo "=== Node.js Version ===" && node --version && \
|
||||
echo "=== Playwright Version ===" && bun x playwright --version
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Set default environment variables
|
||||
ENV DATABASE_PROVIDER=sqlite
|
||||
ENV DATABASE_URL=file:./prisma/ci.db
|
||||
ENV BETTER_AUTH_SECRET=test-secret-key-for-ci-only
|
||||
ENV NODE_ENV=test
|
||||
|
||||
# Health check command (can be overridden)
|
||||
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
||||
CMD bun --version
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
|
||||
services:
|
||||
app:
|
||||
image: euchre-camp/euchre-camp:0.1.0.dev
|
||||
image: docker.notsosm.art/euchre-camp:0.1.0.dev
|
||||
container_name: euchre-camp-app
|
||||
ports:
|
||||
- "3000:3000"
|
||||
|
||||
@@ -79,7 +79,7 @@ test.describe('CSV Upload Player Deduplication', () => {
|
||||
formData.append('eventId', testTournamentId.toString());
|
||||
|
||||
const response = await request.post('http://localhost:3000/api/matches/upload', {
|
||||
data: formData,
|
||||
multipart: formData,
|
||||
});
|
||||
|
||||
expect(response.ok()).toBeTruthy();
|
||||
@@ -133,7 +133,7 @@ test.describe('CSV Upload Player Deduplication', () => {
|
||||
formData.append('eventId', testTournamentId.toString());
|
||||
|
||||
const response = await request.post('http://localhost:3000/api/matches/upload', {
|
||||
data: formData,
|
||||
multipart: formData,
|
||||
});
|
||||
|
||||
expect(response.ok()).toBeTruthy();
|
||||
@@ -190,7 +190,7 @@ test.describe('CSV Upload Player Deduplication', () => {
|
||||
formData.append('eventId', testTournamentId.toString());
|
||||
|
||||
const response = await request.post('http://localhost:3000/api/matches/upload', {
|
||||
data: formData,
|
||||
multipart: formData,
|
||||
});
|
||||
|
||||
expect(response.ok()).toBeTruthy();
|
||||
|
||||
@@ -41,7 +41,7 @@ test.describe('Tournament Edit - allowTies functionality', () => {
|
||||
}
|
||||
});
|
||||
|
||||
test('should display allowTies checkbox on edit form', async ({ page }) => {
|
||||
test('should display allowTies checkbox on edit form @chromium-admin', async ({ page }) => {
|
||||
// Navigate to tournament edit page
|
||||
await page.goto(`/admin/tournaments/${tournamentId}/edit`);
|
||||
|
||||
@@ -54,7 +54,7 @@ test.describe('Tournament Edit - allowTies functionality', () => {
|
||||
await expect(allowTiesCheckbox).not.toBeChecked();
|
||||
});
|
||||
|
||||
test('should save allowTies when toggled to true', async ({ page }) => {
|
||||
test('should save allowTies when toggled to true @chromium-admin', async ({ page }) => {
|
||||
// Navigate to tournament edit page
|
||||
await page.goto(`/admin/tournaments/${tournamentId}/edit`);
|
||||
|
||||
@@ -80,7 +80,7 @@ test.describe('Tournament Edit - allowTies functionality', () => {
|
||||
expect(updatedTournament?.allowTies).toBe(true);
|
||||
});
|
||||
|
||||
test('should save allowTies when toggled to false', async ({ page }) => {
|
||||
test('should save allowTies when toggled to false @chromium-admin', async ({ page }) => {
|
||||
// First, set allowTies to true
|
||||
await prisma.event.update({
|
||||
where: { id: tournamentId },
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "euchre_camp",
|
||||
"version": "0.1.3",
|
||||
"version": "0.1.4",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "NEXT_PUBLIC_GIT_COMMIT=$(git rev-parse --short HEAD) next dev",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { defineConfig, devices } from '@playwright/test';
|
||||
|
||||
export default defineConfig({
|
||||
testDir: './src/__tests__/e2e',
|
||||
testDir: './e2e',
|
||||
timeout: 30000,
|
||||
expect: {
|
||||
timeout: 5000
|
||||
@@ -17,7 +17,7 @@ export default defineConfig({
|
||||
// Reporter to use
|
||||
reporter: 'html',
|
||||
// Global setup and teardown
|
||||
globalSetup: require.resolve('./src/__tests__/e2e/global.setup'),
|
||||
globalSetup: require.resolve('./e2e/global.setup'),
|
||||
// Use base URL for relative navigation
|
||||
use: {
|
||||
baseURL: 'http://localhost:3000',
|
||||
|
||||
@@ -12,7 +12,7 @@ const path = require('path');
|
||||
const { execSync } = require('child_process');
|
||||
|
||||
// Configuration
|
||||
const REGISTRY = 'euchre-camp';
|
||||
const REGISTRY = 'docker.notsosm.art';
|
||||
const IMAGE_NAME = 'euchre-camp';
|
||||
|
||||
// Get current version from package.json
|
||||
|
||||
@@ -1,8 +1,21 @@
|
||||
// Setup file for Bun test runner to provide DOM environment
|
||||
import { JSDOM } from 'jsdom';
|
||||
import { mock } from 'bun:test';
|
||||
|
||||
console.log('Loading bun-setup.ts...');
|
||||
|
||||
// Mock @prisma/client to avoid dependency on generated Prisma client
|
||||
// This allows unit tests to run without requiring `prisma generate`
|
||||
mock.module('@prisma/client', () => {
|
||||
return {
|
||||
PrismaClient: class MockPrismaClient {
|
||||
$connect() {}
|
||||
$disconnect() {}
|
||||
$transaction() {}
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
const dom = new JSDOM('<!DOCTYPE html><html><body></body></html>', {
|
||||
url: 'http://localhost',
|
||||
pretendToBeVisual: true,
|
||||
|
||||
@@ -14,6 +14,8 @@ export const auth = betterAuth({
|
||||
enabled: true,
|
||||
autoSignIn: true, // Automatically sign in after registration
|
||||
requireEmailVerification: false, // Don't require email verification for tests
|
||||
minPasswordLength: 8, // Set minimum password length
|
||||
maxPasswordLength: 128, // Set maximum password length
|
||||
},
|
||||
secret: process.env.BETTER_AUTH_SECRET || process.env.NEXTAUTH_SECRET,
|
||||
baseURL: process.env.BETTER_AUTH_URL || process.env.NEXTAUTH_URL || "http://localhost:3000",
|
||||
|
||||
Reference in New Issue
Block a user