import { mock } from 'jest-mock-extended'; import { simpleGit } from 'simple-git'; import type { SimpleGit } from 'simple-git'; import type { User } from '@/databases/entities/user'; import { SourceControlGitService } from '../source-control-git.service.ee'; import type { SourceControlPreferences } from '../types/source-control-preferences'; const MOCK_BRANCHES = { all: ['origin/master', 'origin/feature/branch'], branches: { 'origin/master': {}, 'origin/feature/branch': {}, }, current: 'master', }; jest.mock('simple-git', () => { return { simpleGit: jest.fn().mockImplementation(() => ({ branch: jest.fn().mockResolvedValue(MOCK_BRANCHES), })), }; }); describe('SourceControlGitService', () => { const sourceControlGitService = new SourceControlGitService(mock(), mock(), mock()); beforeAll(() => { sourceControlGitService.git = simpleGit(); }); describe('getBranches', () => { it('should support branch names containing slashes', async () => { const branches = await sourceControlGitService.getBranches(); expect(branches.branches).toEqual(['master', 'feature/branch']); }); }); describe('initRepository', () => { describe('when local repo is set up after remote is ready', () => { it('should track remote', async () => { /** * Arrange */ const gitService = new SourceControlGitService(mock(), mock(), mock()); const prefs = mock({ branchName: 'main' }); const user = mock(); const git = mock(); const checkoutSpy = jest.spyOn(git, 'checkout'); const branchSpy = jest.spyOn(git, 'branch'); gitService.git = git; jest.spyOn(gitService, 'setGitSshCommand').mockResolvedValue(); jest .spyOn(gitService, 'getBranches') .mockResolvedValue({ currentBranch: '', branches: ['main'] }); /** * Act */ await gitService.initRepository(prefs, user); /** * Assert */ expect(checkoutSpy).toHaveBeenCalledWith('main'); expect(branchSpy).toHaveBeenCalledWith(['--set-upstream-to=origin/main', 'main']); }); }); }); });