mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-05-03 02:04:54 +00:00
code: dbal,validate,is (26 files)
This commit is contained in:
@@ -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)
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user