Barazo AppView backend
barazo.forum
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})