UNPKG

@aaronshaf/ger

Version:

Gerrit CLI and SDK - A modern CLI tool and TypeScript SDK for Gerrit Code Review, built with Effect-TS

172 lines (151 loc) 4.52 kB
import { describe, expect, it } from 'bun:test' import type { FileDiffContent } from '@/schemas/gerrit' import { extractDiffContext } from '@/utils/diff-context' describe('extractDiffContext', () => { it('should extract context around a simple line', () => { const diff: FileDiffContent = { content: [ { ab: ['line 1', 'line 2', 'line 3', 'line 4', 'line 5'], }, ], } const context = extractDiffContext(diff, 3, 2) expect(context.before).toEqual(['line 1', 'line 2']) expect(context.line).toBe('line 3') expect(context.after).toEqual(['line 4', 'line 5']) }) it('should handle added lines correctly', () => { const diff: FileDiffContent = { content: [ { ab: ['line 1', 'line 2'], }, { b: ['added 1', 'added 2', 'added 3'], }, { ab: ['line 3', 'line 4'], }, ], } // Target line 4 (added 2) const context = extractDiffContext(diff, 4, 1) expect(context.before).toEqual(['added 1']) expect(context.line).toBe('added 2') expect(context.after).toEqual(['added 3']) }) it('should handle removed lines correctly (they dont affect new line numbers)', () => { const diff: FileDiffContent = { content: [ { ab: ['line 1', 'line 2'], }, { a: ['removed 1', 'removed 2'], // These don't count in new file }, { ab: ['line 3', 'line 4'], }, ], } // Line 3 in new file is 'line 3' (removed lines don't count) const context = extractDiffContext(diff, 3, 1) expect(context.before).toEqual(['line 2']) expect(context.line).toBe('line 3') expect(context.after).toEqual(['line 4']) }) it('should handle skip sections correctly', () => { const diff: FileDiffContent = { content: [ { ab: ['line 1', 'line 2'], }, { skip: 100, // Lines 3-102 are skipped }, { ab: ['line 103', 'line 104'], }, ], } // Line in skipped section - should return empty context const context1 = extractDiffContext(diff, 50, 2) expect(context1.before).toEqual([]) expect(context1.line).toBeUndefined() expect(context1.after).toEqual([]) // Line after skip const context2 = extractDiffContext(diff, 103, 1) expect(context2.line).toBe('line 103') expect(context2.after).toEqual(['line 104']) }) it('should handle edge cases at file boundaries', () => { const diff: FileDiffContent = { content: [ { ab: ['line 1', 'line 2', 'line 3'], }, ], } // First line const context1 = extractDiffContext(diff, 1, 2) expect(context1.before).toEqual([]) expect(context1.line).toBe('line 1') expect(context1.after).toEqual(['line 2', 'line 3']) // Last line const context2 = extractDiffContext(diff, 3, 2) expect(context2.before).toEqual(['line 1', 'line 2']) expect(context2.line).toBe('line 3') expect(context2.after).toEqual([]) }) it('should return empty context for non-existent lines', () => { const diff: FileDiffContent = { content: [ { ab: ['line 1', 'line 2'], }, ], } const context = extractDiffContext(diff, 999, 2) expect(context.before).toEqual([]) expect(context.line).toBeUndefined() expect(context.after).toEqual([]) }) it('should handle complex mixed diff sections', () => { const diff: FileDiffContent = { content: [ { ab: ['unchanged 1'], // Line 1 }, { a: ['old only'], // Not in new file }, { b: ['new only'], // Line 2 }, { ab: ['unchanged 2'], // Line 3 }, { skip: 10, // Lines 4-13 skipped }, { ab: ['unchanged 3'], // Line 14 }, { b: ['added at end'], // Line 15 }, ], } // Test line 2 (new only) const context1 = extractDiffContext(diff, 2, 1) expect(context1.before).toEqual(['unchanged 1']) expect(context1.line).toBe('new only') expect(context1.after).toEqual(['unchanged 2']) // Test line 15 (added at end) const context2 = extractDiffContext(diff, 15, 1) expect(context2.before).toEqual(['unchanged 3']) expect(context2.line).toBe('added at end') expect(context2.after).toEqual([]) }) })