diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 057723fe..cd812e47 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -27,6 +27,7 @@ jobs: with: tags: pocket-id/pocket-id:test outputs: type=docker,dest=/tmp/docker-image.tar + build-args: BUILD_TAGS=e2etest - name: Upload Docker image artifact uses: actions/upload-artifact@v4 @@ -51,6 +52,7 @@ jobs: with: name: docker-image path: /tmp + - name: Load Docker Image run: docker load -i /tmp/docker-image.tar diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..794d8983 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "go.buildTags": "e2etest" +} \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 687dcd57..bb2a9fe7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -49,7 +49,7 @@ The backend is built with [Gin](https://gin-gonic.com) and written in Go. 1. Open the `backend` folder 2. Copy the `.env.example` file to `.env` and change the `APP_ENV` to `development` -3. Start the backend with `go run cmd/main.go` +3. Start the backend with `go run -tags e2etest ./cmd` ### Frontend diff --git a/Dockerfile b/Dockerfile index 6516cbfb..73367b75 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,6 @@ +# Tags passed to "go build" +ARG BUILD_TAGS="" + # Stage 1: Build Frontend FROM node:22-alpine AS frontend-builder WORKDIR /app/frontend @@ -9,6 +12,7 @@ RUN npm prune --production # Stage 2: Build Backend FROM golang:1.23-alpine AS backend-builder +ARG BUILD_TAGS WORKDIR /app/backend COPY ./backend/go.mod ./backend/go.sum ./ RUN go mod download @@ -17,7 +21,12 @@ RUN apk add --no-cache gcc musl-dev COPY ./backend ./ WORKDIR /app/backend/cmd -RUN CGO_ENABLED=1 GOOS=linux go build -o /app/backend/pocket-id-backend . +RUN CGO_ENABLED=1 \ + GOOS=linux \ + go build \ + -tags "${BUILD_TAGS}" \ + -o /app/backend/pocket-id-backend \ + . # Stage 3: Production Image FROM node:22-alpine diff --git a/backend/internal/bootstrap/e2etest_router_bootstrap.go b/backend/internal/bootstrap/e2etest_router_bootstrap.go new file mode 100644 index 00000000..7ee8e1e0 --- /dev/null +++ b/backend/internal/bootstrap/e2etest_router_bootstrap.go @@ -0,0 +1,21 @@ +//go:build e2etest + +package bootstrap + +import ( + "github.com/gin-gonic/gin" + "gorm.io/gorm" + + "github.com/pocket-id/pocket-id/backend/internal/controller" + "github.com/pocket-id/pocket-id/backend/internal/service" +) + +// When building for E2E tests, add the e2etest controller +func init() { + registerTestControllers = []func(apiGroup *gin.RouterGroup, db *gorm.DB, appConfigService *service.AppConfigService, jwtService *service.JwtService){ + func(apiGroup *gin.RouterGroup, db *gorm.DB, appConfigService *service.AppConfigService, jwtService *service.JwtService) { + testService := service.NewTestService(db, appConfigService, jwtService) + controller.NewTestController(apiGroup, testService) + }, + } +} diff --git a/backend/internal/bootstrap/router_bootstrap.go b/backend/internal/bootstrap/router_bootstrap.go index 31017999..2f892edd 100644 --- a/backend/internal/bootstrap/router_bootstrap.go +++ b/backend/internal/bootstrap/router_bootstrap.go @@ -16,10 +16,12 @@ import ( "gorm.io/gorm" ) +// This is used to register additional controllers for tests +var registerTestControllers []func(apiGroup *gin.RouterGroup, db *gorm.DB, appConfigService *service.AppConfigService, jwtService *service.JwtService) + // @title Pocket ID API // @version 1 // @description API for Pocket ID - func initRouter(db *gorm.DB, appConfigService *service.AppConfigService) { // Set the appropriate Gin mode based on the environment switch common.EnvConfig.AppEnv { @@ -47,7 +49,6 @@ func initRouter(db *gorm.DB, appConfigService *service.AppConfigService) { userService := service.NewUserService(db, jwtService, auditLogService, emailService, appConfigService) customClaimService := service.NewCustomClaimService(db) oidcService := service.NewOidcService(db, jwtService, appConfigService, auditLogService, customClaimService) - testService := service.NewTestService(db, appConfigService, jwtService) userGroupService := service.NewUserGroupService(db, appConfigService) ldapService := service.NewLdapService(db, appConfigService, userService, userGroupService) apiKeyService := service.NewApiKeyService(db) @@ -79,7 +80,9 @@ func initRouter(db *gorm.DB, appConfigService *service.AppConfigService) { // Add test controller in non-production environments if common.EnvConfig.AppEnv != "production" { - controller.NewTestController(apiGroup, testService) + for _, f := range registerTestControllers { + f(apiGroup, db, appConfigService, jwtService) + } } // Set up base routes diff --git a/backend/internal/controller/test_controller.go b/backend/internal/controller/e2etest_controller.go similarity index 97% rename from backend/internal/controller/test_controller.go rename to backend/internal/controller/e2etest_controller.go index 262c4d31..b8651f35 100644 --- a/backend/internal/controller/test_controller.go +++ b/backend/internal/controller/e2etest_controller.go @@ -1,9 +1,12 @@ +//go:build e2etest + package controller import ( "net/http" "github.com/gin-gonic/gin" + "github.com/pocket-id/pocket-id/backend/internal/service" ) diff --git a/backend/internal/service/test_service.go b/backend/internal/service/e2etest_service.go similarity index 99% rename from backend/internal/service/test_service.go rename to backend/internal/service/e2etest_service.go index f7483ea1..b596195c 100644 --- a/backend/internal/service/test_service.go +++ b/backend/internal/service/e2etest_service.go @@ -1,3 +1,5 @@ +//go:build e2etest + package service import (