code: dbal,validate,is (26 files)

This commit is contained in:
2025-12-25 19:44:13 +00:00
parent edf6a762c0
commit 6b280639a8
26 changed files with 0 additions and 540 deletions
@@ -1,15 +0,0 @@
import { describe, expect, it } from 'vitest'
import { isPlainObject } from './is-plain-object'
describe('isPlainObject', () => {
it.each([
{ value: {}, expected: true },
{ value: { key: 'value' }, expected: true },
{ value: [], expected: false },
{ value: null, expected: false },
{ value: 'string', expected: false },
{ value: 123, expected: false },
])('returns $expected for %s', ({ value, expected }) => {
expect(isPlainObject(value)).toBe(expected)
})
})
@@ -1,18 +0,0 @@
import { describe, expect, it } from 'vitest'
import { isValidDate } from './is-valid-date'
describe('isValidDate', () => {
const validDate = new Date('2024-01-01T00:00:00Z')
const invalidDate = new Date('invalid')
it.each([
{ value: validDate, expected: true },
{ value: '2024-01-01T00:00:00Z', expected: true },
{ value: 1704067200000, expected: true },
{ value: invalidDate, expected: false },
{ value: 'not-a-date', expected: false },
{ value: {}, expected: false },
])('returns $expected for %s', ({ value, expected }) => {
expect(isValidDate(value)).toBe(expected)
})
})
@@ -1,21 +0,0 @@
import { describe, expect, it } from 'vitest'
import { isValidEmail } from './is-valid-email'
describe('isValidEmail', () => {
const longEmail = `${'a'.repeat(250)}@example.com`
it.each([
{ email: 'user@example.com' },
{ email: 'first.last+tag@sub.domain.com' },
])('accepts $email', ({ email }) => {
expect(isValidEmail(email)).toBe(true)
})
it.each([
{ email: 'invalid-email' },
{ email: 'missing-at.example.com' },
{ email: longEmail },
])('rejects $email', ({ email }) => {
expect(isValidEmail(email)).toBe(false)
})
})
@@ -1,19 +0,0 @@
import { describe, expect, it } from 'vitest'
import { isValidLevel } from './is-valid-level'
describe('isValidLevel', () => {
it.each([
{ level: 1 },
{ level: 5 },
])('accepts level $level', ({ level }) => {
expect(isValidLevel(level)).toBe(true)
})
it.each([
{ level: 0 },
{ level: 6 },
{ level: 2.5 },
])('rejects level $level', ({ level }) => {
expect(isValidLevel(level)).toBe(false)
})
})
@@ -1,14 +0,0 @@
import { describe, expect, it } from 'vitest'
import { isValidSemver } from './is-valid-semver'
describe('isValidSemver', () => {
it.each([
{ version: '1.0.0', expected: true },
{ version: '0.10.2', expected: true },
{ version: '1.0', expected: false },
{ version: '1.0.0-beta', expected: false },
{ version: 'v1.0.0', expected: false },
])('returns $expected for $version', ({ version, expected }) => {
expect(isValidSemver(version)).toBe(expected)
})
})
@@ -1,20 +0,0 @@
import { describe, expect, it } from 'vitest'
import { isValidSlug } from './is-valid-slug'
describe('isValidSlug', () => {
it.each([
{ slug: 'home' },
{ slug: 'docs/getting-started' },
{ slug: 'a-b/c' },
])('accepts $slug', ({ slug }) => {
expect(isValidSlug(slug)).toBe(true)
})
it.each([
{ slug: 'Home' },
{ slug: 'has spaces' },
{ slug: 'a'.repeat(256) },
])('rejects $slug', ({ slug }) => {
expect(isValidSlug(slug)).toBe(false)
})
})
@@ -1,18 +0,0 @@
import { describe, expect, it } from 'vitest'
import { isValidTitle } from './is-valid-title'
describe('isValidTitle', () => {
it.each([
{ title: 'Welcome' },
{ title: 'a'.repeat(255) },
])('accepts title length %s', ({ title }) => {
expect(isValidTitle(title)).toBe(true)
})
it.each([
{ title: '' },
{ title: 'a'.repeat(256) },
])('rejects title length %s', ({ title }) => {
expect(isValidTitle(title)).toBe(false)
})
})
@@ -1,20 +0,0 @@
import { describe, expect, it } from 'vitest'
import { isValidUsername } from './is-valid-username'
describe('isValidUsername', () => {
it.each([
{ username: 'user_1' },
{ username: 'abc' },
{ username: 'user-name' },
])('accepts $username', ({ username }) => {
expect(isValidUsername(username)).toBe(true)
})
it.each([
{ username: 'ab' },
{ username: 'user name' },
{ username: 'a'.repeat(51) },
])('rejects $username', ({ username }) => {
expect(isValidUsername(username)).toBe(false)
})
})
@@ -1,19 +0,0 @@
import { describe, expect, it } from 'vitest'
import { isValidUuid } from './is-valid-uuid'
describe('isValidUuid', () => {
it.each([
{ id: '550e8400-e29b-41d4-a716-446655440000' },
{ id: '00000000-0000-0000-0000-000000000000' },
])('accepts $id', ({ id }) => {
expect(isValidUuid(id)).toBe(true)
})
it.each([
{ id: 'not-a-uuid' },
{ id: '550e8400e29b41d4a716446655440000' },
{ id: '550e8400-e29b-41d4-a716-44665544000' },
])('rejects $id', ({ id }) => {
expect(isValidUuid(id)).toBe(false)
})
})
@@ -1,27 +0,0 @@
import { describe, expect, it } from 'vitest'
import { validateComponentHierarchyCreate } from './validate-component-hierarchy-create'
describe('validateComponentHierarchyCreate', () => {
const base = {
pageId: '550e8400-e29b-41d4-a716-446655440000',
componentType: 'Hero',
order: 0,
props: { title: 'Hello' },
}
it.each([
{ data: base },
{ data: { ...base, parentId: '00000000-0000-0000-0000-000000000000' } },
])('accepts %s', ({ data }) => {
expect(validateComponentHierarchyCreate(data)).toEqual([])
})
it.each([
{ data: { ...base, pageId: 'not-a-uuid' }, message: 'pageId must be a valid UUID' },
{ data: { ...base, componentType: 'a'.repeat(101) }, message: 'componentType must be 1-100 characters' },
{ data: { ...base, order: -1 }, message: 'order must be a non-negative integer' },
{ data: { ...base, props: [] }, message: 'props must be an object' },
])('rejects %s', ({ data, message }) => {
expect(validateComponentHierarchyCreate(data)).toContain(message)
})
})
@@ -1,19 +0,0 @@
import { describe, expect, it } from 'vitest'
import { validateComponentHierarchyUpdate } from './validate-component-hierarchy-update'
describe('validateComponentHierarchyUpdate', () => {
it.each([
{ data: { order: 2 } },
{ data: { componentType: 'Header' } },
])('accepts %s', ({ data }) => {
expect(validateComponentHierarchyUpdate(data)).toEqual([])
})
it.each([
{ data: { pageId: 'not-a-uuid' }, message: 'pageId must be a valid UUID' },
{ data: { order: 1.5 }, message: 'order must be a non-negative integer' },
{ data: { props: [] }, message: 'props must be an object' },
])('rejects %s', ({ data, message }) => {
expect(validateComponentHierarchyUpdate(data)).toContain(message)
})
})
@@ -1,24 +0,0 @@
import { describe, expect, it } from 'vitest'
import { validateCredentialCreate } from './validate-credential-create'
describe('validateCredentialCreate', () => {
const base = {
username: 'valid_user',
passwordHash: 'hashed_value',
firstLogin: true,
}
it.each([
{ data: base },
])('accepts %s', ({ data }) => {
expect(validateCredentialCreate(data)).toEqual([])
})
it.each([
{ data: { ...base, username: 'ab' }, message: 'username must be 3-50 characters (alphanumeric, underscore, hyphen)' },
{ data: { ...base, passwordHash: ' ' }, message: 'passwordHash must be a non-empty string' },
{ data: { ...base, firstLogin: 'yes' as unknown as boolean }, message: 'firstLogin must be a boolean' },
])('rejects %s', ({ data, message }) => {
expect(validateCredentialCreate(data)).toContain(message)
})
})
@@ -1,19 +0,0 @@
import { describe, expect, it } from 'vitest'
import { validateCredentialUpdate } from './validate-credential-update'
describe('validateCredentialUpdate', () => {
it.each([
{ data: { passwordHash: 'new_hash' } },
{ data: { firstLogin: false } },
])('accepts %s', ({ data }) => {
expect(validateCredentialUpdate(data)).toEqual([])
})
it.each([
{ data: { username: 'ab' }, message: 'username must be 3-50 characters (alphanumeric, underscore, hyphen)' },
{ data: { passwordHash: '' }, message: 'passwordHash must be a non-empty string' },
{ data: { firstLogin: 'no' as unknown as boolean }, message: 'firstLogin must be a boolean' },
])('rejects %s', ({ data, message }) => {
expect(validateCredentialUpdate(data)).toContain(message)
})
})
@@ -1,17 +0,0 @@
import { describe, expect, it } from 'vitest'
import { validateId } from './validate-id'
describe('validateId', () => {
it.each([
{ id: '550e8400-e29b-41d4-a716-446655440000', expected: [] },
])('accepts valid id $id', ({ id, expected }) => {
expect(validateId(id)).toEqual(expected)
})
it.each([
{ id: '', message: 'ID cannot be empty' },
{ id: 'not-a-uuid', message: 'ID must be a valid UUID' },
])('rejects invalid id $id', ({ id, message }) => {
expect(validateId(id)).toContain(message)
})
})
@@ -1,28 +0,0 @@
import { describe, expect, it } from 'vitest'
import { validateLuaScriptCreate } from './validate-lua-script-create'
describe('validateLuaScriptCreate', () => {
const base = {
name: 'daily-cleanup',
code: 'return true',
isSandboxed: true,
allowedGlobals: ['math'],
timeoutMs: 5000,
createdBy: '550e8400-e29b-41d4-a716-446655440000',
}
it.each([
{ data: base },
])('accepts %s', ({ data }) => {
expect(validateLuaScriptCreate(data)).toEqual([])
})
it.each([
{ data: { ...base, allowedGlobals: 'math' as unknown as string[] }, message: 'allowedGlobals must be an array of strings' },
{ data: { ...base, allowedGlobals: [''] }, message: 'allowedGlobals must contain non-empty strings' },
{ data: { ...base, timeoutMs: 50 }, message: 'timeoutMs must be an integer between 100 and 30000' },
{ data: { ...base, createdBy: 'invalid' }, message: 'createdBy must be a valid UUID' },
])('rejects %s', ({ data, message }) => {
expect(validateLuaScriptCreate(data)).toContain(message)
})
})
@@ -1,19 +0,0 @@
import { describe, expect, it } from 'vitest'
import { validateLuaScriptUpdate } from './validate-lua-script-update'
describe('validateLuaScriptUpdate', () => {
it.each([
{ data: { timeoutMs: 100 } },
{ data: { allowedGlobals: ['math', 'string'] } },
])('accepts %s', ({ data }) => {
expect(validateLuaScriptUpdate(data)).toEqual([])
})
it.each([
{ data: { timeoutMs: 10 }, message: 'timeoutMs must be an integer between 100 and 30000' },
{ data: { allowedGlobals: ['ok', 1 as unknown as string] }, message: 'allowedGlobals must contain non-empty strings' },
{ data: { isSandboxed: 'yes' as unknown as boolean }, message: 'isSandboxed must be a boolean' },
])('rejects %s', ({ data, message }) => {
expect(validateLuaScriptUpdate(data)).toContain(message)
})
})
@@ -1,28 +0,0 @@
import { describe, expect, it } from 'vitest'
import { validatePackageCreate } from './validate-package-create'
describe('validatePackageCreate', () => {
const base = {
name: 'forum',
version: '1.0.0',
author: 'MetaBuilder',
manifest: { dependencies: [] },
isInstalled: false,
}
it.each([
{ data: base },
{ data: { ...base, installedAt: '2024-01-01T00:00:00Z' } },
])('accepts %s', ({ data }) => {
expect(validatePackageCreate(data)).toEqual([])
})
it.each([
{ data: { ...base, version: '1.0' }, message: 'version must be semantic (x.y.z)' },
{ data: { ...base, manifest: [] }, message: 'manifest must be an object' },
{ data: { ...base, isInstalled: 'no' as unknown as boolean }, message: 'isInstalled must be a boolean' },
{ data: { ...base, installedBy: 'invalid' }, message: 'installedBy must be a valid UUID' },
])('rejects %s', ({ data, message }) => {
expect(validatePackageCreate(data)).toContain(message)
})
})
@@ -1,20 +0,0 @@
import { describe, expect, it } from 'vitest'
import { validatePackageUpdate } from './validate-package-update'
describe('validatePackageUpdate', () => {
it.each([
{ data: { version: '2.0.0' } },
{ data: { isInstalled: true } },
])('accepts %s', ({ data }) => {
expect(validatePackageUpdate(data)).toEqual([])
})
it.each([
{ data: { name: '' }, message: 'name must be 1-255 characters' },
{ data: { version: '2.0' }, message: 'version must be semantic (x.y.z)' },
{ data: { manifest: [] }, message: 'manifest must be an object' },
{ data: { installedAt: 'not-a-date' }, message: 'installedAt must be a valid date' },
])('rejects %s', ({ data, message }) => {
expect(validatePackageUpdate(data)).toContain(message)
})
})
@@ -1,27 +0,0 @@
import { describe, expect, it } from 'vitest'
import { validatePageCreate } from './validate-page-create'
describe('validatePageCreate', () => {
const base = {
slug: 'docs/getting-started',
title: 'Docs',
level: 1,
layout: { sections: [] },
isActive: true,
}
it.each([
{ data: base },
])('accepts %s', ({ data }) => {
expect(validatePageCreate(data)).toEqual([])
})
it.each([
{ data: { ...base, slug: 'Bad Slug' }, message: 'Invalid slug format (lowercase alphanumeric, hyphen, slash, 1-255 chars)' },
{ data: { ...base, level: 0 }, message: 'Invalid level (must be 1-5)' },
{ data: { ...base, layout: [] }, message: 'Layout must be an object' },
{ data: { ...base, isActive: 'yes' as unknown as boolean }, message: 'isActive must be a boolean' },
])('rejects %s', ({ data, message }) => {
expect(validatePageCreate(data)).toContain(message)
})
})
@@ -1,19 +0,0 @@
import { describe, expect, it } from 'vitest'
import { validatePageUpdate } from './validate-page-update'
describe('validatePageUpdate', () => {
it.each([
{ data: { title: 'Updated' } },
{ data: { level: 5 } },
])('accepts %s', ({ data }) => {
expect(validatePageUpdate(data)).toEqual([])
})
it.each([
{ data: { slug: 'Bad Slug' }, message: 'Invalid slug format (lowercase alphanumeric, hyphen, slash, 1-255 chars)' },
{ data: { layout: [] }, message: 'Layout must be an object' },
{ data: { isActive: 'no' as unknown as boolean }, message: 'isActive must be a boolean' },
])('rejects %s', ({ data, message }) => {
expect(validatePageUpdate(data)).toContain(message)
})
})
@@ -1,24 +0,0 @@
import { describe, expect, it } from 'vitest'
import { validateSessionCreate } from './validate-session-create'
describe('validateSessionCreate', () => {
const base = {
userId: '550e8400-e29b-41d4-a716-446655440000',
token: 'token-value',
expiresAt: new Date('2024-01-01T00:00:00Z'),
}
it.each([
{ data: base },
])('accepts %s', ({ data }) => {
expect(validateSessionCreate(data)).toEqual([])
})
it.each([
{ data: { ...base, userId: 'invalid' }, message: 'userId must be a valid UUID' },
{ data: { ...base, token: ' ' }, message: 'token must be a non-empty string' },
{ data: { ...base, expiresAt: 'not-a-date' }, message: 'expiresAt must be a valid date' },
])('rejects %s', ({ data, message }) => {
expect(validateSessionCreate(data)).toContain(message)
})
})
@@ -1,19 +0,0 @@
import { describe, expect, it } from 'vitest'
import { validateSessionUpdate } from './validate-session-update'
describe('validateSessionUpdate', () => {
it.each([
{ data: { expiresAt: '2024-01-01T00:00:00Z' } },
{ data: { lastActivity: new Date('2024-01-01T00:00:00Z') } },
])('accepts %s', ({ data }) => {
expect(validateSessionUpdate(data)).toEqual([])
})
it.each([
{ data: { userId: 'invalid' }, message: 'userId must be a valid UUID' },
{ data: { token: '' }, message: 'token must be a non-empty string' },
{ data: { lastActivity: 'not-a-date' }, message: 'lastActivity must be a valid date' },
])('rejects %s', ({ data, message }) => {
expect(validateSessionUpdate(data)).toContain(message)
})
})
@@ -1,20 +0,0 @@
import { describe, expect, it } from 'vitest'
import { validateUserCreate } from './validate-user-create'
describe('validateUserCreate', () => {
const base = { username: 'valid_user', email: 'user@example.com', role: 'user' as const }
it.each([
{ data: base },
])('accepts %s', ({ data }) => {
expect(validateUserCreate(data)).toEqual([])
})
it.each([
{ data: { ...base, username: 'ab' }, message: 'Invalid username format (alphanumeric, underscore, hyphen only, 3-50 chars)' },
{ data: { ...base, email: 'invalid-email' }, message: 'Invalid email format (max 255 chars)' },
{ data: { ...base, role: 'guest' as unknown as 'user' }, message: 'Invalid role' },
])('rejects %s', ({ data, message }) => {
expect(validateUserCreate(data)).toContain(message)
})
})
@@ -1,19 +0,0 @@
import { describe, expect, it } from 'vitest'
import { validateUserUpdate } from './validate-user-update'
describe('validateUserUpdate', () => {
it.each([
{ data: { email: 'new@example.com' } },
{ data: { role: 'admin' as const } },
])('accepts %s', ({ data }) => {
expect(validateUserUpdate(data)).toEqual([])
})
it.each([
{ data: { username: 'ab' }, message: 'Invalid username format (alphanumeric, underscore, hyphen only, 3-50 chars)' },
{ data: { email: 'invalid-email' }, message: 'Invalid email format (max 255 chars)' },
{ data: { role: 'guest' as unknown as 'user' }, message: 'Invalid role' },
])('rejects %s', ({ data, message }) => {
expect(validateUserUpdate(data)).toContain(message)
})
})
@@ -1,28 +0,0 @@
import { describe, expect, it } from 'vitest'
import { validateWorkflowCreate } from './validate-workflow-create'
describe('validateWorkflowCreate', () => {
const base = {
name: 'Daily Sync',
trigger: 'schedule' as const,
triggerConfig: { cron: '0 0 * * *' },
steps: { nodes: [] },
isActive: true,
createdBy: '550e8400-e29b-41d4-a716-446655440000',
}
it.each([
{ data: base },
])('accepts %s', ({ data }) => {
expect(validateWorkflowCreate(data)).toEqual([])
})
it.each([
{ data: { ...base, trigger: 'invalid' as unknown as 'manual' }, message: 'trigger must be one of manual, schedule, event, webhook' },
{ data: { ...base, steps: [] }, message: 'steps must be an object' },
{ data: { ...base, createdBy: 'invalid' }, message: 'createdBy must be a valid UUID' },
{ data: { ...base, name: 'a'.repeat(256) }, message: 'name must be 1-255 characters' },
])('rejects %s', ({ data, message }) => {
expect(validateWorkflowCreate(data)).toContain(message)
})
})
@@ -1,19 +0,0 @@
import { describe, expect, it } from 'vitest'
import { validateWorkflowUpdate } from './validate-workflow-update'
describe('validateWorkflowUpdate', () => {
it.each([
{ data: { name: 'Updated' } },
{ data: { isActive: false } },
])('accepts %s', ({ data }) => {
expect(validateWorkflowUpdate(data)).toEqual([])
})
it.each([
{ data: { trigger: 'invalid' as unknown as 'manual' }, message: 'trigger must be one of manual, schedule, event, webhook' },
{ data: { isActive: 'yes' as unknown as boolean }, message: 'isActive must be a boolean' },
{ data: { triggerConfig: [] }, message: 'triggerConfig must be an object' },
])('rejects %s', ({ data, message }) => {
expect(validateWorkflowUpdate(data)).toContain(message)
})
})