ci: add e2e workflow (#1422)
* ci: add e2e workflow * fix: skip showing error * fix: when e2e skipped, e2e still executed * fix: job env not accessible in if * fix: env not accessible at all in job if statement * fix: wrong env used for step ifs * ci: add reusable e2e-execution workflow * fix: e2e trigger fails not supported reusable workflow within steps * fix: composite e2e-execution action not found * fix: reference to composite action not working without checkout * fix: composite action has to be named action.yml * fix: id for docker should not have spaces * fix: shell property missing * fix: typo one dash to much * ci: add e2e tests * chore: change node-version to 22 * chore: move e2e tests to code-quality workflow as duration of e2e step is about 4 minutes * fix: deepsource issues
This commit is contained in:
28
.github/workflows/code-quality.yml
vendored
28
.github/workflows/code-quality.yml
vendored
@@ -67,11 +67,33 @@ jobs:
|
||||
- name: Test
|
||||
run: pnpm test
|
||||
|
||||
- name: 'Report Coverage'
|
||||
- name: "Report Coverage"
|
||||
# Set if: always() to also generate the report if tests are failing
|
||||
# Only works if you set `reportOnFailure: true` in your vite config as specified above
|
||||
if: always()
|
||||
uses: davelosert/vitest-coverage-report-action@v2
|
||||
if: always()
|
||||
uses: davelosert/vitest-coverage-report-action@v2
|
||||
|
||||
e2e:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Setup
|
||||
uses: ./tooling/github/setup
|
||||
- name: Build docker image
|
||||
id: build-docker-image
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
platforms: linux/amd64
|
||||
context: .
|
||||
push: false
|
||||
tags: homarr-e2e
|
||||
network: host
|
||||
env:
|
||||
SKIP_ENV_VALIDATION: true
|
||||
- name: Run E2E Tests
|
||||
shell: bash
|
||||
run: pnpm test:e2e
|
||||
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
18
e2e/health-checks.spec.ts
Normal file
18
e2e/health-checks.spec.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
import { describe, expect, test } from "vitest";
|
||||
|
||||
import { createHomarrContainer } from "./shared/create-homarr-container";
|
||||
|
||||
describe("Health checks", () => {
|
||||
test("ready and live should return 200 OK", async () => {
|
||||
// Arrange
|
||||
const homarrContainer = await createHomarrContainer().start();
|
||||
|
||||
// Act
|
||||
const readyResponse = await fetch(`http://localhost:${homarrContainer.getMappedPort(7575)}/api/health/ready`);
|
||||
const liveResponse = await fetch(`http://localhost:${homarrContainer.getMappedPort(7575)}/api/health/live`);
|
||||
|
||||
// Assert
|
||||
expect(readyResponse.status).toBe(200);
|
||||
expect(liveResponse.status).toBe(200);
|
||||
}, 20_000);
|
||||
});
|
||||
16
e2e/home.spec.ts
Normal file
16
e2e/home.spec.ts
Normal file
@@ -0,0 +1,16 @@
|
||||
import { describe, expect, test } from "vitest";
|
||||
|
||||
import { createHomarrContainer } from "./shared/create-homarr-container";
|
||||
|
||||
describe("Home", () => {
|
||||
test("should open with status code 200", async () => {
|
||||
// Arrange
|
||||
const homarrContainer = await createHomarrContainer().start();
|
||||
|
||||
// Act
|
||||
const homeResponse = await fetch(`http://localhost:${homarrContainer.getMappedPort(7575)}/`);
|
||||
|
||||
// Assert
|
||||
expect(homeResponse.status).toBe(200);
|
||||
}, 20_000);
|
||||
});
|
||||
14
e2e/shared/create-homarr-container.ts
Normal file
14
e2e/shared/create-homarr-container.ts
Normal file
@@ -0,0 +1,14 @@
|
||||
import { GenericContainer, Wait } from "testcontainers";
|
||||
|
||||
export const createHomarrContainer = () => {
|
||||
if (!process.env.CI) {
|
||||
throw new Error("This test should only be run in CI or with a homarr image named 'homarr-e2e'");
|
||||
}
|
||||
|
||||
return new GenericContainer("homarr-e2e")
|
||||
.withEnvironment({
|
||||
AUTH_SECRET: "secret",
|
||||
})
|
||||
.withExposedPorts(7575)
|
||||
.withWaitStrategy(Wait.forHttp("/api/health/ready", 7575));
|
||||
};
|
||||
@@ -19,8 +19,9 @@
|
||||
"lint": "turbo lint --continue -- --cache --cache-location node_modules/.cache/.eslintcache",
|
||||
"lint:fix": "turbo lint --continue -- --fix --cache --cache-location node_modules/.cache/.eslintcache",
|
||||
"lint:ws": "pnpm dlx sherif@latest",
|
||||
"test": "cross-env NODE_ENV=development vitest run --coverage.enabled",
|
||||
"test:ui": "cross-env NODE_ENV=development vitest --ui --coverage.enabled",
|
||||
"test": "cross-env NODE_ENV=development vitest run --exclude e2e --coverage.enabled ",
|
||||
"test:e2e": "cross-env NODE_ENV=development vitest e2e",
|
||||
"test:ui": "cross-env NODE_ENV=development vitest --exclude e2e --ui --coverage.enabled",
|
||||
"typecheck": "turbo typecheck",
|
||||
"with-env": "dotenv -e .env --"
|
||||
},
|
||||
@@ -49,4 +50,4 @@
|
||||
"trpc-swagger@1.2.6": "patches/trpc-swagger@1.2.6.patch"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
8
tsconfig.e2e.json
Normal file
8
tsconfig.e2e.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"extends": "@homarr/tsconfig/base.json",
|
||||
"compilerOptions": {
|
||||
"tsBuildInfoFile": "node_modules/.cache/tsbuildinfo.json"
|
||||
},
|
||||
"include": ["e2e"],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
Reference in New Issue
Block a user