Skip to content

Commit 461e41d

Browse files
committed
update-tests
1 parent 2f1d67e commit 461e41d

2 files changed

Lines changed: 191 additions & 11 deletions

File tree

src/nodejs/hooks/sealights.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ func (sl *SealightsHook) SetApplicationStartInProcfile(stager *libbuildpack.Stag
157157
_, usePackageJson := sl.usePackageJson(originalStartCommand, stager)
158158
if usePackageJson {
159159
// Extract script name from command or use configured default
160-
scriptName, err := sl.extractNpmRunScriptName(originalStartCommand)
160+
scriptName, err := sl.ExtractNpmRunScriptName(originalStartCommand)
161161
if err != nil {
162162
sl.Log.Warning("Failed to extract script name from command '%s', using configured default: %s", originalStartCommand, err)
163163
scriptName = sl.parameters.NpmRunScript
@@ -192,7 +192,7 @@ func (sl *SealightsHook) SetApplicationStartInProcfile(stager *libbuildpack.Stag
192192
return nil
193193
}
194194

195-
func (sl *SealightsHook) extractNpmRunScriptName(command string) (string, error) {
195+
func (sl *SealightsHook) ExtractNpmRunScriptName(command string) (string, error) {
196196
// Remove leading "web:" prefix if present
197197
cleanCommand := strings.TrimSpace(command)
198198
if strings.HasPrefix(cleanCommand, "web:") {
@@ -235,7 +235,7 @@ func (sl *SealightsHook) extractNpmRunScriptName(command string) (string, error)
235235
return "", fmt.Errorf("failed to extract npm script name from command: %s", command)
236236
}
237237

238-
func (sl *SealightsHook) validateNpmRunScript(packageJson map[string]interface{}, scriptName string) error {
238+
func (sl *SealightsHook) ValidateNpmRunScript(packageJson map[string]interface{}, scriptName string) error {
239239
scripts, ok := packageJson["scripts"].(map[string]interface{})
240240
if !ok || scripts == nil {
241241
return fmt.Errorf("no scripts section found in package.json")
@@ -324,12 +324,12 @@ func (sl *SealightsHook) SetApplicationStartInPackageJson(stager *libbuildpack.S
324324
}
325325

326326
// Validate that the target script exists
327-
err = sl.validateNpmRunScript(packageJson, targetScript)
327+
err = sl.ValidateNpmRunScript(packageJson, targetScript)
328328
if err != nil {
329329
// Try fallback to "start" if configured script doesn't exist
330330
if targetScript != "start" {
331331
sl.Log.Warning("Script '%s' not found, falling back to 'start': %s", targetScript, err)
332-
fallbackErr := sl.validateNpmRunScript(packageJson, "start")
332+
fallbackErr := sl.ValidateNpmRunScript(packageJson, "start")
333333
if fallbackErr != nil {
334334
return fmt.Errorf("target script '%s' not found and fallback to 'start' failed: %s", targetScript, fallbackErr)
335335
}
@@ -387,7 +387,7 @@ func (sl *SealightsHook) SetApplicationStartInManifest(stager *libbuildpack.Stag
387387
_, usePackageJson := sl.usePackageJson(originalStartCommand, stager)
388388
if usePackageJson {
389389
// Extract script name from command or use configured default
390-
scriptName, err := sl.extractNpmRunScriptName(originalStartCommand)
390+
scriptName, err := sl.ExtractNpmRunScriptName(originalStartCommand)
391391
if err != nil {
392392
sl.Log.Warning("Failed to extract script name from command '%s', using configured default: %s", originalStartCommand, err)
393393
scriptName = sl.parameters.NpmRunScript

src/nodejs/hooks/sealights_test.go

Lines changed: 185 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,39 @@ var _ = Describe("Sealights hook", func() {
289289
expectedCommand := strings.ReplaceAll("./node_modules/.bin/slnodejs run --useinitialcolor true --token good_token --buildsessionid goodBsid --proxy goodProxy --proxyUsername goodName --proxyPassword goodPassword --labid goodLab --projectroot ./ --teststage \"Good tests\" index.js --build 192 --name Good", " ", "")
290290
Expect(cleanResult).To(Equal("web:" + expectedCommand))
291291
})
292+
293+
It("should use custom npmRunScript parameter for npm commands", func() {
294+
err = os.WriteFile(filepath.Join(stager.BuildDir(), procfileName), []byte("web: npm run dev"), 0755)
295+
Expect(err).To(BeNil())
296+
297+
customPackageJson := "{\n \"scripts\": {\n \"dev\": \"" + originalStartCommand + "\",\n \"start\": \"node index.js\"\n }\n}"
298+
err = os.WriteFile(filepath.Join(stager.BuildDir(), packageJsonName), []byte(customPackageJson), 0755)
299+
Expect(err).To(BeNil())
300+
301+
vcapTemplate := `{
302+
"user-provided":[{
303+
"label": "user-provided",
304+
"name": "sealights",
305+
"credentials": {
306+
"token": "` + token + `",
307+
"buildSessionId": "` + bsid + `",
308+
"npmRunScript": "dev"
309+
}
310+
}]
311+
}`
312+
err = os.Setenv("VCAP_SERVICES", vcapTemplate)
313+
Expect(err).To(BeNil())
314+
315+
err = sealights.AfterCompile(stager)
316+
Expect(err).To(BeNil())
317+
318+
packageJson, err := sealights.ReadPackageJson(stager)
319+
Expect(err).To(BeNil())
320+
321+
devScript := packageJson["scripts"].(map[string]interface{})["dev"].(string)
322+
Expect(devScript).To(ContainSubstring("slnodejs"))
323+
Expect(devScript).To(ContainSubstring("index.js --build 192 --name Good"))
324+
})
292325
})
293326

294327
Context("Sealights injection", func() {
@@ -363,7 +396,7 @@ var _ = Describe("Sealights hook", func() {
363396
})
364397

365398
It("fail to find scripts section in package.json", func() {
366-
err = sealights.SetApplicationStartInPackageJson(stager)
399+
err = sealights.SetApplicationStartInPackageJson(stager, "start")
367400
Expect(err).ShouldNot(BeNil())
368401
})
369402
})
@@ -379,7 +412,7 @@ var _ = Describe("Sealights hook", func() {
379412
})
380413

381414
It("fail to start under scripts section in package.json", func() {
382-
err = sealights.SetApplicationStartInPackageJson(stager)
415+
err = sealights.SetApplicationStartInPackageJson(stager, "start")
383416
Expect(err).ShouldNot(BeNil())
384417
})
385418
})
@@ -397,7 +430,7 @@ var _ = Describe("Sealights hook", func() {
397430
Expect(err).To(BeNil())
398431
err = os.Setenv("SL_TEST_STAGE", stage)
399432
Expect(err).To(BeNil())
400-
err = sealights.SetApplicationStartInPackageJson(stager)
433+
err = sealights.SetApplicationStartInPackageJson(stager, "start")
401434
Expect(err).To(BeNil())
402435
packageJson, err := sealights.ReadPackageJson(stager)
403436
Expect(err).To(BeNil())
@@ -409,7 +442,7 @@ var _ = Describe("Sealights hook", func() {
409442
Expect(err).NotTo(HaveOccurred())
410443
err = os.Setenv("SL_BUILD_SESSION_ID_FILE", "")
411444
Expect(err).NotTo(HaveOccurred())
412-
err = sealights.SetApplicationStartInPackageJson(stager)
445+
err = sealights.SetApplicationStartInPackageJson(stager, "start")
413446
Expect(err).To(MatchError(ContainSubstring(hooks.EmptyBuildError)))
414447
})
415448
It("test application run cmd creation", func() {
@@ -422,7 +455,7 @@ var _ = Describe("Sealights hook", func() {
422455
err = os.Setenv("SL_BUILD_SESSION_ID_FILE", "")
423456
Expect(err).NotTo(HaveOccurred())
424457
Expect(err).To(BeNil())
425-
err = sealights.SetApplicationStartInPackageJson(stager)
458+
err = sealights.SetApplicationStartInPackageJson(stager, "start")
426459
packageJson, err := sealights.ReadPackageJson(stager)
427460
Expect(err).To(BeNil())
428461
cleanResult := strings.ReplaceAll(packageJson["scripts"].(map[string]interface{})["start"].(string), " ", "")
@@ -571,5 +604,152 @@ var _ = Describe("Sealights hook", func() {
571604
Expect(command.args[1]).To(Equal("slnodejs@" + customVersion))
572605
})
573606
})
607+
608+
Context("extractNpmRunScriptName function", func() {
609+
It("should extract script name from npm run command", func() {
610+
scriptName, err := sealights.ExtractNpmRunScriptName("web: npm run start-dev")
611+
Expect(err).To(BeNil())
612+
Expect(scriptName).To(Equal("start-dev"))
613+
})
614+
615+
It("should extract script name from npm command without run", func() {
616+
scriptName, err := sealights.ExtractNpmRunScriptName("web: npm start")
617+
Expect(err).To(BeNil())
618+
Expect(scriptName).To(Equal("start"))
619+
})
620+
621+
It("should extract script name from command with cd prefix", func() {
622+
scriptName, err := sealights.ExtractNpmRunScriptName("web: cd app && npm run dev")
623+
Expect(err).To(BeNil())
624+
Expect(scriptName).To(Equal("dev"))
625+
})
626+
627+
It("should extract script name from simple npm run command", func() {
628+
scriptName, err := sealights.ExtractNpmRunScriptName("npm run test")
629+
Expect(err).To(BeNil())
630+
Expect(scriptName).To(Equal("test"))
631+
})
632+
633+
It("should handle commands with hyphens and underscores", func() {
634+
scriptName, err := sealights.ExtractNpmRunScriptName("npm run start-prod_env")
635+
Expect(err).To(BeNil())
636+
Expect(scriptName).To(Equal("start-prod_env"))
637+
})
638+
639+
It("should fail for non-npm commands", func() {
640+
_, err := sealights.ExtractNpmRunScriptName("web: node server.js")
641+
Expect(err).To(HaveOccurred())
642+
Expect(err.Error()).To(ContainSubstring("failed to extract npm script name"))
643+
})
644+
})
645+
646+
Context("validateNpmRunScript function", func() {
647+
var packageJson map[string]interface{}
648+
649+
BeforeEach(func() {
650+
packageJson = map[string]interface{}{
651+
"scripts": map[string]interface{}{
652+
"start": "node server.js",
653+
"test": "mocha",
654+
"dev": "nodemon server.js",
655+
"build": "webpack",
656+
},
657+
}
658+
})
659+
660+
It("should validate existing script", func() {
661+
err := sealights.ValidateNpmRunScript(packageJson, "start")
662+
Expect(err).To(BeNil())
663+
})
664+
665+
It("should validate existing custom script", func() {
666+
err := sealights.ValidateNpmRunScript(packageJson, "dev")
667+
Expect(err).To(BeNil())
668+
})
669+
670+
It("should fail for non-existing script", func() {
671+
err := sealights.ValidateNpmRunScript(packageJson, "nonexistent")
672+
Expect(err).To(HaveOccurred())
673+
Expect(err.Error()).To(ContainSubstring("script 'nonexistent' not found"))
674+
})
675+
676+
It("should fail for package.json without scripts section", func() {
677+
packageJsonWithoutScripts := map[string]interface{}{
678+
"name": "test-app",
679+
}
680+
err := sealights.ValidateNpmRunScript(packageJsonWithoutScripts, "start")
681+
Expect(err).To(HaveOccurred())
682+
Expect(err.Error()).To(ContainSubstring("no scripts section found"))
683+
})
684+
685+
It("should fail for package.json with null scripts section", func() {
686+
packageJsonWithNullScripts := map[string]interface{}{
687+
"scripts": nil,
688+
}
689+
err := sealights.ValidateNpmRunScript(packageJsonWithNullScripts, "start")
690+
Expect(err).To(HaveOccurred())
691+
Expect(err.Error()).To(ContainSubstring("no scripts section found"))
692+
})
693+
})
694+
695+
Context("custom npm script support", func() {
696+
BeforeEach(func() {
697+
err = os.WriteFile(filepath.Join(stager.BuildDir(), procfileName), []byte("web: npm run custom-script"), 0755)
698+
Expect(err).To(BeNil())
699+
700+
customPackageJson := "{\n \"scripts\": {\n \"custom-script\": \"" + originalStartCommand + "\",\n \"start\": \"node index.js\"\n }\n}"
701+
err = os.WriteFile(filepath.Join(stager.BuildDir(), packageJsonName), []byte(customPackageJson), 0755)
702+
Expect(err).To(BeNil())
703+
704+
os.Setenv("VCAP_SERVICES", `{"user-provided":[
705+
{
706+
"label": "user-provided",
707+
"name": "sealights",
708+
"credentials": {
709+
"token": "`+token+`"
710+
}
711+
}
712+
]}`)
713+
})
714+
715+
AfterEach(func() {
716+
os.Remove(filepath.Join(stager.BuildDir(), packageJsonName))
717+
})
718+
719+
It("should inject sealights into custom npm script", func() {
720+
err = os.Setenv("SL_LAB_ID", lab)
721+
Expect(err).To(BeNil())
722+
err = os.Setenv("SL_PROJECT_ROOT", root)
723+
Expect(err).To(BeNil())
724+
err = os.Setenv("SL_TEST_STAGE", stage)
725+
Expect(err).To(BeNil())
726+
err = os.Setenv("SL_BUILD_SESSION_ID_FILE", "")
727+
Expect(err).NotTo(HaveOccurred())
728+
729+
err = sealights.SetApplicationStartInProcfile(stager)
730+
Expect(err).To(BeNil())
731+
732+
packageJson, err := sealights.ReadPackageJson(stager)
733+
Expect(err).To(BeNil())
734+
735+
customScript := packageJson["scripts"].(map[string]interface{})["custom-script"].(string)
736+
cleanResult := strings.ReplaceAll(customScript, " ", "")
737+
Expect(cleanResult).To(Equal(expected))
738+
})
739+
740+
It("should fallback to start script when custom script doesn't exist", func() {
741+
err = os.WriteFile(filepath.Join(stager.BuildDir(), procfileName), []byte("web: npm run nonexistent"), 0755)
742+
Expect(err).To(BeNil())
743+
744+
err = sealights.SetApplicationStartInPackageJson(stager, "nonexistent")
745+
Expect(err).To(BeNil())
746+
747+
packageJson, err := sealights.ReadPackageJson(stager)
748+
Expect(err).To(BeNil())
749+
750+
startScript := packageJson["scripts"].(map[string]interface{})["start"].(string)
751+
Expect(startScript).To(ContainSubstring("slnodejs"))
752+
})
753+
})
574754
})
575755
})

0 commit comments

Comments
 (0)