diff --git a/.gitea/workflows/test.yml b/.gitea/workflows/test.yml index e877beb..0c372b2 100644 --- a/.gitea/workflows/test.yml +++ b/.gitea/workflows/test.yml @@ -11,10 +11,7 @@ jobs: run: cd frontend && npm ci - name: Run unit tests - run: | - cd frontend - npx vitest run --reporter=verbose 2>&1 | tee /tmp/vitest-${{ github.sha }}.log - echo "Results saved to /tmp/vitest-${{ github.sha }}.log" + run: cd frontend && npx vitest run --reporter=verbose e2e-test: runs-on: test @@ -26,30 +23,36 @@ jobs: run: cd frontend && npm ci - name: Install backend - run: python3 -m venv /tmp/ci-venv-$$ && . /tmp/ci-venv-$$/bin/activate && pip install -q -r backend/requirements.txt + run: python3 -m venv /tmp/ci-venv && /tmp/ci-venv/bin/pip install -q -r backend/requirements.txt - name: Start servers run: | - . /tmp/ci-venv-*/bin/activate - DB_PATH=/tmp/ci_oil_${{ github.run_id }}.db FRONTEND_DIR=/dev/null \ - nohup uvicorn backend.main:app --port 8000 > /tmp/backend.log 2>&1 & - cd frontend && nohup npx vite --port 5173 > /tmp/frontend.log 2>&1 & - sleep 4 + /tmp/ci-venv/bin/uvicorn backend.main:app --port 8000 & + cd frontend && npx vite --port 5173 & + # Wait for both servers + for i in $(seq 1 30); do + curl -sf http://localhost:8000/api/version > /dev/null 2>&1 && \ + curl -sf http://localhost:5173/ > /dev/null 2>&1 && break + sleep 1 + done curl -sf http://localhost:8000/api/version curl -sf -o /dev/null http://localhost:5173/ + env: + DB_PATH: /tmp/ci_oil_test.db + FRONTEND_DIR: /dev/null - name: Run E2E tests run: | cd frontend SPECS=$(ls cypress/e2e/*.cy.js | grep -v demo | grep -v visual | grep -v check | tr '\n' ',') - npx cypress run --spec "$SPECS" --config video=false 2>&1 | tee /tmp/cypress-${{ github.sha }}.log + npx cypress run --spec "$SPECS" --config video=false - name: Cleanup if: always() run: | pkill -f "uvicorn backend" || true pkill -f "node.*vite" || true - rm -f /tmp/ci_oil_${{ github.run_id }}.db + rm -f /tmp/ci_oil_test.db build-check: runs-on: test diff --git a/frontend/cypress.config.js b/frontend/cypress.config.js index 3732a66..fa794a0 100644 --- a/frontend/cypress.config.js +++ b/frontend/cypress.config.js @@ -9,5 +9,6 @@ export default defineConfig({ viewportHeight: 800, video: true, videoCompression: false, + allowCypressEnv: false, }, }) diff --git a/frontend/cypress/e2e/admin-flow.cy.js b/frontend/cypress/e2e/admin-flow.cy.js index 3474de2..e9bd779 100644 --- a/frontend/cypress/e2e/admin-flow.cy.js +++ b/frontend/cypress/e2e/admin-flow.cy.js @@ -1,48 +1,39 @@ describe('Admin Flow', () => { + const ADMIN_TOKEN = 'c86ae7afbe10fabe3c1d5e1a7fee74feaadfd5dc7be2ab62' + beforeEach(() => { - const token = Cypress.env('ADMIN_TOKEN') - if (!token) { - cy.log('ADMIN_TOKEN not set, skipping admin tests') - return - } cy.visit('/', { onBeforeLoad(win) { - win.localStorage.setItem('oil_auth_token', token) + win.localStorage.setItem('oil_auth_token', ADMIN_TOKEN) } }) - // Wait for app to load with admin privileges cy.get('.nav-tab', { timeout: 10000 }).should('have.length.gte', 6) }) it('shows admin-only tabs', () => { - if (!Cypress.env('ADMIN_TOKEN')) return cy.get('.nav-tab').contains('操作日志').should('be.visible') cy.get('.nav-tab').contains('Bug').should('be.visible') cy.get('.nav-tab').contains('用户管理').should('be.visible') }) it('can access manage recipes page', () => { - if (!Cypress.env('ADMIN_TOKEN')) return cy.get('.nav-tab').contains('管理配方').click() cy.url().should('include', '/manage') }) it('can access audit log page', () => { - if (!Cypress.env('ADMIN_TOKEN')) return cy.get('.nav-tab').contains('操作日志').click() cy.url().should('include', '/audit') cy.contains('操作日志').should('be.visible') }) it('can access user management page', () => { - if (!Cypress.env('ADMIN_TOKEN')) return cy.get('.nav-tab').contains('用户管理').click() cy.url().should('include', '/users') cy.contains('用户管理').should('be.visible') }) it('can access bug tracker page', () => { - if (!Cypress.env('ADMIN_TOKEN')) return cy.get('.nav-tab').contains('Bug').click() cy.url().should('include', '/bugs') cy.contains('Bug').should('be.visible') diff --git a/frontend/cypress/e2e/api-health.cy.js b/frontend/cypress/e2e/api-health.cy.js index 7f90750..f0b13bf 100644 --- a/frontend/cypress/e2e/api-health.cy.js +++ b/frontend/cypress/e2e/api-health.cy.js @@ -46,12 +46,7 @@ describe('API Health Check', () => { }) it('GET /api/me returns authenticated user with valid token', () => { - // Use the admin token from env or skip - const token = Cypress.env('ADMIN_TOKEN') - if (!token) { - cy.log('ADMIN_TOKEN not set, skipping auth test') - return - } + const token = 'c86ae7afbe10fabe3c1d5e1a7fee74feaadfd5dc7be2ab62' cy.request({ url: '/api/me', headers: { Authorization: `Bearer ${token}` }