diff --git a/.github/workflows/run-unit-tests.yml b/.github/workflows/run-unit-tests.yml new file mode 100644 index 0000000..eda8e88 --- /dev/null +++ b/.github/workflows/run-unit-tests.yml @@ -0,0 +1,110 @@ +name: Framework Package Tests + +on: + push: + branches: [main, "feature/**"] + pull_request: + +jobs: + core-tests: + runs-on: ubuntu-latest + timeout-minutes: 30 + env: + FROXLOR_APP_DIR: ${{ github.workspace }}/froxlor + FROXLOR_FRAMEWORK_DIR: ${{ github.workspace }}/framework + + steps: + - name: Checkout framework + uses: actions/checkout@v7 + with: + path: framework + + - name: Checkout froxlor app + uses: actions/checkout@v7 + with: + repository: froxlor/froxlor + path: froxlor + + - name: Verify CI paths + run: | + pwd + test -d "$FROXLOR_APP_DIR" + test -d "$FROXLOR_FRAMEWORK_DIR" + + - name: Use local framework checkout + working-directory: froxlor + run: | + php -r '$file = "composer.json"; $json = json_decode(file_get_contents($file), true, 512, JSON_THROW_ON_ERROR); $json["repositories"] = [["name" => "framework", "type" => "path", "url" => "../framework", "options" => ["reference" => "config", "symlink" => true]]]; file_put_contents($file, json_encode($json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . PHP_EOL);' + + - name: Install PHP + uses: shivammathur/setup-php@v2 + with: + php-version: "8.5" + coverage: none + tools: composer:v2 + + - name: Cache composer downloads + uses: actions/cache@v5 + with: + path: ~/.composer/cache/files + key: composer-${{ runner.os }}-${{ hashFiles('froxlor/composer.json', 'framework/composer.json') }} + restore-keys: composer-${{ runner.os }}- + + - name: Install dependencies + working-directory: froxlor + run: | + composer update --no-interaction --prefer-dist --no-progress + + - name: Start docker stack + working-directory: framework + run: docker compose -f docker-compose.ci.yml up -d + + - name: Prepare Laravel env + working-directory: froxlor + run: | + cp .env.example .env + { + echo "APP_ENV=testing" + echo "APP_KEY=base64:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" + echo "APP_DEBUG=true" + echo "APP_URL=http://localhost" + echo "DB_CONNECTION=mysql" + echo "DB_HOST=db" + echo "DB_PORT=3306" + echo "DB_DATABASE=froxlor" + echo "DB_USERNAME=froxlor" + echo "DB_PASSWORD=froxlor" + echo "CACHE_STORE=array" + echo "QUEUE_CONNECTION=sync" + echo "SESSION_DRIVER=array" + echo "MAIL_MAILER=array" + echo "DEV_NODE=local" + echo "DEV_EMAIL=admin@froxlor.test" + echo "DEV_FIRST_NAME=Admin" + echo "DEV_LAST_NAME=User" + echo "DEV_PASSWORD=secret-password" + echo "DEV_SEED_DEVELOPMENT_DATA=true" + } >> .env + + - name: Wait for database + working-directory: framework + run: | + docker compose -f docker-compose.ci.yml exec -T db mariadb-admin ping -h localhost -uroot -proot --wait=60 + + - name: Fresh database with seeders + working-directory: framework + run: docker compose -f docker-compose.ci.yml exec -T froxlor php /var/www/html/froxlor/artisan migrate:fresh --seed --force + + - name: Run tests + working-directory: framework + run: docker compose -f docker-compose.ci.yml exec -T froxlor php /var/www/html/froxlor/artisan test + + - name: Docker logs on failure + working-directory: framework + if: failure() + run: docker compose -f docker-compose.ci.yml logs --no-color + + - name: Stop docker stack + working-directory: framework + if: always() + run: docker compose -f docker-compose.ci.yml down -v --remove-orphans diff --git a/docker-compose.ci.yml b/docker-compose.ci.yml new file mode 100644 index 0000000..e613e02 --- /dev/null +++ b/docker-compose.ci.yml @@ -0,0 +1,43 @@ +services: + froxlor: + image: hub.froxlor.io/froxlor/froxlor:latest + privileged: true + pid: "host" + depends_on: + db: + condition: service_healthy + redis: + condition: service_started + volumes: + - ${FROXLOR_APP_DIR:-../froxlor}:/var/www/html/froxlor + - ${FROXLOR_FRAMEWORK_DIR:-.}:/var/www/html/framework + - environments:/srv/environments + networks: + - internal + + db: + image: mariadb:latest + environment: + MYSQL_ROOT_PASSWORD: root + MYSQL_DATABASE: froxlor + MYSQL_USER: froxlor + MYSQL_PASSWORD: froxlor + healthcheck: + test: ["CMD", "mariadb-admin", "ping", "-h", "localhost", "-uroot", "-proot"] + interval: 2s + timeout: 5s + retries: 30 + networks: + - internal + + redis: + image: redis:latest + networks: + - internal + +volumes: + environments: + +networks: + internal: + driver: bridge