From 6265f3a27a076f6c3c24d0fb323e44c471d85b23 Mon Sep 17 00:00:00 2001 From: Alex Grozav Date: Wed, 15 Feb 2023 15:05:55 +0200 Subject: [PATCH] feat(editor): Update to personalization survey v4 (#5474) * feat(editor): update to personalization survey v4 * refactor: rename role other key for consistency * feat: add reported source to survey * test: add unit tests for personalization modal --- packages/editor-ui/src/Interface.ts | 20 +- packages/editor-ui/src/__tests__/setup.ts | 8 + packages/editor-ui/src/__tests__/utils.ts | 17 ++ .../src/components/PersonalizationModal.vue | 265 ++++++++++++---- .../__tests__/PersonalizationModal.spec.ts | 62 ++++ .../PersonalizationModal.spec.ts.snap | 284 ++++++++++++++++++ packages/editor-ui/src/constants.ts | 41 ++- .../src/plugins/i18n/locales/en.json | 22 +- packages/editor-ui/src/utils/userUtils.ts | 24 +- 9 files changed, 667 insertions(+), 76 deletions(-) create mode 100644 packages/editor-ui/src/__tests__/utils.ts create mode 100644 packages/editor-ui/src/components/__tests__/PersonalizationModal.spec.ts create mode 100644 packages/editor-ui/src/components/__tests__/__snapshots__/PersonalizationModal.spec.ts.snap diff --git a/packages/editor-ui/src/Interface.ts b/packages/editor-ui/src/Interface.ts index 9580abc990..d20f671302 100644 --- a/packages/editor-ui/src/Interface.ts +++ b/packages/editor-ui/src/Interface.ts @@ -512,7 +512,25 @@ export type IPersonalizationSurveyAnswersV3 = { email?: string | null; }; -export type IPersonalizationLatestVersion = IPersonalizationSurveyAnswersV3; +export type IPersonalizationSurveyAnswersV4 = { + version: 'v4'; + automationGoalDevops?: string[] | null; + automationGoalDevopsOther?: string | null; + companyIndustryExtended?: string[] | null; + otherCompanyIndustryExtended?: string[] | null; + companySize?: string | null; + companyType?: string | null; + automationGoalSm?: string[] | null; + automationGoalSmOther?: string | null; + usageModes?: string[] | null; + email?: string | null; + role?: string | null; + roleOther?: string | null; + reportedSource?: string | null; + reportedSourceOther?: string | null; +}; + +export type IPersonalizationLatestVersion = IPersonalizationSurveyAnswersV4; export type IPersonalizationSurveyVersions = | IPersonalizationSurveyAnswersV1 diff --git a/packages/editor-ui/src/__tests__/setup.ts b/packages/editor-ui/src/__tests__/setup.ts index bd57d1e416..350dbc992a 100644 --- a/packages/editor-ui/src/__tests__/setup.ts +++ b/packages/editor-ui/src/__tests__/setup.ts @@ -11,3 +11,11 @@ Vue.config.devtools = false; // [Vue warn]: Failed to mount component: template or render function not defined. Vue.component('vue-json-pretty', require('vue-json-pretty').default); Vue.use((vue) => I18nPlugin(vue)); + +window.ResizeObserver = + window.ResizeObserver || + vi.fn().mockImplementation(() => ({ + disconnect: vi.fn(), + observe: vi.fn(), + unobserve: vi.fn(), + })); diff --git a/packages/editor-ui/src/__tests__/utils.ts b/packages/editor-ui/src/__tests__/utils.ts new file mode 100644 index 0000000000..49834e3854 --- /dev/null +++ b/packages/editor-ui/src/__tests__/utils.ts @@ -0,0 +1,17 @@ +export const retry = (assertion: () => any, { interval = 20, timeout = 200 } = {}) => { + return new Promise((resolve, reject) => { + const startTime = Date.now(); + + const tryAgain = () => { + setTimeout(() => { + try { + resolve(assertion()); + } catch (err) { + Date.now() - startTime > timeout ? reject(err) : tryAgain(); + } + }, interval); + }; + + tryAgain(); + }); +}; diff --git a/packages/editor-ui/src/components/PersonalizationModal.vue b/packages/editor-ui/src/components/PersonalizationModal.vue index 7751ae46d1..b0606f5209 100644 --- a/packages/editor-ui/src/components/PersonalizationModal.vue +++ b/packages/editor-ui/src/components/PersonalizationModal.vue @@ -53,7 +53,7 @@