diff --git a/.github/actions/cache-build/action.yml b/.github/actions/cache-build/action.yml index 1849e475761152..72baa43cfc56cd 100644 --- a/.github/actions/cache-build/action.yml +++ b/.github/actions/cache-build/action.yml @@ -20,13 +20,14 @@ runs: key-2: ${{ hashFiles('apps/**/**.[jt]s', 'apps/**/**.[jt]sx', 'packages/**/**.[jt]s', 'packages/**/**.[jt]sx', '!**/node_modules') }} key-3: ${{ github.event.pull_request.number || github.ref }} key-4: ${{ github.sha }} + key-5: ${{ github.event.pull_request.head.sha }} with: path: | ${{ github.workspace }}/apps/web/.next ${{ github.workspace }}/apps/web/public/embed **/.turbo/** **/dist/** - key: ${{ runner.os }}-${{ env.cache-name }}-${{ env.key-1 }}-${{ env.key-2 }}-${{ env.key-3 }}-${{ env.key-4 }} + key: ${{ runner.os }}-${{ env.cache-name }}-${{ env.key-1 }}-${{ env.key-2 }}-${{ env.key-3 }}-${{ env.key-4 }}-${{ env.key-5 }} - run: | export NODE_OPTIONS="--max_old_space_size=8192" yarn build diff --git a/.github/workflows/pr-labeled.yml b/.github/workflows/pr-labeled.yml new file mode 100644 index 00000000000000..ce0e34a2e3a55c --- /dev/null +++ b/.github/workflows/pr-labeled.yml @@ -0,0 +1,54 @@ +name: PR Labeled with ready-for-e2e + +on: + pull_request_target: + types: [labeled] + branches: + - main + - gh-actions-test-branch + workflow_dispatch: +jobs: + run-e2e-jobs: + name: Run E2E Jobs + runs-on: buildjet-2vcpu-ubuntu-2204 + permissions: + pull-requests: read + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/dangerous-git-checkout + + - name: Check Label and Retrigger Checks + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const labelName = context.payload.label.name; + const prNumber = context.payload.pull_request.number; + const owner = context.repo.owner; + const repo = context.repo.repo; + + if (labelName === 'ready-for-e2e') { + console.log(`Running E2E jobs for PR #${prNumber}...`); + + const checkRuns = await github.rest.checks.listForRef({ + owner, + repo, + ref: context.payload.pull_request.head.sha, + }); + + for (const check of checkRuns.data.check_runs) { + console.log('check.name', check.name); + if (check.name.includes('e2e')) { + await github.rest.actions.reRunJob({ + owner, + repo, + job_id: check.id, + }); + console.log(`Triggering job #${check.id}`); + } + } + + console.log(`Triggered E2E checks for PR #${prNumber}`); + } else { + console.log(`Label ${labelName} does not trigger re-running checks.`); + } diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index fc18d35bff252e..abe34c3b79ab16 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -2,7 +2,6 @@ name: PR Update on: pull_request_target: - types: [opened, synchronize, reopened, labeled] branches: - main - gh-actions-test-branch @@ -135,28 +134,28 @@ jobs: secrets: inherit e2e: - name: Tests + name: e2e needs: [changes, check-label, build] if: ${{ needs.check-label.outputs.run-e2e == 'true' && needs.changes.outputs.has-files-requiring-all-checks == 'true' }} uses: ./.github/workflows/e2e.yml secrets: inherit e2e-app-store: - name: Tests + name: e2e-app-store needs: [changes, check-label, build] if: ${{ needs.check-label.outputs.run-e2e == 'true' && needs.changes.outputs.has-files-requiring-all-checks == 'true' }} uses: ./.github/workflows/e2e-app-store.yml secrets: inherit e2e-embed: - name: Tests + name: e2e-embed needs: [changes, check-label, build] if: ${{ needs.check-label.outputs.run-e2e == 'true' && needs.changes.outputs.has-files-requiring-all-checks == 'true' }} uses: ./.github/workflows/e2e-embed.yml secrets: inherit e2e-embed-react: - name: Tests + name: e2e-embed-react needs: [changes, check-label, build] if: ${{ needs.check-label.outputs.run-e2e == 'true' && needs.changes.outputs.has-files-requiring-all-checks == 'true' }} uses: ./.github/workflows/e2e-embed-react.yml diff --git a/apps/api/v2/src/ee/event-types/event-types_2024_04_15/controllers/event-types.controller.e2e-spec.ts b/apps/api/v2/src/ee/event-types/event-types_2024_04_15/controllers/event-types.controller.e2e-spec.ts index 5f0575015040e1..a1d283c62bbdbb 100644 --- a/apps/api/v2/src/ee/event-types/event-types_2024_04_15/controllers/event-types.controller.e2e-spec.ts +++ b/apps/api/v2/src/ee/event-types/event-types_2024_04_15/controllers/event-types.controller.e2e-spec.ts @@ -24,7 +24,12 @@ import { TeamRepositoryFixture } from "test/fixtures/repository/team.repository. import { UserRepositoryFixture } from "test/fixtures/repository/users.repository.fixture"; import { withApiAuth } from "test/utils/withApiAuth"; -import { SUCCESS_STATUS } from "@calcom/platform-constants"; +import { + SUCCESS_STATUS, + VERSION_2024_06_11, + VERSION_2024_04_15, + CAL_API_VERSION_HEADER, +} from "@calcom/platform-constants"; import { EventTypesByViewer, EventTypesPublic, @@ -154,6 +159,7 @@ describe("Event types Endpoints", () => { return request(app.getHttpServer()) .post("/api/v2/event-types") + .set(CAL_API_VERSION_HEADER, VERSION_2024_04_15) .send(body) .expect(201) .then(async (response) => { @@ -184,6 +190,7 @@ describe("Event types Endpoints", () => { return request(app.getHttpServer()) .patch(`/api/v2/event-types/${eventType.id}`) + .set(CAL_API_VERSION_HEADER, VERSION_2024_04_15) .send(body) .expect(200) .then(async (response) => { @@ -288,6 +295,25 @@ describe("Event types Endpoints", () => { it(`/GET/:id`, async () => { const response = await request(app.getHttpServer()) .get(`/api/v2/event-types/${eventType.id}`) + .set(CAL_API_VERSION_HEADER, VERSION_2024_04_15) + // note: bearer token value mocked using "withApiAuth" for user which id is used when creating event type above + .set("Authorization", `Bearer whatever`) + .expect(200); + + const responseBody: GetEventTypeOutput = response.body; + + expect(responseBody.status).toEqual(SUCCESS_STATUS); + expect(responseBody.data).toBeDefined(); + expect(responseBody.data.eventType.id).toEqual(eventType.id); + expect(responseBody.data.eventType.title).toEqual(eventType.title); + expect(responseBody.data.eventType.slug).toEqual(eventType.slug); + expect(responseBody.data.eventType.userId).toEqual(user.id); + }); + + it(`/GET/:id with version VERSION_2024_06_11`, async () => { + const response = await request(app.getHttpServer()) + .get(`/api/v2/event-types/${eventType.id}`) + .set(CAL_API_VERSION_HEADER, VERSION_2024_06_11) // note: bearer token value mocked using "withApiAuth" for user which id is used when creating event type above .set("Authorization", `Bearer whatever`) .expect(200); @@ -305,6 +331,7 @@ describe("Event types Endpoints", () => { it(`/GET/:username/public`, async () => { const response = await request(app.getHttpServer()) .get(`/api/v2/event-types/${username}/public`) + .set(CAL_API_VERSION_HEADER, VERSION_2024_04_15) // note: bearer token value mocked using "withApiAuth" for user which id is used when creating event type above .set("Authorization", `Bearer whatever`) .expect(200); @@ -323,6 +350,7 @@ describe("Event types Endpoints", () => { it(`/GET/:username/:eventSlug/public`, async () => { const response = await request(app.getHttpServer()) .get(`/api/v2/event-types/${username}/${eventType.slug}/public`) + .set(CAL_API_VERSION_HEADER, VERSION_2024_04_15) // note: bearer token value mocked using "withApiAuth" for user which id is used when creating event type above .set("Authorization", `Bearer whatever`) .expect(200); @@ -340,6 +368,7 @@ describe("Event types Endpoints", () => { it(`/GET/`, async () => { const response = await request(app.getHttpServer()) .get(`/api/v2/event-types`) + .set(CAL_API_VERSION_HEADER, VERSION_2024_04_15) // note: bearer token value mocked using "withApiAuth" for user which id is used when creating event type above .set("Authorization", `Bearer whatever`) .expect(200); @@ -359,6 +388,7 @@ describe("Event types Endpoints", () => { it(`/GET/public/:username/`, async () => { const response = await request(app.getHttpServer()) .get(`/api/v2/event-types/${username}/public`) + .set(CAL_API_VERSION_HEADER, VERSION_2024_04_15) // note: bearer token value mocked using "withApiAuth" for user which id is used when creating event type above .set("Authorization", `Bearer whatever`) .expect(200); @@ -375,13 +405,17 @@ describe("Event types Endpoints", () => { it(`/GET/:id not existing`, async () => { await request(app.getHttpServer()) .get(`/api/v2/event-types/1000`) + .set(CAL_API_VERSION_HEADER, VERSION_2024_04_15) // note: bearer token value mocked using "withApiAuth" for user which id is used when creating event type above .set("Authorization", `Bearer whatever`) .expect(404); }); it("should delete schedule", async () => { - return request(app.getHttpServer()).delete(`/api/v2/event-types/${eventType.id}`).expect(200); + return request(app.getHttpServer()) + .delete(`/api/v2/event-types/${eventType.id}`) + .set(CAL_API_VERSION_HEADER, VERSION_2024_04_15) + .expect(200); }); afterAll(async () => { diff --git a/apps/api/v2/src/ee/event-types/event-types_2024_04_15/controllers/event-types.controller.ts b/apps/api/v2/src/ee/event-types/event-types_2024_04_15/controllers/event-types.controller.ts index 81c03a9066edd8..3669420db1ab14 100644 --- a/apps/api/v2/src/ee/event-types/event-types_2024_04_15/controllers/event-types.controller.ts +++ b/apps/api/v2/src/ee/event-types/event-types_2024_04_15/controllers/event-types.controller.ts @@ -13,7 +13,7 @@ import { } from "@/ee/event-types/event-types_2024_04_15/outputs/get-event-types.output"; import { UpdateEventTypeOutput } from "@/ee/event-types/event-types_2024_04_15/outputs/update-event-type.output"; import { EventTypesService_2024_04_15 } from "@/ee/event-types/event-types_2024_04_15/services/event-types.service"; -import { VERSION_2024_04_15_VALUE } from "@/lib/api-versions"; +import { VERSION_2024_04_15, VERSION_2024_06_11 } from "@/lib/api-versions"; import { GetUser } from "@/modules/auth/decorators/get-user/get-user.decorator"; import { Permissions } from "@/modules/auth/decorators/permissions/permissions.decorator"; import { ApiAuthGuard } from "@/modules/auth/guards/api-auth/api-auth.guard"; @@ -45,7 +45,7 @@ import { PrismaClient } from "@calcom/prisma"; @Controller({ path: "/v2/event-types", - version: VERSION_2024_04_15_VALUE, + version: [VERSION_2024_04_15, VERSION_2024_06_11], }) @UseGuards(PermissionsGuard) @DocsTags("Event types") diff --git a/apps/api/v2/src/lib/api-versions.ts b/apps/api/v2/src/lib/api-versions.ts index f4352e3ef9e37f..62a70a4b83a372 100644 --- a/apps/api/v2/src/lib/api-versions.ts +++ b/apps/api/v2/src/lib/api-versions.ts @@ -12,5 +12,6 @@ export const VERSION_2024_06_14_VALUE: VersionValue = VERSION_2024_06_14 as unkn export const VERSION_2024_06_11_VALUE: VersionValue = VERSION_2024_06_11 as unknown as VersionValue; export const VERSION_2024_04_15_VALUE: VersionValue = VERSION_2024_04_15 as unknown as VersionValue; +export { VERSION_2024_04_15 }; export { VERSION_2024_06_11 }; export { VERSION_2024_06_14 };