@@ -17,6 +17,8 @@ func TestLoadProjectConfigValid(t *testing.T) {
1717 if err := os .MkdirAll (filepath .Join (root , "backend" ), 0o755 ); err != nil {
1818 t .Fatalf ("could not create backend dir: %v" , err )
1919 }
20+ writePackageJSON (t , filepath .Join (root , "frontend" ))
21+ writePackageJSON (t , filepath .Join (root , "backend" ))
2022
2123 cfg := ProjectConfig {
2224 Name : "my-app" ,
@@ -46,6 +48,7 @@ func TestLoadProjectConfigMissingServiceFolder(t *testing.T) {
4648 if err := os .MkdirAll (filepath .Join (root , "frontend" ), 0o755 ); err != nil {
4749 t .Fatalf ("could not create frontend dir: %v" , err )
4850 }
51+ writePackageJSON (t , filepath .Join (root , "frontend" ))
4952
5053 cfg := ProjectConfig {
5154 Name : "my-app" ,
@@ -75,6 +78,7 @@ func TestLoadProjectConfigInvalidShareDefaultService(t *testing.T) {
7578 if err := os .MkdirAll (filepath .Join (root , "frontend" ), 0o755 ); err != nil {
7679 t .Fatalf ("could not create frontend dir: %v" , err )
7780 }
81+ writePackageJSON (t , filepath .Join (root , "frontend" ))
7882
7983 cfg := ProjectConfig {
8084 Name : "my-app" ,
@@ -121,6 +125,87 @@ func TestLoadProjectConfigInvalidPathEscape(t *testing.T) {
121125 }
122126}
123127
128+ func TestLoadProjectConfigOfficialTemplateRequiresNPMRun (t * testing.T ) {
129+ root := t .TempDir ()
130+
131+ if err := os .MkdirAll (filepath .Join (root , "frontend" ), 0o755 ); err != nil {
132+ t .Fatalf ("could not create frontend dir: %v" , err )
133+ }
134+ writePackageJSON (t , filepath .Join (root , "frontend" ))
135+
136+ cfg := ProjectConfig {
137+ Name : "my-app" ,
138+ Template : "mern" ,
139+ Services : []ServiceConfig {
140+ {Name : "frontend" , CWD : "frontend" , Run : "node src/index.js" , Port : 3000 },
141+ },
142+ Share : ShareConfig {DefaultService : "frontend" , DefaultPort : 3000 },
143+ }
144+
145+ writeProjectConfig (t , root , cfg )
146+
147+ _ , err := LoadProjectConfig (root )
148+ if err == nil {
149+ t .Fatalf ("expected npm run validation error" )
150+ }
151+
152+ if ! strings .Contains (err .Error (), "service frontend: run must use npm run" ) {
153+ t .Fatalf ("unexpected error: %v" , err )
154+ }
155+ }
156+
157+ func TestLoadProjectConfigOfficialTemplateRequiresPackageJSON (t * testing.T ) {
158+ root := t .TempDir ()
159+
160+ if err := os .MkdirAll (filepath .Join (root , "frontend" ), 0o755 ); err != nil {
161+ t .Fatalf ("could not create frontend dir: %v" , err )
162+ }
163+
164+ cfg := ProjectConfig {
165+ Name : "my-app" ,
166+ Template : "mern" ,
167+ Services : []ServiceConfig {
168+ {Name : "frontend" , CWD : "frontend" , Run : "npm run dev" , Port : 3000 },
169+ },
170+ Share : ShareConfig {DefaultService : "frontend" , DefaultPort : 3000 },
171+ }
172+
173+ writeProjectConfig (t , root , cfg )
174+
175+ _ , err := LoadProjectConfig (root )
176+ if err == nil {
177+ t .Fatalf ("expected package.json validation error" )
178+ }
179+
180+ if ! strings .Contains (err .Error (), "service frontend: package.json missing" ) {
181+ t .Fatalf ("unexpected error: %v" , err )
182+ }
183+ }
184+
185+ func TestLoadProjectConfigCustomTemplateAllowsNonNPMRun (t * testing.T ) {
186+ root := t .TempDir ()
187+
188+ if err := os .MkdirAll (filepath .Join (root , "frontend" ), 0o755 ); err != nil {
189+ t .Fatalf ("could not create frontend dir: %v" , err )
190+ }
191+
192+ cfg := ProjectConfig {
193+ Name : "my-app" ,
194+ Template : "custom" ,
195+ Services : []ServiceConfig {
196+ {Name : "frontend" , CWD : "frontend" , Run : "node src/index.js" , Port : 3000 },
197+ },
198+ Share : ShareConfig {DefaultService : "frontend" , DefaultPort : 3000 },
199+ }
200+
201+ writeProjectConfig (t , root , cfg )
202+
203+ _ , err := LoadProjectConfig (root )
204+ if err != nil {
205+ t .Fatalf ("unexpected error for custom template: %v" , err )
206+ }
207+ }
208+
124209func writeProjectConfig (t * testing.T , root string , cfg ProjectConfig ) {
125210 t .Helper ()
126211
@@ -134,3 +219,11 @@ func writeProjectConfig(t *testing.T, root string, cfg ProjectConfig) {
134219 t .Fatalf ("could not write config: %v" , err )
135220 }
136221}
222+
223+ func writePackageJSON (t * testing.T , dir string ) {
224+ t .Helper ()
225+
226+ if err := os .WriteFile (filepath .Join (dir , "package.json" ), []byte ("{}\n " ), 0o644 ); err != nil {
227+ t .Fatalf ("could not write package.json in %s: %v" , dir , err )
228+ }
229+ }
0 commit comments