Barazo AppView backend barazo.forum
at main 136 lines 3.7 kB view raw
1import { describe, it, expect } from 'vitest' 2import { 3 createRuleSchema, 4 updateRuleSchema, 5 reorderRulesSchema, 6 ruleVersionsQuerySchema, 7} from '../../../src/validation/community-rules.js' 8 9describe('community rules validation schemas', () => { 10 describe('createRuleSchema', () => { 11 it('should accept valid rule', () => { 12 const result = createRuleSchema.safeParse({ 13 title: 'Be respectful', 14 description: 'Treat all members with respect and courtesy.', 15 }) 16 expect(result.success).toBe(true) 17 }) 18 19 it('should reject empty title', () => { 20 const result = createRuleSchema.safeParse({ 21 title: '', 22 description: 'Some description', 23 }) 24 expect(result.success).toBe(false) 25 }) 26 27 it('should reject title exceeding 200 chars', () => { 28 const result = createRuleSchema.safeParse({ 29 title: 'x'.repeat(201), 30 description: 'Some description', 31 }) 32 expect(result.success).toBe(false) 33 }) 34 35 it('should reject empty description', () => { 36 const result = createRuleSchema.safeParse({ 37 title: 'A rule', 38 description: '', 39 }) 40 expect(result.success).toBe(false) 41 }) 42 43 it('should reject missing title', () => { 44 const result = createRuleSchema.safeParse({ 45 description: 'Some description', 46 }) 47 expect(result.success).toBe(false) 48 }) 49 50 it('should reject missing description', () => { 51 const result = createRuleSchema.safeParse({ 52 title: 'A rule', 53 }) 54 expect(result.success).toBe(false) 55 }) 56 }) 57 58 describe('updateRuleSchema', () => { 59 it('should accept valid update', () => { 60 const result = updateRuleSchema.safeParse({ 61 title: 'Updated title', 62 description: 'Updated description', 63 }) 64 expect(result.success).toBe(true) 65 }) 66 67 it('should reject empty title', () => { 68 const result = updateRuleSchema.safeParse({ 69 title: '', 70 description: 'Updated description', 71 }) 72 expect(result.success).toBe(false) 73 }) 74 }) 75 76 describe('reorderRulesSchema', () => { 77 it('should accept valid order array', () => { 78 const result = reorderRulesSchema.safeParse({ 79 order: [ 80 { id: 1, displayOrder: 0 }, 81 { id: 2, displayOrder: 1 }, 82 ], 83 }) 84 expect(result.success).toBe(true) 85 }) 86 87 it('should reject empty order array', () => { 88 const result = reorderRulesSchema.safeParse({ 89 order: [], 90 }) 91 expect(result.success).toBe(false) 92 }) 93 94 it('should reject negative id', () => { 95 const result = reorderRulesSchema.safeParse({ 96 order: [{ id: -1, displayOrder: 0 }], 97 }) 98 expect(result.success).toBe(false) 99 }) 100 101 it('should reject negative displayOrder', () => { 102 const result = reorderRulesSchema.safeParse({ 103 order: [{ id: 1, displayOrder: -1 }], 104 }) 105 expect(result.success).toBe(false) 106 }) 107 }) 108 109 describe('ruleVersionsQuerySchema', () => { 110 it('should accept empty query (defaults)', () => { 111 const result = ruleVersionsQuerySchema.safeParse({}) 112 expect(result.success).toBe(true) 113 if (result.success) { 114 expect(result.data.limit).toBe(25) 115 } 116 }) 117 118 it('should accept cursor and limit', () => { 119 const result = ruleVersionsQuerySchema.safeParse({ 120 cursor: 'abc123', 121 limit: '10', 122 }) 123 expect(result.success).toBe(true) 124 if (result.success) { 125 expect(result.data.limit).toBe(10) 126 } 127 }) 128 129 it('should reject limit exceeding 100', () => { 130 const result = ruleVersionsQuerySchema.safeParse({ 131 limit: '101', 132 }) 133 expect(result.success).toBe(false) 134 }) 135 }) 136})