@@ -226,7 +226,7 @@ describe('generateDatabase — docker-compose.yml', () => {
226226 expect ( content ) . toContain ( 'postgres:16' ) ;
227227 expect ( content ) . toContain ( 'db_data:/var/lib/postgresql/data' ) ;
228228 expect ( content ) . toContain ( 'pg_isready' ) ;
229- expect ( content ) . toContain ( "'-d', 'test-app'" ) ;
229+ expect ( content ) . toContain ( `POSTGRES_DB: ${ pgOptions . projectName } ` ) ;
230230 expect ( content ) . toContain ( 'healthcheck' ) ;
231231 expect ( content ) . toContain ( 'backend' ) ;
232232 expect ( content ) . toContain ( 'tsx watch src/index.ts' ) ;
@@ -324,10 +324,9 @@ describe('generateDatabase — tokenRepository.ts', () => {
324324 expect ( compose ) . toContain ( 'app:' ) ;
325325 expect ( compose ) . toContain ( 'dockerfile: Dockerfile.app' ) ;
326326 expect ( compose ) . toContain ( 'user: root' ) ;
327- expect ( compose ) . toContain (
328- 'command: sh -c "chown -R node:node /app/node_modules && su-exec node sh -c \'echo Installing dependencies... && npm install --no-package-lock --no-audit --no-fund --loglevel=error && ./node_modules/.bin/tsx watch src/index.ts\'"' ,
329- ) ;
330- expect ( compose ) . toContain ( "'3000:3000'" ) ;
327+ expect ( compose ) . toContain ( 'tsx watch src/index.ts' ) ;
328+ expect ( compose ) . toContain ( 'su-exec node' ) ;
329+ expect ( compose ) . toContain ( '3000:3000' ) ;
331330 expect ( compose ) . toContain ( './package.json:/app/package.json:ro' ) ;
332331 expect ( compose ) . toContain ( 'app_node_modules:/app/node_modules' ) ;
333332 expect ( compose ) . toContain ( 'DATABASE_URL: file:./data.db' ) ;
@@ -337,10 +336,9 @@ describe('generateDatabase — tokenRepository.ts', () => {
337336 expect ( compose ) . toContain ( 'path: ./tsconfig.json' ) ;
338337 expect ( compose ) . toContain ( 'app-extension-ui:' ) ;
339338 expect ( compose ) . toContain ( 'dockerfile: Dockerfile.app-extension-ui' ) ;
340- expect ( compose ) . toContain (
341- 'command: sh -c "chown -R node:node /app/node_modules && su-exec node sh -c \'echo Installing dependencies... && npm install --no-package-lock --no-audit --no-fund --loglevel=error && npm run dev:frontend\'"' ,
342- ) ;
343- expect ( compose ) . toContain ( "'5173:5173'" ) ;
339+ expect ( compose ) . toContain ( 'npm run dev:frontend' ) ;
340+ expect ( compose ) . toContain ( 'su-exec node' ) ;
341+ expect ( compose ) . toContain ( '5173:5173' ) ;
344342 expect ( compose ) . toContain ( './package.json:/app/package.json:ro' ) ;
345343 expect ( compose ) . toContain ( 'app_extension_ui_node_modules:/app/node_modules' ) ;
346344 expect ( compose ) . toContain ( 'develop:' ) ;
@@ -447,6 +445,52 @@ describe('generateDatabase — tokenRepository.ts', () => {
447445 } ) ;
448446} ) ;
449447
448+ describe ( 'generateDatabase — ComposeBuilder behavior' , ( ) => {
449+ it ( 'sqlite compose has no db service and no database image' , async ( ) => {
450+ const { generateDatabase } = await import ( './database.js' ) ;
451+ await generateDatabase ( tmpDir , sqliteOptions ) ;
452+ const content = await read ( 'docker-compose.yml' ) ;
453+ expect ( content ) . not . toContain ( 'image:' ) ;
454+ expect ( content ) . not . toContain ( 'db:' ) ;
455+ } ) ;
456+
457+ it ( 'postgres compose has db service with correct image, env, and healthcheck' , async ( ) => {
458+ const { generateDatabase } = await import ( './database.js' ) ;
459+ await generateDatabase ( tmpDir , pgOptions ) ;
460+ const content = await read ( 'docker-compose.yml' ) ;
461+ expect ( content ) . toContain ( 'postgres:16' ) ;
462+ expect ( content ) . toContain ( 'POSTGRES_USER: app' ) ;
463+ expect ( content ) . toContain ( 'POSTGRES_PASSWORD: app' ) ;
464+ expect ( content ) . toContain ( `POSTGRES_DB: ${ pgOptions . projectName } ` ) ;
465+ expect ( content ) . toContain ( '5432:5432' ) ;
466+ expect ( content ) . toContain ( 'pg_isready' ) ;
467+ expect ( content ) . toContain ( 'interval: 5s' ) ;
468+ expect ( content ) . toContain ( 'retries: 5' ) ;
469+ } ) ;
470+
471+ it ( 'mysql compose has db service with correct image, env, and healthcheck' , async ( ) => {
472+ const { generateDatabase } = await import ( './database.js' ) ;
473+ await generateDatabase ( tmpDir , mysqlOptions ) ;
474+ const content = await read ( 'docker-compose.yml' ) ;
475+ expect ( content ) . toContain ( 'mysql:8' ) ;
476+ expect ( content ) . toContain ( 'MYSQL_ROOT_PASSWORD: app' ) ;
477+ expect ( content ) . toContain ( 'MYSQL_USER: app' ) ;
478+ expect ( content ) . toContain ( `MYSQL_DATABASE: ${ mysqlOptions . projectName } ` ) ;
479+ expect ( content ) . toContain ( '127.0.0.1:3307:3306' ) ;
480+ expect ( content ) . toContain ( 'mysqladmin' ) ;
481+ expect ( content ) . toContain ( 'interval: 5s' ) ;
482+ expect ( content ) . toContain ( 'retries: 5' ) ;
483+ } ) ;
484+
485+ it ( 'when false: postgres compose without app extensions has no app-extension-ui service' , async ( ) => {
486+ const { generateDatabase } = await import ( './database.js' ) ;
487+ await generateDatabase ( tmpDir , pgOptions ) ;
488+ const content = await read ( 'docker-compose.yml' ) ;
489+ expect ( content ) . not . toContain ( 'app-extension-ui' ) ;
490+ expect ( content ) . not . toContain ( 'Dockerfile.app-extension-ui' ) ;
491+ } ) ;
492+ } ) ;
493+
450494describe ( 'generateDatabase — Dockerfile' , ( ) => {
451495 it ( 'generates Dockerfile with USER node when no app extensions' , async ( ) => {
452496 const { generateDatabase } = await import ( './database.js' ) ;
0 commit comments