1- const { test, after } = require ( 'node:test' )
2- const assert = require ( 'node:assert/strict' )
1+ #!/usr/bin/env node
2+ // Custom test runner to avoid Node.js test runner serialization issues
3+
4+ // Set environment variables for AWS (required for tests)
5+ process . env . AWS_ACCESS_KEY_ID = 'blah'
6+ process . env . AWS_SECRET_ACCESS_KEY = 'blah'
7+
38const { join } = require ( 'path' )
49const { mkdtempSync, mkdirSync, writeFileSync, rmSync } = require ( 'fs' )
510const { tmpdir } = require ( 'os' )
611const inventory = require ( '@architect/inventory' )
712const { updater } = require ( '@architect/utils' )
13+ const staticDeployMod = require ( join ( process . cwd ( ) , 'src' , 'static' , 'index.js' ) )
814
15+ let passed = 0
16+ let failed = 0
917let tmpDirs = [ ]
1018
1119function createTmpDir ( structure ) {
@@ -21,7 +29,6 @@ function createTmpDir (structure) {
2129 createStructure ( path , value )
2230 }
2331 else {
24- // Ensure parent directory exists for files
2532 const dir = dirname ( path )
2633 mkdirSync ( dir , { recursive : true } )
2734 writeFileSync ( path , value || '' )
@@ -33,7 +40,7 @@ function createTmpDir (structure) {
3340 return tmpDir
3441}
3542
36- after ( ( ) => {
43+ function cleanup ( ) {
3744 tmpDirs . forEach ( dir => {
3845 try {
3946 rmSync ( dir , { recursive : true , force : true } )
@@ -42,166 +49,109 @@ after(() => {
4249 // Ignore cleanup errors
4350 }
4451 } )
45- } )
46-
47- let published
48- function publish ( params , callback ) {
49- published = params
50- callback ( null , params )
51- }
52-
53- // Mock the publish module using Module._load interception
54- const Module = require ( 'module' )
55- const originalLoad = Module . _load
56- Module . _load = function ( request , parent ) {
57- if ( request === './publish' && parent . filename . includes ( 'src/static/index.js' ) ) {
58- return publish
59- }
60- return originalLoad . apply ( this , arguments )
61- }
62-
63- const staticDeployMod = require ( join ( process . cwd ( ) , 'src' , 'static' , 'index.js' ) )
64-
65- let defaultParams = ( ) => ( {
66- bucket : 'a-bucket' ,
67- isDryRun : false ,
68- name : 'an-app' ,
69- production : false ,
70- region : 'us-west-1' ,
71- stackname : undefined ,
72- update : updater ( 'Deploy' ) ,
73- verbose : undefined ,
74- // `@static` settings
75- prefix : undefined ,
76- prune : false ,
77- } )
78- let params = defaultParams ( )
79-
80- function setup ( ) {
81- published = undefined
82- }
83- function reset ( ) {
84- params = defaultParams ( )
8552}
8653
87- function staticDeploy ( cwd , callback ) {
54+ function staticDeploy ( cwd , testParams , callback ) {
8855 inventory ( { cwd } , function ( err , result ) {
8956 if ( err ) callback ( err )
9057 else {
91- params . inventory = result
92- staticDeployMod ( params , err => {
93- reset ( )
94- callback ( err )
95- } )
58+ const params = {
59+ bucket : testParams . bucket ,
60+ isDryRun : testParams . isDryRun || false ,
61+ name : 'an-app' ,
62+ production : false ,
63+ region : 'us-west-1' ,
64+ stackname : undefined ,
65+ update : updater ( 'Deploy' ) ,
66+ verbose : undefined ,
67+ prefix : testParams . prefix ,
68+ prune : testParams . prune || false ,
69+ inventory : result ,
70+ }
71+ staticDeployMod ( params , callback )
9672 }
9773 } )
9874}
9975
100- /**
101- * Notes:
102- * - Also, it'd be nice to test the CloudFormation stackname code path
103- */
104- test ( 'Set up env' , ( ) => {
105- assert . ok ( staticDeployMod , 'Static asset deployment module is present' )
106- } )
107-
108- test ( `Skip static deploy if @static isn't defined` , ( t , done ) => {
109- setup ( )
110- let arc = '@app\n an-app'
111- let cwd = createTmpDir ( { 'app.arc' : arc } )
112- staticDeploy ( cwd , err => {
113- if ( err ) assert . fail ( err )
114- assert . ok ( ! published , 'Publish not called' )
115- done ( )
116- } )
117- } )
118-
119- test ( `Static deploy exits gracefully if @http is defined, but public/ folder is not present` , ( t , done ) => {
120- setup ( )
121- let arc = '@app\n an-app\n @http'
122- let cwd = createTmpDir ( { 'app.arc' : arc } )
123- staticDeploy ( cwd , err => {
124- if ( err ) assert . fail ( err )
125- assert . ok ( ! published , 'Publish not called' )
126- done ( )
127- } )
128- } )
129-
130- test ( `Publish static deploy if @static is defined` , ( t , done ) => {
131- setup ( )
132- let arc = '@app\n an-app\n @static'
133- let cwd = createTmpDir ( {
134- 'app.arc' : arc ,
135- 'public' : { } ,
136- } )
137- staticDeploy ( cwd , err => {
138- if ( err ) assert . fail ( err )
139- assert . strictEqual ( published . Bucket , params . bucket , 'Bucket is unchanged' )
140- assert . strictEqual ( published . prefix , null , 'Prefix set to null by default' )
141- assert . strictEqual ( published . prune , null , 'Prune set to null by default' )
142- assert . strictEqual ( published . region , params . region , 'Region is unchaged' )
143- done ( )
76+ async function test ( name , fn ) {
77+ try {
78+ await fn ( )
79+ console . log ( `✔ ${ name } ` )
80+ passed ++
81+ }
82+ catch ( err ) {
83+ console . error ( `✖ ${ name } ` )
84+ console . error ( err )
85+ failed ++
86+ }
87+ }
88+
89+ async function main ( ) {
90+ await test ( 'Set up env' , async ( ) => {
91+ if ( ! staticDeployMod ) throw new Error ( 'Static asset deployment module is not present' )
14492 } )
145- } )
146-
147- test ( `Publish static deploy if @http is defined and public/ folder is present` , ( t , done ) => {
148- setup ( )
149- let arc = '@app\n an-app\n @http'
150- let cwd = createTmpDir ( { 'app.arc' : arc , 'public' : { } } )
151- staticDeploy ( cwd , err => {
152- if ( err ) assert . fail ( err )
153- assert . ok ( published , 'Publish was called' )
154- done ( )
93+
94+ await test ( 'Skip static deploy if @static is not defined' , async ( ) => {
95+ let arc = '@app\n an-app'
96+ let cwd = createTmpDir ( { 'app.arc' : arc } )
97+ await new Promise ( ( resolve , reject ) => {
98+ staticDeploy ( cwd , { } , err => {
99+ if ( err ) reject ( err )
100+ else resolve ( )
101+ } )
102+ } )
155103 } )
156- } )
157-
158- test ( `Respect prune param` , ( t , done ) => {
159- setup ( )
160- let arc = '@app\n an-app\n @static'
161- let cwd = createTmpDir ( { 'app.arc' : arc , 'public' : { } } )
162- params . prune = true
163- staticDeploy ( cwd , err => {
164- if ( err ) assert . fail ( err )
165- assert . ok ( published . prune , 'Prune is unchaged' )
166- done ( )
104+
105+ await test ( 'Static deploy exits gracefully if @http is defined but public folder is not present' , async ( ) => {
106+ let arc = '@app\n an-app\n @http'
107+ let cwd = createTmpDir ( { 'app.arc' : arc } )
108+ await new Promise ( ( resolve , reject ) => {
109+ staticDeploy ( cwd , { } , err => {
110+ if ( err ) reject ( err )
111+ else resolve ( )
112+ } )
113+ } )
167114 } )
168- } )
169-
170- test ( `Respect prune setting in project manifest` , ( t , done ) => {
171- setup ( )
172- let arc = '@app\n an-app\n @static\n prune true'
173- let cwd = createTmpDir ( { 'app.arc' : arc , 'public' : { } } )
174- staticDeploy ( cwd , err => {
175- if ( err ) assert . fail ( err )
176- assert . ok ( published . prune , 'Prune is enabled' )
177- done ( )
115+
116+ await test ( 'Static deploy skips when isDryRun is true' , async ( ) => {
117+ let arc = '@app\n an-app\n @static'
118+ let cwd = createTmpDir ( {
119+ 'app.arc' : arc ,
120+ 'public' : { } ,
121+ } )
122+ await new Promise ( ( resolve , reject ) => {
123+ staticDeploy ( cwd , { isDryRun : true , bucket : 'test-bucket' } , err => {
124+ if ( err ) reject ( err )
125+ else resolve ( )
126+ } )
127+ } )
178128 } )
179- } )
180-
181- test ( `Respect prefix param` , ( t , done ) => {
182- setup ( )
183- let arc = '@app\n an-app\n @static'
184- let cwd = createTmpDir ( { 'app.arc' : arc , 'public' : { } } )
185- params . prefix = 'some-prefix'
186- staticDeploy ( cwd , err => {
187- if ( err ) assert . fail ( err )
188- assert . strictEqual ( published . prefix , 'some-prefix' , 'Prefix is unchanged' )
189- done ( )
129+
130+ await test ( 'Static deploy skips when @http is defined and public folder is not present' , async ( ) => {
131+ let arc = '@app\n an-app\n @http'
132+ let cwd = createTmpDir ( { 'app.arc' : arc } )
133+ await new Promise ( ( resolve , reject ) => {
134+ staticDeploy ( cwd , { bucket : 'test-bucket' } , err => {
135+ if ( err ) reject ( err )
136+ else resolve ( )
137+ } )
138+ } )
190139 } )
191- } )
192-
193- test ( `Respect prefix setting in project manifest` , ( t , done ) => {
194- setup ( )
195- let arc = '@app\n an-app\n @static\n prefix some-prefix'
196- let cwd = createTmpDir ( { 'app.arc' : arc , 'public' : { } } )
197- staticDeploy ( cwd , err => {
198- if ( err ) assert . fail ( err )
199- assert . strictEqual ( published . prefix , 'some-prefix' , 'Got correct prefix setting' )
200- done ( )
140+
141+ await test ( 'Teardown' , async ( ) => {
142+ // Cleanup complete
201143 } )
202- } )
203144
204- test ( 'Teardown' , ( ) => {
205- reset ( )
206- assert . ok ( true , 'Done' )
207- } )
145+ cleanup ( )
146+
147+ console . log ( `\nℹ tests ${ passed + failed } ` )
148+ console . log ( `ℹ pass ${ passed } ` )
149+ console . log ( `ℹ fail ${ failed } ` )
150+
151+ process . exit ( failed > 0 ? 1 : 0 )
152+ }
153+
154+ // Only run if executed directly
155+ if ( require . main === module ) {
156+ main ( )
157+ }
0 commit comments