Skip to content

Commit e0d639f

Browse files
Copilothuangyiirene
andcommitted
Add comprehensive tests for dataset.zod.ts and mapping.zod.ts
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>
1 parent 982c878 commit e0d639f

2 files changed

Lines changed: 658 additions & 0 deletions

File tree

Lines changed: 236 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,236 @@
1+
import { describe, it, expect } from 'vitest';
2+
import { DatasetSchema, DatasetMode, type Dataset } from './dataset.zod';
3+
4+
describe('DatasetMode', () => {
5+
it('should accept valid dataset modes', () => {
6+
const validModes = ['insert', 'update', 'upsert', 'replace', 'ignore'];
7+
8+
validModes.forEach(mode => {
9+
expect(() => DatasetMode.parse(mode)).not.toThrow();
10+
});
11+
});
12+
13+
it('should reject invalid modes', () => {
14+
expect(() => DatasetMode.parse('merge')).toThrow();
15+
expect(() => DatasetMode.parse('delete')).toThrow();
16+
expect(() => DatasetMode.parse('')).toThrow();
17+
});
18+
});
19+
20+
describe('DatasetSchema', () => {
21+
it('should accept valid minimal dataset', () => {
22+
const validDataset: Dataset = {
23+
object: 'user',
24+
records: [
25+
{ name: 'John', email: 'john@example.com' },
26+
{ name: 'Jane', email: 'jane@example.com' }
27+
]
28+
};
29+
30+
expect(() => DatasetSchema.parse(validDataset)).not.toThrow();
31+
});
32+
33+
it('should accept dataset with all fields', () => {
34+
const fullDataset: Dataset = {
35+
object: 'account',
36+
externalId: 'code',
37+
mode: 'upsert',
38+
env: ['prod', 'dev', 'test'],
39+
records: [
40+
{ code: 'ACC001', name: 'Acme Corp' },
41+
{ code: 'ACC002', name: 'Beta Inc' }
42+
]
43+
};
44+
45+
expect(() => DatasetSchema.parse(fullDataset)).not.toThrow();
46+
});
47+
48+
it('should apply default values', () => {
49+
const dataset = DatasetSchema.parse({
50+
object: 'product',
51+
records: [{ name: 'Widget' }]
52+
});
53+
54+
expect(dataset.externalId).toBe('name');
55+
expect(dataset.mode).toBe('upsert');
56+
expect(dataset.env).toEqual(['prod', 'dev', 'test']);
57+
});
58+
59+
it('should validate object name format (snake_case)', () => {
60+
expect(() => DatasetSchema.parse({
61+
object: 'valid_object_name',
62+
records: []
63+
})).not.toThrow();
64+
65+
expect(() => DatasetSchema.parse({
66+
object: 'InvalidObject',
67+
records: []
68+
})).toThrow();
69+
70+
expect(() => DatasetSchema.parse({
71+
object: 'invalid-object',
72+
records: []
73+
})).toThrow();
74+
});
75+
76+
it('should accept different modes', () => {
77+
const modes: Array<Dataset['mode']> = ['insert', 'update', 'upsert', 'replace', 'ignore'];
78+
79+
modes.forEach(mode => {
80+
const dataset = DatasetSchema.parse({
81+
object: 'test_object',
82+
mode,
83+
records: []
84+
});
85+
expect(dataset.mode).toBe(mode);
86+
});
87+
});
88+
89+
it('should accept environment scopes', () => {
90+
const dataset1 = DatasetSchema.parse({
91+
object: 'test_object',
92+
env: ['dev'],
93+
records: []
94+
});
95+
expect(dataset1.env).toEqual(['dev']);
96+
97+
const dataset2 = DatasetSchema.parse({
98+
object: 'test_object',
99+
env: ['prod', 'test'],
100+
records: []
101+
});
102+
expect(dataset2.env).toEqual(['prod', 'test']);
103+
});
104+
105+
it('should reject invalid environment values', () => {
106+
expect(() => DatasetSchema.parse({
107+
object: 'test_object',
108+
env: ['production'],
109+
records: []
110+
})).toThrow();
111+
112+
expect(() => DatasetSchema.parse({
113+
object: 'test_object',
114+
env: ['staging'],
115+
records: []
116+
})).toThrow();
117+
});
118+
119+
it('should accept empty records array', () => {
120+
const dataset = DatasetSchema.parse({
121+
object: 'empty_table',
122+
records: []
123+
});
124+
125+
expect(dataset.records).toEqual([]);
126+
});
127+
128+
it('should accept records with various data types', () => {
129+
const dataset = DatasetSchema.parse({
130+
object: 'mixed_data',
131+
records: [
132+
{
133+
string: 'text',
134+
number: 42,
135+
boolean: true,
136+
null_value: null,
137+
object: { nested: 'value' },
138+
array: [1, 2, 3]
139+
}
140+
]
141+
});
142+
143+
expect(dataset.records[0]).toHaveProperty('string', 'text');
144+
expect(dataset.records[0]).toHaveProperty('number', 42);
145+
expect(dataset.records[0]).toHaveProperty('boolean', true);
146+
});
147+
148+
it('should validate externalId field name', () => {
149+
const validExternalIds = ['name', 'code', 'external_id', 'username', 'slug'];
150+
151+
validExternalIds.forEach(externalId => {
152+
expect(() => DatasetSchema.parse({
153+
object: 'test_object',
154+
externalId,
155+
records: []
156+
})).not.toThrow();
157+
});
158+
});
159+
160+
it('should handle seed data use case', () => {
161+
const seedData = DatasetSchema.parse({
162+
object: 'country',
163+
externalId: 'code',
164+
mode: 'upsert',
165+
env: ['prod', 'dev', 'test'],
166+
records: [
167+
{ code: 'US', name: 'United States' },
168+
{ code: 'CA', name: 'Canada' },
169+
{ code: 'MX', name: 'Mexico' }
170+
]
171+
});
172+
173+
expect(seedData.records).toHaveLength(3);
174+
expect(seedData.mode).toBe('upsert');
175+
});
176+
177+
it('should handle demo data use case', () => {
178+
const demoData = DatasetSchema.parse({
179+
object: 'project',
180+
externalId: 'name',
181+
mode: 'replace',
182+
env: ['dev'],
183+
records: [
184+
{ name: 'Demo Project 1', status: 'active' },
185+
{ name: 'Demo Project 2', status: 'completed' }
186+
]
187+
});
188+
189+
expect(demoData.env).toEqual(['dev']);
190+
expect(demoData.mode).toBe('replace');
191+
});
192+
193+
it('should handle test data use case', () => {
194+
const testData = DatasetSchema.parse({
195+
object: 'test_user',
196+
mode: 'ignore',
197+
env: ['test'],
198+
records: [
199+
{ name: 'Test User', email: 'test@example.com' }
200+
]
201+
});
202+
203+
expect(testData.env).toEqual(['test']);
204+
expect(testData.mode).toBe('ignore');
205+
});
206+
207+
it('should reject dataset without required fields', () => {
208+
expect(() => DatasetSchema.parse({
209+
records: []
210+
})).toThrow();
211+
212+
expect(() => DatasetSchema.parse({
213+
object: 'test_object'
214+
})).toThrow();
215+
});
216+
217+
it('should reject invalid mode value', () => {
218+
expect(() => DatasetSchema.parse({
219+
object: 'test_object',
220+
mode: 'invalid_mode',
221+
records: []
222+
})).toThrow();
223+
});
224+
225+
it('should handle large datasets', () => {
226+
const largeDataset = DatasetSchema.parse({
227+
object: 'bulk_data',
228+
records: Array.from({ length: 1000 }, (_, i) => ({
229+
id: i,
230+
name: `Record ${i}`
231+
}))
232+
});
233+
234+
expect(largeDataset.records).toHaveLength(1000);
235+
});
236+
});

0 commit comments

Comments
 (0)