| | import { mkdtempSync, rmSync } from 'fs' |
| | import { writeJSONSync, readJSONSync } from 'fs-extra' |
| | import { join } from 'path' |
| | import { tmpdir } from 'os' |
| | import execa from 'execa' |
| |
|
| | describe('merge-errors-json driver', () => { |
| | it('should correctly merge errors.json files with conflicting new entries', async () => { |
| | const base = { |
| | '1': 'Original message 1', |
| | '2': 'Original message 2', |
| | } |
| | const current = { |
| | ...base, |
| | '3': 'From a conflicting branch that was merged first 1', |
| | '4': 'From a conflicting branch that was merged first 2', |
| | } |
| | const rebased = await simulateRebase({ |
| | base, |
| | current, |
| | incoming: { |
| | ...base, |
| | '3': 'From our branch 1', |
| | '4': 'From our branch 2', |
| | }, |
| | }) |
| | expect(rebased).toEqual({ |
| | ...current, |
| | '5': 'From our branch 1', |
| | '6': 'From our branch 2', |
| | }) |
| | }) |
| |
|
| | it('should handle empty base file', async () => { |
| | const base = {} |
| | const current = { |
| | '1': 'Message from a conflicting branch that was merged first', |
| | } |
| | const rebased = await simulateRebase({ |
| | base, |
| | current, |
| | incoming: { '1': 'New message from our branch' }, |
| | }) |
| | expect(rebased).toEqual({ |
| | ...current, |
| | '2': 'New message from our branch', |
| | }) |
| | }) |
| |
|
| | it('should handle stacked PRs', async () => { |
| | const base = { |
| | '1': 'Original message 1', |
| | '2': 'Original message 2', |
| | } |
| | const current = { |
| | ...base, |
| | '3': 'Message from a conflicting branch that was merged first', |
| | } |
| | const ourBranch1 = { |
| | ...base, |
| | '3': 'New message from our-branch-1', |
| | } |
| | const ourBranch2 = { |
| | ...ourBranch1, |
| | '4': 'New message from our-branch-2', |
| | } |
| |
|
| | const branch1Rebased = await simulateRebase({ |
| | base: base, |
| | current: current, |
| | incoming: ourBranch1, |
| | }) |
| | expect(branch1Rebased).toEqual({ |
| | ...current, |
| | '4': 'New message from our-branch-1', |
| | }) |
| |
|
| | const branch2Rebased = await simulateRebase({ |
| | base: ourBranch1, |
| | current: branch1Rebased, |
| | incoming: ourBranch2, |
| | }) |
| | expect(branch2Rebased).toEqual({ |
| | ...branch1Rebased, |
| | '5': 'New message from our-branch-2', |
| | }) |
| | }) |
| | }) |
| |
|
| | type Contents = Record<string, string> |
| |
|
| | async function simulateRebase({ |
| | base, |
| | current, |
| | incoming, |
| | }: { |
| | base: Contents |
| | current: Contents |
| | incoming: Contents |
| | }) { |
| | const tempDir = mkdtempSync(join(tmpdir(), 'merge-driver-test-')) |
| |
|
| | const paths = { |
| | base: join(tempDir, 'base.json'), |
| | current: join(tempDir, 'current.json'), |
| | other: join(tempDir, 'other.json'), |
| | } |
| |
|
| | writeJSONSync(paths.base, base, { spaces: 2 }) |
| | |
| | writeJSONSync(paths.current, current, { spaces: 2 }) |
| | writeJSONSync(paths.other, incoming, { spaces: 2 }) |
| |
|
| | await execa('node', [ |
| | 'scripts/merge-errors-json/merge.mjs', |
| | paths.current, |
| | paths.base, |
| | paths.other, |
| | ]) |
| |
|
| | const result = readJSONSync(paths.current) |
| | rmSync(tempDir, { recursive: true, force: true }) |
| | return result |
| | } |
| |
|