Files
sencho/backend/src/__tests__/compose-build-services.test.ts
T
Anso f2b5c68d84 feat: add build-aware compose stack updates (#1561)
Detect services with build: in the update preview and run compose build --pull
plus pull --ignore-buildable when Update is triggered on those stacks, while
keeping the existing pull-only path for image-only stacks.
2026-07-05 04:45:45 -04:00

65 lines
1.7 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import {
extractBuildServicesFromCompose,
extractBuildServicesFromRenderedConfig,
} from '../services/ImageUpdateService';
describe('extractBuildServicesFromCompose', () => {
it('returns service names that declare build', () => {
const yaml = `
services:
web:
build: .
api:
image: nginx:1.25
worker:
build:
context: ./worker
dockerfile: Dockerfile
`;
expect(extractBuildServicesFromCompose(yaml).sort()).toEqual(['web', 'worker']);
});
it('returns empty for image-only stacks', () => {
const yaml = `
services:
web:
image: nginx:1.25
`;
expect(extractBuildServicesFromCompose(yaml)).toEqual([]);
});
it('ignores empty build sections', () => {
const yaml = `
services:
web:
build: ""
api:
build: {}
`;
expect(extractBuildServicesFromCompose(yaml)).toEqual([]);
});
});
describe('extractBuildServicesFromRenderedConfig', () => {
it('reads build services from a rendered compose json model', () => {
const rendered = JSON.stringify({
services: {
app: { build: { context: '/app' }, image: 'myapp:latest' },
cache: { image: 'redis:7' },
},
});
expect(extractBuildServicesFromRenderedConfig(rendered)).toEqual(['app']);
});
it('includes override-only build services from merged model', () => {
const rendered = JSON.stringify({
services: {
web: { image: 'nginx:1.25' },
sidecar: { build: './sidecar' },
},
});
expect(extractBuildServicesFromRenderedConfig(rendered)).toEqual(['sidecar']);
});
});