UNPKG

@coveo/semantic-monorepo-tools

Version:

A library of helper functions to do SemVer2 compliant releases from Conventional Commits in monorepos

122 lines (109 loc) 3.37 kB
import type { Readable } from "node:stream"; import { spawn, ChildProcess } from "node:child_process"; import { EventEmitter } from "node:events"; import bump from "../doPnpmBumpVersion.js"; jest.mock("node:child_process"); const mockedSpawn = jest.mocked(spawn); describe("doPnpmBumpVersion", () => { const doMockSpawnWithStdout = (mockedStdout?: string) => { mockedSpawn.mockImplementationOnce(() => { const cpEventEmitter: ChildProcess = new EventEmitter() as ChildProcess; const stdoutEventEmitter = new EventEmitter(); const stderrEventEmitter = new EventEmitter(); cpEventEmitter.stdout = stdoutEventEmitter as Readable; cpEventEmitter.stderr = stderrEventEmitter as Readable; setTimeout(() => { if (mockedStdout) { stdoutEventEmitter.emit("data", mockedStdout); } cpEventEmitter.emit("close", 0); }, 0); return cpEventEmitter; }); }; const doMockDummySpawn = () => { mockedSpawn.mockImplementation(() => { const cpEventEmitter: ChildProcess = new EventEmitter() as ChildProcess; const stdoutEventEmitter = new EventEmitter(); const stderrEventEmitter = new EventEmitter(); cpEventEmitter.stdout = stdoutEventEmitter as Readable; cpEventEmitter.stderr = stderrEventEmitter as Readable; setTimeout(() => { cpEventEmitter.emit("close", 0); }, 0); return cpEventEmitter; }); }; beforeEach(() => { jest.resetAllMocks(); doMockDummySpawn(); doMockSpawnWithStdout("7.0.0"); }); it("bumps the version recursively", async () => { await bump("v1.0.0", "v0.0.0"); expect(mockedSpawn).toHaveBeenCalledWith( "pnpm", [ "--recursive", '--filter="...[v0.0.0]"', "exec", "pnpm version v1.0.0 --no-git-tag-version", ], { shell: true }, ); }); it("filters in the forced packages", async () => { await bump("v1.0.0", "v0.0.0", ["@org/package-a", "@org/package-b"]); expect(mockedSpawn).toHaveBeenCalledWith( "pnpm", [ "--recursive", '--filter="...[v0.0.0]"', '--filter="@org/package-a"', '--filter="@org/package-b"', "exec", "pnpm version v1.0.0 --no-git-tag-version", ], { shell: true }, ); }); it("filters out the excluded packages", async () => { await bump("v1.0.0", "v0.0.0", [], ["@org/package-a", "@org/package-b"]); expect(mockedSpawn).toHaveBeenCalledWith( "pnpm", [ "--recursive", '--filter="...[v0.0.0]"', '--filter="!@org/package-a"', '--filter="!@org/package-b"', "exec", "pnpm version v1.0.0 --no-git-tag-version", ], { shell: true }, ); }); it("combines all the options", async () => { await bump( "v1.0.0", "v1.0.0-rc.1", ["package-a", "package-b"], ["package-c", "package-d"], ); expect(mockedSpawn).toHaveBeenCalledWith( "pnpm", [ "--recursive", '--filter="...[v1.0.0-rc.1]"', // include '--filter="package-a"', '--filter="package-b"', // exclude '--filter="!package-c"', '--filter="!package-d"', "exec", "pnpm version v1.0.0 --no-git-tag-version", ], { shell: true }, ); }); });