80 lines
2.7 KiB
TypeScript
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();
|
|
});
|
|
});
|