Skip to content

Commit 76d8b2e

Browse files
authored
feat: Add error messages for partial migration [FC-0107] (#2555)
Adds the error messages for partial migrations
1 parent 5ce61fa commit 76d8b2e

File tree

6 files changed

+130
-4
lines changed

6 files changed

+130
-4
lines changed

src/legacy-libraries-migration/LegacyLibMigrationPage.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ describe('<LegacyLibMigrationPage />', () => {
418418
expect(axiosMock.history.post[0].data).toBe(
419419
'{"sources":["library-v1:MBA+123","library-v1:UNIX+LG1","library-v1:MBA+1234"],"target":"lib:SampleTaxonomyOrg1:TL1","create_collections":true,"repeat_handling_strategy":"fork"}',
420420
);
421-
expect(mockShowToast).toHaveBeenCalledWith('Legacy libraries migration failed.');
421+
expect(mockShowToast).toHaveBeenCalledWith('Legacy libraries migration have failed');
422422
});
423423

424424
it('should show help sidebar', async () => {

src/legacy-libraries-migration/data/api.mocks.ts

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ export async function mockGetMigrationStatus(migrationId: string): Promise<api.M
66
return mockGetMigrationStatus.migrationStatusData;
77
case mockGetMigrationStatus.migrationIdFailed:
88
return mockGetMigrationStatus.migrationStatusFailedData;
9+
case mockGetMigrationStatus.migrationIdMultiple:
10+
return mockGetMigrationStatus.migrationStatusFailedMultipleData;
11+
case mockGetMigrationStatus.migrationIdOneLibrary:
12+
return mockGetMigrationStatus.migrationStatusFailedOneLibraryData;
913
default:
1014
/* istanbul ignore next */
1115
throw new Error(`mockGetMigrationStatus: unknown migration ID "${migrationId}"`);
@@ -32,6 +36,7 @@ mockGetMigrationStatus.migrationStatusData = {
3236
preserveUrlSlugs: false,
3337
targetCollectionSlug: 'coll-1',
3438
forwardSourceToTarget: true,
39+
isFailed: false,
3540
},
3641
],
3742
} as api.MigrateTaskStatusData;
@@ -55,6 +60,75 @@ mockGetMigrationStatus.migrationStatusFailedData = {
5560
preserveUrlSlugs: false,
5661
targetCollectionSlug: 'coll-1',
5762
forwardSourceToTarget: true,
63+
isFailed: true,
64+
},
65+
],
66+
} as api.MigrateTaskStatusData;
67+
mockGetMigrationStatus.migrationIdMultiple = '3';
68+
mockGetMigrationStatus.migrationStatusFailedMultipleData = {
69+
uuid: mockGetMigrationStatus.migrationId,
70+
state: 'Succeeded',
71+
stateText: 'Succeeded',
72+
completedSteps: 9,
73+
totalSteps: 9,
74+
attempts: 1,
75+
created: '',
76+
modified: '',
77+
artifacts: [],
78+
parameters: [
79+
{
80+
source: 'legacy-lib-1',
81+
target: 'lib',
82+
compositionLevel: 'component',
83+
repeatHandlingStrategy: 'update',
84+
preserveUrlSlugs: false,
85+
targetCollectionSlug: 'coll-1',
86+
forwardSourceToTarget: true,
87+
isFailed: true,
88+
},
89+
{
90+
source: 'legacy-lib-2',
91+
target: 'lib',
92+
compositionLevel: 'component',
93+
repeatHandlingStrategy: 'update',
94+
preserveUrlSlugs: false,
95+
targetCollectionSlug: 'coll-1',
96+
forwardSourceToTarget: true,
97+
isFailed: true,
98+
},
99+
],
100+
} as api.MigrateTaskStatusData;
101+
mockGetMigrationStatus.migrationIdOneLibrary = '4';
102+
mockGetMigrationStatus.migrationStatusFailedOneLibraryData = {
103+
uuid: mockGetMigrationStatus.migrationId,
104+
state: 'Succeeded',
105+
stateText: 'Succeeded',
106+
completedSteps: 9,
107+
totalSteps: 9,
108+
attempts: 1,
109+
created: '',
110+
modified: '',
111+
artifacts: [],
112+
parameters: [
113+
{
114+
source: 'legacy-lib-1',
115+
target: 'lib',
116+
compositionLevel: 'component',
117+
repeatHandlingStrategy: 'update',
118+
preserveUrlSlugs: false,
119+
targetCollectionSlug: 'coll-1',
120+
forwardSourceToTarget: true,
121+
isFailed: true,
122+
},
123+
{
124+
source: 'legacy-lib-2',
125+
target: 'lib',
126+
compositionLevel: 'component',
127+
repeatHandlingStrategy: 'update',
128+
preserveUrlSlugs: false,
129+
targetCollectionSlug: 'coll-1',
130+
forwardSourceToTarget: true,
131+
isFailed: false,
58132
},
59133
],
60134
} as api.MigrateTaskStatusData;

