Refactor to fs-fixture (#622)

This commit is contained in:
Bjorn Lu
2026-05-18 10:03:43 +00:00
committed by GitHub
parent 87481d361e
commit f1222b6286
12 changed files with 76 additions and 260 deletions
+68 -25
View File
@@ -1,8 +1,7 @@
import fs from "node:fs/promises";
import path from "node:path";
import type { Changeset } from "@changesets/types";
import writeChangeset from "@changesets/write";
import fixturez from "fixturez";
import { createFixture } from "fs-fixture";
import { beforeEach, describe, expect, it, vi } from "vitest";
import { Git } from "./git.ts";
import { setupOctokit } from "./octokit.ts";
@@ -36,14 +35,58 @@ let mockedGithubMethods = {
};
let mockedGraphql = vi.fn();
let f = fixturez(import.meta.dirname);
const nodeModulesDir = path.join(import.meta.dirname, "..", "node_modules");
function createSimpleProjectFixture() {
return createFixture({
node_modules: (api) => api.symlink(nodeModulesDir),
".changeset/config.json": JSON.stringify({}),
"packages/pkg-a/package.json": JSON.stringify({
name: "changesets-dev-simple-project-pkg-a",
version: "1.0.0",
dependencies: {
"changesets-dev-simple-project-pkg-b": "1.0.0",
},
}),
"packages/pkg-b/package.json": JSON.stringify({
name: "changesets-dev-simple-project-pkg-b",
version: "1.0.0",
}),
"package.json": JSON.stringify({
name: "simple-project",
version: "1.0.0",
private: true,
workspaces: ["packages/*"],
}),
});
}
function createIgnoredPackageFixture() {
return createFixture({
node_modules: (api) => api.symlink(nodeModulesDir),
".changeset/config.json": JSON.stringify({
ignore: ["changesets-dev-ignored-package-pkg-a"],
}),
"packages/pkg-a/package.json": JSON.stringify({
name: "changesets-dev-ignored-package-pkg-a",
version: "1.0.0",
dependencies: {
"changesets-dev-ignored-package-pkg-b": "1.0.0",
},
}),
"packages/pkg-b/package.json": JSON.stringify({
name: "changesets-dev-ignored-package-pkg-b",
version: "1.0.0",
}),
"package.json": JSON.stringify({
name: "ignored-package",
version: "1.0.0",
private: true,
workspaces: ["packages/*"],
}),
});
}
const linkNodeModules = async (cwd: string) => {
await fs.symlink(
path.join(import.meta.dirname, "..", "node_modules"),
path.join(cwd, "node_modules"),
);
};
const writeChangesets = (changesets: Changeset[], cwd: string) => {
return Promise.all(changesets.map((commit) => writeChangeset(commit, cwd)));
};
@@ -54,8 +97,8 @@ beforeEach(() => {
describe("version", () => {
it("creates simple PR", async () => {
let cwd = f.copy("simple-project");
await linkNodeModules(cwd);
await using fixture = await createSimpleProjectFixture();
const cwd = fixture.path;
mockedGithubMethods.pulls.list.mockImplementationOnce(() => ({ data: [] }));
@@ -93,8 +136,8 @@ describe("version", () => {
});
it('creates a draft PR when prDraft is "create"', async () => {
let cwd = f.copy("simple-project");
await linkNodeModules(cwd);
await using fixture = await createSimpleProjectFixture();
const cwd = fixture.path;
mockedGithubMethods.pulls.list.mockImplementationOnce(() => ({ data: [] }));
@@ -129,8 +172,8 @@ describe("version", () => {
});
it("only includes bumped packages in the PR body", async () => {
let cwd = f.copy("simple-project");
await linkNodeModules(cwd);
await using fixture = await createSimpleProjectFixture();
const cwd = fixture.path;
mockedGithubMethods.pulls.list.mockImplementationOnce(() => ({ data: [] }));
@@ -164,8 +207,8 @@ describe("version", () => {
});
it("doesn't include ignored package that got a dependency update in the PR body", async () => {
let cwd = f.copy("ignored-package");
await linkNodeModules(cwd);
await using fixture = await createIgnoredPackageFixture();
const cwd = fixture.path;
mockedGithubMethods.pulls.list.mockImplementationOnce(() => ({ data: [] }));
@@ -199,8 +242,8 @@ describe("version", () => {
});
it("does not include changelog entries if full message exceeds size limit", async () => {
let cwd = f.copy("simple-project");
await linkNodeModules(cwd);
await using fixture = await createSimpleProjectFixture();
const cwd = fixture.path;
mockedGithubMethods.pulls.list.mockImplementationOnce(() => ({ data: [] }));
@@ -258,8 +301,8 @@ fluminis divesque vulnere aquis parce lapsis rabie si visa fulmineis.
});
it("does not include any release information if a message with simplified release info exceeds size limit", async () => {
let cwd = f.copy("simple-project");
await linkNodeModules(cwd);
await using fixture = await createSimpleProjectFixture();
const cwd = fixture.path;
mockedGithubMethods.pulls.list.mockImplementationOnce(() => ({ data: [] }));
@@ -317,8 +360,8 @@ fluminis divesque vulnere aquis parce lapsis rabie si visa fulmineis.
});
it('updates an existing PR via GraphQL without converting it to draft when prDraft is "create"', async () => {
let cwd = f.copy("simple-project");
await linkNodeModules(cwd);
await using fixture = await createSimpleProjectFixture();
const cwd = fixture.path;
mockedGithubMethods.pulls.list.mockImplementationOnce(() => ({
data: [{ number: 123, node_id: "PR_kwDOA" }],
@@ -351,8 +394,8 @@ fluminis divesque vulnere aquis parce lapsis rabie si visa fulmineis.
});
it('updates an existing PR via GraphQL and converts it to draft when prDraft is "always"', async () => {
let cwd = f.copy("simple-project");
await linkNodeModules(cwd);
await using fixture = await createSimpleProjectFixture();
const cwd = fixture.path;
mockedGithubMethods.pulls.list.mockImplementationOnce(() => ({
data: [{ number: 123, node_id: "PR_kwDOA" }],