@codfish/actions 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/codeql-config.yml +21 -0
- package/.github/dependabot.yml +35 -0
- package/.github/workflows/claude-code-review.yml +43 -0
- package/.github/workflows/claude.yml +39 -0
- package/.github/workflows/release.yml +48 -0
- package/.github/workflows/security.yml +103 -0
- package/.github/workflows/update-docs.yml +38 -0
- package/.github/workflows/validate.yml +210 -0
- package/.husky/pre-commit +1 -0
- package/.nvmrc +1 -0
- package/AGENT.md +129 -0
- package/CLAUDE.md +3 -0
- package/CONTRIBUTING.md +316 -0
- package/README.md +207 -0
- package/SECURITY.md +208 -0
- package/bin/generate-docs.js +432 -0
- package/comment/README.md +82 -0
- package/comment/action.yml +102 -0
- package/eslint.config.js +8 -0
- package/npm-publish-pr/README.md +145 -0
- package/npm-publish-pr/action.yml +171 -0
- package/package.json +52 -0
- package/setup-node-and-install/README.md +139 -0
- package/setup-node-and-install/action.yml +220 -0
- package/tests/fixtures/.node-version +1 -0
- package/tests/fixtures/.nvmrc +1 -0
- package/tests/fixtures/lockfiles/package-lock.json +12 -0
- package/tests/fixtures/lockfiles/pnpm-lock.yaml +9 -0
- package/tests/fixtures/lockfiles/yarn.lock +7 -0
- package/tests/fixtures/package-json/minimal.json +4 -0
- package/tests/fixtures/package-json/scoped.json +6 -0
- package/tests/fixtures/package-json/valid.json +13 -0
- package/tests/integration/comment/basic.bats +95 -0
- package/tests/integration/npm-pr-version/basic.bats +353 -0
- package/tests/integration/setup-node-and-install/basic.bats +200 -0
- package/tests/scripts/test-helpers.sh +113 -0
- package/tests/scripts/test-runner.sh +115 -0
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
#!/usr/bin/env bats
|
|
2
|
+
|
|
3
|
+
load "../../scripts/test-helpers.sh"
|
|
4
|
+
|
|
5
|
+
setup() {
|
|
6
|
+
setup_github_env
|
|
7
|
+
TEST_DIR=$(mktemp -d)
|
|
8
|
+
cd "$TEST_DIR"
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
teardown() {
|
|
12
|
+
cd /
|
|
13
|
+
cleanup_test_env "$TEST_DIR"
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
@test "npm-pr-version: generates correct PR version format" {
|
|
17
|
+
# Setup test repo
|
|
18
|
+
cp "$BATS_TEST_DIRNAME/../../../tests/fixtures/package-json/valid.json" package.json
|
|
19
|
+
|
|
20
|
+
# Mock npm command
|
|
21
|
+
mock_npm_publish
|
|
22
|
+
|
|
23
|
+
# Set PR and SHA environment variables
|
|
24
|
+
export PR=123
|
|
25
|
+
export SHA="abcdef1234567890"
|
|
26
|
+
|
|
27
|
+
# Test version generation logic
|
|
28
|
+
bash -c '
|
|
29
|
+
version="0.0.0-PR-${PR}--$(echo ${SHA} | cut -c -7)"
|
|
30
|
+
echo "Generated version: $version"
|
|
31
|
+
echo "version=$version"
|
|
32
|
+
' > output.txt
|
|
33
|
+
|
|
34
|
+
assert_output_contains "version=0.0.0-PR-123--abcdef1" "$(cat output.txt)"
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
@test "npm-pr-version: updates package.json version" {
|
|
38
|
+
# Setup test repo
|
|
39
|
+
cp "$BATS_TEST_DIRNAME/../../../tests/fixtures/package-json/valid.json" package.json
|
|
40
|
+
|
|
41
|
+
# Set environment variables
|
|
42
|
+
export PR=456
|
|
43
|
+
export SHA="fedcba0987654321"
|
|
44
|
+
|
|
45
|
+
# Test version update in package.json
|
|
46
|
+
bash -c '
|
|
47
|
+
version="0.0.0-PR-${PR}--$(echo ${SHA} | cut -c -7)"
|
|
48
|
+
npm version $version --no-git-tag-version
|
|
49
|
+
echo "Updated package.json:"
|
|
50
|
+
cat package.json | grep "\"version\""
|
|
51
|
+
' > output.txt 2>/dev/null || echo "npm version failed" > output.txt
|
|
52
|
+
|
|
53
|
+
# Check if version was updated (npm version command may not be available in test env)
|
|
54
|
+
if grep -q "npm version failed" output.txt; then
|
|
55
|
+
# Fallback: test with manual JSON update
|
|
56
|
+
bash -c '
|
|
57
|
+
version="0.0.0-PR-456--fedcba0"
|
|
58
|
+
# Simulate version update
|
|
59
|
+
sed -i.bak "s/\"version\": \"[^\"]*\"/\"version\": \"$version\"/" package.json
|
|
60
|
+
cat package.json | grep "\"version\""
|
|
61
|
+
' > output.txt
|
|
62
|
+
fi
|
|
63
|
+
|
|
64
|
+
assert_output_contains "0.0.0-PR-456--fedcba0" "$(cat output.txt)"
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
@test "npm-pr-version: handles scoped packages" {
|
|
68
|
+
# Setup test repo with scoped package
|
|
69
|
+
cp "$BATS_TEST_DIRNAME/../../../tests/fixtures/package-json/scoped.json" package.json
|
|
70
|
+
|
|
71
|
+
export PR=789
|
|
72
|
+
export SHA="1234567890abcdef"
|
|
73
|
+
|
|
74
|
+
# Test with scoped package
|
|
75
|
+
bash -c '
|
|
76
|
+
version="0.0.0-PR-${PR}--$(echo ${SHA} | cut -c -7)"
|
|
77
|
+
echo "version=$version"
|
|
78
|
+
echo "Testing scoped package:"
|
|
79
|
+
cat package.json | grep "\"name\""
|
|
80
|
+
' > output.txt
|
|
81
|
+
|
|
82
|
+
assert_output_contains "version=0.0.0-PR-789--1234567" "$(cat output.txt)"
|
|
83
|
+
assert_output_contains "@test-org/scoped-package" "$(cat output.txt)"
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
@test "npm-pr-version: detects yarn package manager" {
|
|
87
|
+
# Setup test repo with yarn lockfile
|
|
88
|
+
cp "$BATS_TEST_DIRNAME/../../../tests/fixtures/package-json/valid.json" package.json
|
|
89
|
+
cp "$BATS_TEST_DIRNAME/../../../tests/fixtures/lockfiles/yarn.lock" .
|
|
90
|
+
|
|
91
|
+
export PR=456
|
|
92
|
+
export SHA="fedcba0987654321"
|
|
93
|
+
|
|
94
|
+
# Test package manager detection
|
|
95
|
+
bash -c '
|
|
96
|
+
if [ -f "./yarn.lock" ]; then
|
|
97
|
+
package_manager="yarn"
|
|
98
|
+
echo "Detected package manager: yarn"
|
|
99
|
+
elif [ -f "./pnpm-lock.yaml" ]; then
|
|
100
|
+
package_manager="pnpm"
|
|
101
|
+
echo "Detected package manager: pnpm"
|
|
102
|
+
else
|
|
103
|
+
package_manager="npm"
|
|
104
|
+
echo "Detected package manager: npm"
|
|
105
|
+
fi
|
|
106
|
+
echo "package-manager=$package_manager"
|
|
107
|
+
' > output.txt
|
|
108
|
+
|
|
109
|
+
assert_output_contains "package-manager=yarn" "$(cat output.txt)"
|
|
110
|
+
assert_output_contains "Detected package manager: yarn" "$(cat output.txt)"
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
@test "npm-pr-version: detects pnpm package manager" {
|
|
114
|
+
# Setup test repo with pnpm lockfile
|
|
115
|
+
cp "$BATS_TEST_DIRNAME/../../../tests/fixtures/package-json/valid.json" package.json
|
|
116
|
+
cp "$BATS_TEST_DIRNAME/../../../tests/fixtures/lockfiles/pnpm-lock.yaml" .
|
|
117
|
+
|
|
118
|
+
export PR=789
|
|
119
|
+
export SHA="1234567890abcdef"
|
|
120
|
+
|
|
121
|
+
# Test package manager detection
|
|
122
|
+
bash -c '
|
|
123
|
+
if [ -f "./yarn.lock" ]; then
|
|
124
|
+
package_manager="yarn"
|
|
125
|
+
echo "Detected package manager: yarn"
|
|
126
|
+
elif [ -f "./pnpm-lock.yaml" ]; then
|
|
127
|
+
package_manager="pnpm"
|
|
128
|
+
echo "Detected package manager: pnpm"
|
|
129
|
+
else
|
|
130
|
+
package_manager="npm"
|
|
131
|
+
echo "Detected package manager: npm"
|
|
132
|
+
fi
|
|
133
|
+
echo "package-manager=$package_manager"
|
|
134
|
+
' > output.txt
|
|
135
|
+
|
|
136
|
+
assert_output_contains "package-manager=pnpm" "$(cat output.txt)"
|
|
137
|
+
assert_output_contains "Detected package manager: pnpm" "$(cat output.txt)"
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
@test "npm-pr-version: requires package.json" {
|
|
141
|
+
# Test without package.json
|
|
142
|
+
export PR=999
|
|
143
|
+
export SHA="testsha123456789"
|
|
144
|
+
|
|
145
|
+
# This should fail
|
|
146
|
+
bash -c '
|
|
147
|
+
if [ ! -f "package.json" ]; then
|
|
148
|
+
echo "ERROR: package.json not found"
|
|
149
|
+
exit 1
|
|
150
|
+
fi
|
|
151
|
+
' > output.txt 2>&1 || echo "exit-code=$?" >> output.txt
|
|
152
|
+
|
|
153
|
+
assert_output_contains "ERROR: package.json not found" "$(cat output.txt)"
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
@test "npm-pr-version: comment input defaults to true" {
|
|
157
|
+
# Test that comment input defaults to 'true' when not specified
|
|
158
|
+
bash -c '
|
|
159
|
+
comment_input=""
|
|
160
|
+
if [ -z "$comment_input" ]; then
|
|
161
|
+
comment_input="true"
|
|
162
|
+
fi
|
|
163
|
+
echo "comment=$comment_input"
|
|
164
|
+
' > output.txt
|
|
165
|
+
|
|
166
|
+
assert_output_contains "comment=true" "$(cat output.txt)"
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
@test "npm-pr-version: comment input can be set to false" {
|
|
170
|
+
# Test that comment input can be explicitly set to false
|
|
171
|
+
bash -c '
|
|
172
|
+
comment_input="false"
|
|
173
|
+
echo "comment=$comment_input"
|
|
174
|
+
|
|
175
|
+
# Simulate conditional comment step
|
|
176
|
+
if [ "$comment_input" = "true" ]; then
|
|
177
|
+
echo "Would create comment"
|
|
178
|
+
else
|
|
179
|
+
echo "Skipping comment creation"
|
|
180
|
+
fi
|
|
181
|
+
' > output.txt
|
|
182
|
+
|
|
183
|
+
assert_output_contains "comment=false" "$(cat output.txt)"
|
|
184
|
+
assert_output_contains "Skipping comment creation" "$(cat output.txt)"
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
@test "npm-pr-version: comment-tag input defaults to npm-publish-pr" {
|
|
188
|
+
# Test that comment-tag input defaults to 'npm-publish-pr' when not specified
|
|
189
|
+
bash -c '
|
|
190
|
+
comment_tag_input=""
|
|
191
|
+
if [ -z "$comment_tag_input" ]; then
|
|
192
|
+
comment_tag_input="npm-publish-pr"
|
|
193
|
+
fi
|
|
194
|
+
echo "comment-tag=$comment_tag_input"
|
|
195
|
+
' > output.txt
|
|
196
|
+
|
|
197
|
+
assert_output_contains "comment-tag=npm-publish-pr" "$(cat output.txt)"
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
@test "npm-pr-version: comment-tag input can be customized" {
|
|
201
|
+
# Test that comment-tag input can be set to custom value
|
|
202
|
+
bash -c '
|
|
203
|
+
comment_tag_input="my-custom-tag"
|
|
204
|
+
echo "comment-tag=$comment_tag_input"
|
|
205
|
+
|
|
206
|
+
# Simulate using custom tag in comment action
|
|
207
|
+
echo "Using tag: $comment_tag_input for PR comment"
|
|
208
|
+
' > output.txt
|
|
209
|
+
|
|
210
|
+
assert_output_contains "comment-tag=my-custom-tag" "$(cat output.txt)"
|
|
211
|
+
assert_output_contains "Using tag: my-custom-tag for PR comment" "$(cat output.txt)"
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
@test "npm-pr-version: comment workflow with custom tag" {
|
|
215
|
+
# Test complete workflow with comment disabled and custom tag
|
|
216
|
+
bash -c '
|
|
217
|
+
comment_input="false"
|
|
218
|
+
comment_tag_input="custom-npm-publish"
|
|
219
|
+
|
|
220
|
+
echo "comment=$comment_input"
|
|
221
|
+
echo "comment-tag=$comment_tag_input"
|
|
222
|
+
|
|
223
|
+
# Simulate the conditional logic from action.yml
|
|
224
|
+
if [ "$comment_input" = "true" ]; then
|
|
225
|
+
echo "Would use codfish/actions/comment@main with tag: $comment_tag_input"
|
|
226
|
+
else
|
|
227
|
+
echo "Comment step skipped due to comment=false"
|
|
228
|
+
fi
|
|
229
|
+
' > output.txt
|
|
230
|
+
|
|
231
|
+
assert_output_contains "comment=false" "$(cat output.txt)"
|
|
232
|
+
assert_output_contains "comment-tag=custom-npm-publish" "$(cat output.txt)"
|
|
233
|
+
assert_output_contains "Comment step skipped due to comment=false" "$(cat output.txt)"
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
@test "npm-pr-version: before/after commenting workflow" {
|
|
237
|
+
# Test that before/after commenting logic works correctly
|
|
238
|
+
bash -c '
|
|
239
|
+
comment_input="true"
|
|
240
|
+
comment_tag_input="npm-publish-pr"
|
|
241
|
+
publish_success="true"
|
|
242
|
+
|
|
243
|
+
echo "comment=$comment_input"
|
|
244
|
+
echo "comment-tag=$comment_tag_input"
|
|
245
|
+
|
|
246
|
+
# Simulate before comment
|
|
247
|
+
if [ "$comment_input" = "true" ]; then
|
|
248
|
+
echo "Before: Publishing PR version..."
|
|
249
|
+
fi
|
|
250
|
+
|
|
251
|
+
# Simulate publish step
|
|
252
|
+
if [ "$publish_success" = "true" ]; then
|
|
253
|
+
echo "Publish: SUCCESS"
|
|
254
|
+
package_name="test-package"
|
|
255
|
+
version="0.0.0-PR-123--abc1234"
|
|
256
|
+
|
|
257
|
+
# Simulate success comment
|
|
258
|
+
if [ "$comment_input" = "true" ]; then
|
|
259
|
+
echo "After: PR package published successfully! Install with: npm install $package_name@$version"
|
|
260
|
+
fi
|
|
261
|
+
else
|
|
262
|
+
echo "Publish: FAILED"
|
|
263
|
+
error_message="Failed to publish"
|
|
264
|
+
|
|
265
|
+
# Simulate error comment
|
|
266
|
+
if [ "$comment_input" = "true" ]; then
|
|
267
|
+
echo "After: PR package publish failed! Error: $error_message"
|
|
268
|
+
fi
|
|
269
|
+
fi
|
|
270
|
+
' > output.txt
|
|
271
|
+
|
|
272
|
+
assert_output_contains "Before: Publishing PR version..." "$(cat output.txt)"
|
|
273
|
+
assert_output_contains "Publish: SUCCESS" "$(cat output.txt)"
|
|
274
|
+
assert_output_contains "After: PR package published successfully!" "$(cat output.txt)"
|
|
275
|
+
assert_output_contains "npm install test-package@0.0.0-PR-123--abc1234" "$(cat output.txt)"
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
@test "npm-pr-version: error handling and comment update" {
|
|
279
|
+
# Test error handling workflow
|
|
280
|
+
bash -c '
|
|
281
|
+
comment_input="true"
|
|
282
|
+
comment_tag_input="npm-publish-pr"
|
|
283
|
+
publish_success="false"
|
|
284
|
+
|
|
285
|
+
echo "comment=$comment_input"
|
|
286
|
+
echo "comment-tag=$comment_tag_input"
|
|
287
|
+
|
|
288
|
+
# Simulate before comment
|
|
289
|
+
if [ "$comment_input" = "true" ]; then
|
|
290
|
+
echo "Before: Publishing PR version..."
|
|
291
|
+
fi
|
|
292
|
+
|
|
293
|
+
# Simulate publish step failure
|
|
294
|
+
if [ "$publish_success" = "true" ]; then
|
|
295
|
+
echo "Publish: SUCCESS"
|
|
296
|
+
else
|
|
297
|
+
echo "Publish: FAILED"
|
|
298
|
+
error_message="Failed to publish package with npm. Error: E403 Forbidden"
|
|
299
|
+
|
|
300
|
+
# Simulate error comment
|
|
301
|
+
if [ "$comment_input" = "true" ]; then
|
|
302
|
+
echo "After: PR package publish failed! Error: $error_message"
|
|
303
|
+
fi
|
|
304
|
+
fi
|
|
305
|
+
' > output.txt
|
|
306
|
+
|
|
307
|
+
assert_output_contains "Before: Publishing PR version..." "$(cat output.txt)"
|
|
308
|
+
assert_output_contains "Publish: FAILED" "$(cat output.txt)"
|
|
309
|
+
assert_output_contains "After: PR package publish failed!" "$(cat output.txt)"
|
|
310
|
+
assert_output_contains "Error: Failed to publish package with npm. Error: E403 Forbidden" "$(cat output.txt)"
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
@test "npm-pr-version: error handling with package name extraction" {
|
|
314
|
+
# Setup test repo with package.json
|
|
315
|
+
cp "$BATS_TEST_DIRNAME/../../../tests/fixtures/package-json/valid.json" package.json
|
|
316
|
+
|
|
317
|
+
# Test error message generation with package name
|
|
318
|
+
bash -c '
|
|
319
|
+
# Simulate package name extraction
|
|
320
|
+
if [ -f "package.json" ]; then
|
|
321
|
+
package_name=$(jq -r ".name // empty" package.json)
|
|
322
|
+
echo "package-name=$package_name"
|
|
323
|
+
|
|
324
|
+
# Simulate error scenario
|
|
325
|
+
error_message="❌ ERROR: Failed to publish package with npm. Error: E403 Forbidden - you must be logged in"
|
|
326
|
+
echo "error-message=$error_message"
|
|
327
|
+
fi
|
|
328
|
+
' > output.txt
|
|
329
|
+
|
|
330
|
+
assert_output_contains "package-name=test-package" "$(cat output.txt)"
|
|
331
|
+
assert_output_contains "error-message=❌ ERROR: Failed to publish package with npm" "$(cat output.txt)"
|
|
332
|
+
assert_output_contains "E403 Forbidden" "$(cat output.txt)"
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
@test "npm-pr-version: npm version error capture" {
|
|
336
|
+
# Test npm version error handling with output capture
|
|
337
|
+
bash -c '
|
|
338
|
+
version="invalid-version"
|
|
339
|
+
|
|
340
|
+
# Simulate npm version command failure with output
|
|
341
|
+
version_output="npm ERR! Invalid version: \"invalid-version\""
|
|
342
|
+
version_exit_code=1
|
|
343
|
+
|
|
344
|
+
if [ $version_exit_code -ne 0 ]; then
|
|
345
|
+
error_message="❌ ERROR: Failed to update package version. Check if the version format is valid. Error: $version_output"
|
|
346
|
+
echo "error-message=$error_message"
|
|
347
|
+
fi
|
|
348
|
+
' > output.txt
|
|
349
|
+
|
|
350
|
+
assert_output_contains "error-message=❌ ERROR: Failed to update package version" "$(cat output.txt)"
|
|
351
|
+
assert_output_contains "Check if the version format is valid" "$(cat output.txt)"
|
|
352
|
+
assert_output_contains "npm ERR! Invalid version" "$(cat output.txt)"
|
|
353
|
+
}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
#!/usr/bin/env bats
|
|
2
|
+
|
|
3
|
+
load "../../scripts/test-helpers.sh"
|
|
4
|
+
|
|
5
|
+
setup() {
|
|
6
|
+
setup_github_env
|
|
7
|
+
TEST_DIR=$(mktemp -d)
|
|
8
|
+
cd "$TEST_DIR"
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
teardown() {
|
|
12
|
+
cd /
|
|
13
|
+
cleanup_test_env "$TEST_DIR"
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
@test "setup-node-and-install: detects npm with package-lock.json" {
|
|
17
|
+
# Setup test repo with npm lockfile
|
|
18
|
+
cp "$BATS_TEST_DIRNAME/../../../tests/fixtures/package-json/valid.json" package.json
|
|
19
|
+
cp "$BATS_TEST_DIRNAME/../../../tests/fixtures/lockfiles/package-lock.json" .
|
|
20
|
+
|
|
21
|
+
# Test enhanced package manager detection
|
|
22
|
+
bash -c '
|
|
23
|
+
if [ -f "./pnpm-lock.yaml" ]; then
|
|
24
|
+
echo "package-manager=pnpm"
|
|
25
|
+
echo "lockfile-exists=true"
|
|
26
|
+
elif [ -f "./yarn.lock" ]; then
|
|
27
|
+
echo "package-manager=yarn"
|
|
28
|
+
echo "lockfile-exists=true"
|
|
29
|
+
elif [ -f "./package-lock.json" ]; then
|
|
30
|
+
echo "package-manager=npm"
|
|
31
|
+
echo "lockfile-exists=true"
|
|
32
|
+
else
|
|
33
|
+
echo "package-manager=npm"
|
|
34
|
+
echo "lockfile-exists=false"
|
|
35
|
+
fi
|
|
36
|
+
' > output.txt
|
|
37
|
+
|
|
38
|
+
assert_output_contains "package-manager=npm" "$(cat output.txt)"
|
|
39
|
+
assert_output_contains "lockfile-exists=true" "$(cat output.txt)"
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@test "setup-node-and-install: detects pnpm with pnpm-lock.yaml" {
|
|
43
|
+
# Setup test repo with pnpm lockfile
|
|
44
|
+
cp "$BATS_TEST_DIRNAME/../../../tests/fixtures/package-json/valid.json" package.json
|
|
45
|
+
cp "$BATS_TEST_DIRNAME/../../../tests/fixtures/lockfiles/pnpm-lock.yaml" .
|
|
46
|
+
|
|
47
|
+
# Test package manager detection (updated with yarn support)
|
|
48
|
+
bash -c '
|
|
49
|
+
if [ -f "./pnpm-lock.yaml" ]; then
|
|
50
|
+
echo "package-manager=pnpm"
|
|
51
|
+
echo "lockfile-exists=true"
|
|
52
|
+
elif [ -f "./yarn.lock" ]; then
|
|
53
|
+
echo "package-manager=yarn"
|
|
54
|
+
echo "lockfile-exists=true"
|
|
55
|
+
elif [ -f "./package-lock.json" ]; then
|
|
56
|
+
echo "package-manager=npm"
|
|
57
|
+
echo "lockfile-exists=true"
|
|
58
|
+
else
|
|
59
|
+
echo "package-manager=npm"
|
|
60
|
+
echo "lockfile-exists=false"
|
|
61
|
+
fi
|
|
62
|
+
' > output.txt
|
|
63
|
+
|
|
64
|
+
assert_output_contains "package-manager=pnpm" "$(cat output.txt)"
|
|
65
|
+
assert_output_contains "lockfile-exists=true" "$(cat output.txt)"
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
@test "setup-node-and-install: detects .nvmrc file" {
|
|
69
|
+
# Setup test repo with .nvmrc
|
|
70
|
+
cp "$BATS_TEST_DIRNAME/../../../tests/fixtures/package-json/valid.json" package.json
|
|
71
|
+
cp "$BATS_TEST_DIRNAME/../../../tests/fixtures/.nvmrc" .
|
|
72
|
+
|
|
73
|
+
# Test nvmrc detection
|
|
74
|
+
bash -c '
|
|
75
|
+
if [[ ! -f "./.nvmrc" && -z "$INPUT_NODE_VERSION" ]]; then
|
|
76
|
+
echo "node-version-missing=true"
|
|
77
|
+
else
|
|
78
|
+
echo "node-version-found=true"
|
|
79
|
+
if [ -f "./.nvmrc" ]; then
|
|
80
|
+
echo "nvmrc-version=$(cat .nvmrc)"
|
|
81
|
+
fi
|
|
82
|
+
fi
|
|
83
|
+
' > output.txt
|
|
84
|
+
|
|
85
|
+
assert_output_contains "node-version-found=true" "$(cat output.txt)"
|
|
86
|
+
assert_output_contains "nvmrc-version=18.20.0" "$(cat output.txt)"
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
@test "setup-node-and-install: detects yarn with yarn.lock" {
|
|
90
|
+
# Setup test repo with yarn lockfile
|
|
91
|
+
cp "$BATS_TEST_DIRNAME/../../../tests/fixtures/package-json/valid.json" package.json
|
|
92
|
+
cp "$BATS_TEST_DIRNAME/../../../tests/fixtures/lockfiles/yarn.lock" .
|
|
93
|
+
|
|
94
|
+
# Test yarn detection
|
|
95
|
+
bash -c '
|
|
96
|
+
if [ -f "./pnpm-lock.yaml" ]; then
|
|
97
|
+
echo "package-manager=pnpm"
|
|
98
|
+
echo "lockfile-exists=true"
|
|
99
|
+
elif [ -f "./yarn.lock" ]; then
|
|
100
|
+
echo "package-manager=yarn"
|
|
101
|
+
echo "lockfile-exists=true"
|
|
102
|
+
elif [ -f "./package-lock.json" ]; then
|
|
103
|
+
echo "package-manager=npm"
|
|
104
|
+
echo "lockfile-exists=true"
|
|
105
|
+
else
|
|
106
|
+
echo "package-manager=npm"
|
|
107
|
+
echo "lockfile-exists=false"
|
|
108
|
+
fi
|
|
109
|
+
' > output.txt
|
|
110
|
+
|
|
111
|
+
assert_output_contains "package-manager=yarn" "$(cat output.txt)"
|
|
112
|
+
assert_output_contains "lockfile-exists=true" "$(cat output.txt)"
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
@test "setup-node-and-install: fails when no node version specified" {
|
|
116
|
+
# Setup test repo without .nvmrc or node-version input
|
|
117
|
+
cp "$BATS_TEST_DIRNAME/../../../tests/fixtures/package-json/valid.json" package.json
|
|
118
|
+
|
|
119
|
+
# Test missing node version
|
|
120
|
+
bash -c '
|
|
121
|
+
if [[ ! -f "./.nvmrc" && -z "$INPUT_NODE_VERSION" ]]; then
|
|
122
|
+
echo "node-version-missing=true"
|
|
123
|
+
exit 1
|
|
124
|
+
fi
|
|
125
|
+
' > output.txt 2>&1 || echo "exit-code=$?" >> output.txt
|
|
126
|
+
|
|
127
|
+
assert_output_contains "node-version-missing=true" "$(cat output.txt)"
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
@test "setup-node-and-install: detects .node-version file" {
|
|
131
|
+
# Setup test repo with .node-version
|
|
132
|
+
cp "$BATS_TEST_DIRNAME/../../../tests/fixtures/package-json/valid.json" package.json
|
|
133
|
+
cp "$BATS_TEST_DIRNAME/../../../tests/fixtures/.node-version" .
|
|
134
|
+
|
|
135
|
+
# Test .node-version detection
|
|
136
|
+
bash -c '
|
|
137
|
+
if [[ ! -f "./.nvmrc" && ! -f "./.node-version" && -z "$INPUT_NODE_VERSION" ]]; then
|
|
138
|
+
echo "node-version-missing=true"
|
|
139
|
+
else
|
|
140
|
+
echo "node-version-found=true"
|
|
141
|
+
if [ -f "./.node-version" ]; then
|
|
142
|
+
echo "node-version-content=$(cat .node-version)"
|
|
143
|
+
fi
|
|
144
|
+
fi
|
|
145
|
+
' > output.txt
|
|
146
|
+
|
|
147
|
+
assert_output_contains "node-version-found=true" "$(cat output.txt)"
|
|
148
|
+
assert_output_contains "node-version-content=20.10.0" "$(cat output.txt)"
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
@test "setup-node-and-install: prioritizes .nvmrc over .node-version" {
|
|
152
|
+
# Setup test repo with both files
|
|
153
|
+
cp "$BATS_TEST_DIRNAME/../../../tests/fixtures/package-json/valid.json" package.json
|
|
154
|
+
cp "$BATS_TEST_DIRNAME/../../../tests/fixtures/.nvmrc" .
|
|
155
|
+
cp "$BATS_TEST_DIRNAME/../../../tests/fixtures/.node-version" .
|
|
156
|
+
|
|
157
|
+
# Test priority logic
|
|
158
|
+
bash -c '
|
|
159
|
+
if [ -f "./.nvmrc" ] && [ -f "./.node-version" ]; then
|
|
160
|
+
echo "Both files found, .nvmrc takes priority"
|
|
161
|
+
echo "nvmrc-version=$(cat .nvmrc)"
|
|
162
|
+
echo "node-version-file=$(cat .node-version)"
|
|
163
|
+
fi
|
|
164
|
+
' > output.txt
|
|
165
|
+
|
|
166
|
+
assert_output_contains "Both files found, .nvmrc takes priority" "$(cat output.txt)"
|
|
167
|
+
assert_output_contains "nvmrc-version=18.20.0" "$(cat output.txt)"
|
|
168
|
+
assert_output_contains "node-version-file=20.10.0" "$(cat output.txt)"
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
@test "setup-node-and-install: validates package.json existence" {
|
|
172
|
+
# Test without package.json
|
|
173
|
+
bash -c '
|
|
174
|
+
if [ ! -f "./package.json" ]; then
|
|
175
|
+
echo "ERROR: package.json not found"
|
|
176
|
+
exit 1
|
|
177
|
+
fi
|
|
178
|
+
' > output.txt 2>&1 || echo "exit-code=$?" >> output.txt
|
|
179
|
+
|
|
180
|
+
assert_output_contains "ERROR: package.json not found" "$(cat output.txt)"
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
@test "setup-node-and-install: validates empty .node-version file" {
|
|
184
|
+
# Setup test repo with empty .node-version
|
|
185
|
+
cp "$BATS_TEST_DIRNAME/../../../tests/fixtures/package-json/valid.json" package.json
|
|
186
|
+
touch .node-version # Create empty file
|
|
187
|
+
|
|
188
|
+
# Test empty .node-version validation
|
|
189
|
+
bash -c '
|
|
190
|
+
if [ -f "./.node-version" ] && [ ! -f "./.nvmrc" ]; then
|
|
191
|
+
node_version_file=$(cat .node-version | tr -d "\n\r" | xargs)
|
|
192
|
+
if [ -z "$node_version_file" ]; then
|
|
193
|
+
echo "ERROR: .node-version file is empty"
|
|
194
|
+
exit 1
|
|
195
|
+
fi
|
|
196
|
+
fi
|
|
197
|
+
' > output.txt 2>&1 || echo "exit-code=$?" >> output.txt
|
|
198
|
+
|
|
199
|
+
assert_output_contains "ERROR: .node-version file is empty" "$(cat output.txt)"
|
|
200
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# Test helper functions for GitHub Actions testing
|
|
4
|
+
|
|
5
|
+
# Setup test environment variables
|
|
6
|
+
setup_github_env() {
|
|
7
|
+
export GITHUB_ACTIONS=true
|
|
8
|
+
export GITHUB_WORKFLOW="test"
|
|
9
|
+
export GITHUB_RUN_ID="test-run-$(date +%s)"
|
|
10
|
+
export GITHUB_RUN_NUMBER="1"
|
|
11
|
+
export GITHUB_SHA="${GITHUB_SHA:-$(git rev-parse HEAD 2>/dev/null || echo "test-sha-$(date +%s)")}"
|
|
12
|
+
export GITHUB_REF="refs/heads/test"
|
|
13
|
+
export GITHUB_REPOSITORY="codfish/actions"
|
|
14
|
+
export GITHUB_ACTOR="test-user"
|
|
15
|
+
export GITHUB_EVENT_NAME="pull_request"
|
|
16
|
+
export GITHUB_EVENT_PATH="/tmp/github-event.json"
|
|
17
|
+
|
|
18
|
+
# Create mock event file
|
|
19
|
+
cat > "$GITHUB_EVENT_PATH" <<EOF
|
|
20
|
+
{
|
|
21
|
+
"number": 123,
|
|
22
|
+
"pull_request": {
|
|
23
|
+
"number": 123,
|
|
24
|
+
"head": {
|
|
25
|
+
"sha": "$GITHUB_SHA"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
EOF
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
# Create temporary test directory
|
|
33
|
+
create_test_repo() {
|
|
34
|
+
local test_dir="$1"
|
|
35
|
+
local package_json_fixture="${2:-valid}"
|
|
36
|
+
|
|
37
|
+
mkdir -p "$test_dir"
|
|
38
|
+
cp "tests/fixtures/package-json/${package_json_fixture}.json" "$test_dir/package.json"
|
|
39
|
+
|
|
40
|
+
# Initialize git repo if needed
|
|
41
|
+
if [ ! -d "$test_dir/.git" ]; then
|
|
42
|
+
cd "$test_dir"
|
|
43
|
+
git init
|
|
44
|
+
git config user.name "Test User"
|
|
45
|
+
git config user.email "test@example.com"
|
|
46
|
+
git add .
|
|
47
|
+
git commit -m "Initial commit"
|
|
48
|
+
cd - >/dev/null
|
|
49
|
+
fi
|
|
50
|
+
|
|
51
|
+
echo "$test_dir"
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
# Mock npm publish command
|
|
55
|
+
mock_npm_publish() {
|
|
56
|
+
cat > /tmp/mock-npm <<'EOF'
|
|
57
|
+
#!/usr/bin/env bash
|
|
58
|
+
echo "Mock npm publish called with args: $*"
|
|
59
|
+
echo "npm notice"
|
|
60
|
+
echo "npm notice 📦 test-package@0.0.0-PR-123--abc1234"
|
|
61
|
+
echo "npm notice === Published Successfully ==="
|
|
62
|
+
exit 0
|
|
63
|
+
EOF
|
|
64
|
+
chmod +x /tmp/mock-npm
|
|
65
|
+
export PATH="/tmp:$PATH"
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
# Cleanup test environment
|
|
69
|
+
cleanup_test_env() {
|
|
70
|
+
local test_dir="$1"
|
|
71
|
+
if [ -n "$test_dir" ] && [ -d "$test_dir" ]; then
|
|
72
|
+
rm -rf "$test_dir"
|
|
73
|
+
fi
|
|
74
|
+
rm -f /tmp/mock-npm /tmp/github-event.json
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
# Check if action output contains expected value
|
|
78
|
+
assert_output_contains() {
|
|
79
|
+
local expected="$1"
|
|
80
|
+
local actual="$2"
|
|
81
|
+
|
|
82
|
+
if [[ "$actual" == *"$expected"* ]]; then
|
|
83
|
+
return 0
|
|
84
|
+
else
|
|
85
|
+
echo "Expected output to contain: $expected"
|
|
86
|
+
echo "Actual output: $actual"
|
|
87
|
+
return 1
|
|
88
|
+
fi
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
# Check if file exists
|
|
92
|
+
assert_file_exists() {
|
|
93
|
+
local file="$1"
|
|
94
|
+
if [ -f "$file" ]; then
|
|
95
|
+
return 0
|
|
96
|
+
else
|
|
97
|
+
echo "Expected file to exist: $file"
|
|
98
|
+
return 1
|
|
99
|
+
fi
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
# Check if environment variable is set
|
|
103
|
+
assert_env_set() {
|
|
104
|
+
local var_name="$1"
|
|
105
|
+
local var_value="${!var_name}"
|
|
106
|
+
|
|
107
|
+
if [ -n "$var_value" ]; then
|
|
108
|
+
return 0
|
|
109
|
+
else
|
|
110
|
+
echo "Expected environment variable to be set: $var_name"
|
|
111
|
+
return 1
|
|
112
|
+
fi
|
|
113
|
+
}
|