From b03f0aea5bb2fe3a9ae95ece3263b17aaa98096a Mon Sep 17 00:00:00 2001 From: "Xunnamius (Romulus)" Date: Sun, 3 Apr 2022 20:39:40 -0700 Subject: [PATCH] test: ensure all "package/X" scope derivation rules are more thoroughly tested --- test/integration-client.test.ts | 80 ++++++++++++++++++++ test/unit-index.test.ts | 128 +++++++++++++++++++++++++++++--- 2 files changed, 197 insertions(+), 11 deletions(-) diff --git a/test/integration-client.test.ts b/test/integration-client.test.ts index d09c433..0babf65 100644 --- a/test/integration-client.test.ts +++ b/test/integration-client.test.ts @@ -845,6 +845,86 @@ it('both staged and non-staged paths are added and committed properly', async () }); }); +it('"packages/package-name/..." paths are committed with commit scope "packages/package-name" when using --scope-root', async () => { + expect.hasAssertions(); + + await withMockedFixture(async ({ root, git }) => { + if (!git) throw new Error('must use git-repository fixture'); + + await run( + 'mkdir', + [ + '-p', + 'packages/pkg-1', + 'packages/pkg-2/script-a', + 'packages/pkg-3/script-b', + 'packages/pkg-4/script-c', + 'packages/pkg-5/script-d' + ], + { cwd: root, reject: true } + ); + + await run( + 'touch', + [ + 'packages/pkg-1/script.js', + 'packages/pkg-2/script-a/script.js', + 'packages/pkg-3/script-b/script.js', + 'packages/pkg-4/script-c/script.js', + 'packages/pkg-5/script-d/script1.js', + 'packages/pkg-5/script-d/script2.js' + ], + { cwd: root, reject: true } + ); + + await run(CLI_BIN_PATH, ['::pkg-1', 'fix', '---', 'super complex add 1'], { + cwd: root, + reject: true + }); + + let commit = await git.show(); + expect(commit).toInclude('fix(packages/pkg-1): super complex add 1'); + expect(commit).toInclude('a/packages/pkg-1/script.js'); + + await run( + CLI_BIN_PATH, + ['packages/pkg-2/script-a/script.js', 'fix', '---', 'super complex add 2'], + { + cwd: root, + reject: true + } + ); + + commit = await git.show(); + expect(commit).toInclude('fix(packages/pkg-2): super complex add 2'); + expect(commit).toInclude('a/packages/pkg-2/script-a/script.js'); + + await run( + CLI_BIN_PATH, + ['packages/pkg-3', '::pkg-4', 'fix', '---', 'super complex add 3'], + { + cwd: root, + reject: true + } + ); + + commit = await git.show(); + expect(commit).toInclude('fix(packages/pkg-3): super complex add 3'); + expect(commit).toInclude('a/packages/pkg-3/script-b/script.js'); + expect(commit).toInclude('a/packages/pkg-4/script-c/script.js'); + + await run(CLI_BIN_PATH, ['::pkg-5', 'refactor', '---', 'super complex add 4'], { + cwd: root, + reject: true + }); + + commit = await git.show(); + expect(commit).toInclude('refactor(packages/pkg-5): super complex add 4'); + expect(commit).toInclude('a/packages/pkg-5/script-d/script1.js'); + expect(commit).toInclude('a/packages/pkg-5/script-d/script2.js'); + }); +}); + it('"external*/..." paths are committed with commit scope "externals" when using --scope-root', async () => { expect.hasAssertions(); diff --git a/test/unit-index.test.ts b/test/unit-index.test.ts index ece1981..dc615ad 100644 --- a/test/unit-index.test.ts +++ b/test/unit-index.test.ts @@ -238,19 +238,33 @@ describe('::configureProgram', () => { }); }); - it('colon works as monorepo pathspec shortcut', async () => { + it('double-colon works as monorepo pseudo-pathspec path shortcut', async () => { expect.hasAssertions(); - mockedFullname.mockImplementationOnce(() => Promise.reject('#1')); - mockedFullname.mockReturnValueOnce( - Promise.resolve({ ambiguous: false, file: 'packages/pkg-1/src/file.js' }) - ); + mockedGetGitRepoRoot.mockImplementation(() => Promise.resolve('/repo-root')); await withMocks(async () => { + mockedFullname.mockImplementationOnce(() => Promise.reject('#1')); + mockedFullname.mockReturnValueOnce( + Promise.resolve({ ambiguous: false, file: 'packages/pkg-1/src/file.js' }) + ); + + await expect(runProgram(['::', 'type', '--', 'message 0'])).resolves.toBeDefined(); + + expect(mockedFullname).toBeCalledWith('/repo-root/packages/'); + expect(mockedMakeCommit).toBeCalledWith('type(file.js): message 0', true, false); + + mockedFullname.mockImplementationOnce(() => Promise.reject('#1')); + mockedFullname.mockReturnValueOnce( + Promise.resolve({ ambiguous: false, file: 'packages/pkg-1/src/file.js' }) + ); + await expect( - runProgram(['::pkg-1', 'type', '--', 'message']) + runProgram(['::pkg-1', 'type', '--', 'message 1']) ).resolves.toBeDefined(); - expect(mockedMakeCommit).toBeCalledWith('type(file.js): message', true, false); + + expect(mockedFullname).toBeCalledWith('/repo-root/packages/pkg-1'); + expect(mockedMakeCommit).toBeCalledWith('type(file.js): message 1', true, false); mockedFullname.mockImplementationOnce(() => Promise.reject('#2')); mockedFullname.mockReturnValueOnce( @@ -258,10 +272,12 @@ describe('::configureProgram', () => { ); await expect( - runProgram(['::pkg-1/src/index.ts', 'type', '---', 'message']) + runProgram(['::pkg-1/src/index.ts', 'type', '---', 'message 2']) ).resolves.toBeDefined(); + + expect(mockedFullname).toBeCalledWith('/repo-root/packages/pkg-1/src/index.ts'); expect(mockedMakeCommit).toBeCalledWith( - 'type(packages/pkg-1): message', + 'type(packages/pkg-1): message 2', true, false ); @@ -272,10 +288,100 @@ describe('::configureProgram', () => { ); await expect( - runProgram(['packages/pkg-1/src/index.ts', 'type', '---', 'message']) + runProgram(['packages/pkg-1/src/index.ts', 'type', '---', 'message 3']) + ).resolves.toBeDefined(); + + expect(mockedFullname).toBeCalledWith('/repo-root/packages/pkg-1/src/index.ts'); + expect(mockedMakeCommit).toBeCalledWith( + 'type(packages/pkg-1): message 3', + true, + false + ); + }); + }); + + it('"packages/package-name/..." paths are committed with commit scope "packages/package-name" when using --scope-root', async () => { + expect.hasAssertions(); + + await withMocks(async () => { + mockedFullname.mockImplementationOnce(() => Promise.reject('#1')); + mockedFullname.mockReturnValueOnce( + Promise.resolve({ ambiguous: false, file: 'packages/pkg-1/script.ts' }) + ); + + await expect( + runProgram(['packages/pkg-1/script.ts', 'type', '---', 'message 1']) + ).resolves.toBeDefined(); + expect(mockedMakeCommit).toBeCalledWith( + 'type(packages/pkg-1): message 1', + true, + false + ); + + mockedFullname.mockImplementationOnce(() => Promise.reject('#1')); + mockedFullname.mockReturnValueOnce( + Promise.resolve({ ambiguous: false, file: 'packages/pkg-1/script-a/index.ts' }) + ); + + await expect( + runProgram(['../../packages/pkg-1/script-a/index.ts', 'type', '---', 'message 2']) + ).resolves.toBeDefined(); + expect(mockedMakeCommit).toBeCalledWith( + 'type(packages/pkg-1): message 2', + true, + false + ); + }); + }); + + it('ambiguous "packages/package-name/..." paths are committed with proper commit scope when using --scope-root', async () => { + expect.hasAssertions(); + + mockedGetGitRepoRoot.mockImplementation(() => Promise.resolve('/repo-root')); + + await withMocks(async () => { + mockedCommonAncestor.mockReturnValueOnce('packages'); + mockedFullname.mockImplementationOnce(() => Promise.reject('#1')); + mockedFullname.mockReturnValueOnce( + Promise.resolve({ + ambiguous: true, + files: ['packages/pkg-1/script.ts', 'packages/pkg-2/script.ts'] + }) + ); + + await expect( + runProgram(['packages/**/*', 'type', '---', 'message 1']) + ).resolves.toBeDefined(); + expect(mockedMakeCommit).toBeCalledWith('type(packages): message 1', true, false); + + mockedCommonAncestor.mockReturnValueOnce('packages'); + mockedFullname.mockImplementationOnce(() => Promise.reject('#1')); + mockedFullname.mockReturnValueOnce( + Promise.resolve({ + ambiguous: true, + files: ['packages/pkg-1/script-a/index.ts', 'packages/pkg-2/script-b/index.ts'] + }) + ); + + await expect( + runProgram(['../../packages', 'type', '---', 'message 2']) + ).resolves.toBeDefined(); + expect(mockedMakeCommit).toBeCalledWith('type(packages): message 2', true, false); + + mockedCommonAncestor.mockReturnValueOnce('packages/pkg-1'); + mockedFullname.mockImplementationOnce(() => Promise.reject('#1')); + mockedFullname.mockReturnValueOnce( + Promise.resolve({ + ambiguous: true, + files: ['packages/pkg-1/script-a/index.ts', 'packages/pkg-1/script-b/index.ts'] + }) + ); + + await expect( + runProgram(['::pkg-1', 'type', '---', 'message 3']) ).resolves.toBeDefined(); expect(mockedMakeCommit).toBeCalledWith( - 'type(packages/pkg-1): message', + 'type(packages/pkg-1): message 3', true, false );