Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

N21-1971 cancel migration wizard #3258

Merged
merged 18 commits into from
May 30, 2024
Merged
Show file tree
Hide file tree
Changes from 8 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
4 changes: 4 additions & 0 deletions src/locales/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,10 @@ export default {
"Öffnet ein Tool, mit dem Benutzerkonten ohne Benutzereingriff zu moin.schule migriert werden können. Dieses Tool ist verfügbar, sobald der erste Benutzer dieser Schule erfolgreich zu moin.schule migriert wurde.",
"components.administration.adminMigrationSection.migrationWizardButton.label":
"Migrationsassistenten öffnen",
"components.administration.adminMigrationSection.migrationWizardCancelDialog.Description":
"Wenn Sie die Ausführung des Migrationsassistenten jetzt abbrechen, werden die in der aktuellen Sitzung durchgeführten Konten-Verknüpfungen zurückgesetzt. Möchten Sie die Ausführung des Assistenten jetzt wirklich abbrechen?",
"components.administration.adminMigrationSection.migrationWizardCancelDialog.Title":
"Sind Sie sich sicher, dass sie die Migration abbrechen wollen?",
"components.administration.adminMigrationSection.oauthMigrationFinished.text":
"Die Account-Migration wurde am {date} um {time} Uhr abgeschlossen.<br>Die Wartefrist nach Abschluss der Migration endet endgültig am {finishDate} um {finishTime} Uhr!",
"components.administration.adminMigrationSection.oauthMigrationFinished.textComplete":
Expand Down
4 changes: 4 additions & 0 deletions src/locales/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,10 @@ export default {
"Opens a tool that is used to migrate user accounts to moin.schule without user involvement. This tool is available once the first user of this school has been successfully migrated to moin.schule.",
"components.administration.adminMigrationSection.migrationWizardButton.label":
"Open migration wizard",
"components.administration.adminMigrationSection.migrationWizardCancelDialog.Description":
"If you cancel the execution of the migration wizard now, the account links made in the current session will be reset. Do you really want to cancel the wizard now?",
"components.administration.adminMigrationSection.migrationWizardCancelDialog.Title":
"Are you sure you want to cancel the migration?",
"components.administration.adminMigrationSection.oauthMigrationFinished.text":
"The account migration was completed on {date} at {time}.<br>The waiting period after completion of the migration finally ends on {finishDate} at {finishTime}!",
"components.administration.adminMigrationSection.oauthMigrationFinished.textComplete":
Expand Down
4 changes: 4 additions & 0 deletions src/locales/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,10 @@ export default {
"Abre una herramienta que se utiliza para migrar cuentas de usuario a moin.schule sin la participación del usuario. Esta herramienta estará disponible una vez que el primer usuario de esta escuela haya migrado exitosamente a moin.schule.",
"components.administration.adminMigrationSection.migrationWizardButton.label":
"Abrir asistente de migración",
"components.administration.adminMigrationSection.migrationWizardCancelDialog.Description":
"Si cancela ahora la ejecución del asistente de migración, se restablecerán los vínculos de cuenta realizados en la sesión actual. ¿Realmente desea cancelar el asistente ahora?",
"components.administration.adminMigrationSection.migrationWizardCancelDialog.Title":
"¿Estás seguro de que quieres cancelar la migración?",
"components.administration.adminMigrationSection.oauthMigrationFinished.text":
"La migración de la cuenta se completó el {date} a las {time}.<br>¡El periodo de espera tras la finalización de la migración termina finalmente el {finishDate} a las {finishTime}!",
"components.administration.adminMigrationSection.oauthMigrationFinished.textComplete":
Expand Down
4 changes: 4 additions & 0 deletions src/locales/uk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,10 @@ export default {
"Відкриває інструмент, який використовується для перенесення облікових записів користувачів на moin.schule без участі користувача. Цей інструмент стане доступним після успішного переходу першого користувача цієї школи на moin.schule.",
"components.administration.adminMigrationSection.migrationWizardButton.label":
"Відкрийте помічник з міграції",
"components.administration.adminMigrationSection.migrationWizardCancelDialog.Description":
"Якщо ви скасуєте запуск майстра міграції зараз, зв'язки облікових записів, зроблені в поточному сеансі, будуть скинуті. Ви дійсно хочете скасувати майстер зараз?",
"components.administration.adminMigrationSection.migrationWizardCancelDialog.Title":
"Ви впевнені, що хочете скасувати міграцію?",
"components.administration.adminMigrationSection.oauthMigrationFinished.text":
"Перенесення облікового запису завершено {date} о {time}.<br>Період очікування після завершення міграції нарешті закінчується {finishDate} о {finishTime}!",
"components.administration.adminMigrationSection.oauthMigrationFinished.textComplete":
Expand Down
98 changes: 84 additions & 14 deletions src/pages/administration/Migration.page.vue
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,28 @@
{{ t("pages.administration.migration.step5") }}
</VStepperItem>
</VStepperHeader>
<vCustomDialog
:is-open="isCancelDialogOpen"
mrikallab marked this conversation as resolved.
Show resolved Hide resolved
has-buttons
mrikallab marked this conversation as resolved.
Show resolved Hide resolved
@dialog-confirmed="confirmCancelMigration()"
@update:is-open="isCancelDialogOpen = $event"
data-testid="cancel-migration-dialog"
>
<template #title>
{{
t(
"components.administration.adminMigrationSection.migrationWizardCancelDialog.Title"
)
}}
</template>
<template #content>
{{
t(
"components.administration.adminMigrationSection.migrationWizardCancelDialog.Description"
)
}}
</template>
</vCustomDialog>
</VStepper>
</template>

Expand Down Expand Up @@ -160,19 +182,29 @@

<VStepperWindowItem :value="2" data-testid="migration_importUsers">
<ImportUsers />
<div class="text-right">
<VBtn @click="migrationStep = 1">
{{ t("pages.administration.migration.back") }}
</VBtn>
<VBtn
class="ml-2"
id="migration_importUsers_next"
color="primary"
:disabled="!canPerformMigration"
@click="migrationStep = 3"
>
{{ t("pages.administration.migration.next") }}
</VBtn>
<div>
<div class="float-left">
mrikallab marked this conversation as resolved.
Show resolved Hide resolved
<VBtn
@click="cancelMigration()"
data-testid="importUsers-cancel-migration-btn"
mrikallab marked this conversation as resolved.
Show resolved Hide resolved
>
{{ t("common.actions.cancel") }}
</VBtn>
</div>
<div class="float-right">
<VBtn @click="migrationStep = 1">
{{ t("pages.administration.migration.back") }}
</VBtn>
<VBtn
class="ml-2"
id="migration_importUsers_next"
color="primary"
:disabled="!canPerformMigration"
@click="migrationStep = 3"
>
{{ t("pages.administration.migration.next") }}
</VBtn>
</div>
</div>
</VStepperWindowItem>

Expand Down Expand Up @@ -214,7 +246,15 @@
/>
</VRow>
</VCardText>
<div class="text-right">
<div class="float-left">
mrikallab marked this conversation as resolved.
Show resolved Hide resolved
mrikallab marked this conversation as resolved.
Show resolved Hide resolved
<VBtn
@click="cancelMigration"
data-testid="summary-cancel-migration-btn"
>
{{ t("common.actions.cancel") }}
</VBtn>
</div>
<div class="float-right">
<VBtn :disabled="isLoading" @click="migrationStep = 2"
>{{ t("pages.administration.migration.back") }}
</VBtn>
Expand Down Expand Up @@ -485,6 +525,8 @@ import {
} from "vue";
import { useI18n } from "vue-i18n";
import { useRouter } from "vue-router";
import VCustomDialog from "../../components/organisms/vCustomDialog.vue";
mrikallab marked this conversation as resolved.
Show resolved Hide resolved
import router from "../../router";
mrikallab marked this conversation as resolved.
Show resolved Hide resolved

const { t } = useI18n();

Expand All @@ -500,6 +542,8 @@ const isLoading: Ref<boolean> = ref(false);

const checkTotal: Ref<NodeJS.Timeout | undefined> = ref(undefined);

const isCancelDialogOpen: Ref<boolean> = ref(false);

const isMigrationNotStarted = computed(() => {
return school.value.inUserMigration === undefined;
});
Expand Down Expand Up @@ -558,6 +602,11 @@ const sourceSystemName = computed(() => {
}
});

const schoolSettingsPage: Breadcrumb = {
mrikallab marked this conversation as resolved.
Show resolved Hide resolved
title: t("pages.administration.school.index.title"),
to: "/administration/school-settings",
};

const breadcrumbs: Ref<Breadcrumb[]> = ref([
{
title: t("pages.administration.index.title"),
Expand Down Expand Up @@ -703,6 +752,27 @@ const nextStep = () => {
migrationStep.value = nextStep;
};

const cancelMigration = () => {
isCancelDialogOpen.value = true;
};

const confirmCancelMigration = async () => {
isLoading.value = true;

await importUsersModule.cancelMigration();

await redirectToAdminPage();

isLoading.value = false;
};

const redirectToAdminPage = async () => {
await router.push({
path: schoolSettingsPage.to,
query: { openPanels: "migration" },
});
};

watch(migrationStep, async (val) => {
if (val === 1 || val === 3) {
await summary();
Expand Down
142 changes: 142 additions & 0 deletions src/pages/administration/migration.unit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import setupStores from "@@/tests/test-utils/setupStores";
import { ComponentMountingOptions, mount, shallowMount } from "@vue/test-utils";
import { nextTick } from "vue";
import vueDompurifyHTMLPlugin from "vue-dompurify-html";
import Router from "../../router";

jest.mock<typeof import("@/utils/pageTitle")>("@/utils/pageTitle", () => ({
buildPageTitle: (pageTitle) => pageTitle ?? "",
Expand All @@ -38,6 +39,9 @@ const getWrapper = (
provide: {
[THEME_KEY.valueOf()]: $theme,
},
mocks: {
mrikallab marked this conversation as resolved.
Show resolved Hide resolved
$theme,
},
},
...options,
});
Expand Down Expand Up @@ -71,6 +75,7 @@ describe("User Migration / Index", () => {
envConfigModule: EnvConfigModule,
importUsersModule: ImportUsersModule,
schoolsModule: SchoolsModule,
router: Router,
});

envConfigModule.getEnv.FEATURE_USER_MIGRATION_ENABLED = true;
Expand Down Expand Up @@ -299,4 +304,141 @@ describe("User Migration / Index", () => {
expect(wrapper.vm.school.inMaintenance).toBe(false);
});
});

describe("cancel migration", () => {
describe("in step migration_importUsers", () => {
const setup = async () => {
schoolsModule.setSchool(
schoolFactory.build({
inUserMigration: true,
inMaintenance: true,
})
);

importUsersModule.setTotal(10);
importUsersModule.setTotalUnmatched(5);
importUsersModule.setTotalMatched(5);

const wrapper = getWrapper();

wrapper.vm.migrationStep = 2;
wrapper.vm.t("pages.administration.migration.title", {
source: "LDAP",
instance: $theme.name,
});

const redirect = {
path: "/administration/school-settings",
query: { openPanels: "authentication" },
};

await nextTick();

return {
wrapper,
redirect,
};
};

it("should show cancel button", async () => {
const { wrapper } = await setup();

const button = wrapper.findComponent(
"[data-testid=importUsers-cancel-migration-btn]"
);

expect(button.exists()).toBe(true);
});

it("should show dialog on click", async () => {
const { wrapper } = await setup();

const button = wrapper.findComponent(
"[data-testid=importUsers-cancel-migration-btn]"
);

await button.trigger("click");

expect(wrapper.vm.isCancelDialogOpen).toBe(true);
});

it("should change isCancelDialogOpen on isOpen", async () => {
const { wrapper } = await setup();

const button = wrapper.findComponent(
"[data-testid=importUsers-cancel-migration-btn]"
);

await button.trigger("click");

const dialog = wrapper.findComponent({ name: "v-custom-dialog" });

dialog.vm.$emit("update:isOpen", false);
await nextTick();

expect(wrapper.vm.isCancelDialogOpen).toEqual(false);
});

it("should call store on dialog-confirm", async () => {
const { wrapper } = await setup();

const cancelMigrationMock = jest.spyOn(
importUsersModule,
"cancelMigration"
);
cancelMigrationMock.mockImplementationOnce(async () => {
schoolsModule.setSchool({
...schoolsModule.getSchool,
inUserMigration: false,
inMaintenance: false,
});
return Promise.resolve();
});

const button = wrapper.findComponent(
"[data-testid=importUsers-cancel-migration-btn]"
);

await button.trigger("click");

const dialog = wrapper.findComponent({ name: "v-custom-dialog" });

dialog.vm.$emit("dialog-confirmed");
await nextTick();

expect(importUsersModule.cancelMigration).toHaveBeenCalled();
});
});

describe("in step migration_summary", () => {
const setup = async () => {
schoolsModule.setSchool(
schoolFactory.build({
inUserMigration: true,
inMaintenance: true,
})
);

const wrapper = getWrapper();

wrapper.vm.migrationStep = 3;

await nextTick();

return {
wrapper,
};
};

it("should show cancel button", async () => {
const { wrapper } = await setup();

const button = wrapper.findComponent(
"[data-testid=summary-cancel-migration-btn]"
);

expect(button.exists()).toBe(true);
});
});
});
});
Loading
Loading