79 lines
2.1 KiB
TypeScript
79 lines
2.1 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import type { GitRemoteStatus, ModifiedFile } from '../types'
|
|
import { autoGitWorkSignature, hasAutoGitWork } from './autoGitWork'
|
|
|
|
function modifiedFile(relativePath: string, vaultPath = '/vault'): ModifiedFile {
|
|
return {
|
|
path: `${vaultPath}/${relativePath}`,
|
|
relativePath,
|
|
status: 'modified',
|
|
vaultPath,
|
|
}
|
|
}
|
|
|
|
function remoteStatus(ahead: number): GitRemoteStatus {
|
|
return {
|
|
ahead,
|
|
behind: 0,
|
|
branch: 'main',
|
|
hasRemote: true,
|
|
}
|
|
}
|
|
|
|
function noRemoteStatus(): GitRemoteStatus {
|
|
return {
|
|
ahead: 3,
|
|
behind: 0,
|
|
branch: 'main',
|
|
hasRemote: false,
|
|
}
|
|
}
|
|
|
|
describe('autoGitWork', () => {
|
|
it('detects dirty files in a single vault', () => {
|
|
const input = {
|
|
activeVaultPath: '/vault',
|
|
modifiedFiles: [modifiedFile('note.md')],
|
|
repositoryPaths: ['/vault'],
|
|
remoteStatusForRepository: () => null,
|
|
}
|
|
|
|
expect(hasAutoGitWork(input)).toBe(true)
|
|
expect(autoGitWorkSignature(input)).toBe('/vault:note.md:modified')
|
|
})
|
|
|
|
it('detects push-only work in every active repository', () => {
|
|
const statuses = new Map([
|
|
['/personal', remoteStatus(1)],
|
|
['/team', remoteStatus(2)],
|
|
])
|
|
|
|
expect(autoGitWorkSignature({
|
|
activeVaultPath: '/personal',
|
|
modifiedFiles: [],
|
|
repositoryPaths: ['/personal', '/team'],
|
|
remoteStatusForRepository: (path) => statuses.get(path) ?? null,
|
|
})).toBe('/personal:1|/team:2')
|
|
})
|
|
|
|
it('ignores repositories without pushable remote commits', () => {
|
|
expect(hasAutoGitWork({
|
|
activeRemoteStatus: noRemoteStatus(),
|
|
activeVaultPath: '/plain',
|
|
modifiedFiles: [],
|
|
repositoryPaths: ['/plain'],
|
|
remoteStatusForRepository: () => noRemoteStatus(),
|
|
})).toBe(false)
|
|
})
|
|
|
|
it('uses the active sync status when repository status has not been loaded yet', () => {
|
|
expect(autoGitWorkSignature({
|
|
activeRemoteStatus: remoteStatus(4),
|
|
activeVaultPath: '/vault',
|
|
modifiedFiles: [],
|
|
repositoryPaths: [],
|
|
remoteStatusForRepository: () => null,
|
|
})).toBe('/vault:4')
|
|
})
|
|
})
|