import { validateTag, validationMessages } from '~/lib/utils/ref_validator'; describe('~/lib/utils/ref_validator', () => { describe('validateTag', () => { describe.each([ ['foo'], ['FOO'], ['foo/a.lockx'], ['foo.123'], ['foo/123'], ['foo/bar/123'], ['foo.bar.123'], ['foo-bar_baz'], ['head'], ['"foo"-'], ['foo@bar'], ['\ud83e\udd8a'], ['ünicöde'], ['\x80}'], ])('tag with the name "%s"', (tagName) => { it('is valid', () => { const result = validateTag(tagName); expect(result.isValid).toBe(true); expect(result.validationErrors).toEqual([]); }); }); describe.each([ [' ', validationMessages.EmptyNameValidationMessage], ['refs/heads/tagName', validationMessages.DisallowedPrefixesValidationMessage], ['/foo', validationMessages.DisallowedPrefixesValidationMessage], ['-tagName', validationMessages.DisallowedPrefixesValidationMessage], ['HEAD', validationMessages.DisallowedNameValidationMessage], ['@', validationMessages.DisallowedNameValidationMessage], ['tag name with spaces', validationMessages.DisallowedSubstringsValidationMessage], ['tag\\name', validationMessages.DisallowedSubstringsValidationMessage], ['tag^name', validationMessages.DisallowedSubstringsValidationMessage], ['tag..name', validationMessages.DisallowedSubstringsValidationMessage], ['..', validationMessages.DisallowedSubstringsValidationMessage], ['tag?name', validationMessages.DisallowedSubstringsValidationMessage], ['tag*name', validationMessages.DisallowedSubstringsValidationMessage], ['tag[name', validationMessages.DisallowedSubstringsValidationMessage], ['tag@{name', validationMessages.DisallowedSubstringsValidationMessage], ['tag:name', validationMessages.DisallowedSubstringsValidationMessage], ['tag~name', validationMessages.DisallowedSubstringsValidationMessage], ['/', validationMessages.DisallowedSequenceEmptyValidationMessage], ['//', validationMessages.DisallowedSequenceEmptyValidationMessage], ['foo//123', validationMessages.DisallowedSequenceEmptyValidationMessage], ['.', validationMessages.DisallowedSequencePrefixesValidationMessage], ['/./', validationMessages.DisallowedSequencePrefixesValidationMessage], ['./.', validationMessages.DisallowedSequencePrefixesValidationMessage], ['.tagName', validationMessages.DisallowedSequencePrefixesValidationMessage], ['tag/.Name', validationMessages.DisallowedSequencePrefixesValidationMessage], ['foo/.123/bar', validationMessages.DisallowedSequencePrefixesValidationMessage], ['foo.', validationMessages.DisallowedSequencePostfixesValidationMessage], ['a.lock', validationMessages.DisallowedSequencePostfixesValidationMessage], ['foo/a.lock', validationMessages.DisallowedSequencePostfixesValidationMessage], ['foo/a.lock/b', validationMessages.DisallowedSequencePostfixesValidationMessage], ['foo.123.', validationMessages.DisallowedSequencePostfixesValidationMessage], ['foo/', validationMessages.DisallowedPostfixesValidationMessage], ['control-character\x7f', validationMessages.ControlCharactersValidationMessage], ['control-character\x15', validationMessages.ControlCharactersValidationMessage], ])('tag with name "%s"', (tagName, validationMessage) => { it(`should be invalid with validation message "${validationMessage}"`, () => { const result = validateTag(tagName); expect(result.isValid).toBe(false); expect(result.validationErrors).toContain(validationMessage); }); }); }); });