Skip to content

Commit 4d13e28

Browse files
authored
Merge pull request DSpace#3138 from 4Science/task/main/DURACOM-282
Fix error which prevent submitter to deposit a new item
2 parents fb70b58 + 7f8e0a1 commit 4d13e28

5 files changed

Lines changed: 411 additions & 17 deletions

File tree

src/app/core/json-patch/json-patch-operations.reducer.spec.ts

Lines changed: 380 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,4 +340,384 @@ describe('jsonPatchOperationsReducer test suite', () => {
340340
});
341341
});
342342

343+
describe('dedupeOperationEntries', () => {
344+
it('should not remove duplicated keys if operations are not sequential', () => {
345+
initState = {
346+
sections: {
347+
children: {
348+
publicationStep: {
349+
body: [
350+
{
351+
operation: {
352+
op: 'add',
353+
path: '/sections/publicationStep/dc.date.issued',
354+
value: [
355+
{
356+
value: '2024-06',
357+
language: null,
358+
authority: null,
359+
display: '2024-06',
360+
confidence: -1,
361+
place: 0,
362+
otherInformation: null,
363+
},
364+
],
365+
},
366+
timeCompleted: timestampBeforeStart,
367+
},
368+
{
369+
operation: {
370+
op: 'replace',
371+
path: '/sections/publicationStep/dc.date.issued/0',
372+
value: {
373+
value: '2023-06-19',
374+
language: null,
375+
authority: null,
376+
display: '2023-06-19',
377+
confidence: -1,
378+
place: 0,
379+
otherInformation: null,
380+
},
381+
},
382+
timeCompleted: timestampBeforeStart,
383+
},
384+
],
385+
} as JsonPatchOperationsEntry,
386+
},
387+
transactionStartTime: null,
388+
commitPending: false,
389+
} as JsonPatchOperationsResourceEntry,
390+
};
391+
392+
const value = [
393+
{
394+
value: '2024-06-19',
395+
language: null,
396+
authority: null,
397+
display: '2024-06-19',
398+
confidence: -1,
399+
place: 0,
400+
otherInformation: null,
401+
},
402+
];
403+
const action = new NewPatchAddOperationAction(
404+
'sections',
405+
'publicationStep',
406+
'/sections/publicationStep/dc.date.issued',
407+
value);
408+
const newState = jsonPatchOperationsReducer(initState, action);
409+
410+
const expectedBody: any = [
411+
{
412+
'operation': {
413+
'op': 'add',
414+
'path': '/sections/publicationStep/dc.date.issued',
415+
'value': [
416+
{
417+
'value': '2024-06',
418+
'language': null,
419+
'authority': null,
420+
'display': '2024-06',
421+
'confidence': -1,
422+
'place': 0,
423+
'otherInformation': null,
424+
},
425+
],
426+
},
427+
'timeCompleted': timestampBeforeStart,
428+
},
429+
{
430+
'operation': {
431+
'op': 'replace',
432+
'path': '/sections/publicationStep/dc.date.issued/0',
433+
'value': {
434+
'value': '2023-06-19',
435+
'language': null,
436+
'authority': null,
437+
'display': '2023-06-19',
438+
'confidence': -1,
439+
'place': 0,
440+
'otherInformation': null,
441+
},
442+
},
443+
'timeCompleted': timestampBeforeStart,
444+
},
445+
{
446+
'operation': {
447+
'op': 'add',
448+
'path': '/sections/publicationStep/dc.date.issued',
449+
'value': [
450+
{
451+
'value': '2024-06-19',
452+
'language': null,
453+
'authority': null,
454+
'display': '2024-06-19',
455+
'confidence': -1,
456+
'place': 0,
457+
'otherInformation': null,
458+
},
459+
],
460+
},
461+
'timeCompleted': timestampBeforeStart,
462+
},
463+
];
464+
465+
expect(newState.sections.children.publicationStep.body).toEqual(expectedBody);
466+
467+
});
468+
469+
it('should remove duplicated keys if operations are sequential', () => {
470+
initState = {
471+
sections: {
472+
children: {
473+
publicationStep: {
474+
body: [
475+
{
476+
operation: {
477+
op: 'add',
478+
path: '/sections/publicationStep/dc.date.issued',
479+
value: [
480+
{
481+
value: '2024-06',
482+
language: null,
483+
authority: null,
484+
display: '2024-06',
485+
confidence: -1,
486+
place: 0,
487+
otherInformation: null,
488+
},
489+
],
490+
},
491+
timeCompleted: timestampBeforeStart,
492+
},
493+
{
494+
operation: {
495+
op: 'replace',
496+
path: '/sections/publicationStep/dc.date.issued/0',
497+
value: {
498+
value: '2023-06-19',
499+
language: null,
500+
authority: null,
501+
display: '2023-06-19',
502+
confidence: -1,
503+
place: 0,
504+
otherInformation: null,
505+
},
506+
},
507+
timeCompleted: timestampBeforeStart,
508+
},
509+
{
510+
'operation': {
511+
'op': 'add',
512+
'path': '/sections/publicationStep/dc.date.issued',
513+
'value': [
514+
{
515+
'value': '2024-06-19',
516+
'language': null,
517+
'authority': null,
518+
'display': '2024-06-19',
519+
'confidence': -1,
520+
'place': 0,
521+
'otherInformation': null,
522+
},
523+
],
524+
},
525+
'timeCompleted': timestampBeforeStart,
526+
},
527+
],
528+
} as JsonPatchOperationsEntry,
529+
},
530+
transactionStartTime: null,
531+
commitPending: false,
532+
} as JsonPatchOperationsResourceEntry,
533+
};
534+
535+
const value = [
536+
{
537+
value: '2024-06-20',
538+
language: null,
539+
authority: null,
540+
display: '2024-06-20',
541+
confidence: -1,
542+
place: 0,
543+
otherInformation: null,
544+
},
545+
];
546+
const action = new NewPatchAddOperationAction(
547+
'sections',
548+
'publicationStep',
549+
'/sections/publicationStep/dc.date.issued',
550+
value);
551+
const newState = jsonPatchOperationsReducer(initState, action);
552+
553+
const expectedBody: any = [
554+
{
555+
'operation': {
556+
'op': 'add',
557+
'path': '/sections/publicationStep/dc.date.issued',
558+
'value': [
559+
{
560+
'value': '2024-06',
561+
'language': null,
562+
'authority': null,
563+
'display': '2024-06',
564+
'confidence': -1,
565+
'place': 0,
566+
'otherInformation': null,
567+
},
568+
],
569+
},
570+
'timeCompleted': timestampBeforeStart,
571+
},
572+
{
573+
'operation': {
574+
'op': 'replace',
575+
'path': '/sections/publicationStep/dc.date.issued/0',
576+
'value': {
577+
'value': '2023-06-19',
578+
'language': null,
579+
'authority': null,
580+
'display': '2023-06-19',
581+
'confidence': -1,
582+
'place': 0,
583+
'otherInformation': null,
584+
},
585+
},
586+
'timeCompleted': timestampBeforeStart,
587+
},
588+
{
589+
'operation': {
590+
'op': 'add',
591+
'path': '/sections/publicationStep/dc.date.issued',
592+
'value': [
593+
{
594+
'value': '2024-06-20',
595+
'language': null,
596+
'authority': null,
597+
'display': '2024-06-20',
598+
'confidence': -1,
599+
'place': 0,
600+
'otherInformation': null,
601+
},
602+
],
603+
},
604+
'timeCompleted': timestampBeforeStart,
605+
},
606+
];
607+
608+
expect(newState.sections.children.publicationStep.body).toEqual(expectedBody);
609+
610+
});
611+
612+
it('should remove duplicated keys if all operations have same key', () => {
613+
initState = {
614+
sections: {
615+
children: {
616+
publicationStep: {
617+
body: [
618+
{
619+
operation: {
620+
op: 'add',
621+
path: '/sections/publicationStep/dc.date.issued',
622+
value: [
623+
{
624+
value: '2024',
625+
language: null,
626+
authority: null,
627+
display: '2024-06',
628+
confidence: -1,
629+
place: 0,
630+
otherInformation: null,
631+
},
632+
],
633+
},
634+
timeCompleted: timestampBeforeStart,
635+
},
636+
{
637+
'operation': {
638+
'op': 'add',
639+
'path': '/sections/publicationStep/dc.date.issued',
640+
'value': [
641+
{
642+
'value': '2024-06',
643+
'language': null,
644+
'authority': null,
645+
'display': '2024-06',
646+
'confidence': -1,
647+
'place': 0,
648+
'otherInformation': null,
649+
},
650+
],
651+
},
652+
'timeCompleted': timestampBeforeStart,
653+
},
654+
{
655+
'operation': {
656+
'op': 'add',
657+
'path': '/sections/publicationStep/dc.date.issued',
658+
'value': [
659+
{
660+
'value': '2024-06-19',
661+
'language': null,
662+
'authority': null,
663+
'display': '2024-06-19',
664+
'confidence': -1,
665+
'place': 0,
666+
'otherInformation': null,
667+
},
668+
],
669+
},
670+
'timeCompleted': timestampBeforeStart,
671+
},
672+
],
673+
} as JsonPatchOperationsEntry,
674+
},
675+
transactionStartTime: null,
676+
commitPending: false,
677+
} as JsonPatchOperationsResourceEntry,
678+
};
679+
680+
const value = [
681+
{
682+
value: '2024-06-20',
683+
language: null,
684+
authority: null,
685+
display: '2024-06-20',
686+
confidence: -1,
687+
place: 0,
688+
otherInformation: null,
689+
},
690+
];
691+
const action = new NewPatchAddOperationAction(
692+
'sections',
693+
'publicationStep',
694+
'/sections/publicationStep/dc.date.issued',
695+
value);
696+
const newState = jsonPatchOperationsReducer(initState, action);
697+
698+
const expectedBody: any = [
699+
{
700+
'operation': {
701+
'op': 'add',
702+
'path': '/sections/publicationStep/dc.date.issued',
703+
'value': [
704+
{
705+
'value': '2024-06-20',
706+
'language': null,
707+
'authority': null,
708+
'display': '2024-06-20',
709+
'confidence': -1,
710+
'place': 0,
711+
'otherInformation': null,
712+
},
713+
],
714+
},
715+
'timeCompleted': timestampBeforeStart,
716+
},
717+
];
718+
719+
expect(newState.sections.children.publicationStep.body).toEqual(expectedBody);
720+
721+
});
722+
});
343723
});

0 commit comments

Comments
 (0)