fix: mock github checks in tests (#724)

* fix: load fetch polyfill before tests

* refactor: extract cloud runner test helpers

* fix: load fetch polyfill before tests
pull/725/head^2
Frostebite 2025-08-06 06:07:52 +01:00 committed by GitHub
parent 9e91ca9749
commit c6c8236152
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 124 additions and 51 deletions

View File

@ -3,6 +3,11 @@ name: Cloud Runner CI Pipeline
on: on:
push: { branches: [cloud-runner-develop, cloud-runner-preview, main] } push: { branches: [cloud-runner-develop, cloud-runner-preview, main] }
workflow_dispatch: workflow_dispatch:
inputs:
runGithubIntegrationTests:
description: 'Run GitHub Checks integration tests'
required: false
default: 'false'
permissions: permissions:
checks: write checks: write
@ -207,3 +212,20 @@ jobs:
name: ${{ matrix.providerStrategy }} Build (${{ matrix.targetPlatform }}) name: ${{ matrix.providerStrategy }} Build (${{ matrix.targetPlatform }})
path: ${{ steps.unity-build.outputs.BUILD_ARTIFACT }} path: ${{ steps.unity-build.outputs.BUILD_ARTIFACT }}
retention-days: 14 retention-days: 14
githubChecksIntegration:
name: GitHub Checks Integration
runs-on: ubuntu-latest
if: github.event_name == 'workflow_dispatch' && github.event.inputs.runGithubIntegrationTests == 'true'
env:
RUN_GITHUB_INTEGRATION_TESTS: true
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'yarn'
- run: yarn install --frozen-lockfile
- run: yarn test cloud-runner-github-checks-integration-test --detectOpenHandles --forceExit --runInBand
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@ -25,6 +25,8 @@ module.exports = {
// An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader
modulePathIgnorePatterns: ['<rootDir>/lib/', '<rootDir>/dist/'], modulePathIgnorePatterns: ['<rootDir>/lib/', '<rootDir>/dist/'],
// A list of paths to modules that run some code to configure or set up the testing framework before each test // Files that will be run before Jest is loaded to set globals like fetch
setupFiles: ['<rootDir>/src/jest.globals.ts'],
// A list of paths to modules that run some code to configure or set up the testing framework after the environment is ready
setupFilesAfterEnv: ['<rootDir>/src/jest.setup.ts'], setupFilesAfterEnv: ['<rootDir>/src/jest.setup.ts'],
}; };

View File

@ -0,0 +1,29 @@
// Integration test for exercising real GitHub check creation and updates.
import CloudRunner from '../model/cloud-runner/cloud-runner';
import UnityVersioning from '../model/unity-versioning';
import GitHub from '../model/github';
import { TIMEOUT_INFINITE, createParameters } from '../test-utils/cloud-runner-test-helpers';
const runIntegration = process.env.RUN_GITHUB_INTEGRATION_TESTS === 'true';
const describeOrSkip = runIntegration ? describe : describe.skip;
describeOrSkip('Cloud Runner Github Checks Integration', () => {
it(
'creates and updates a real GitHub check',
async () => {
const buildParameter = await createParameters({
versioning: 'None',
projectPath: 'test-project',
unityVersion: UnityVersioning.read('test-project'),
asyncCloudRunner: `true`,
githubChecks: `true`,
});
await CloudRunner.setup(buildParameter);
const checkId = await GitHub.createGitHubCheck(`integration create`);
expect(checkId).not.toEqual('');
await GitHub.updateGitHubCheck(`1 ${new Date().toISOString()}`, `integration`);
await GitHub.updateGitHubCheck(`2 ${new Date().toISOString()}`, `integration`, `success`, `completed`);
},
TIMEOUT_INFINITE,
);
});

View File

@ -0,0 +1,3 @@
import { fetch as undiciFetch, Headers, Request, Response } from 'undici';
Object.assign(globalThis, { fetch: undiciFetch, Headers, Request, Response });

View File

