takt/src/__tests__/takt-repertoire-schema.test.ts

80 lines
2.7 KiB
TypeScript

/**
* Unit tests for takt-repertoire.yaml schema validation.
*
* Target: src/features/repertoire/takt-repertoire-config.ts
*
* Schema rules under test:
* - description: optional
* - path: optional, defaults to "."
* - takt.min_version: must match /^\d+\.\d+\.\d+$/ (no "v" prefix, no pre-release)
* - path: must not start with "/" or "~"
* - path: must not contain ".." segments
*/
import { describe, it, expect } from 'vitest';
import {
parseTaktRepertoireConfig,
validateTaktRepertoirePath,
validateMinVersion,
} from '../features/repertoire/takt-repertoire-config.js';
describe('takt-repertoire.yaml schema: description field', () => {
it('should accept schema without description field', () => {
const config = parseTaktRepertoireConfig('');
expect(config.description).toBeUndefined();
});
});
describe('takt-repertoire.yaml schema: path field', () => {
it('should default path to "." when not specified', () => {
const config = parseTaktRepertoireConfig('');
expect(config.path).toBe('.');
});
it('should reject path starting with "/" (absolute path)', () => {
expect(() => validateTaktRepertoirePath('/foo')).toThrow();
});
it('should reject path starting with "~" (tilde-absolute path)', () => {
expect(() => validateTaktRepertoirePath('~/foo')).toThrow();
});
it('should reject path with ".." segment traversing outside repository', () => {
expect(() => validateTaktRepertoirePath('../outside')).toThrow();
});
it('should reject path with embedded ".." segments leading outside repository', () => {
expect(() => validateTaktRepertoirePath('sub/../../../outside')).toThrow();
});
it('should accept valid relative path "sub/dir"', () => {
expect(() => validateTaktRepertoirePath('sub/dir')).not.toThrow();
});
});
describe('takt-repertoire.yaml schema: takt.min_version field', () => {
it('should accept min_version "0.5.0" (valid semver)', () => {
expect(() => validateMinVersion('0.5.0')).not.toThrow();
});
it('should accept min_version "1.0.0" (valid semver)', () => {
expect(() => validateMinVersion('1.0.0')).not.toThrow();
});
it('should reject min_version "1.0" (missing patch segment)', () => {
expect(() => validateMinVersion('1.0')).toThrow();
});
it('should reject min_version "v1.0.0" (v prefix not allowed)', () => {
expect(() => validateMinVersion('v1.0.0')).toThrow();
});
it('should reject min_version "1.0.0-alpha" (pre-release suffix not allowed)', () => {
expect(() => validateMinVersion('1.0.0-alpha')).toThrow();
});
it('should reject min_version "1.0.0-beta.1" (pre-release suffix not allowed)', () => {
expect(() => validateMinVersion('1.0.0-beta.1')).toThrow();
});
});