src/legacy-libraries-migration/data/api.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export interface MigrateArtifacts {
2121
preserveUrlSlugs: boolean;
2222
targetCollectionSlug: string;
2323
forwardSourceToTarget: boolean;
24+
isFailed: boolean;
2425
}
2526

2627
export interface MigrateTaskStatusData {

src/legacy-libraries-migration/messages.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,9 +142,19 @@ const messages = defineMessages({
142142
},
143143
migrationFailed: {
144144
id: 'legacy-libraries-migration.confirmation-step.toast.migration-failed',
145-
defaultMessage: 'Legacy libraries migration failed.',
145+
defaultMessage: 'Legacy libraries migration have failed',
146146
description: 'Toast message that indicates the migration of legacy libraries is failed',
147147
},
148+
migrationFailedMultiple: {
149+
id: 'legacy-libraries-migration.confirmation-step.toast.migration-multiple-failed',
150+
defaultMessage: 'Multiple legacy libraries have failed',
151+
description: 'Toast message that indicates the migration of legacy libraries is failed',
152+
},
153+
migrationFailedOneLibrary: {
154+
id: 'legacy-libraries-migration.confirmation-step.toast.migration-one-failed',
155+
defaultMessage: 'The legacy library with this key has failed: {key}',
156+
description: 'Toast message that indicates that one legacy library has failed in the migration',
157+
},
148158
migrationSuccess: {
149159
id: 'legacy-libraries-migration.confirmation-step.toast.migration-success',
150160
defaultMessage: 'The migration of legacy libraries has been completed successfully.',

src/library-authoring/LibraryAuthoringPage.test.tsx

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1089,6 +1089,32 @@ describe('<LibraryAuthoringPage />', () => {
10891089
},
10901090
});
10911091

1092-
await waitFor(() => expect(mockShowToast).toHaveBeenCalledWith('Legacy libraries migration failed.'));
1092+
await waitFor(() => expect(mockShowToast).toHaveBeenCalledWith('Legacy libraries migration have failed'));
1093+
});
1094+
1095+
it('Should show fail multiple legacy libraries in a migration', async () => {
1096+
render(<LibraryLayout />, {
1097+
path,
1098+
routerProps: {
1099+
initialEntries: [
1100+
`/library/${mockContentLibrary.libraryId}?migration_task=${mockGetMigrationStatus.migrationIdMultiple}`,
1101+
],
1102+
},
1103+
});
1104+
1105+
await waitFor(() => expect(mockShowToast).toHaveBeenCalledWith('Multiple legacy libraries have failed'));
1106+
});
1107+
1108+
it('Should show fail one legacy library in a migration', async () => {
1109+
render(<LibraryLayout />, {
1110+
path,
1111+
routerProps: {
1112+
initialEntries: [
1113+
`/library/${mockContentLibrary.libraryId}?migration_task=${mockGetMigrationStatus.migrationIdOneLibrary}`,
1114+
],
1115+
},
1116+
});
1117+
1118+
await waitFor(() => expect(mockShowToast).toHaveBeenCalledWith('The legacy library with this key has failed: legacy-lib-1'));
10931119
});
10941120
});

src/library-authoring/LibraryAuthoringPage.tsx

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,10 +225,25 @@ const LibraryAuthoringPage = ({
225225
if (migrationId) {
226226
let deleteMigrationIdParam = false;
227227
if (migrationStatusData?.state === 'Succeeded') {
228-
showToast(intl.formatMessage(migrationMessages.migrationSuccess));
228+
// Check if any library migrations failed.
229+
// A `Succeeded` state means that the bulk migration ended, but some libraries might have failed.
230+
const failedMigrations = migrationStatusData.parameters.filter(item => item.isFailed);
231+
if (failedMigrations.length > 1) {
232+
showToast(intl.formatMessage(migrationMessages.migrationFailedMultiple));
233+
} else if (failedMigrations.length === 1) {
234+
showToast(intl.formatMessage(
235+
migrationMessages.migrationFailedOneLibrary,
236+
{
237+
key: failedMigrations[0].source,
238+
},
239+
));
240+
} else {
241+
showToast(intl.formatMessage(migrationMessages.migrationSuccess));
242+
}
229243
queryClient.invalidateQueries({ predicate: (query) => libraryQueryPredicate(query, libraryId) });
230244
deleteMigrationIdParam = true;
231245
} else if (migrationStatusData?.state === 'Failed') {
246+
// A `Failed` state means that the entire bulk migration has failed.
232247
showToast(intl.formatMessage(migrationMessages.migrationFailed));
233248
deleteMigrationIdParam = true;
234249
} else if (migrationStatusData?.state === 'Canceled') {

0 commit comments

Comments
 (0)