Skip to content

Commit 12a2b1f

Browse files
Merge pull request #2217 from contentstack/fix/dx-3571-testcases
Added taxonomy localization unit testcases
2 parents 65ea0ff + c6a3733 commit 12a2b1f

File tree

3 files changed

+59
-37
lines changed

3 files changed

+59
-37
lines changed

.talismanrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ fileignoreconfig:
142142
- filename: packages/contentstack-export/test/unit/export/modules/stack.test.ts
143143
checksum: bb0f20845d85fd56197f1a8c67b8f71c57dcd1836ed9cfd86d1f49f41e84d3a0
144144
- filename: packages/contentstack-export/test/unit/export/modules/taxonomies.test.ts
145-
checksum: 621c1de129488b6a0372a91056ebb84353bcc642ce06de59e3852cfee8d0ce49
145+
checksum: 5b1d2ba5ec9100fd6174e9c6771b7e49c93a09fa2d6aedadd338e56bc3e3610f
146146
- filename: packages/contentstack-export/test/unit/export/modules/custom-roles.test.ts
147147
checksum: 39f0166a8030ee8f504301f3a42cc71b46ddc027189b90029ef19800b79a46e5
148148
- filename: packages/contentstack-export/test/unit/export/modules/workflows.test.ts

packages/contentstack-export/test/unit/export/modules/taxonomies.test.ts

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ describe('ExportTaxonomies', () => {
7070
fileName: 'taxonomies.json',
7171
invalidKeys: [],
7272
limit: 100
73+
},
74+
locales: {
75+
dirName: 'locales',
76+
fileName: 'locales.json',
77+
requiredKeys: ['code', 'uid', 'name', 'fallback_locale']
7378
}
7479
}
7580
} as any;
@@ -82,6 +87,7 @@ describe('ExportTaxonomies', () => {
8287

8388
sinon.stub(FsUtility.prototype, 'writeFile').resolves();
8489
sinon.stub(FsUtility.prototype, 'makeDirectory').resolves();
90+
sinon.stub(FsUtility.prototype, 'readFile').resolves({});
8591
});
8692

8793
afterEach(() => {
@@ -102,7 +108,7 @@ describe('ExportTaxonomies', () => {
102108
});
103109
});
104110

