1+ import { resetMathRandom } from '../../__tests__/setup' ;
2+ import { deterministic } from '../../util' ;
3+ import { TemplateJson } from '../TemplateJson' ;
4+ import * as templates from '../templates' ;
5+
6+ describe ( 'Template Examples' , ( ) => {
7+ describe ( 'String Pattern Templates' , ( ) => {
8+ test ( 'generates email addresses' , ( ) => {
9+ deterministic ( 123 , ( ) => {
10+ const email = TemplateJson . gen ( [ 'str' , templates . tokenEmail ] ) as string ;
11+ expect ( typeof email ) . toBe ( 'string' ) ;
12+ expect ( email ) . toContain ( '@' ) ;
13+ expect ( email . length ) . toBeGreaterThan ( 5 ) ;
14+ } ) ;
15+ } ) ;
16+
17+ test ( 'generates phone numbers' , ( ) => {
18+ deterministic ( 456 , ( ) => {
19+ const phone = TemplateJson . gen ( [ 'str' , templates . tokenPhone ] ) as string ;
20+ expect ( typeof phone ) . toBe ( 'string' ) ;
21+ expect ( phone ) . toMatch ( / ^ \+ 1 - \d { 3 } - \d { 3 } - \d { 4 } $ / ) ;
22+ } ) ;
23+ } ) ;
24+
25+ test ( 'generates product codes' , ( ) => {
26+ deterministic ( 789 , ( ) => {
27+ const code = TemplateJson . gen ( [ 'str' , templates . tokenProductCode ] ) as string ;
28+ expect ( typeof code ) . toBe ( 'string' ) ;
29+ expect ( code ) . toMatch ( / ^ ( P R D | I T M | S K U ) - [ A - Z ] { 2 } \d { 6 } $ / ) ;
30+ } ) ;
31+ } ) ;
32+
33+ test ( 'generates URLs' , ( ) => {
34+ deterministic ( 101 , ( ) => {
35+ const url = TemplateJson . gen ( [ 'str' , templates . tokenUrl ] ) as string ;
36+ expect ( typeof url ) . toBe ( 'string' ) ;
37+ expect ( url ) . toMatch ( / ^ h t t p s : \/ \/ .* \. ( c o m | o r g | n e t | i o ) / ) ;
38+ } ) ;
39+ } ) ;
40+ } ) ;
41+
42+ describe ( 'User Profile Templates' , ( ) => {
43+ test ( 'generates user profile with all required fields' , ( ) => {
44+ deterministic ( 202 , ( ) => {
45+ const user = TemplateJson . gen ( templates . userProfile ) as any ;
46+ expect ( user ) . toHaveProperty ( 'id' ) ;
47+ expect ( user ) . toHaveProperty ( 'username' ) ;
48+ expect ( user ) . toHaveProperty ( 'email' ) ;
49+ expect ( user ) . toHaveProperty ( 'age' ) ;
50+ expect ( user ) . toHaveProperty ( 'isActive' ) ;
51+ expect ( user ) . toHaveProperty ( 'profile' ) ;
52+ expect ( typeof user . id ) . toBe ( 'number' ) ;
53+ expect ( typeof user . username ) . toBe ( 'string' ) ;
54+ expect ( typeof user . email ) . toBe ( 'string' ) ;
55+ expect ( typeof user . age ) . toBe ( 'number' ) ;
56+ expect ( typeof user . isActive ) . toBe ( 'boolean' ) ;
57+ expect ( user . age ) . toBeGreaterThanOrEqual ( 18 ) ;
58+ expect ( user . age ) . toBeLessThanOrEqual ( 120 ) ;
59+ } ) ;
60+ } ) ;
61+
62+ test ( 'generates basic user with required fields' , ( ) => {
63+ deterministic ( 303 , ( ) => {
64+ const user = TemplateJson . gen ( templates . userBasic ) as any ;
65+ expect ( user ) . toHaveProperty ( 'id' ) ;
66+ expect ( user ) . toHaveProperty ( 'name' ) ;
67+ expect ( user ) . toHaveProperty ( 'active' ) ;
68+ expect ( typeof user . id ) . toBe ( 'number' ) ;
69+ expect ( typeof user . name ) . toBe ( 'string' ) ;
70+ expect ( typeof user . active ) . toBe ( 'boolean' ) ;
71+ expect ( user . name ) . toContain ( ' ' ) ; // Should have first and last name
72+ } ) ;
73+ } ) ;
74+ } ) ;
75+
76+ describe ( 'API Response Templates' , ( ) => {
77+ test ( 'generates API response with correct structure' , ( ) => {
78+ deterministic ( 404 , ( ) => {
79+ const response = TemplateJson . gen ( templates . apiResponse ) as any ;
80+ expect ( response ) . toHaveProperty ( 'status' ) ;
81+ expect ( response ) . toHaveProperty ( 'timestamp' ) ;
82+ expect ( response ) . toHaveProperty ( 'data' ) ;
83+ expect ( [ 'success' , 'error' ] ) . toContain ( response . status ) ;
84+ expect ( typeof response . timestamp ) . toBe ( 'number' ) ;
85+ expect ( Array . isArray ( response . data ) ) . toBe ( true ) ;
86+ } ) ;
87+ } ) ;
88+ } ) ;
89+
90+ describe ( 'E-commerce Templates' , ( ) => {
91+ test ( 'generates product with all fields' , ( ) => {
92+ deterministic ( 505 , ( ) => {
93+ const product = TemplateJson . gen ( templates . product ) as any ;
94+ expect ( product ) . toHaveProperty ( 'id' ) ;
95+ expect ( product ) . toHaveProperty ( 'name' ) ;
96+ expect ( product ) . toHaveProperty ( 'price' ) ;
97+ expect ( product ) . toHaveProperty ( 'currency' ) ;
98+ expect ( product ) . toHaveProperty ( 'category' ) ;
99+ expect ( product ) . toHaveProperty ( 'tags' ) ;
100+ expect ( product ) . toHaveProperty ( 'inventory' ) ;
101+ expect ( product ) . toHaveProperty ( 'rating' ) ;
102+ expect ( product ) . toHaveProperty ( 'reviews' ) ;
103+
104+ expect ( typeof product . id ) . toBe ( 'string' ) ;
105+ expect ( product . id ) . toMatch ( / ^ p r o d _ \d { 8 } $ / ) ;
106+ expect ( typeof product . price ) . toBe ( 'number' ) ;
107+ expect ( product . price ) . toBeGreaterThanOrEqual ( 9.99 ) ;
108+ expect ( Array . isArray ( product . tags ) ) . toBe ( true ) ;
109+ expect ( product . inventory ) . toHaveProperty ( 'stock' ) ;
110+ expect ( product . rating ) . toBeGreaterThanOrEqual ( 1.0 ) ;
111+ expect ( product . rating ) . toBeLessThanOrEqual ( 5.0 ) ;
112+ } ) ;
113+ } ) ;
114+
115+ test ( 'generates order with items' , ( ) => {
116+ deterministic ( 606 , ( ) => {
117+ const order = TemplateJson . gen ( templates . order ) as any ;
118+ expect ( order ) . toHaveProperty ( 'orderId' ) ;
119+ expect ( order ) . toHaveProperty ( 'customerId' ) ;
120+ expect ( order ) . toHaveProperty ( 'items' ) ;
121+ expect ( order ) . toHaveProperty ( 'total' ) ;
122+ expect ( order ) . toHaveProperty ( 'status' ) ;
123+ expect ( order ) . toHaveProperty ( 'shippingAddress' ) ;
124+
125+ expect ( order . orderId ) . toMatch ( / ^ O R D - \d { 10 } $ / ) ;
126+ expect ( order . customerId ) . toMatch ( / ^ C U S T - [ A - Z ] { 3 } \d { 6 } $ / ) ;
127+ expect ( Array . isArray ( order . items ) ) . toBe ( true ) ;
128+ expect ( order . items . length ) . toBeGreaterThan ( 0 ) ;
129+ expect ( order . shippingAddress ) . toHaveProperty ( 'street' ) ;
130+ expect ( order . shippingAddress ) . toHaveProperty ( 'city' ) ;
131+ expect ( order . shippingAddress ) . toHaveProperty ( 'state' ) ;
132+ expect ( order . shippingAddress ) . toHaveProperty ( 'zipCode' ) ;
133+ } ) ;
134+ } ) ;
135+ } ) ;
136+
137+ describe ( 'Recursive Templates' , ( ) => {
138+ test ( 'generates tree structure' , ( ) => {
139+ deterministic ( 707 , ( ) => {
140+ const tree = TemplateJson . gen ( templates . tree ( ) ) as any ;
141+ expect ( tree ) . toHaveProperty ( 'value' ) ;
142+ expect ( typeof tree . value ) . toBe ( 'number' ) ;
143+ // Tree may or may not have left/right children due to probability
144+ } ) ;
145+ } ) ;
146+
147+ test ( 'generates comment thread' , ( ) => {
148+ deterministic ( 808 , ( ) => {
149+ const comment = TemplateJson . gen ( templates . comment ( ) ) as any ;
150+ expect ( comment ) . toHaveProperty ( 'id' ) ;
151+ expect ( comment ) . toHaveProperty ( 'text' ) ;
152+ expect ( comment ) . toHaveProperty ( 'author' ) ;
153+ expect ( typeof comment . id ) . toBe ( 'number' ) ;
154+ expect ( typeof comment . text ) . toBe ( 'string' ) ;
155+ expect ( typeof comment . author ) . toBe ( 'string' ) ;
156+ // Replies may or may not exist due to probability
157+ } ) ;
158+ } ) ;
159+ } ) ;
160+
161+ describe ( 'IoT & Sensor Templates' , ( ) => {
162+ test ( 'generates sensor reading' , ( ) => {
163+ deterministic ( 909 , ( ) => {
164+ const reading = TemplateJson . gen ( templates . sensorReading ) as any ;
165+ expect ( reading ) . toHaveProperty ( 'sensorId' ) ;
166+ expect ( reading ) . toHaveProperty ( 'deviceType' ) ;
167+ expect ( reading ) . toHaveProperty ( 'value' ) ;
168+ expect ( reading ) . toHaveProperty ( 'unit' ) ;
169+ expect ( reading ) . toHaveProperty ( 'timestamp' ) ;
170+ expect ( reading ) . toHaveProperty ( 'location' ) ;
171+ expect ( reading ) . toHaveProperty ( 'status' ) ;
172+
173+ expect ( reading . sensorId ) . toMatch ( / ^ s e n s o r _ [ A - Z ] { 2 } \d { 6 } $ / ) ;
174+ expect ( typeof reading . value ) . toBe ( 'number' ) ;
175+ expect ( reading . value ) . toBeGreaterThanOrEqual ( - 50 ) ;
176+ expect ( reading . value ) . toBeLessThanOrEqual ( 150 ) ;
177+ expect ( reading . location ) . toHaveProperty ( 'room' ) ;
178+ expect ( reading . location ) . toHaveProperty ( 'floor' ) ;
179+ } ) ;
180+ } ) ;
181+ } ) ;
182+
183+ describe ( 'Medical Templates' , ( ) => {
184+ test ( 'generates patient record' , ( ) => {
185+ deterministic ( 1010 , ( ) => {
186+ const patient = TemplateJson . gen ( templates . patient ) as any ;
187+ expect ( patient ) . toHaveProperty ( 'patientId' ) ;
188+ expect ( patient ) . toHaveProperty ( 'firstName' ) ;
189+ expect ( patient ) . toHaveProperty ( 'lastName' ) ;
190+ expect ( patient ) . toHaveProperty ( 'dateOfBirth' ) ;
191+ expect ( patient ) . toHaveProperty ( 'gender' ) ;
192+ expect ( patient ) . toHaveProperty ( 'bloodType' ) ;
193+ expect ( patient ) . toHaveProperty ( 'allergies' ) ;
194+ expect ( patient ) . toHaveProperty ( 'emergencyContact' ) ;
195+
196+ expect ( patient . patientId ) . toMatch ( / ^ P A T - \d { 8 } $ / ) ;
197+ expect ( typeof patient . firstName ) . toBe ( 'string' ) ;
198+ expect ( typeof patient . lastName ) . toBe ( 'string' ) ;
199+ expect ( Array . isArray ( patient . allergies ) ) . toBe ( true ) ;
200+ expect ( patient . emergencyContact ) . toHaveProperty ( 'name' ) ;
201+ expect ( patient . emergencyContact ) . toHaveProperty ( 'relationship' ) ;
202+ expect ( patient . emergencyContact ) . toHaveProperty ( 'phone' ) ;
203+ } ) ;
204+ } ) ;
205+ } ) ;
206+
207+ describe ( 'Edge Case Templates' , ( ) => {
208+ test ( 'generates empty structures' , ( ) => {
209+ const empty = TemplateJson . gen ( templates . emptyStructures ) as any ;
210+ expect ( empty ) . toHaveProperty ( 'emptyObject' ) ;
211+ expect ( empty ) . toHaveProperty ( 'emptyArray' ) ;
212+ expect ( empty ) . toHaveProperty ( 'emptyString' ) ;
213+ expect ( empty ) . toHaveProperty ( 'nullValue' ) ;
214+ expect ( empty ) . toHaveProperty ( 'zeroNumber' ) ;
215+ expect ( empty ) . toHaveProperty ( 'falseBool' ) ;
216+
217+ expect ( empty . emptyObject ) . toEqual ( { } ) ;
218+ expect ( empty . emptyArray ) . toEqual ( [ ] ) ;
219+ expect ( empty . emptyString ) . toBe ( '' ) ;
220+ expect ( empty . nullValue ) . toBeNull ( ) ;
221+ expect ( empty . zeroNumber ) . toBe ( 0 ) ;
222+ expect ( empty . falseBool ) . toBe ( false ) ;
223+ } ) ;
224+
225+ test ( 'generates unicode text' , ( ) => {
226+ deterministic ( 1111 , ( ) => {
227+ const unicode = TemplateJson . gen ( templates . unicodeText ) as any ;
228+ expect ( unicode ) . toHaveProperty ( 'ascii' ) ;
229+ expect ( unicode ) . toHaveProperty ( 'latin' ) ;
230+ expect ( unicode ) . toHaveProperty ( 'emoji' ) ;
231+ expect ( unicode ) . toHaveProperty ( 'chinese' ) ;
232+ expect ( unicode ) . toHaveProperty ( 'arabic' ) ;
233+ expect ( unicode ) . toHaveProperty ( 'mixed' ) ;
234+
235+ expect ( typeof unicode . ascii ) . toBe ( 'string' ) ;
236+ expect ( typeof unicode . emoji ) . toBe ( 'string' ) ;
237+ expect ( typeof unicode . mixed ) . toBe ( 'string' ) ;
238+ } ) ;
239+ } ) ;
240+
241+ test ( 'generates large numbers' , ( ) => {
242+ const large = TemplateJson . gen ( templates . largeNumbers ) as any ;
243+ expect ( large ) . toHaveProperty ( 'maxSafeInteger' ) ;
244+ expect ( large ) . toHaveProperty ( 'minSafeInteger' ) ;
245+ expect ( large ) . toHaveProperty ( 'largeFloat' ) ;
246+ expect ( large ) . toHaveProperty ( 'smallFloat' ) ;
247+ expect ( large ) . toHaveProperty ( 'preciseDecimal' ) ;
248+ expect ( large ) . toHaveProperty ( 'scientificNotation' ) ;
249+
250+ expect ( large . maxSafeInteger ) . toBe ( Number . MAX_SAFE_INTEGER ) ;
251+ expect ( large . minSafeInteger ) . toBe ( Number . MIN_SAFE_INTEGER ) ;
252+ expect ( typeof large . largeFloat ) . toBe ( 'number' ) ;
253+ expect ( typeof large . smallFloat ) . toBe ( 'number' ) ;
254+ expect ( large . scientificNotation ) . toBe ( 1.23e-45 ) ;
255+ } ) ;
256+
257+ test ( 'generates mixed types with or template' , ( ) => {
258+ deterministic ( 1212 , ( ) => {
259+ // Test multiple times to see different types
260+ const values = [ ] ;
261+ for ( let i = 0 ; i < 10 ; i ++ ) {
262+ values . push ( TemplateJson . gen ( templates . mixedTypes ) ) ;
263+ }
264+
265+ // Should have generated different types
266+ const types = new Set ( values . map ( v => typeof v ) ) ;
267+ expect ( types . size ) . toBeGreaterThan ( 1 ) ;
268+ } ) ;
269+ } ) ;
270+ } ) ;
271+ } ) ;
0 commit comments