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:
26
.github/workflows/code-quality.yml
vendored
26
.github/workflows/code-quality.yml
vendored
@@ -67,11 +67,33 @@ jobs:
|
|||||||
- name: Test
|
- name: Test
|
||||||
run: pnpm test
|
run: pnpm test
|
||||||
|
|
||||||
- name: 'Report Coverage'
|
- name: "Report Coverage"
|
||||||
# Set if: always() to also generate the report if tests are failing
|
# 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
|
# Only works if you set `reportOnFailure: true` in your vite config as specified above
|
||||||
if: always()
|
if: always()
|
||||||
uses: davelosert/vitest-coverage-report-action@v2
|
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:
|
build:
|
||||||
runs-on: ubuntu-latest
|
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": "turbo lint --continue -- --cache --cache-location node_modules/.cache/.eslintcache",
|
||||||
"lint:fix": "turbo lint --continue -- --fix --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",
|
"lint:ws": "pnpm dlx sherif@latest",
|
||||||
"test": "cross-env NODE_ENV=development vitest run --coverage.enabled",
|
"test": "cross-env NODE_ENV=development vitest run --exclude e2e --coverage.enabled ",
|
||||||
"test:ui": "cross-env NODE_ENV=development vitest --ui --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",
|
"typecheck": "turbo typecheck",
|
||||||
"with-env": "dotenv -e .env --"
|
"with-env": "dotenv -e .env --"
|
||||||
},
|
},
|
||||||
|
|||||||
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