@ -1,59 +1,65 @@
import { BuildParameters } from '../..';
import CloudRunner from '../cloud-runner'; import CloudRunner from '../cloud-runner';
import UnityVersioning from '../../unity-versioning'; import UnityVersioning from '../../unity-versioning';
import { Cli } from '../../cli/cli';
import CloudRunnerOptions from '../options/cloud-runner-options';
import setups from './cloud-runner-suite.test'; import setups from './cloud-runner-suite.test';
import { OptionValues } from 'commander';
import GitHub from '../../github'; import GitHub from '../../github';
export const TIMEOUT_INFINITE = 1e9; import { TIMEOUT_INFINITE, createParameters } from '../../../test-utils/cloud-runner-test-helpers';
async function CreateParameters(overrides: OptionValues | undefined) {
if (overrides) Cli.options = overrides;
return BuildParameters.create();
}
describe('Cloud Runner Github Checks', () => { describe('Cloud Runner Github Checks', () => {
setups(); setups();
it('Responds', () => {}); it('Responds', () => {});
if (CloudRunnerOptions.cloudRunnerDebug) { beforeEach(() => {
it( // Mock GitHub API requests to avoid real network calls
'Check Handling Direct', jest.spyOn(GitHub as any, 'createGitHubCheckRequest').mockResolvedValue({
async () => { status: 201,
// Setup parameters data: { id: '1' },
const buildParameter = await CreateParameters({ });
versioning: 'None', jest.spyOn(GitHub as any, 'updateGitHubCheckRequest').mockResolvedValue({
projectPath: 'test-project', status: 200,
unityVersion: UnityVersioning.read('test-project'), data: {},
asyncCloudRunner: `true`, });
githubChecks: `true`, jest.spyOn(GitHub as any, 'runUpdateAsyncChecksWorkflow').mockResolvedValue(undefined);
}); });
await CloudRunner.setup(buildParameter);
CloudRunner.buildParameters.githubCheckId = await GitHub.createGitHubCheck(`direct create`); afterEach(() => {
await GitHub.updateGitHubCheck(`1 ${new Date().toISOString()}`, `direct`); jest.restoreAllMocks();
await GitHub.updateGitHubCheck(`2 ${new Date().toISOString()}`, `direct`, `success`, `completed`); });
},
TIMEOUT_INFINITE, it(
); 'Check Handling Direct',
it( async () => {
'Check Handling Via Async Workflow', // Setup parameters
async () => { const buildParameter = await createParameters({
// Setup parameters versioning: 'None',
const buildParameter = await CreateParameters({ projectPath: 'test-project',
versioning: 'None', unityVersion: UnityVersioning.read('test-project'),
projectPath: 'test-project', asyncCloudRunner: `true`,
unityVersion: UnityVersioning.read('test-project'), githubChecks: `true`,
asyncCloudRunner: `true`, });
githubChecks: `true`, await CloudRunner.setup(buildParameter);
}); CloudRunner.buildParameters.githubCheckId = await GitHub.createGitHubCheck(`direct create`);
GitHub.forceAsyncTest = true; await GitHub.updateGitHubCheck(`1 ${new Date().toISOString()}`, `direct`);
await CloudRunner.setup(buildParameter); await GitHub.updateGitHubCheck(`2 ${new Date().toISOString()}`, `direct`, `success`, `completed`);
CloudRunner.buildParameters.githubCheckId = await GitHub.createGitHubCheck(`async create`); },
await GitHub.updateGitHubCheck(`1 ${new Date().toISOString()}`, `async`); TIMEOUT_INFINITE,
await GitHub.updateGitHubCheck(`2 ${new Date().toISOString()}`, `async`, `success`, `completed`); );
GitHub.forceAsyncTest = false; it(
}, 'Check Handling Via Async Workflow',
TIMEOUT_INFINITE, async () => {
); // Setup parameters
} const buildParameter = await createParameters({
versioning: 'None',
projectPath: 'test-project',
unityVersion: UnityVersioning.read('test-project'),
asyncCloudRunner: `true`,
githubChecks: `true`,
});
GitHub.forceAsyncTest = true;
await CloudRunner.setup(buildParameter);
CloudRunner.buildParameters.githubCheckId = await GitHub.createGitHubCheck(`async create`);
await GitHub.updateGitHubCheck(`1 ${new Date().toISOString()}`, `async`);
await GitHub.updateGitHubCheck(`2 ${new Date().toISOString()}`, `async`, `success`, `completed`);
GitHub.forceAsyncTest = false;
},
TIMEOUT_INFINITE,
);
}); });

View File

@ -0,0 +1,11 @@
import { BuildParameters } from '../model';
import { Cli } from '../model/cli/cli';
import { OptionValues } from 'commander';
export const TIMEOUT_INFINITE = 1e9;
export async function createParameters(overrides?: OptionValues) {
if (overrides) Cli.options = overrides;
return BuildParameters.create();
}