Skip to content

Commit 898a1e9

Browse files
committed
feat(api): add hasFixableError on OrganizationImportDetail
1 parent 08a482b commit 898a1e9

File tree

4 files changed

+89
-1
lines changed

4 files changed

+89
-1
lines changed

api/src/prescription/learner-management/domain/read-models/OrganizationImportDetail.js

+3
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,7 @@ export class OrganizationImportDetail {
1010
lastName,
1111
};
1212
}
13+
get hasFixableErrors() {
14+
return this.errors.some((error) => error.code || error.name === 'AggregateImportError');
15+
}
1316
}

api/src/prescription/learner-management/infrastructure/serializers/jsonapi/organization-import-detail-serializer.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
import jsonapiSerializer from 'jsonapi-serializer';
2+
import omit from 'lodash/omit.js';
23

34
const { Serializer } = jsonapiSerializer;
45

56
const serialize = function (organizationImportDetail, meta) {
67
return new Serializer('organization-import-detail', {
7-
attributes: ['id', 'status', 'errors', 'createdBy', 'createdAt', 'updatedAt'],
8+
attributes: ['id', 'status', 'errors', 'hasFixableErrors', 'createdBy', 'createdAt', 'updatedAt'],
9+
transform: function (record) {
10+
record.errors = record.errors.map((error) => omit(error, 'stack'));
11+
return record;
12+
},
813
meta,
914
}).serialize(organizationImportDetail);
1015
};

api/tests/prescription/learner-management/unit/domain/read-models/OrganizationImportDetail_test.js

+46
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
import { IMPORT_STATUSES } from '../../../../../../src/prescription/learner-management/domain/constants.js';
2+
import {
3+
AggregateImportError,
4+
SiecleXmlImportError,
5+
} from '../../../../../../src/prescription/learner-management/domain/errors.js';
26
import { OrganizationImportDetail } from '../../../../../../src/prescription/learner-management/domain/read-models/OrganizationImportDetail.js';
37
import { expect } from '../../../../../test-helper.js';
48

@@ -32,4 +36,46 @@ describe('Unit | Models | OrganizationImportDetail', function () {
3236

3337
expect(organizationImportDetail).to.eql(expected);
3438
});
39+
40+
describe('hasFixableErrors', function () {
41+
let data;
42+
43+
beforeEach(function () {
44+
data = {
45+
id: 1,
46+
status: IMPORT_STATUSES.VALIDATION_ERROR,
47+
updatedAt: new Date('2023-01-02'),
48+
firstName: 'Tomie',
49+
lastName: 'Katana',
50+
organizationId: 1,
51+
createdBy: 12,
52+
createdAt: new Date('2023-01-01'),
53+
};
54+
});
55+
56+
it('should return true if error is AggregateImportError', function () {
57+
const organizationImportDetail = new OrganizationImportDetail({
58+
...data,
59+
errors: [new AggregateImportError([new Error('oups')])],
60+
});
61+
expect(organizationImportDetail.hasFixableErrors).to.be.true;
62+
});
63+
64+
it('should return true if error has a code property', function () {
65+
const organizationImportDetail = new OrganizationImportDetail({
66+
...data,
67+
errors: [new SiecleXmlImportError('oups')],
68+
});
69+
expect(organizationImportDetail.hasFixableErrors).to.be.true;
70+
});
71+
72+
it("should return false if errors doesn't contains DomainError", function () {
73+
const organizationImportDetail = new OrganizationImportDetail({
74+
...data,
75+
errors: [new Error('oups')],
76+
});
77+
78+
expect(organizationImportDetail.hasFixableErrors).to.be.false;
79+
});
80+
});
3581
});

api/tests/prescription/learner-management/unit/infrastructure/serializers/jsonapi/organization-import-detail-serializer_test.js

+34
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { IMPORT_STATUSES } from '../../../../../../../src/prescription/learner-management/domain/constants.js';
2+
import { SiecleXmlImportError } from '../../../../../../../src/prescription/learner-management/domain/errors.js';
23
import { OrganizationImportDetail } from '../../../../../../../src/prescription/learner-management/domain/read-models/OrganizationImportDetail.js';
34
import { serialize } from '../../../../../../../src/prescription/learner-management/infrastructure/serializers/jsonapi/organization-import-detail-serializer.js';
45
import { CsvImportError } from '../../../../../../../src/shared/domain/errors.js';
@@ -31,6 +32,39 @@ describe('Unit | Serializer | JSONAPI | organization-import-detail-serializer',
3132
'created-at': createdAt,
3233
'created-by': { firstName: 'Richard', lastName: 'Aldana' },
3334
errors: [{ code: 'header', name: 'CsvImportError', meta: { line: 3 } }],
35+
'has-fixable-errors': true,
36+
},
37+
},
38+
});
39+
});
40+
41+
it('should remove stack trace informations from errors', function () {
42+
// given
43+
const updatedAt = new Date();
44+
const createdAt = new Date();
45+
46+
const organizationImport = new OrganizationImportDetail({
47+
id: 1,
48+
status: IMPORT_STATUSES.VALIDATION_ERROR,
49+
firstName: 'Richard',
50+
lastName: 'Aldana',
51+
// use object spread to mimic what is saved in db
52+
errors: [{ ...new SiecleXmlImportError('plop', 'line 2'), stack: 'Error stack' }],
53+
updatedAt,
54+
createdAt,
55+
});
56+
expect(serialize(organizationImport)).to.eql({
57+
data: {
58+
id: '1',
59+
type: 'organization-import-details',
60+
attributes: {
61+
id: 1,
62+
status: IMPORT_STATUSES.VALIDATION_ERROR,
63+
'updated-at': updatedAt,
64+
'created-at': createdAt,
65+
'created-by': { firstName: 'Richard', lastName: 'Aldana' },
66+
errors: [{ code: 'plop', meta: 'line 2', name: 'SiecleXmlImportError' }],
67+
'has-fixable-errors': true,
3468
},
3569
},
3670
});

0 commit comments

Comments
 (0)