Skip to content

Commit 4632c04

Browse files
AINATIVEM-44 replace compose string functions with ComposeBuilder using yaml package
1 parent 4e40366 commit 4632c04

2 files changed

Lines changed: 247 additions & 281 deletions

File tree

src/generators/node/database.test.ts

Lines changed: 53 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
450494
describe('generateDatabase — Dockerfile', () => {
451495
it('generates Dockerfile with USER node when no app extensions', async () => {
452496
const { generateDatabase } = await import('./database.js');

0 commit comments

Comments
 (0)