Skip to content

Commit 79bcd77

Browse files
Merge pull request #203 from contentstack/feature/DX-3269-comprehensive-test-coverage
DX-3269: Add comprehensive test coverage enhancement
2 parents 3a802ab + 5ab6e75 commit 79bcd77

12 files changed

+4201
-17
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,5 @@ coverage
1313
.env
1414
.dccache
1515
dist/*
16-
*.log
16+
*.log
17+
.nx/

.talismanrc

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,4 @@
11
fileignoreconfig:
2-
- filename: test/unit/persistance/local-storage.spec.ts
3-
checksum: da6638b676c34274279d80539983a5dfcf5e729ec65d6a535d7939b6ba7c9b58
4-
- filename: test/unit/cache.spec.ts
5-
checksum: cadf177ffc4ce8c271e8b49fd227947351afa7cade5c7cd902cda78d0f91ba5b
6-
- filename: test/unit/persistance/preference-store.spec.ts
7-
checksum: 0f3457f8ea8b149c5de1d6585c78eb4cea0d2ac00ca69cdc294c44fe29ea3c11
8-
- filename: test/unit/contentstack.spec.ts
9-
checksum: 267e4857af531bd3e5f080c3630922169a0c161355a6b185f1ee2716c5e60c45
10-
- filename: test/unit/utils.spec.ts
11-
checksum: b447bcd7d3b4ff83846dc0f492f1c7f52f80c46f341aabbf7570a16ed17d8232
12-
- filename: src/lib/types.ts
13-
checksum: a5e87bfe625b8cef8714545c07cfbe3ea05b07c8cb495fef532c610b37d82140
14-
- filename: test/unit/persistance/preference-store.spec.ts
15-
checksum: 5d31522fb28b95b0b243b8f3d8499dcf4c5c80c0ea24f895802a724136985e37
16-
- filename: test/api/live-preview.spec.ts
17-
checksum: 577c1407bfd80d2e6a7717f55b02eb0b93e37050d7c985b85f2bb4bf99f430f0
2+
- filename: test/unit/query-optimization-comprehensive.spec.ts
3+
checksum: f5aaf6c784d7c101a05ca513c584bbd6e95f963d1e42779f2596050d9bcbac96
184
version: "1.0"

test/api/entry-variants.spec.ts

Lines changed: 329 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,329 @@
1+
import { stackInstance } from '../utils/stack-instance';
2+
import { TEntry } from './types';
3+
4+
const stack = stackInstance();
5+
const contentTypeUid = process.env.CONTENT_TYPE_UID || 'sample_content_type';
6+
const entryUid = process.env.ENTRY_UID || 'sample_entry';
7+
const variantUid = process.env.VARIANT_UID || 'sample_variant';
8+
9+
describe('Entry Variants API Tests', () => {
10+
describe('Single Entry Variant Operations', () => {
11+
it('should fetch entry with specific variant', async () => {
12+
const result = await stack.contentType(contentTypeUid).entry(entryUid)
13+
.variants(variantUid)
14+
.fetch<TEntry>();
15+
16+
expect(result).toBeDefined();
17+
expect(result.uid).toBe(entryUid);
18+
// Note: The SDK uses variants() method and sets x-cs-variant-uid header
19+
// The actual variant data structure depends on the CMS response
20+
});
21+
22+
it('should fetch entry with multiple variants', async () => {
23+
const variantUids = [variantUid, 'variant_2', 'variant_3'];
24+
25+
const result = await stack.contentType(contentTypeUid).entry(entryUid)
26+
.variants(variantUids)
27+
.fetch<TEntry>();
28+
29+
expect(result).toBeDefined();
30+
expect(result.uid).toBe(entryUid);
31+
// Multiple variants are passed as comma-separated string in header
32+
});
33+
34+
it('should include metadata with variant requests', async () => {
35+
const result = await stack.contentType(contentTypeUid).entry(entryUid)
36+
.variants(variantUid)
37+
.includeMetadata()
38+
.fetch<TEntry>();
39+
40+
expect(result).toBeDefined();
41+
expect(result.uid).toBe(entryUid);
42+
// Metadata should be included when requested
43+
});
44+
45+
it('should apply variant with reference inclusion', async () => {
46+
const result = await stack.contentType(contentTypeUid).entry(entryUid)
47+
.variants(variantUid)
48+
.includeReference()
49+
.fetch<TEntry>();
50+
51+
expect(result).toBeDefined();
52+
expect(result.uid).toBe(entryUid);
53+
// Variants should work with reference inclusion
54+
});
55+
});
56+
57+
describe('Entry Variants Query Operations', () => {
58+
it('should query entries with specific variant', async () => {
59+
const result = await stack.contentType(contentTypeUid).entry()
60+
.variants(variantUid)
61+
.find<{ entries: TEntry[] }>();
62+
63+
expect(result).toBeDefined();
64+
expect(result.entries).toBeDefined();
65+
expect(result.entries!.length).toBeGreaterThan(0);
66+
67+
// The variant header is sent, affecting the response
68+
const entry = result.entries![0] as any;
69+
expect(entry.uid).toBeDefined();
70+
});
71+
72+
it('should query entries with multiple variants', async () => {
73+
const variantUids = [variantUid, 'variant_2'];
74+
75+
const result = await stack.contentType(contentTypeUid).entry()
76+
.variants(variantUids)
77+
.find<{ entries: TEntry[] }>();
78+
79+
expect(result).toBeDefined();
80+
expect(result.entries).toBeDefined();
81+
expect(result.entries!.length).toBeGreaterThan(0);
82+
83+
// Multiple variants are passed as comma-separated string
84+
const entry = result.entries![0] as any;
85+
expect(entry.uid).toBeDefined();
86+
});
87+
88+
it('should filter entries with variant using query', async () => {
89+
const result = await stack.contentType(contentTypeUid).entry()
90+
.variants(variantUid)
91+
.query()
92+
.equalTo('uid', entryUid)
93+
.find<{ entries: TEntry[] }>();
94+
95+
expect(result).toBeDefined();
96+
expect(result.entries).toBeDefined();
97+
98+
if (result.entries && result.entries.length > 0) {
99+
result.entries.forEach((entry: any) => {
100+
expect(entry.uid).toBe(entryUid);
101+
});
102+
}
103+
});
104+
105+
it('should support pagination with variant queries', async () => {
106+
const result = await stack.contentType(contentTypeUid).entry()
107+
.variants(variantUid)
108+
.limit(5)
109+
.skip(0)
110+
.find<{ entries: TEntry[] }>();
111+
112+
expect(result).toBeDefined();
113+
expect(result.entries).toBeDefined();
114+
expect(result.entries!.length).toBeLessThanOrEqual(5);
115+
116+
if (result.entries && result.entries.length > 0) {
117+
const entry = result.entries[0] as any;
118+
expect(entry.uid).toBeDefined();
119+
}
120+
});
121+
122+
it('should include count with variant queries', async () => {
123+
const result = await stack.contentType(contentTypeUid).entry()
124+
.variants(variantUid)
125+
.includeCount()
126+
.find<{ entries: TEntry[], count: number }>();
127+
128+
expect(result).toBeDefined();
129+
expect(result.entries).toBeDefined();
130+
expect(result.count).toBeDefined();
131+
expect(typeof result.count).toBe('number');
132+
133+
if (result.entries && result.entries.length > 0) {
134+
const entry = result.entries[0] as any;
135+
expect(entry.uid).toBeDefined();
136+
}
137+
});
138+
});
139+
140+
describe('Variant Field and Content Operations', () => {
141+
it('should fetch entry with variant and content type', async () => {
142+
const result = await stack.contentType(contentTypeUid).entry(entryUid)
143+
.variants(variantUid)
144+
.includeContentType()
145+
.fetch<TEntry>();
146+
147+
expect(result).toBeDefined();
148+
expect(result.uid).toBe(entryUid);
149+
expect(result.title).toBeDefined();
150+
// Content type should be included with variant
151+
});
152+
153+
it('should fetch entry with variant and specific fields only', async () => {
154+
const result = await stack.contentType(contentTypeUid).entry(entryUid)
155+
.variants(variantUid)
156+
.only(['title', 'uid'])
157+
.fetch<TEntry>();
158+
159+
expect(result).toBeDefined();
160+
expect(result.uid).toBe(entryUid);
161+
expect(result.title).toBeDefined();
162+
// Only specified fields should be returned
163+
});
164+
165+
it('should handle variant with embedded items', async () => {
166+
const result = await stack.contentType(contentTypeUid).entry(entryUid)
167+
.variants(variantUid)
168+
.includeEmbeddedItems()
169+
.fetch<TEntry>();
170+
171+
expect(result).toBeDefined();
172+
expect(result.uid).toBe(entryUid);
173+
// Embedded items should be included with variant
174+
});
175+
});
176+
177+
describe('Variant Performance and Basic Tests', () => {
178+
it('should apply variant with additional parameters', async () => {
179+
const result = await stack.contentType(contentTypeUid).entry(entryUid)
180+
.variants(variantUid)
181+
.addParams({ 'variant_context': 'mobile' })
182+
.fetch<TEntry>();
183+
184+
expect(result).toBeDefined();
185+
expect(result.uid).toBe(entryUid);
186+
// Variant context is passed as additional parameter
187+
});
188+
189+
it('should handle variant with multiple parameters', async () => {
190+
const result = await stack.contentType(contentTypeUid).entry(entryUid)
191+
.variants(variantUid)
192+
.addParams({
193+
'variant_context': 'mobile',
194+
'user_segment': 'premium'
195+
})
196+
.fetch<TEntry>();
197+
198+
expect(result).toBeDefined();
199+
expect(result.uid).toBe(entryUid);
200+
// Multiple parameters should be handled
201+
});
202+
203+
it('should handle variant with locale specification', async () => {
204+
const result = await stack.contentType(contentTypeUid).entry(entryUid)
205+
.variants(variantUid)
206+
.locale('en-us')
207+
.fetch<TEntry>();
208+
209+
expect(result).toBeDefined();
210+
expect(result.uid).toBe(entryUid);
211+
expect(result.locale).toBe('en-us');
212+
// Variant should work with locale
213+
});
214+
});
215+
216+
describe('Variant Error Handling', () => {
217+
it('should handle variant queries with reasonable performance', async () => {
218+
const startTime = Date.now();
219+
220+
const result = await stack.contentType(contentTypeUid).entry()
221+
.variants(variantUid)
222+
.limit(10)
223+
.find<{ entries: TEntry[] }>();
224+
225+
const endTime = Date.now();
226+
const duration = endTime - startTime;
227+
228+
expect(result).toBeDefined();
229+
expect(result.entries).toBeDefined();
230+
expect(duration).toBeLessThan(10000); // Should complete within 10 seconds
231+
232+
if (result.entries && result.entries.length > 0) {
233+
const entry = result.entries[0] as any;
234+
expect(entry.uid).toBeDefined();
235+
}
236+
});
237+
238+
it('should handle repeated variant requests consistently', async () => {
239+
// First request
240+
const result1 = await stack.contentType(contentTypeUid).entry(entryUid)
241+
.variants(variantUid)
242+
.fetch<TEntry>();
243+
244+
// Second request
245+
const result2 = await stack.contentType(contentTypeUid).entry(entryUid)
246+
.variants(variantUid)
247+
.fetch<TEntry>();
248+
249+
expect(result1).toBeDefined();
250+
expect(result2).toBeDefined();
251+
expect(result1.uid).toBe(result2.uid);
252+
253+
// Both requests should return consistent data
254+
expect(result1.uid).toBe(entryUid);
255+
expect(result2.uid).toBe(entryUid);
256+
});
257+
});
258+
259+
describe('Advanced Variant Error Handling', () => {
260+
it('should handle invalid variant UIDs gracefully', async () => {
261+
try {
262+
await stack.contentType(contentTypeUid).entry(entryUid)
263+
.variants('invalid_variant_uid')
264+
.fetch<TEntry>();
265+
} catch (error) {
266+
expect(error).toBeDefined();
267+
// Should return meaningful error message
268+
}
269+
});
270+
271+
it('should handle basic variant requests', async () => {
272+
const result = await stack.contentType(contentTypeUid).entry(entryUid)
273+
.variants(variantUid)
274+
.fetch<TEntry>();
275+
276+
expect(result).toBeDefined();
277+
expect(result.uid).toBe(entryUid);
278+
// Variant header should be applied
279+
});
280+
281+
it('should handle variant query errors gracefully', async () => {
282+
try {
283+
await stack.contentType('invalid_content_type').entry()
284+
.variants(variantUid)
285+
.find<{ entries: TEntry[] }>();
286+
} catch (error) {
287+
expect(error).toBeDefined();
288+
// Should handle error gracefully
289+
}
290+
});
291+
});
292+
293+
describe('Variant Integration Tests', () => {
294+
it('should support variant with reference inclusion', async () => {
295+
const result = await stack.contentType(contentTypeUid).entry(entryUid)
296+
.variants(variantUid)
297+
.includeReference()
298+
.fetch<TEntry>();
299+
300+
expect(result).toBeDefined();
301+
expect(result.uid).toBe(entryUid);
302+
// Reference inclusion should work with variants
303+
});
304+
305+
it('should handle variant with locale specification', async () => {
306+
const result = await stack.contentType(contentTypeUid).entry(entryUid)
307+
.variants(variantUid)
308+
.locale('en-us')
309+
.fetch<TEntry>();
310+
311+
expect(result).toBeDefined();
312+
expect(result.uid).toBe(entryUid);
313+
expect(result.locale).toBe('en-us');
314+
// Variant should work with locale
315+
});
316+
317+
it('should support variant with field selection', async () => {
318+
const result = await stack.contentType(contentTypeUid).entry(entryUid)
319+
.variants(variantUid)
320+
.only(['title', 'uid'])
321+
.fetch<TEntry>();
322+
323+
expect(result).toBeDefined();
324+
expect(result.uid).toBe(entryUid);
325+
expect(result.title).toBeDefined();
326+
// Only specified fields should be returned with variant
327+
});
328+
});
329+
});

0 commit comments

Comments
 (0)