105-
describe('getAllTaxonomies() method', () => {
111+
describe('fetchTaxonomies() method', () => {
106112
it('should fetch and process taxonomies correctly', async () => {
107113
const taxonomies = [
108114
{ uid: 'taxonomy-1', name: 'Category', invalidField: 'remove' },
@@ -118,15 +124,15 @@ describe('ExportTaxonomies', () => {
118124
})
119125
});
120126

121-
await exportTaxonomies.getAllTaxonomies();
127+
await exportTaxonomies.fetchTaxonomies();
122128

123129
// Verify taxonomies were processed
124130
expect(Object.keys(exportTaxonomies.taxonomies).length).to.equal(2);
125131
expect(exportTaxonomies.taxonomies['taxonomy-1']).to.exist;
126132
expect(exportTaxonomies.taxonomies['taxonomy-1'].name).to.equal('Category');
127133
});
128134

129-
it('should call getAllTaxonomies recursively when more taxonomies exist', async () => {
135+
it('should call fetchTaxonomies recursively when more taxonomies exist', async () => {
130136
let callCount = 0;
131137
mockStackClient.taxonomy.returns({
132138
query: sinon.stub().returns({
@@ -147,7 +153,7 @@ describe('ExportTaxonomies', () => {
147153
})
148154
});
149155

150-
await exportTaxonomies.getAllTaxonomies();
156+
await exportTaxonomies.fetchTaxonomies();
151157

152158
// Verify multiple calls were made
153159
expect(callCount).to.be.greaterThan(1);
@@ -159,7 +165,7 @@ describe('ExportTaxonomies', () => {
159165
const mockMakeAPICall = sinon.stub(exportTaxonomies, 'makeAPICall').resolves();
160166
const writeFileStub = FsUtility.prototype.writeFile as sinon.SinonStub;
161167

162-
// Mock getAllTaxonomies to return one taxonomy
168+
// Mock fetchTaxonomies to return one taxonomy
163169
const mockTaxonomy = {
164170
uid: 'taxonomy-1',
165171
name: 'Category'
@@ -208,7 +214,7 @@ describe('ExportTaxonomies', () => {
208214
});
209215
});
210216

211-
describe('getAllTaxonomies() method - edge cases', () => {
217+
describe('fetchTaxonomies() method - edge cases', () => {
212218
it('should handle no items response and not process taxonomies', async () => {
213219
mockStackClient.taxonomy.returns({
214220
query: sinon.stub().returns({
@@ -220,7 +226,7 @@ describe('ExportTaxonomies', () => {
220226
});
221227

222228
const initialCount = Object.keys(exportTaxonomies.taxonomies).length;
223-
await exportTaxonomies.getAllTaxonomies();
229+
await exportTaxonomies.fetchTaxonomies();
224230

225231
// Verify no new taxonomies were added
226232
expect(Object.keys(exportTaxonomies.taxonomies).length).to.equal(initialCount);
@@ -237,7 +243,7 @@ describe('ExportTaxonomies', () => {
237243
});
238244

239245
const initialCount = Object.keys(exportTaxonomies.taxonomies).length;
240-
await exportTaxonomies.getAllTaxonomies();
246+
await exportTaxonomies.fetchTaxonomies();
241247

242248
// Verify no processing occurred with null items
243249
expect(Object.keys(exportTaxonomies.taxonomies).length).to.equal(initialCount);
@@ -250,7 +256,7 @@ describe('ExportTaxonomies', () => {
250256
})
251257
});
252258

253-
await exportTaxonomies.getAllTaxonomies();
259+
await exportTaxonomies.fetchTaxonomies();
254260

255261
// Verify method completes without throwing
256262
expect(exportTaxonomies.taxonomies).to.exist;
@@ -268,7 +274,7 @@ describe('ExportTaxonomies', () => {
268274
})
269275
});
270276

271-
await exportTaxonomies.getAllTaxonomies();
277+
await exportTaxonomies.fetchTaxonomies();
272278

273279
// Verify taxonomies were still processed despite undefined count
274280
expect(exportTaxonomies.taxonomies['taxonomy-1']).to.exist;

packages/contentstack-import/test/unit/import/modules/taxonomies.test.ts

Lines changed: 42 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { expect } from 'chai';
22
import * as sinon from 'sinon';
33
import { join } from 'node:path';
4+
import values from 'lodash/values';
45
import ImportTaxonomies from '../../../../src/import/modules/taxonomies';
56
import { fsUtil, fileHelper } from '../../../../src/utils';
67

@@ -40,10 +41,15 @@ describe('ImportTaxonomies', () => {
4041
context: { module: 'taxonomies' },
4142
concurrency: 2,
4243
fetchConcurrency: 3,
44+
master_locale: { code: 'en-us' },
4345
modules: {
4446
taxonomies: {
4547
dirName: 'taxonomies',
4648
fileName: 'taxonomies.json'
49+
},
50+
locales: {
51+
dirName: 'locales',
52+
fileName: 'locales.json'
4753
}
4854
}
4955
};
@@ -156,11 +162,15 @@ describe('ImportTaxonomies', () => {
156162
(fileHelper.fileExistsSync as any).returns(true);
157163
(fsUtil.readFile as any).returns(null);
158164
(fsUtil.makeDirectory as any).resolves();
165+
166+
// Stub makeConcurrentCall to avoid errors when processing null taxonomies
167+
sandbox.stub(importTaxonomies as any, 'makeConcurrentCall').resolves();
159168

169+
// Should complete without errors when taxonomies data is null
170+
// The method should handle null gracefully and not throw
160171
await importTaxonomies.start();
161172

162-
expect((fileHelper.fileExistsSync as any).calledOnce).to.be.true;
163-
expect((fsUtil.readFile as any).calledOnce).to.be.true;
173+
// Verify the method completed successfully (no assertion needed as the test would fail if an error was thrown)
164174
});
165175

166176
it('should write success and failed files when data exists', async () => {
@@ -192,7 +202,7 @@ describe('ImportTaxonomies', () => {
192202
// Stub makeConcurrentCall
193203
const makeConcurrentCallStub = sandbox.stub(importTaxonomies as any, 'makeConcurrentCall').resolves();
194204

195-
await (importTaxonomies as any).importTaxonomies();
205+
await (importTaxonomies as any).importTaxonomies({ apiContent: values((importTaxonomies as any).taxonomies) });
196206

197207
expect(makeConcurrentCallStub.calledOnce).to.be.true;
198208
});
@@ -201,18 +211,18 @@ describe('ImportTaxonomies', () => {
201211
(importTaxonomies as any).taxonomies = {};
202212
const makeConcurrentCallStub = sandbox.stub(importTaxonomies as any, 'makeConcurrentCall').resolves();
203213

204-
await (importTaxonomies as any).importTaxonomies();
214+
await (importTaxonomies as any).importTaxonomies({ apiContent: [] });
205215

206-
expect(makeConcurrentCallStub.called).to.be.false;
216+
expect(makeConcurrentCallStub.calledOnce).to.be.true;
207217
});
208218

209219
it('should handle undefined taxonomies', async () => {
210220
(importTaxonomies as any).taxonomies = undefined;
211221
const makeConcurrentCallStub = sandbox.stub(importTaxonomies as any, 'makeConcurrentCall').resolves();
212222

213-
await (importTaxonomies as any).importTaxonomies();
223+
await (importTaxonomies as any).importTaxonomies({ apiContent: [] });
214224

215-
expect(makeConcurrentCallStub.called).to.be.false;
225+
expect(makeConcurrentCallStub.calledOnce).to.be.true;
216226
});
217227

218228
it('should process taxonomies with concurrency limit', async () => {
@@ -222,7 +232,7 @@ describe('ImportTaxonomies', () => {
222232

223233
const makeConcurrentCallStub = sandbox.stub(importTaxonomies as any, 'makeConcurrentCall').resolves();
224234

225-
await (importTaxonomies as any).importTaxonomies();
235+
await (importTaxonomies as any).importTaxonomies({ apiContent: values((importTaxonomies as any).taxonomies) });
226236

227237
expect(makeConcurrentCallStub.calledOnce).to.be.true;
228238
const callArgs = makeConcurrentCallStub.getCall(0).args[0];
@@ -235,6 +245,7 @@ describe('ImportTaxonomies', () => {
235245
const mockApiOptions = {
236246
entity: 'import-taxonomy' as any,
237247
apiData: { uid: 'taxonomy_1', name: 'Test Taxonomy' },
248+
queryParam: { locale: undefined as string | undefined },
238249
resolve: sandbox.stub(),
239250
reject: sandbox.stub()
240251
};
@@ -256,6 +267,7 @@ describe('ImportTaxonomies', () => {
256267
const mockApiOptions = {
257268
entity: 'import-taxonomy' as any,
258269
apiData: { uid: 'taxonomy_1', name: 'Test Taxonomy' },
270+
queryParam: { locale: undefined as string | undefined },
259271
resolve: sandbox.stub(),
260272
reject: sandbox.stub()
261273
};
@@ -271,6 +283,7 @@ describe('ImportTaxonomies', () => {
271283
const mockApiOptions = {
272284
entity: 'import-taxonomy' as any,
273285
apiData: { uid: 'taxonomy_1', name: 'Test Taxonomy' },
286+
queryParam: { locale: undefined as string | undefined },
274287
resolve: sandbox.stub(),
275288
reject: sandbox.stub()
276289
};
@@ -294,6 +307,7 @@ describe('ImportTaxonomies', () => {
294307
const mockApiOptions = {
295308
entity: 'import-taxonomy' as any,
296309
apiData: { uid: 'taxonomy_3', name: 'Test Taxonomy' },
310+
queryParam: { locale: undefined as string | undefined },
297311
resolve: sandbox.stub(),
298312
reject: sandbox.stub()
299313
};
@@ -715,7 +729,7 @@ describe('ImportTaxonomies', () => {
715729
await onSuccess({ apiData: mockApiData });
716730
});
717731

718-
await (importTaxonomies as any).importTaxonomies();
732+
await (importTaxonomies as any).importTaxonomies({ apiContent: values((importTaxonomies as any).taxonomies) });
719733

720734
// Verify the actual callback executed lines 97-98
721735
expect((importTaxonomies as any).createdTaxonomies['taxonomy_1']).to.exist;
@@ -758,6 +772,7 @@ describe('ImportTaxonomies', () => {
758772
const serialized = (importTaxonomies as any).serializeTaxonomy({
759773
apiData: config.apiContent[0],
760774
entity: 'import-taxonomy',
775+
queryParam: { locale: config.apiParams.queryParam?.locale },
761776
resolve: actualOnSuccess,
762777
reject: actualOnReject
763778
});
@@ -771,7 +786,7 @@ describe('ImportTaxonomies', () => {
771786
}
772787
});
773788

774-
await (importTaxonomies as any).importTaxonomies();
789+
await (importTaxonomies as any).importTaxonomies({ apiContent: values((importTaxonomies as any).taxonomies) });
775790

776791
// Verify lines 117-118 executed (adding to createdTaxonomies and createdTerms on 409)
777792
expect((importTaxonomies as any).createdTaxonomies['taxonomy_1']).to.exist;
@@ -814,6 +829,7 @@ describe('ImportTaxonomies', () => {
814829
const serialized = (importTaxonomies as any).serializeTaxonomy({
815830
apiData: config.apiContent[0],
816831
entity: 'import-taxonomy',
832+
queryParam: { locale: config.apiParams.queryParam?.locale },
817833
resolve: actualOnSuccess,
818834
reject: actualOnReject
819835
});
@@ -827,7 +843,7 @@ describe('ImportTaxonomies', () => {
827843
}
828844
});
829845

830-
await (importTaxonomies as any).importTaxonomies();
846+
await (importTaxonomies as any).importTaxonomies({ apiContent: values((importTaxonomies as any).taxonomies) });
831847

832848
// Verify lines 131-132 executed (adding to failedTaxonomies and failedTerms)
833849
expect((importTaxonomies as any).failedTaxonomies['taxonomy_1']).to.exist;
@@ -850,7 +866,7 @@ describe('ImportTaxonomies', () => {
850866
onReject({ error: mockError, apiData: mockApiData });
851867
});
852868

853-
await (importTaxonomies as any).importTaxonomies();
869+
await (importTaxonomies as any).importTaxonomies({ apiContent: values((importTaxonomies as any).taxonomies) });
854870

855871
expect((importTaxonomies as any).failedTaxonomies['taxonomy_1']).to.exist;
856872
});
@@ -871,7 +887,7 @@ describe('ImportTaxonomies', () => {
871887
onReject({ error: mockError, apiData: mockApiData });
872888
});
873889

874-
await (importTaxonomies as any).importTaxonomies();
890+
await (importTaxonomies as any).importTaxonomies({ apiContent: values((importTaxonomies as any).taxonomies) });
875891

876892
expect((importTaxonomies as any).failedTaxonomies['taxonomy_1']).to.exist;
877893
});
@@ -892,7 +908,7 @@ describe('ImportTaxonomies', () => {
892908
onReject({ error: mockError, apiData: mockApiData });
893909
});
894910

895-
await (importTaxonomies as any).importTaxonomies();
911+
await (importTaxonomies as any).importTaxonomies({ apiContent: values((importTaxonomies as any).taxonomies) });
896912

897913
expect((importTaxonomies as any).failedTaxonomies['taxonomy_1']).to.exist;
898914
});
@@ -913,7 +929,7 @@ describe('ImportTaxonomies', () => {
913929
onReject({ error: mockError, apiData: mockApiData });
914930
});
915931

916-
await (importTaxonomies as any).importTaxonomies();
932+
await (importTaxonomies as any).importTaxonomies({ apiContent: values((importTaxonomies as any).taxonomies) });
917933

918934
expect((importTaxonomies as any).failedTaxonomies['taxonomy_1']).to.exist;
919935
});
@@ -934,7 +950,7 @@ describe('ImportTaxonomies', () => {
934950
onReject({ error: mockError, apiData: mockApiData });
935951
});
936952

937-
await (importTaxonomies as any).importTaxonomies();
953+
await (importTaxonomies as any).importTaxonomies({ apiContent: values((importTaxonomies as any).taxonomies) });
938954

939955
expect((importTaxonomies as any).failedTaxonomies['taxonomy_1']).to.exist;
940956
});
@@ -955,7 +971,7 @@ describe('ImportTaxonomies', () => {
955971
onReject({ error: mockError, apiData: mockApiData });
956972
});
957973

958-
await (importTaxonomies as any).importTaxonomies();
974+
await (importTaxonomies as any).importTaxonomies({ apiContent: values((importTaxonomies as any).taxonomies) });
959975

960976
expect(Object.keys((importTaxonomies as any).failedTaxonomies)).to.include('undefined');
961977
});
@@ -975,7 +991,7 @@ describe('ImportTaxonomies', () => {
975991
onSuccess({ apiData: mockApiData });
976992
});
977993

978-
await (importTaxonomies as any).importTaxonomies();
994+
await (importTaxonomies as any).importTaxonomies({ apiContent: values((importTaxonomies as any).taxonomies) });
979995

980996
expect((importTaxonomies as any).createdTaxonomies['taxonomy_1']).to.exist;
981997
expect((importTaxonomies as any).createdTerms['taxonomy_1']).to.be.undefined;
@@ -996,7 +1012,7 @@ describe('ImportTaxonomies', () => {
9961012
onSuccess({ apiData: mockApiData });
9971013
});
9981014

999-
await (importTaxonomies as any).importTaxonomies();
1015+
await (importTaxonomies as any).importTaxonomies({ apiContent: values((importTaxonomies as any).taxonomies) });
10001016

10011017
expect((importTaxonomies as any).createdTaxonomies['taxonomy_1']).to.exist;
10021018
expect((importTaxonomies as any).createdTerms['taxonomy_1']).to.deep.equal({});
@@ -1005,7 +1021,7 @@ describe('ImportTaxonomies', () => {
10051021
it('should handle empty taxonomies list', async () => {
10061022
(importTaxonomies as any).taxonomies = {};
10071023

1008-
await (importTaxonomies as any).importTaxonomies();
1024+
await (importTaxonomies as any).importTaxonomies({ apiContent: [] });
10091025

10101026
expect((importTaxonomies as any).createdTaxonomies).to.deep.equal({});
10111027
});
@@ -1029,19 +1045,19 @@ describe('ImportTaxonomies', () => {
10291045
const mockApiOptions = {
10301046
entity: 'import-taxonomy' as any,
10311047
apiData: { uid: 'taxonomy_1', name: 'Test Taxonomy' },
1048+
queryParam: { locale: undefined as string | undefined },
10321049
resolve: sandbox.stub(),
10331050
reject: sandbox.stub()
10341051
};
10351052

10361053
(fileHelper.fileExistsSync as any).returns(true);
10371054
(fsUtil.readFile as any).throws(new Error('File read error'));
10381055

1039-
try {
1040-
(importTaxonomies as any).serializeTaxonomy(mockApiOptions);
1041-
expect.fail('Expected error to be thrown');
1042-
} catch (error: any) {
1043-
expect(error.message).to.equal('File read error');
1044-
}
1056+
const result = (importTaxonomies as any).serializeTaxonomy(mockApiOptions);
1057+
1058+
// When file read fails, loadTaxonomyFile catches the error and returns undefined,
1059+
// which causes serializeTaxonomy to set apiData to undefined
1060+
expect(result.apiData).to.be.undefined;
10451061
});
10461062
});
10471063
});

0 commit comments

Comments
 (0)