import type { ComposeSpecification } from "@dokploy/server"; import { addSuffixToVolumesInServices, generateRandomHash, } from "@dokploy/server"; import { expect, test } from "vitest"; import { parse } from "yaml"; test("Generate random hash with 8 characters", () => { const hash = generateRandomHash(); expect(hash).toBeDefined(); expect(hash.length).toBe(8); }); const composeFile1 = ` version: "3.8" services: db: image: postgres:latest volumes: - db_data:/var/lib/postgresql/data `; test("Add suffix to volumes declared directly in services", () => { const composeData = parse(composeFile1) as ComposeSpecification; const suffix = generateRandomHash(); if (!composeData.services) { return; } const updatedComposeData = addSuffixToVolumesInServices( composeData.services, suffix, ); const actualComposeData = { ...composeData, services: updatedComposeData }; expect(actualComposeData.services?.db?.volumes).toContain( `db_data-${suffix}:/var/lib/postgresql/data`, ); }); const composeFileAccessMode = ` version: "3.8" services: web: image: nginx:alpine volumes: - web_config:/etc/nginx/conf.d:ro - certs/sub:/etc/certs:Z `; test("Add suffix to volumes preserves access mode (:ro, :z, :Z)", () => { const composeData = parse(composeFileAccessMode) as ComposeSpecification; const suffix = generateRandomHash(); if (!composeData.services) { return; } const updatedComposeData = addSuffixToVolumesInServices( composeData.services, suffix, ); expect(updatedComposeData.web?.volumes).toContain( `web_config-${suffix}:/etc/nginx/conf.d:ro`, ); expect(updatedComposeData.web?.volumes).toContain( `certs-${suffix}/sub:/etc/certs:Z`, ); }); const composeFileTypeVolume = ` version: "3.8" services: db: image: postgres:latest volumes: - type: volume source: db-test target: /var/lib/postgresql/data volumes: db-test: driver: local `; test("Add suffix to volumes declared directly in services (Case 2)", () => { const composeData = parse(composeFileTypeVolume) as ComposeSpecification; const suffix = generateRandomHash(); if (!composeData.services) { return; } const updatedComposeData = addSuffixToVolumesInServices( composeData.services, suffix, ); const actualComposeData = { ...composeData, services: updatedComposeData }; expect(actualComposeData.services?.db?.volumes).toEqual([ { type: "volume", source: `db-test-${suffix}`, target: "/var/lib/postgresql/data", }, ]); });