Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .talismanrc
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ fileignoreconfig:
- filename: packages/contentstack-export/test/unit/export/modules/stack.test.ts
checksum: bb0f20845d85fd56197f1a8c67b8f71c57dcd1836ed9cfd86d1f49f41e84d3a0
- filename: packages/contentstack-export/test/unit/export/modules/taxonomies.test.ts
checksum: 621c1de129488b6a0372a91056ebb84353bcc642ce06de59e3852cfee8d0ce49
checksum: 5b1d2ba5ec9100fd6174e9c6771b7e49c93a09fa2d6aedadd338e56bc3e3610f
- filename: packages/contentstack-export/test/unit/export/modules/custom-roles.test.ts
checksum: 39f0166a8030ee8f504301f3a42cc71b46ddc027189b90029ef19800b79a46e5
- filename: packages/contentstack-export/test/unit/export/modules/workflows.test.ts
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,11 @@ describe('ExportTaxonomies', () => {
fileName: 'taxonomies.json',
invalidKeys: [],
limit: 100
},
locales: {
dirName: 'locales',
fileName: 'locales.json',
requiredKeys: ['code', 'uid', 'name', 'fallback_locale']
}
}
} as any;
Expand All @@ -82,6 +87,7 @@ describe('ExportTaxonomies', () => {

sinon.stub(FsUtility.prototype, 'writeFile').resolves();
sinon.stub(FsUtility.prototype, 'makeDirectory').resolves();
sinon.stub(FsUtility.prototype, 'readFile').resolves({});
});

afterEach(() => {
Expand All @@ -102,7 +108,7 @@ describe('ExportTaxonomies', () => {
});
});

