mirror of
https://github.com/game-ci/unity-builder.git
synced 2026-06-11 08:23:56 -07:00
b774d7fef1
The test mock was missing gitAuthMode, causing useHeaderAuth to default to true and strip the token from repo URLs. Adding gitAuthMode: 'url' restores the expected URL-mode behavior. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
163 lines
5.5 KiB
TypeScript
163 lines
5.5 KiB
TypeScript
import { OrchestratorFolders } from './orchestrator-folders';
|
|
|
|
// Mock Orchestrator
|
|
jest.mock('../orchestrator', () => ({
|
|
__esModule: true,
|
|
default: {
|
|
buildParameters: {
|
|
buildGuid: 'test-guid-abc',
|
|
cacheKey: 'my-cache-key',
|
|
projectPath: 'test-project',
|
|
buildPath: 'Builds',
|
|
maxRetainedWorkspaces: 0,
|
|
gitPrivateToken: 'ghp_test123',
|
|
gitAuthMode: 'url',
|
|
orchestratorRepoName: 'game-ci/unity-builder',
|
|
githubRepo: 'user/my-game',
|
|
},
|
|
lockedWorkspace: '',
|
|
},
|
|
}));
|
|
|
|
jest.mock('../../build-parameters', () => ({
|
|
__esModule: true,
|
|
default: {
|
|
shouldUseRetainedWorkspaceMode: jest.fn().mockReturnValue(false),
|
|
},
|
|
}));
|
|
|
|
jest.mock('./orchestrator-options', () => ({
|
|
__esModule: true,
|
|
default: {
|
|
useSharedBuilder: false,
|
|
},
|
|
}));
|
|
|
|
// Normalize paths for cross-platform test compatibility
|
|
const normalize = (p: string) => p.replace(/\\/g, '/');
|
|
|
|
describe('OrchestratorFolders', () => {
|
|
describe('static constants', () => {
|
|
it('repositoryFolder is "repo"', () => {
|
|
expect(OrchestratorFolders.repositoryFolder).toBe('repo');
|
|
});
|
|
|
|
it('buildVolumeFolder is "data"', () => {
|
|
expect(OrchestratorFolders.buildVolumeFolder).toBe('data');
|
|
});
|
|
|
|
it('cacheFolder is "cache"', () => {
|
|
expect(OrchestratorFolders.cacheFolder).toBe('cache');
|
|
});
|
|
});
|
|
|
|
describe('ToLinuxFolder', () => {
|
|
it('converts backslashes to forward slashes', () => {
|
|
expect(OrchestratorFolders.ToLinuxFolder('C:\\Users\\test\\project')).toBe('C:/Users/test/project');
|
|
});
|
|
|
|
it('preserves forward slashes', () => {
|
|
expect(OrchestratorFolders.ToLinuxFolder('/home/user/project')).toBe('/home/user/project');
|
|
});
|
|
|
|
it('handles mixed slashes', () => {
|
|
expect(OrchestratorFolders.ToLinuxFolder('some/path\\mixed/slashes\\here')).toBe('some/path/mixed/slashes/here');
|
|
});
|
|
|
|
it('handles empty string', () => {
|
|
expect(OrchestratorFolders.ToLinuxFolder('')).toBe('');
|
|
});
|
|
});
|
|
|
|
describe('path computations (non-retained workspace mode)', () => {
|
|
it('uniqueOrchestratorJobFolderAbsolute uses buildGuid', () => {
|
|
const result = normalize(OrchestratorFolders.uniqueOrchestratorJobFolderAbsolute);
|
|
expect(result).toBe('/data/test-guid-abc');
|
|
});
|
|
|
|
it('cacheFolderForAllFull returns /data/cache', () => {
|
|
const result = normalize(OrchestratorFolders.cacheFolderForAllFull);
|
|
expect(result).toBe('/data/cache');
|
|
});
|
|
|
|
it('cacheFolderForCacheKeyFull includes cache key', () => {
|
|
const result = normalize(OrchestratorFolders.cacheFolderForCacheKeyFull);
|
|
expect(result).toBe('/data/cache/my-cache-key');
|
|
});
|
|
|
|
it('repoPathAbsolute is under job folder', () => {
|
|
const result = normalize(OrchestratorFolders.repoPathAbsolute);
|
|
expect(result).toBe('/data/test-guid-abc/repo');
|
|
});
|
|
|
|
it('projectPathAbsolute includes project path', () => {
|
|
const result = normalize(OrchestratorFolders.projectPathAbsolute);
|
|
expect(result).toBe('/data/test-guid-abc/repo/test-project');
|
|
});
|
|
|
|
it('libraryFolderAbsolute is under project path', () => {
|
|
const result = normalize(OrchestratorFolders.libraryFolderAbsolute);
|
|
expect(result).toBe('/data/test-guid-abc/repo/test-project/Library');
|
|
});
|
|
|
|
it('projectBuildFolderAbsolute uses buildPath', () => {
|
|
const result = normalize(OrchestratorFolders.projectBuildFolderAbsolute);
|
|
expect(result).toBe('/data/test-guid-abc/repo/Builds');
|
|
});
|
|
|
|
it('lfsFolderAbsolute is under .git/lfs', () => {
|
|
const result = normalize(OrchestratorFolders.lfsFolderAbsolute);
|
|
expect(result).toBe('/data/test-guid-abc/repo/.git/lfs');
|
|
});
|
|
|
|
it('lfsCacheFolderFull is under cache key', () => {
|
|
const result = normalize(OrchestratorFolders.lfsCacheFolderFull);
|
|
expect(result).toBe('/data/cache/my-cache-key/lfs');
|
|
});
|
|
|
|
it('libraryCacheFolderFull is under cache key', () => {
|
|
const result = normalize(OrchestratorFolders.libraryCacheFolderFull);
|
|
expect(result).toBe('/data/cache/my-cache-key/Library');
|
|
});
|
|
});
|
|
|
|
describe('builderPathAbsolute', () => {
|
|
it('uses job folder when shared builder is disabled', () => {
|
|
const result = normalize(OrchestratorFolders.builderPathAbsolute);
|
|
expect(result).toBe('/data/test-guid-abc/builder');
|
|
});
|
|
});
|
|
|
|
describe('repo URLs', () => {
|
|
it('unityBuilderRepoUrl includes token and repo name', () => {
|
|
const url = OrchestratorFolders.unityBuilderRepoUrl;
|
|
expect(url).toBe('https://ghp_test123@github.com/game-ci/unity-builder.git');
|
|
});
|
|
|
|
it('targetBuildRepoUrl includes token and github repo', () => {
|
|
const url = OrchestratorFolders.targetBuildRepoUrl;
|
|
expect(url).toBe('https://ghp_test123@github.com/user/my-game.git');
|
|
});
|
|
});
|
|
|
|
describe('purgeRemoteCaching', () => {
|
|
it('returns false when env var is not set', () => {
|
|
const original = process.env.PURGE_REMOTE_BUILDER_CACHE;
|
|
delete process.env.PURGE_REMOTE_BUILDER_CACHE;
|
|
expect(OrchestratorFolders.purgeRemoteCaching).toBe(false);
|
|
if (original !== undefined) process.env.PURGE_REMOTE_BUILDER_CACHE = original;
|
|
});
|
|
|
|
it('returns true when env var is set', () => {
|
|
const original = process.env.PURGE_REMOTE_BUILDER_CACHE;
|
|
process.env.PURGE_REMOTE_BUILDER_CACHE = 'true';
|
|
expect(OrchestratorFolders.purgeRemoteCaching).toBe(true);
|
|
if (original !== undefined) {
|
|
process.env.PURGE_REMOTE_BUILDER_CACHE = original;
|
|
} else {
|
|
delete process.env.PURGE_REMOTE_BUILDER_CACHE;
|
|
}
|
|
});
|
|
});
|
|
});
|