-
Notifications
You must be signed in to change notification settings - Fork 2.2k
/
publish-from-git.test.js
134 lines (107 loc) · 4.06 KB
/
publish-from-git.test.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
"use strict";
// we're actually testing integration with git
jest.unmock("@lerna/collect-updates");
// local modules _must_ be explicitly mocked
jest.mock("../lib/get-packages-without-license");
jest.mock("../lib/verify-npm-package-access");
jest.mock("../lib/get-npm-username");
jest.mock("../lib/get-two-factor-auth-required");
jest.mock("../lib/get-unpublished-packages");
// FIXME: better mock for version command
jest.mock("../../version/lib/git-push");
jest.mock("../../version/lib/is-anything-committed");
jest.mock("../../version/lib/is-behind-upstream");
jest.mock("../../version/lib/remote-branch-exists");
// mocked or stubbed modules
const npmPublish = require("@lerna/npm-publish");
const PromptUtilities = require("@lerna/prompt");
const output = require("@lerna/output");
const checkWorkingTree = require("@lerna/check-working-tree");
// helpers
const loggingOutput = require("@lerna-test/logging-output");
const gitTag = require("@lerna-test/git-tag");
const initFixture = require("@lerna-test/init-fixture")(__dirname);
// file under test
const lernaPublish = require("@lerna-test/command-runner")(require("../command"));
describe("publish from-git", () => {
it("publishes tagged packages", async () => {
const cwd = await initFixture("normal");
await gitTag(cwd, "v1.0.0");
await lernaPublish(cwd)("from-git");
// called from chained describeRef()
expect(checkWorkingTree.throwIfUncommitted).toHaveBeenCalled();
expect(PromptUtilities.confirm).toHaveBeenLastCalledWith(
"Are you sure you want to publish these packages?"
);
expect(output.logged()).toMatch("Found 4 packages to publish:");
expect(npmPublish.order()).toEqual([
"package-1",
"package-3",
"package-4",
"package-2",
// package-5 is private
]);
});
it("publishes tagged independent packages", async () => {
const cwd = await initFixture("independent");
await Promise.all([
gitTag(cwd, "package-1@1.0.0"),
gitTag(cwd, "package-2@2.0.0"),
gitTag(cwd, "package-3@3.0.0"),
gitTag(cwd, "package-4@4.0.0"),
gitTag(cwd, "package-5@5.0.0"),
]);
await lernaPublish(cwd)("from-git");
expect(npmPublish.order()).toEqual([
"package-1",
"package-3",
"package-4",
"package-2",
// package-5 is private
]);
});
it("publishes packages matching custom --tag-version-prefix", async () => {
const cwd = await initFixture("normal");
await gitTag(cwd, "foo/1.0.0");
await lernaPublish(cwd)("from-git", "--tag-version-prefix", "foo/");
expect(npmPublish.order()).toEqual([
"package-1",
"package-3",
"package-4",
"package-2",
// package-5 is private
]);
});
it("only publishes independent packages with matching tags", async () => {
const cwd = await initFixture("independent");
await gitTag(cwd, "package-3@3.0.0");
await lernaPublish(cwd)("from-git");
expect(output.logged()).toMatch("Found 1 package to publish:");
expect(npmPublish.order()).toEqual(["package-3"]);
});
it("exits early when the current commit is not tagged", async () => {
const cwd = await initFixture("normal");
await lernaPublish(cwd)("from-git");
expect(npmPublish).not.toHaveBeenCalled();
const logMessages = loggingOutput("info");
expect(logMessages).toContain("No tagged release found");
});
it("throws an error when uncommitted changes are present", async () => {
checkWorkingTree.throwIfUncommitted.mockImplementationOnce(() => {
throw new Error("uncommitted");
});
const cwd = await initFixture("normal");
const command = lernaPublish(cwd)("from-git");
await expect(command).rejects.toThrow("uncommitted");
// notably different than the actual message, but good enough here
});
it("throws an error when --git-head is passed", async () => {
const cwd = await initFixture("normal");
const command = lernaPublish(cwd)("from-git", "--git-head", "deadbeef");
await expect(command).rejects.toThrow(
expect.objectContaining({
prefix: "EGITHEAD",
})
);
});
});