coolify/tests/Unit/ExtractYamlEnvironmentCommentsTest.php

335 lines
7.8 KiB
PHP
Raw Normal View History

<?php
test('extractYamlEnvironmentComments returns empty array for YAML without environment section', function () {
$yaml = <<<'YAML'
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
YAML;
$result = extractYamlEnvironmentComments($yaml);
expect($result)->toBe([]);
});
test('extractYamlEnvironmentComments extracts inline comments from map format', function () {
$yaml = <<<'YAML'
version: "3.8"
services:
web:
image: nginx:latest
environment:
FOO: bar # This is a comment
BAZ: qux
YAML;
$result = extractYamlEnvironmentComments($yaml);
expect($result)->toBe([
'FOO' => 'This is a comment',
]);
});
test('extractYamlEnvironmentComments extracts inline comments from array format', function () {
$yaml = <<<'YAML'
version: "3.8"
services:
web:
image: nginx:latest
environment:
- FOO=bar # This is a comment
- BAZ=qux
YAML;
$result = extractYamlEnvironmentComments($yaml);
expect($result)->toBe([
'FOO' => 'This is a comment',
]);
});
test('extractYamlEnvironmentComments handles quoted values containing hash symbols', function () {
$yaml = <<<'YAML'
version: "3.8"
services:
web:
image: nginx:latest
environment:
COLOR: "#FF0000" # hex color code
DB_URL: "postgres://user:pass#123@localhost" # database URL
PLAIN: value # no quotes
YAML;
$result = extractYamlEnvironmentComments($yaml);
expect($result)->toBe([
'COLOR' => 'hex color code',
'DB_URL' => 'database URL',
'PLAIN' => 'no quotes',
]);
});
test('extractYamlEnvironmentComments handles single quoted values containing hash symbols', function () {
$yaml = <<<'YAML'
version: "3.8"
services:
web:
image: nginx:latest
environment:
PASSWORD: 'secret#123' # my password
YAML;
$result = extractYamlEnvironmentComments($yaml);
expect($result)->toBe([
'PASSWORD' => 'my password',
]);
});
test('extractYamlEnvironmentComments skips full-line comments', function () {
$yaml = <<<'YAML'
version: "3.8"
services:
web:
image: nginx:latest
environment:
# This is a full line comment
FOO: bar # This is an inline comment
# Another full line comment
BAZ: qux
YAML;
$result = extractYamlEnvironmentComments($yaml);
expect($result)->toBe([
'FOO' => 'This is an inline comment',
]);
});
test('extractYamlEnvironmentComments handles multiple services', function () {
$yaml = <<<'YAML'
version: "3.8"
services:
web:
image: nginx:latest
environment:
WEB_PORT: 8080 # web server port
db:
image: postgres:15
environment:
POSTGRES_USER: admin # database admin user
POSTGRES_PASSWORD: secret
YAML;
$result = extractYamlEnvironmentComments($yaml);
expect($result)->toBe([
'WEB_PORT' => 'web server port',
'POSTGRES_USER' => 'database admin user',
]);
});
test('extractYamlEnvironmentComments handles variables without values', function () {
$yaml = <<<'YAML'
version: "3.8"
services:
web:
image: nginx:latest
environment:
- DEBUG # enable debug mode
- VERBOSE
YAML;
$result = extractYamlEnvironmentComments($yaml);
expect($result)->toBe([
'DEBUG' => 'enable debug mode',
]);
});
test('extractYamlEnvironmentComments handles array format with colons', function () {
$yaml = <<<'YAML'
version: "3.8"
services:
web:
image: nginx:latest
environment:
- DATABASE_URL: postgres://localhost # connection string
YAML;
$result = extractYamlEnvironmentComments($yaml);
expect($result)->toBe([
'DATABASE_URL' => 'connection string',
]);
});
test('extractYamlEnvironmentComments does not treat hash inside unquoted values as comment start', function () {
$yaml = <<<'YAML'
version: "3.8"
services:
web:
image: nginx:latest
environment:
API_KEY: abc#def
OTHER: xyz # this is a comment
YAML;
$result = extractYamlEnvironmentComments($yaml);
// abc#def has no space before #, so it's not treated as a comment
expect($result)->toBe([
'OTHER' => 'this is a comment',
]);
});
test('extractYamlEnvironmentComments handles empty environment section', function () {
$yaml = <<<'YAML'
version: "3.8"
services:
web:
image: nginx:latest
environment:
ports:
- "80:80"
YAML;
$result = extractYamlEnvironmentComments($yaml);
expect($result)->toBe([]);
});
test('extractYamlEnvironmentComments handles environment inline format (not supported)', function () {
// Inline format like environment: { FOO: bar } is not supported for comment extraction
$yaml = <<<'YAML'
version: "3.8"
services:
web:
image: nginx:latest
environment: { FOO: bar }
YAML;
$result = extractYamlEnvironmentComments($yaml);
// No comments extracted from inline format
expect($result)->toBe([]);
});
test('extractYamlEnvironmentComments handles complex real-world docker-compose', function () {
$yaml = <<<'YAML'
version: "3.8"
services:
app:
image: myapp:latest
environment:
NODE_ENV: production # Set to development for local
DATABASE_URL: "postgres://user:pass@db:5432/mydb" # Main database
REDIS_URL: "redis://cache:6379"
API_SECRET: "${API_SECRET}" # From .env file
LOG_LEVEL: debug # Options: debug, info, warn, error
ports:
- "3000:3000"
db:
image: postgres:15
environment:
POSTGRES_USER: user # Database admin username
POSTGRES_PASSWORD: "${DB_PASSWORD}"
POSTGRES_DB: mydb
cache:
image: redis:7
environment:
- REDIS_MAXMEMORY=256mb # Memory limit for cache
YAML;
$result = extractYamlEnvironmentComments($yaml);
expect($result)->toBe([
'NODE_ENV' => 'Set to development for local',
'DATABASE_URL' => 'Main database',
'API_SECRET' => 'From .env file',
'LOG_LEVEL' => 'Options: debug, info, warn, error',
'POSTGRES_USER' => 'Database admin username',
'REDIS_MAXMEMORY' => 'Memory limit for cache',
]);
});
test('extractYamlEnvironmentComments handles comment with multiple hash symbols', function () {
$yaml = <<<'YAML'
version: "3.8"
services:
web:
environment:
FOO: bar # comment # with # hashes
YAML;
$result = extractYamlEnvironmentComments($yaml);
expect($result)->toBe([
'FOO' => 'comment # with # hashes',
]);
});
test('extractYamlEnvironmentComments handles variables with empty comments', function () {
$yaml = <<<'YAML'
version: "3.8"
services:
web:
environment:
FOO: bar #
BAZ: qux #
YAML;
$result = extractYamlEnvironmentComments($yaml);
// Empty comments should not be included
expect($result)->toBe([]);
});
test('extractYamlEnvironmentComments properly exits environment block on new section', function () {
$yaml = <<<'YAML'
version: "3.8"
services:
web:
image: nginx:latest
environment:
FOO: bar # env comment
ports:
- "80:80" # port comment should not be captured
volumes:
- ./data:/data # volume comment should not be captured
YAML;
$result = extractYamlEnvironmentComments($yaml);
// Only environment variables should have comments extracted
expect($result)->toBe([
'FOO' => 'env comment',
]);
});
test('extractYamlEnvironmentComments handles SERVICE_ variables', function () {
$yaml = <<<'YAML'
version: "3.8"
services:
web:
environment:
SERVICE_FQDN_WEB: /api # Path for the web service
SERVICE_URL_WEB: # URL will be generated
NORMAL_VAR: value # Regular variable
YAML;
$result = extractYamlEnvironmentComments($yaml);
expect($result)->toBe([
'SERVICE_FQDN_WEB' => 'Path for the web service',
'SERVICE_URL_WEB' => 'URL will be generated',
'NORMAL_VAR' => 'Regular variable',
]);
});