@@ -6,16 +6,92 @@ import com.github.gradle.node.npm.proxy.ProxySettings
66import com.github.gradle.node.task.AbstractTaskTest
77import com.github.gradle.node.util.PlatformHelperKt
88
9+ import java.nio.file.Files
10+
911import static com.github.gradle.node.NodeExtension.DEFAULT_NODE_VERSION
1012
1113class NpmTaskTest extends AbstractTaskTest {
1214 def cleanup () {
1315 GradleProxyHelper . resetProxy()
1416 }
1517
18+ /**
19+ * Creates a temporary directory with a dummy executable file.
20+ *
21+ * @param fileName The name of the dummy executable (e.g., "npm").
22+ * @param scriptContent (Optional) The content inside the executable. Defaults to a simple echo script.
23+ * @return File object pointing to the dummy executable.
24+ */
25+ File createTempDummyExecutable (String fileName , String scriptContent = " #!/bin/bash\n echo 'Dummy executable ran with args: \$ @'" ) {
26+ // Create a temporary directory
27+ File tempDir = Files . createTempDirectory(" dummy-bin" ). toFile()
28+
29+ // Create the dummy executable inside the temp directory
30+ File executableFile = new File (tempDir, fileName)
31+
32+ // Write the script content
33+ executableFile. text = scriptContent
34+
35+ // Set executable permissions
36+ executableFile. setExecutable(true )
37+
38+ return executableFile
39+ }
40+
41+ def " exec npm task with environment variable" () {
42+ given :
43+ def npmFile = createTempDummyExecutable(" npm" )
44+
45+ nodeExtension. resolvedPlatform. set(PlatformHelperKt . parsePlatform(" Linux" , " x86_64" , {}))
46+ nodeExtension. environment. set([" PATH" : npmFile. parent])
47+
48+ def task = project. tasks. create(' simple' , NpmTask )
49+ mockProjectApiHelperExec(task)
50+ task. args. set([' a' , ' b' ])
51+ task. environment. set([' a' : ' 1' ])
52+ task. ignoreExitValue. set(true )
53+ task. workingDir. set(projectDir)
54+
55+ when :
56+ project. evaluate()
57+ task. exec()
58+
59+ then :
60+ 1 * execSpec. setIgnoreExitValue(true )
61+ 1 * execSpec. setEnvironment({ it[' a' ] == ' 1' && containsPath(it) })
62+ 1 * execSpec. setExecutable(npmFile. absolutePath)
63+ 1 * execSpec. setArgs([' a' , ' b' ])
64+ }
65+
66+ def "exec npm task with environment variable (windows )" () {
67+ given:
68+ def npmFile = createTempDummyExecutable(" npm. cmd" )
69+
70+ nodeExtension.resolvedPlatform.set(PlatformHelperKt.parsePlatform(" Windows " , " x86_64" , {}))
71+ nodeExtension.environment.set([" Path " : npmFile.parent])
72+
73+ def task = project.tasks.create('simple', NpmTask)
74+ mockProjectApiHelperExec(task)
75+ task.args.set(['a', 'b'])
76+ task.environment.set(['a': '1'])
77+ task.ignoreExitValue.set(true)
78+ task.workingDir.set(projectDir)
79+
80+ when:
81+ project.evaluate()
82+ task.exec()
83+
84+ then:
85+ 1 * execSpec.setIgnoreExitValue(true)
86+ 1 * execSpec.setEnvironment({ it['a'] == '1' && containsPath(it) })
87+ 1 * execSpec.setExecutable(npmFile.absolutePath)
88+ 1 * execSpec.setArgs(['a', 'b'])
89+ }
90+
1691 def " exec npm task" () {
1792 given:
1893 nodeExtension.resolvedPlatform.set(PlatformHelperKt.parsePlatform(" Linux " , " x86_64" , {}))
94+ nodeExtension.environment.set([:])
1995
2096 def task = project.tasks.create('simple', NpmTask)
2197 mockProjectApiHelperExec(task)
@@ -57,6 +133,39 @@ class NpmTaskTest extends AbstractTaskTest {
57133 1 * execSpec.setArgs(['a', 'b'])
58134 }
59135
136+ def " exec npm task with path respects download" () {
137+ given:
138+ def npmFile = createTempDummyExecutable(" npm" )
139+
140+ nodeExtension.resolvedPlatform.set(PlatformHelperKt.parsePlatform(" Linux " , " x86_64" , {}))
141+ nodeExtension.environment.set([" PATH " : npmFile.parent])
142+ nodeExtension.download.set(true)
143+
144+ def nodeDir = projectDir.toPath().resolve(" . gradle" ).resolve(" nodejs" )
145+ .resolve(" node- v${DEFAULT_NODE_VERSION }- linux- x64" )
146+
147+ def task = project.tasks.create('simple', NpmTask)
148+ mockProjectApiHelperExec(task)
149+ task.args.set([" run" , " command" ])
150+
151+ when:
152+ project.evaluate()
153+ task.exec()
154+
155+ then:
156+ 1 * execSpec.setIgnoreExitValue(false)
157+ 1 * execSpec.setExecutable({ executable ->
158+ def expectedNodePath = nodeDir.resolve(" bin" ).resolve(" node" )
159+ return fixAbsolutePath(executable) == expectedNodePath.toAbsolutePath().toString()
160+ })
161+ 1 * execSpec.setArgs({ args ->
162+ def command = nodeDir
163+ .resolve(" lib" ).resolve(" node_modules" ).resolve(" npm" ).resolve(" bin" )
164+ .resolve(" npm- cli. js" ).toAbsolutePath().toString()
165+ return fixAbsolutePaths(args) == [command, " run" , " command" ]
166+ })
167+ }
168+
60169 def " exec npm task (download)" () {
61170 given:
62171 nodeExtension.resolvedPlatform.set(PlatformHelperKt.parsePlatform(" Linux " , " x86_64" , {}))
@@ -121,6 +230,8 @@ class NpmTaskTest extends AbstractTaskTest {
121230 def " exec npm task with configured proxy" () {
122231 given :
123232 nodeExtension. resolvedPlatform. set(PlatformHelperKt . parsePlatform(" Linux" , " x86_64" , {}))
233+ nodeExtension. environment. set([:])
234+
124235 GradleProxyHelper . setHttpsProxyHost(" my-super-proxy.net" )
125236 GradleProxyHelper . setHttpsProxyPort(11235 )
126237
@@ -141,6 +252,8 @@ class NpmTaskTest extends AbstractTaskTest {
141252 def " exec npm task with configured proxy but disabled" () {
142253 given :
143254 nodeExtension. resolvedPlatform. set(PlatformHelperKt . parsePlatform(" Linux" , " x86_64" , {}))
255+ nodeExtension. environment. set([:])
256+
144257 GradleProxyHelper . setHttpsProxyHost(" my-super-proxy.net" )
145258 GradleProxyHelper . setHttpsProxyPort(11235 )
146259 nodeExtension. nodeProxySettings. set(ProxySettings . OFF )
0 commit comments