describe('getAllTaxonomies() method', () => {
describe('fetchTaxonomies() method', () => {
it('should fetch and process taxonomies correctly', async () => {
const taxonomies = [
{ uid: 'taxonomy-1', name: 'Category', invalidField: 'remove' },
Expand All @@ -118,15 +124,15 @@ describe('ExportTaxonomies', () => {
})
});

await exportTaxonomies.getAllTaxonomies();
await exportTaxonomies.fetchTaxonomies();

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

it('should call getAllTaxonomies recursively when more taxonomies exist', async () => {
it('should call fetchTaxonomies recursively when more taxonomies exist', async () => {
let callCount = 0;
mockStackClient.taxonomy.returns({
query: sinon.stub().returns({
Expand All @@ -147,7 +153,7 @@ describe('ExportTaxonomies', () => {
})
});

await exportTaxonomies.getAllTaxonomies();
await exportTaxonomies.fetchTaxonomies();

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

// Mock getAllTaxonomies to return one taxonomy
// Mock fetchTaxonomies to return one taxonomy
const mockTaxonomy = {
uid: 'taxonomy-1',
name: 'Category'
Expand Down Expand Up @@ -208,7 +214,7 @@ describe('ExportTaxonomies', () => {
});
});

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

const initialCount = Object.keys(exportTaxonomies.taxonomies).length;
await exportTaxonomies.getAllTaxonomies();
await exportTaxonomies.fetchTaxonomies();

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

const initialCount = Object.keys(exportTaxonomies.taxonomies).length;
await exportTaxonomies.getAllTaxonomies();
await exportTaxonomies.fetchTaxonomies();

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

await exportTaxonomies.getAllTaxonomies();
await exportTaxonomies.fetchTaxonomies();

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

await exportTaxonomies.getAllTaxonomies();
await exportTaxonomies.fetchTaxonomies();

// Verify taxonomies were still processed despite undefined count
expect(exportTaxonomies.taxonomies['taxonomy-1']).to.exist;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { expect } from 'chai';
import * as sinon from 'sinon';
import { join } from 'node:path';
import values from 'lodash/values';
import ImportTaxonomies from '../../../../src/import/modules/taxonomies';
import { fsUtil, fileHelper } from '../../../../src/utils';

Expand Down Expand Up @@ -40,10 +41,15 @@ describe('ImportTaxonomies', () => {
context: { module: 'taxonomies' },
concurrency: 2,
fetchConcurrency: 3,
master_locale: { code: 'en-us' },
modules: {
taxonomies: {
dirName: 'taxonomies',
fileName: 'taxonomies.json'
},
locales: {
dirName: 'locales',
fileName: 'locales.json'
}
}
};
Expand Down Expand Up @@ -156,11 +162,15 @@ describe('ImportTaxonomies', () => {
(fileHelper.fileExistsSync as any).returns(true);
(fsUtil.readFile as any).returns(null);
(fsUtil.makeDirectory as any).resolves();

// Stub makeConcurrentCall to avoid errors when processing null taxonomies
sandbox.stub(importTaxonomies as any, 'makeConcurrentCall').resolves();

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

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

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

await (importTaxonomies as any).importTaxonomies();
await (importTaxonomies as any).importTaxonomies({ apiContent: values((importTaxonomies as any).taxonomies) });

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

await (importTaxonomies as any).importTaxonomies();
await (importTaxonomies as any).importTaxonomies({ apiContent: [] });

expect(makeConcurrentCallStub.called).to.be.false;
expect(makeConcurrentCallStub.calledOnce).to.be.true;
});

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

await (importTaxonomies as any).importTaxonomies();
await (importTaxonomies as any).importTaxonomies({ apiContent: [] });

expect(makeConcurrentCallStub.called).to.be.false;
expect(makeConcurrentCallStub.calledOnce).to.be.true;
});

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

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

await (importTaxonomies as any).importTaxonomies();
await (importTaxonomies as any).importTaxonomies({ apiContent: values((importTaxonomies as any).taxonomies) });

expect(makeConcurrentCallStub.calledOnce).to.be.true;
const callArgs = makeConcurrentCallStub.getCall(0).args[0];
Expand All @@ -235,6 +245,7 @@ describe('ImportTaxonomies', () => {
const mockApiOptions = {
entity: 'import-taxonomy' as any,
apiData: { uid: 'taxonomy_1', name: 'Test Taxonomy' },
queryParam: { locale: undefined as string | undefined },
resolve: sandbox.stub(),
reject: sandbox.stub()
};
Expand All @@ -256,6 +267,7 @@ describe('ImportTaxonomies', () => {
const mockApiOptions = {
entity: 'import-taxonomy' as any,
apiData: { uid: 'taxonomy_1', name: 'Test Taxonomy' },
queryParam: { locale: undefined as string | undefined },
resolve: sandbox.stub(),
reject: sandbox.stub()
};
Expand All @@ -271,6 +283,7 @@ describe('ImportTaxonomies', () => {
const mockApiOptions = {
entity: 'import-taxonomy' as any,
apiData: { uid: 'taxonomy_1', name: 'Test Taxonomy' },
queryParam: { locale: undefined as string | undefined },
resolve: sandbox.stub(),
reject: sandbox.stub()
};
Expand All @@ -294,6 +307,7 @@ describe('ImportTaxonomies', () => {
const mockApiOptions = {
entity: 'import-taxonomy' as any,
apiData: { uid: 'taxonomy_3', name: 'Test Taxonomy' },
queryParam: { locale: undefined as string | undefined },
resolve: sandbox.stub(),
reject: sandbox.stub()
};
Expand Down Expand Up @@ -715,7 +729,7 @@ describe('ImportTaxonomies', () => {
await onSuccess({ apiData: mockApiData });
});

await (importTaxonomies as any).importTaxonomies();
await (importTaxonomies as any).importTaxonomies({ apiContent: values((importTaxonomies as any).taxonomies) });

// Verify the actual callback executed lines 97-98
expect((importTaxonomies as any).createdTaxonomies['taxonomy_1']).to.exist;
Expand Down Expand Up @@ -758,6 +772,7 @@ describe('ImportTaxonomies', () => {
const serialized = (importTaxonomies as any).serializeTaxonomy({
apiData: config.apiContent[0],
entity: 'import-taxonomy',
queryParam: { locale: config.apiParams.queryParam?.locale },
resolve: actualOnSuccess,
reject: actualOnReject
});
Expand All @@ -771,7 +786,7 @@ describe('ImportTaxonomies', () => {
}
});

await (importTaxonomies as any).importTaxonomies();
await (importTaxonomies as any).importTaxonomies({ apiContent: values((importTaxonomies as any).taxonomies) });

// Verify lines 117-118 executed (adding to createdTaxonomies and createdTerms on 409)
expect((importTaxonomies as any).createdTaxonomies['taxonomy_1']).to.exist;
Expand Down Expand Up @@ -814,6 +829,7 @@ describe('ImportTaxonomies', () => {
const serialized = (importTaxonomies as any).serializeTaxonomy({
apiData: config.apiContent[0],
entity: 'import-taxonomy',
queryParam: { locale: config.apiParams.queryParam?.locale },
resolve: actualOnSuccess,
reject: actualOnReject
});
Expand All @@ -827,7 +843,7 @@ describe('ImportTaxonomies', () => {
}
});

await (importTaxonomies as any).importTaxonomies();
await (importTaxonomies as any).importTaxonomies({ apiContent: values((importTaxonomies as any).taxonomies) });

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

await (importTaxonomies as any).importTaxonomies();
await (importTaxonomies as any).importTaxonomies({ apiContent: values((importTaxonomies as any).taxonomies) });

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

await (importTaxonomies as any).importTaxonomies();
await (importTaxonomies as any).importTaxonomies({ apiContent: values((importTaxonomies as any).taxonomies) });

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

await (importTaxonomies as any).importTaxonomies();
await (importTaxonomies as any).importTaxonomies({ apiContent: values((importTaxonomies as any).taxonomies) });

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

await (importTaxonomies as any).importTaxonomies();
await (importTaxonomies as any).importTaxonomies({ apiContent: values((importTaxonomies as any).taxonomies) });

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

await (importTaxonomies as any).importTaxonomies();
await (importTaxonomies as any).importTaxonomies({ apiContent: values((importTaxonomies as any).taxonomies) });

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

await (importTaxonomies as any).importTaxonomies();
await (importTaxonomies as any).importTaxonomies({ apiContent: values((importTaxonomies as any).taxonomies) });

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

await (importTaxonomies as any).importTaxonomies();
await (importTaxonomies as any).importTaxonomies({ apiContent: values((importTaxonomies as any).taxonomies) });

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

await (importTaxonomies as any).importTaxonomies();
await (importTaxonomies as any).importTaxonomies({ apiContent: values((importTaxonomies as any).taxonomies) });

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

await (importTaxonomies as any).importTaxonomies();
await (importTaxonomies as any).importTaxonomies({ apiContent: [] });

expect((importTaxonomies as any).createdTaxonomies).to.deep.equal({});
});
Expand All @@ -1029,19 +1045,19 @@ describe('ImportTaxonomies', () => {
const mockApiOptions = {
entity: 'import-taxonomy' as any,
apiData: { uid: 'taxonomy_1', name: 'Test Taxonomy' },
queryParam: { locale: undefined as string | undefined },
resolve: sandbox.stub(),
reject: sandbox.stub()
};

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

try {
(importTaxonomies as any).serializeTaxonomy(mockApiOptions);
expect.fail('Expected error to be thrown');
} catch (error: any) {
expect(error.message).to.equal('File read error');
}
const result = (importTaxonomies as any).serializeTaxonomy(mockApiOptions);

// When file read fails, loadTaxonomyFile catches the error and returns undefined,
// which causes serializeTaxonomy to set apiData to undefined
expect(result.apiData).to.be.undefined;
});
});
});