-
-
Notifications
You must be signed in to change notification settings - Fork 186
/
TemplateGenerator.spec.ts
142 lines (132 loc) · 4.13 KB
/
TemplateGenerator.spec.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
import { TemplateGenerator } from '../../../src/generators/template';
describe('TemplateGenerator', () => {
let generator: TemplateGenerator;
beforeEach(() => {
generator = new TemplateGenerator();
});
describe('Enum', () => {
test('should render `enum` with mixed types (union type)', async () => {
const doc = {
$id: 'Things',
enum: ['Texas', 1, '1', false, { test: 'test' }]
};
const models = await generator.generate(doc);
expect(models).toHaveLength(1);
expect(models[0].result).toMatchSnapshot();
});
test('should work custom preset for `enum` type', async () => {
const doc = {
$id: 'CustomEnum',
type: 'string',
enum: ['Texas', 'Alabama', 'California']
};
generator = new TemplateGenerator({
presets: [
{
enum: {
self({ content }) {
return content;
}
}
}
]
});
const models = await generator.generate(doc);
expect(models).toHaveLength(1);
expect(models[0].result).toMatchSnapshot();
});
test('should render enums with translated special characters', async () => {
const doc = {
$id: 'States',
enum: ['test+', '$test', 'test-', 'test?!', '*test']
};
const models = await generator.generate(doc);
expect(models).toHaveLength(1);
expect(models[0].result).toMatchSnapshot();
});
});
describe('Class', () => {
test('should not render reserved keyword', async () => {
const doc = {
$id: 'Address',
type: 'object',
properties: {
enum: { type: 'string' },
reservedEnum: { type: 'string' }
},
additionalProperties: false
};
const models = await generator.generate(doc);
expect(models).toHaveLength(1);
expect(models[0].result).toMatchSnapshot();
});
test('should render `class` type', async () => {
const doc = {
$id: 'Address',
type: 'object',
properties: {
street_name: { type: 'string' },
city: { type: 'string', description: 'City description' },
state: { type: 'string' },
house_number: { type: 'number' },
marriage: {
type: 'boolean',
description: 'Status if marriage live in given house'
},
members: {
oneOf: [{ type: 'string' }, { type: 'number' }, { type: 'boolean' }]
},
array_type: {
type: 'array',
items: [{ type: 'string' }, { type: 'number' }]
}
},
patternProperties: {
'^S(.?*)test&': {
type: 'string'
}
},
required: ['street_name', 'city', 'state', 'house_number', 'array_type']
};
const expectedDependencies: string[] = [];
const models = await generator.generate(doc);
expect(models).toHaveLength(1);
expect(models[0].result).toMatchSnapshot();
expect(models[0].dependencies).toEqual(expectedDependencies);
});
test('should work with custom preset for `class` type', async () => {
const doc = {
$id: 'CustomClass',
type: 'object',
properties: {
property: { type: 'string' }
}
};
generator = new TemplateGenerator({
presets: [
{
class: {
property({ content }) {
const annotation = 'test1';
return `${annotation}\n${content}`;
},
getter({ content }) {
const annotation = 'test2';
return `${annotation}\n${content}`;
},
setter({ content }) {
const annotation = 'test3';
return `${annotation}\n${content}`;
}
}
}
]
});
const expectedDependencies: string[] = [];
const models = await generator.generate(doc);
expect(models).toHaveLength(1);
expect(models[0].result).toMatchSnapshot();
expect(models[0].dependencies).toEqual(expectedDependencies);
});
});
});