diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..c03a7cf --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,88 @@ +name: CI + +on: + push: + branches: + - main + pull_request: + +jobs: + backend-tests: + runs-on: ubuntu-latest + if: github.event_name != 'pull_request' || github.event.pull_request.draft == false + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Cache NuGet + uses: actions/cache@v4 + with: + path: ~/.nuget/packages + key: nuget-${{ runner.os }}-${{ hashFiles('**/*.csproj') }} + restore-keys: | + nuget-${{ runner.os }}- + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 10.0.x + + - name: Restore and test + run: dotnet test backend/Cauldron.Api/Cauldron.Api.sln + + frontend-unit: + runs-on: ubuntu-latest + if: github.event_name != 'pull_request' || github.event.pull_request.draft == false + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + + - name: Cache Bun + uses: actions/cache@v4 + with: + path: ~/.bun/install/cache + key: bun-${{ runner.os }}-${{ hashFiles('frontend/cauldron/bun.lock') }} + restore-keys: | + bun-${{ runner.os }}- + + - name: Install dependencies + working-directory: frontend/cauldron + run: bun install + + - name: Run unit tests + working-directory: frontend/cauldron + run: bun test:unit + + frontend-e2e: + runs-on: ubuntu-latest + needs: frontend-unit + if: github.event_name != 'pull_request' || github.event.pull_request.draft == false + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + + - name: Cache Bun + uses: actions/cache@v4 + with: + path: ~/.bun/install/cache + key: bun-${{ runner.os }}-${{ hashFiles('frontend/cauldron/bun.lock') }} + restore-keys: | + bun-${{ runner.os }}- + + - name: Install dependencies + working-directory: frontend/cauldron + run: bun install + + - name: Install Playwright browsers + working-directory: frontend/cauldron + run: npx playwright install --with-deps + + - name: Run e2e tests + working-directory: frontend/cauldron + run: bun test:e2e diff --git a/backend/Cauldron.Api.Tests/LeftoverEndpointsTests.cs b/backend/Cauldron.Api.Tests/LeftoverEndpointsTests.cs index 046a0c5..4626fbd 100644 --- a/backend/Cauldron.Api.Tests/LeftoverEndpointsTests.cs +++ b/backend/Cauldron.Api.Tests/LeftoverEndpointsTests.cs @@ -1,12 +1,35 @@ using System.Net; using System.Net.Http.Json; using Cauldron.Api.Contracts.Leftovers; +using Cauldron.Api.Data; +using Microsoft.Extensions.DependencyInjection; namespace Cauldron.Api.Tests; -public class LeftoverEndpointsTests(TestApplicationFactory factory) : IClassFixture +public class LeftoverEndpointsTests : IClassFixture, IAsyncLifetime { - private readonly HttpClient _client = factory.CreateClient(); + private readonly HttpClient _client; + private readonly IServiceScope _scope; + private readonly CauldronDbContext _db; + + public LeftoverEndpointsTests(TestApplicationFactory factory) + { + _client = factory.CreateClient(); + _scope = factory.Services.CreateScope(); + _db = _scope.ServiceProvider.GetRequiredService(); + } + + public async Task InitializeAsync() + { + _db.Leftovers.RemoveRange(_db.Leftovers); + await _db.SaveChangesAsync(); + } + + public Task DisposeAsync() + { + _scope.Dispose(); + return Task.CompletedTask; + } [Fact] public async Task CreateLeftover_PersistsAndCanBeFetched() diff --git a/frontend/cauldron/playwright.config.ts b/frontend/cauldron/playwright.config.ts index 5ece956..449bed3 100644 --- a/frontend/cauldron/playwright.config.ts +++ b/frontend/cauldron/playwright.config.ts @@ -99,11 +99,11 @@ export default defineConfig({ /* Run your local dev server before starting the tests */ webServer: { /** - * Use the dev server by default for faster feedback loop. - * Use the preview server on CI for more realistic testing. - * Playwright will re-use the local server if there is already a dev-server running. + * Use dev server locally; on CI build then run preview so assets are built. */ - command: process.env.CI ? 'npm run preview' : 'npm run dev', + command: process.env.CI + ? 'bun run build && bun run preview -- --host 0.0.0.0 --port 4173' + : 'bun dev -- --host 0.0.0.0 --port 5173', port: process.env.CI ? 4173 : 5173, reuseExistingServer: !process.env.CI, },