From 1355ca59b79df81cfe34f151ab02b12a467027af Mon Sep 17 00:00:00 2001 From: Diana Barsan Date: Thu, 29 Aug 2024 17:49:53 +0300 Subject: [PATCH 01/27] move moment-locales-webpack-plugin to webapp --- package-lock.json | 20 -------------------- package.json | 1 - webapp/package-lock.json | 31 +++++++++++++++++++++++++++++++ webapp/package.json | 1 + 4 files changed, 32 insertions(+), 21 deletions(-) diff --git a/package-lock.json b/package-lock.json index 00fcfca0f5b..045a1b9b907 100644 --- a/package-lock.json +++ b/package-lock.json @@ -140,7 +140,6 @@ "loose-envify": "^1.4.0", "mocha": "^10.7.3", "module-alias": "^2.2.3", - "moment-locales-webpack-plugin": "^1.2.0", "nodemon": "^3.0.1", "nyc": "^15.1.0", "patch-package": "^8.0.0", @@ -19893,12 +19892,6 @@ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, - "node_modules/lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", - "dev": true - }, "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", @@ -21330,19 +21323,6 @@ "node": "*" } }, - "node_modules/moment-locales-webpack-plugin": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/moment-locales-webpack-plugin/-/moment-locales-webpack-plugin-1.2.0.tgz", - "integrity": "sha512-QAi5v0OlPUP7GXviKMtxnpBAo8WmTHrUNN7iciAhNOEAd9evCOvuN0g1N7ThIg3q11GLCkjY1zQ2saRcf/43nQ==", - "dev": true, - "dependencies": { - "lodash.difference": "^4.5.0" - }, - "peerDependencies": { - "moment": "^2.8.0", - "webpack": "^1 || ^2 || ^3 || ^4 || ^5" - } - }, "node_modules/morgan": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", diff --git a/package.json b/package.json index a7b73ea5b50..a3918e0d5ed 100644 --- a/package.json +++ b/package.json @@ -141,7 +141,6 @@ "loose-envify": "^1.4.0", "mocha": "^10.7.3", "module-alias": "^2.2.3", - "moment-locales-webpack-plugin": "^1.2.0", "nodemon": "^3.0.1", "nyc": "^15.1.0", "patch-package": "^8.0.0", diff --git a/webapp/package-lock.json b/webapp/package-lock.json index 3c2e733c533..dc6d387aaca 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -35,6 +35,7 @@ "font-awesome": "^4.7.0", "jquery": "3.5.1", "lodash-es": "^4.17.21", + "moment-locales-webpack-plugin": "^1.2.0", "ngrx-store-logger": "^0.2.4", "ngx-bootstrap": "^11.0.2", "ngx-cookie-service": "^17.1.0", @@ -10924,6 +10925,11 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -11529,6 +11535,18 @@ "node": "*" } }, + "node_modules/moment-locales-webpack-plugin": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/moment-locales-webpack-plugin/-/moment-locales-webpack-plugin-1.2.0.tgz", + "integrity": "sha512-QAi5v0OlPUP7GXviKMtxnpBAo8WmTHrUNN7iciAhNOEAd9evCOvuN0g1N7ThIg3q11GLCkjY1zQ2saRcf/43nQ==", + "dependencies": { + "lodash.difference": "^4.5.0" + }, + "peerDependencies": { + "moment": "^2.8.0", + "webpack": "^1 || ^2 || ^3 || ^4 || ^5" + } + }, "node_modules/moo": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", @@ -23766,6 +23784,11 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" + }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -24199,6 +24222,14 @@ "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" }, + "moment-locales-webpack-plugin": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/moment-locales-webpack-plugin/-/moment-locales-webpack-plugin-1.2.0.tgz", + "integrity": "sha512-QAi5v0OlPUP7GXviKMtxnpBAo8WmTHrUNN7iciAhNOEAd9evCOvuN0g1N7ThIg3q11GLCkjY1zQ2saRcf/43nQ==", + "requires": { + "lodash.difference": "^4.5.0" + } + }, "moo": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", diff --git a/webapp/package.json b/webapp/package.json index e2369edb61a..c89ee0cf2d0 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -49,6 +49,7 @@ "font-awesome": "^4.7.0", "jquery": "3.5.1", "lodash-es": "^4.17.21", + "moment-locales-webpack-plugin": "^1.2.0", "ngrx-store-logger": "^0.2.4", "ngx-bootstrap": "^11.0.2", "ngx-cookie-service": "^17.1.0", From 95d97059019674859a53b542329d2ed6cd8f3752 Mon Sep 17 00:00:00 2001 From: Diana Barsan Date: Fri, 30 Aug 2024 16:14:05 +0300 Subject: [PATCH 02/27] handle organic service worker updates --- webapp/src/ts/app.component.ts | 2 ++ webapp/tests/karma/ts/app.component.spec.ts | 24 +++++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/webapp/src/ts/app.component.ts b/webapp/src/ts/app.component.ts index a84bd314e29..d73da11b3bc 100644 --- a/webapp/src/ts/app.component.ts +++ b/webapp/src/ts/app.component.ts @@ -355,6 +355,8 @@ export class AppComponent implements OnInit, AfterViewInit { } private watchDDocChanges() { + this.updateServiceWorker.update(() => this.ngZone.run(() => this.showUpdateReady())); + this.changesService.subscribe({ key: 'ddoc', filter: (change) => { diff --git a/webapp/tests/karma/ts/app.component.spec.ts b/webapp/tests/karma/ts/app.component.spec.ts index 781dd688d3e..f3b86d57396 100644 --- a/webapp/tests/karma/ts/app.component.spec.ts +++ b/webapp/tests/karma/ts/app.component.spec.ts @@ -45,6 +45,7 @@ import { AnalyticsActions } from '@mm-actions/analytics'; import { AnalyticsModulesService } from '@mm-services/analytics-modules.service'; import { Selectors } from '@mm-selectors/index'; import { TrainingCardsService } from '@mm-services/training-cards.service'; +import { ReloadingComponent } from '@mm-modals/reloading/reloading.component'; describe('AppComponent', () => { let component: AppComponent; @@ -83,6 +84,7 @@ describe('AppComponent', () => { let chtDatasourceService; let analyticsModulesService; let trainingCardsService; + let updateServiceWorkerService; // End Services let globalActions; @@ -117,7 +119,11 @@ describe('AppComponent', () => { unreadRecordsService = { init: sinon.stub() }; setLanguageService = { set: sinon.stub() }; translateService = { instant: sinon.stub().returnsArg(0) }; - modalService = { show: sinon.stub().resolves() }; + modalService = { + show: sinon.stub().returns({ + afterClosed: sinon.stub().returns(of()) + }) + }; browserDetectorService = { isUsingOutdatedBrowser: sinon.stub().returns(false) }; chtDatasourceService = { isInitialized: sinon.stub() }; analyticsModulesService = { get: sinon.stub() }; @@ -165,6 +171,7 @@ describe('AppComponent', () => { }; telemetryService = { record: sinon.stub() }; trainingCardsService = { initTrainingCards: sinon.stub() }; + updateServiceWorkerService = { update: sinon.stub() }; consoleErrorStub = sinon.stub(console, 'error'); const mockedSelectors = [ @@ -192,7 +199,7 @@ describe('AppComponent', () => { { provide: AuthService, useValue: authService }, { provide: ResourceIconsService, useValue: resourceIconsService }, { provide: ChangesService, useValue: changesService }, - { provide: UpdateServiceWorkerService, useValue: {} }, + { provide: UpdateServiceWorkerService, useValue: updateServiceWorkerService }, { provide: LocationService, useValue: locationService }, { provide: ModalService, useValue: modalService }, { provide: BrowserDetectorService, useValue: browserDetectorService}, @@ -260,6 +267,19 @@ describe('AppComponent', () => { expect(recurringProcessManagerService.startUpdateRelativeDate.callCount).to.equal(1); expect(recurringProcessManagerService.startUpdateReadDocsCount.callCount).to.equal(0); expect(component.isSidebarFilterOpen).to.be.false; + expect(updateServiceWorkerService.update.callCount).to.equal(1); + }); + + it('should show reload popup when service worker is updated', async () => { + await getComponent(); + await component.setupPromise; + + expect(updateServiceWorkerService.update.callCount).to.equal(1); + const callback = updateServiceWorkerService.update.args[0][0]; + callback(); + expect(modalService.show.calledOnce).to.be.true; + expect(modalService.show.args[0]).to.have.deep.members([ReloadingComponent]); + }); it('should display browser compatibility modal if using outdated chrome browser', async () => { From 6a0b3350114ab356462bec7a7afdc79b3fe1f9b7 Mon Sep 17 00:00:00 2001 From: Diana Barsan Date: Thu, 5 Sep 2024 07:55:09 +0300 Subject: [PATCH 03/27] change how we try to sync --- .../transitions/client-side-muting.wdio-spec.js | 2 +- tests/page-objects/default/common/common.wdio.page.js | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/tests/e2e/default/transitions/client-side-muting.wdio-spec.js b/tests/e2e/default/transitions/client-side-muting.wdio-spec.js index 18c5304f32d..d06821adea4 100644 --- a/tests/e2e/default/transitions/client-side-muting.wdio-spec.js +++ b/tests/e2e/default/transitions/client-side-muting.wdio-spec.js @@ -11,7 +11,7 @@ const personFactory = require('@factories/cht/contacts/person'); /* global window */ -describe.skip('Muting', () => { +describe('Muting', () => { const places = placeFactory.generateHierarchy(); const district = places.get('district_hospital'); const healthCenter = places.get('health_center'); diff --git a/tests/page-objects/default/common/common.wdio.page.js b/tests/page-objects/default/common/common.wdio.page.js index 387b8cac210..15b35d61e6b 100644 --- a/tests/page-objects/default/common/common.wdio.page.js +++ b/tests/page-objects/default/common/common.wdio.page.js @@ -319,14 +319,21 @@ const syncAndNotWaitForSuccess = async () => { await (await syncButton()).click(); }; -const syncAndWaitForSuccess = async (timeout = 20000) => { +const syncAndWaitForSuccess = async (timeout = 20000, retry = 10) => { + if (!retry) { + throw new Error('Failed to sync after 10 retries'); + } await openHamburgerMenu(); await (await syncButton()).click(); await openHamburgerMenu(); if (await (await syncInProgress()).isExisting()) { await (await syncInProgress()).waitForDisplayed({ reverse: true, timeout }); } - await (await syncSuccess()).waitForDisplayed({ timeout }); + + if (await (await syncSuccess()).isDisplayed()) { + return; + } + await syncAndWaitForSuccess(--retry); }; const hideModalOverlay = () => { From 878c1ae977a6aca2739b0921fbb5ec9caa124b0b Mon Sep 17 00:00:00 2001 From: Diana Barsan Date: Fri, 6 Sep 2024 11:51:59 +0300 Subject: [PATCH 04/27] close modal before hamburger menu --- tests/page-objects/default/common/common.wdio.page.js | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/page-objects/default/common/common.wdio.page.js b/tests/page-objects/default/common/common.wdio.page.js index 15b35d61e6b..9712a360f14 100644 --- a/tests/page-objects/default/common/common.wdio.page.js +++ b/tests/page-objects/default/common/common.wdio.page.js @@ -323,6 +323,7 @@ const syncAndWaitForSuccess = async (timeout = 20000, retry = 10) => { if (!retry) { throw new Error('Failed to sync after 10 retries'); } + await closeReloadModal(false, 1000); await openHamburgerMenu(); await (await syncButton()).click(); await openHamburgerMenu(); From 5f6f1bd87768890fe2f1d36866ee3fc8d19cfc00 Mon Sep 17 00:00:00 2001 From: Diana Barsan Date: Fri, 6 Sep 2024 12:39:04 +0300 Subject: [PATCH 05/27] close modal before hamburger menu --- tests/page-objects/default/common/common.wdio.page.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/page-objects/default/common/common.wdio.page.js b/tests/page-objects/default/common/common.wdio.page.js index 9712a360f14..abdfbb985f0 100644 --- a/tests/page-objects/default/common/common.wdio.page.js +++ b/tests/page-objects/default/common/common.wdio.page.js @@ -320,7 +320,7 @@ const syncAndNotWaitForSuccess = async () => { }; const syncAndWaitForSuccess = async (timeout = 20000, retry = 10) => { - if (!retry) { + if (retry < 0) { throw new Error('Failed to sync after 10 retries'); } await closeReloadModal(false, 1000); From 119c9769eb0ffe34477585e1cc3b6bef8c3338b4 Mon Sep 17 00:00:00 2001 From: Diana Barsan Date: Sat, 7 Sep 2024 10:02:13 +0300 Subject: [PATCH 06/27] close modal before hamburger menu --- tests/page-objects/default/common/common.wdio.page.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/tests/page-objects/default/common/common.wdio.page.js b/tests/page-objects/default/common/common.wdio.page.js index abdfbb985f0..57420aba3c0 100644 --- a/tests/page-objects/default/common/common.wdio.page.js +++ b/tests/page-objects/default/common/common.wdio.page.js @@ -320,21 +320,19 @@ const syncAndNotWaitForSuccess = async () => { }; const syncAndWaitForSuccess = async (timeout = 20000, retry = 10) => { + console.warn(retry); if (retry < 0) { throw new Error('Failed to sync after 10 retries'); } - await closeReloadModal(false, 1000); + await closeReloadModal(false, 0); await openHamburgerMenu(); await (await syncButton()).click(); await openHamburgerMenu(); - if (await (await syncInProgress()).isExisting()) { - await (await syncInProgress()).waitForDisplayed({ reverse: true, timeout }); - } - + await (await syncInProgress()).waitForDisplayed({ reverse: true, timeout }); if (await (await syncSuccess()).isDisplayed()) { return; } - await syncAndWaitForSuccess(--retry); + await syncAndWaitForSuccess(timeout, retry - 1); }; const hideModalOverlay = () => { From d0df488d7b9182200f22f5f110c5d4384bd382e3 Mon Sep 17 00:00:00 2001 From: Diana Barsan Date: Fri, 20 Sep 2024 15:37:04 +0300 Subject: [PATCH 07/27] close modal before hamburger menu --- tests/page-objects/default/common/common.wdio.page.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/page-objects/default/common/common.wdio.page.js b/tests/page-objects/default/common/common.wdio.page.js index 57420aba3c0..295ba343427 100644 --- a/tests/page-objects/default/common/common.wdio.page.js +++ b/tests/page-objects/default/common/common.wdio.page.js @@ -326,8 +326,12 @@ const syncAndWaitForSuccess = async (timeout = 20000, retry = 10) => { } await closeReloadModal(false, 0); await openHamburgerMenu(); - await (await syncButton()).click(); - await openHamburgerMenu(); + + if (!await (await syncInProgress()).isDisplayed()) { + await (await syncButton()).click(); + await openHamburgerMenu(); + } + await (await syncInProgress()).waitForDisplayed({ reverse: true, timeout }); if (await (await syncSuccess()).isDisplayed()) { return; From b5328217ce9f2b33feb2a4f3b2aa062d59861184 Mon Sep 17 00:00:00 2001 From: Diana Barsan Date: Tue, 24 Sep 2024 12:37:48 +0300 Subject: [PATCH 08/27] update sync retry --- .../e2e/default/db/initial-replication.wdio-spec.js | 1 + .../page-objects/default/common/common.wdio.page.js | 12 ++++++------ webapp/src/ts/services/form.service.ts | 1 - 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/e2e/default/db/initial-replication.wdio-spec.js b/tests/e2e/default/db/initial-replication.wdio-spec.js index 4d6664577eb..aae3aa05709 100644 --- a/tests/e2e/default/db/initial-replication.wdio-spec.js +++ b/tests/e2e/default/db/initial-replication.wdio-spec.js @@ -155,6 +155,7 @@ describe('initial-replication', () => { setTimeout(() => browser.refresh(), 3000); setTimeout(() => browser.refresh(), 5000); + await browser.pause(5000); await commonPage.waitForPageLoaded(); await validateReplication(); }); diff --git a/tests/page-objects/default/common/common.wdio.page.js b/tests/page-objects/default/common/common.wdio.page.js index 6c13756ea9f..9688717594a 100644 --- a/tests/page-objects/default/common/common.wdio.page.js +++ b/tests/page-objects/default/common/common.wdio.page.js @@ -321,23 +321,23 @@ const syncAndNotWaitForSuccess = async () => { }; const syncAndWaitForSuccess = async (timeout = 20000, retry = 10) => { - console.warn(retry); if (retry < 0) { throw new Error('Failed to sync after 10 retries'); } await closeReloadModal(false, 0); await openHamburgerMenu(); - if (!await (await syncInProgress()).isDisplayed()) { + if (!await (await syncInProgress()).isExisting()) { await (await syncButton()).click(); await openHamburgerMenu(); } await (await syncInProgress()).waitForDisplayed({ reverse: true, timeout }); - if (await (await syncSuccess()).isDisplayed()) { - return; + try { + await (await syncSuccess()).waitForDisplayed({ timeout: 1000 }); + } catch { + await syncAndWaitForSuccess(timeout, retry - 1); } - await syncAndWaitForSuccess(timeout, retry - 1); }; const hideModalOverlay = () => { @@ -381,7 +381,7 @@ const closeReloadModal = async (shouldUpdate = false, timeout = 5000) => { shouldUpdate && await waitForAngularLoaded(); return true; } catch (err) { - console.error('Reload modal not showed up'); + timeout && console.error('Reload modal has not showed up'); return false; } }; diff --git a/webapp/src/ts/services/form.service.ts b/webapp/src/ts/services/form.service.ts index 8e4f99deb37..e6740574893 100644 --- a/webapp/src/ts/services/form.service.ts +++ b/webapp/src/ts/services/form.service.ts @@ -46,7 +46,6 @@ export class FormService { private dbService: DbService, private fileReaderService: FileReaderService, private lineageModelGeneratorService: LineageModelGeneratorService, - private searchService: SearchService, private submitFormBySmsService: SubmitFormBySmsService, private userContactService: UserContactService, private userSettingsService:UserSettingsService, From 2d3660c574ba6d85851b1c4072ecbf60de273a3a Mon Sep 17 00:00:00 2001 From: Diana Barsan Date: Tue, 24 Sep 2024 15:27:06 +0300 Subject: [PATCH 09/27] fix linting --- webapp/src/ts/services/form.service.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/webapp/src/ts/services/form.service.ts b/webapp/src/ts/services/form.service.ts index e6740574893..2329c820407 100644 --- a/webapp/src/ts/services/form.service.ts +++ b/webapp/src/ts/services/form.service.ts @@ -8,7 +8,6 @@ import * as medicXpathExtensions from '../../js/enketo/medic-xpath-extensions'; import { DbService } from '@mm-services/db.service'; import { FileReaderService } from '@mm-services/file-reader.service'; import { LineageModelGeneratorService } from '@mm-services/lineage-model-generator.service'; -import { SearchService } from '@mm-services/search.service'; import { SubmitFormBySmsService } from '@mm-services/submit-form-by-sms.service'; import { UserContactService } from '@mm-services/user-contact.service'; import { XmlFormsService } from '@mm-services/xml-forms.service'; From 77d8f9ae7fecf2bd217690bbd2f9aac45576f12b Mon Sep 17 00:00:00 2001 From: Diana Barsan Date: Tue, 24 Sep 2024 15:30:28 +0300 Subject: [PATCH 10/27] wait for a standard amount of time --- tests/page-objects/default/common/common.wdio.page.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/page-objects/default/common/common.wdio.page.js b/tests/page-objects/default/common/common.wdio.page.js index 9688717594a..98e1a06d413 100644 --- a/tests/page-objects/default/common/common.wdio.page.js +++ b/tests/page-objects/default/common/common.wdio.page.js @@ -52,6 +52,7 @@ const FEEDBACK = '#feedback'; const ABOUT_MENU = '#header-dropdown i.fa-question'; //Configuration App const CONFIGURATION_APP_MENU = '#header-dropdown i.fa-cog'; +const ELEMENT_DISPLAY_PAUSE = 500; // 500ms const errorLog = () => $(`error-log`); @@ -72,7 +73,7 @@ const waitForSnackbarToClose = async () => { const clickFastActionById = async (id) => { // Wait for the Angular Material's animation to complete. - await browser.pause(500); + await browser.pause(ELEMENT_DISPLAY_PAUSE); await (await fastActionListContainer()).waitForDisplayed(); await (await fastActionById(id)).waitForClickable(); await (await fastActionById(id)).click(); @@ -95,7 +96,7 @@ const getFastActionItemsLabels = async () => { await (await fastActionFAB()).waitForClickable(); await (await fastActionFAB()).click(); - await browser.pause(500); + await browser.pause(ELEMENT_DISPLAY_PAUSE); await (await fastActionListContainer()).waitForDisplayed(); const items = await fastActionItems(); @@ -334,7 +335,7 @@ const syncAndWaitForSuccess = async (timeout = 20000, retry = 10) => { await (await syncInProgress()).waitForDisplayed({ reverse: true, timeout }); try { - await (await syncSuccess()).waitForDisplayed({ timeout: 1000 }); + await (await syncSuccess()).waitForDisplayed({ timeout: ELEMENT_DISPLAY_PAUSE }); } catch { await syncAndWaitForSuccess(timeout, retry - 1); } From 727b5f8cfeb9d3769e8c9304d71cea7dc74c3158 Mon Sep 17 00:00:00 2001 From: Diana Barsan Date: Tue, 24 Sep 2024 17:12:14 +0300 Subject: [PATCH 11/27] try with longer pause --- tests/page-objects/default/common/common.wdio.page.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/page-objects/default/common/common.wdio.page.js b/tests/page-objects/default/common/common.wdio.page.js index 98e1a06d413..4b6fd5d481d 100644 --- a/tests/page-objects/default/common/common.wdio.page.js +++ b/tests/page-objects/default/common/common.wdio.page.js @@ -335,7 +335,7 @@ const syncAndWaitForSuccess = async (timeout = 20000, retry = 10) => { await (await syncInProgress()).waitForDisplayed({ reverse: true, timeout }); try { - await (await syncSuccess()).waitForDisplayed({ timeout: ELEMENT_DISPLAY_PAUSE }); + await (await syncSuccess()).waitForDisplayed({ timeout: 1000 }); } catch { await syncAndWaitForSuccess(timeout, retry - 1); } From ae17825b5697ae833789c854ee75bfcdedc772e5 Mon Sep 17 00:00:00 2001 From: Diana Barsan Date: Tue, 24 Sep 2024 18:19:51 +0300 Subject: [PATCH 12/27] try with longer pause --- tests/page-objects/default/common/common.wdio.page.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/page-objects/default/common/common.wdio.page.js b/tests/page-objects/default/common/common.wdio.page.js index 4b6fd5d481d..c7c0841b6b1 100644 --- a/tests/page-objects/default/common/common.wdio.page.js +++ b/tests/page-objects/default/common/common.wdio.page.js @@ -335,7 +335,7 @@ const syncAndWaitForSuccess = async (timeout = 20000, retry = 10) => { await (await syncInProgress()).waitForDisplayed({ reverse: true, timeout }); try { - await (await syncSuccess()).waitForDisplayed({ timeout: 1000 }); + await (await syncSuccess()).waitForDisplayed({ timeout }); } catch { await syncAndWaitForSuccess(timeout, retry - 1); } From 849aa4281aaae89c8ad32bc9a99a502e5430cb53 Mon Sep 17 00:00:00 2001 From: Diana Barsan Date: Wed, 25 Sep 2024 09:46:26 +0300 Subject: [PATCH 13/27] try with longer pause --- tests/page-objects/default/common/common.wdio.page.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/page-objects/default/common/common.wdio.page.js b/tests/page-objects/default/common/common.wdio.page.js index c7c0841b6b1..2976f99a537 100644 --- a/tests/page-objects/default/common/common.wdio.page.js +++ b/tests/page-objects/default/common/common.wdio.page.js @@ -335,7 +335,7 @@ const syncAndWaitForSuccess = async (timeout = 20000, retry = 10) => { await (await syncInProgress()).waitForDisplayed({ reverse: true, timeout }); try { - await (await syncSuccess()).waitForDisplayed({ timeout }); + await (await syncSuccess()).waitForDisplayed({ timeout: 2000 }); } catch { await syncAndWaitForSuccess(timeout, retry - 1); } From 99757cbadfc26eb39d99ce379c51487048f95501 Mon Sep 17 00:00:00 2001 From: Diana Barsan Date: Wed, 25 Sep 2024 13:36:05 +0300 Subject: [PATCH 14/27] try with longer pause --- tests/page-objects/default/common/common.wdio.page.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/page-objects/default/common/common.wdio.page.js b/tests/page-objects/default/common/common.wdio.page.js index 2976f99a537..2f9b64325de 100644 --- a/tests/page-objects/default/common/common.wdio.page.js +++ b/tests/page-objects/default/common/common.wdio.page.js @@ -27,7 +27,7 @@ const getTasksButtonLabel = () => $('#tasks-tab .button-label'); const getAllButtonLabels = async () => await $$('.header .tabs .button-label'); const loaders = () => $$('.container-fluid .loader'); const syncSuccess = () => $(`${hamburgerMenuItemSelector}.sync-status .success`); -const syncInProgress = () => $('*="Currently syncing"'); +const syncInProgress = () => $(`${hamburgerMenuItemSelector}.sync-status`).$('*="Currently syncing"'); const syncRequired = () => $(`${hamburgerMenuItemSelector}.sync-status .required`); const jsonError = async () => (await $('pre')).getText(); From da6329785a54204cd56583fc8030dfa08d6e04c7 Mon Sep 17 00:00:00 2001 From: Diana Barsan Date: Wed, 25 Sep 2024 15:21:45 +0300 Subject: [PATCH 15/27] try with longer pause --- tests/page-objects/default/common/common.wdio.page.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/page-objects/default/common/common.wdio.page.js b/tests/page-objects/default/common/common.wdio.page.js index 2f9b64325de..c273b1ae0eb 100644 --- a/tests/page-objects/default/common/common.wdio.page.js +++ b/tests/page-objects/default/common/common.wdio.page.js @@ -333,9 +333,9 @@ const syncAndWaitForSuccess = async (timeout = 20000, retry = 10) => { await openHamburgerMenu(); } - await (await syncInProgress()).waitForDisplayed({ reverse: true, timeout }); + // await (await syncInProgress()).waitForDisplayed({ reverse: true, timeout }); try { - await (await syncSuccess()).waitForDisplayed({ timeout: 2000 }); + await (await syncSuccess()).waitForDisplayed({ timeout }); } catch { await syncAndWaitForSuccess(timeout, retry - 1); } From 5f1feca9fb48e3673431f14741e1b0878d392551 Mon Sep 17 00:00:00 2001 From: Diana Barsan Date: Wed, 25 Sep 2024 17:33:14 +0300 Subject: [PATCH 16/27] try with longer pause --- .../client-side-muting.wdio-spec.js | 29 +------------------ .../default/common/common.wdio.page.js | 2 +- 2 files changed, 2 insertions(+), 29 deletions(-) diff --git a/tests/e2e/default/transitions/client-side-muting.wdio-spec.js b/tests/e2e/default/transitions/client-side-muting.wdio-spec.js index d06821adea4..e72e8421187 100644 --- a/tests/e2e/default/transitions/client-side-muting.wdio-spec.js +++ b/tests/e2e/default/transitions/client-side-muting.wdio-spec.js @@ -155,22 +155,6 @@ describe('Muting', () => { expect(doc.muted).to.be.ok; expect(doc.muting_history).to.be.undefined; }; - const setBrowserOffline = async () => { - await browser.throttle({ - offline: true, - downloadThroughput: 0, - uploadThroughput: 0, - latency: 0 - }); - }; - const setBrowserOnline = async () => { - await browser.throttle({ - offline: false, - downloadThroughput: 1000 * 1000, - uploadThroughput: 1000 * 1000, - latency: 0 - }); - }; before(async () => { await utils.saveDocs([district, healthCenter]); @@ -213,17 +197,8 @@ describe('Muting', () => { describe('for an offline user', () => { const updateClientSideMutingSettings = async (settings) => { - await setBrowserOffline(); await utils.updateSettings(settings); - await setBrowserOnline(); - try { - await commonPage.sync(); - } catch (err) { - // sometimes sync happens by itself, on timeout - console.error('Error when trying to sync', err); - await commonPage.closeReloadModal(true); - await commonPage.sync(); - } + await commonPage.sync(); }; const unmuteContacts = () => { @@ -264,10 +239,8 @@ describe('Muting', () => { afterEach(async () => { await commonPage.sync(); - await setBrowserOffline(); await utils.revertSettings(true); await unmuteContacts(); - await setBrowserOnline(); }); it( 'should not process muting client-side if not enabled', async () => { diff --git a/tests/page-objects/default/common/common.wdio.page.js b/tests/page-objects/default/common/common.wdio.page.js index c273b1ae0eb..8c8a797ac1c 100644 --- a/tests/page-objects/default/common/common.wdio.page.js +++ b/tests/page-objects/default/common/common.wdio.page.js @@ -27,7 +27,7 @@ const getTasksButtonLabel = () => $('#tasks-tab .button-label'); const getAllButtonLabels = async () => await $$('.header .tabs .button-label'); const loaders = () => $$('.container-fluid .loader'); const syncSuccess = () => $(`${hamburgerMenuItemSelector}.sync-status .success`); -const syncInProgress = () => $(`${hamburgerMenuItemSelector}.sync-status`).$('*="Currently syncing"'); +const syncInProgress = () => $(`${hamburgerMenuItemSelector}.sync-status .in_progress`); const syncRequired = () => $(`${hamburgerMenuItemSelector}.sync-status .required`); const jsonError = async () => (await $('pre')).getText(); From a2205d96783645f04f7b7a072558379063b98561 Mon Sep 17 00:00:00 2001 From: Diana Barsan Date: Wed, 25 Sep 2024 19:53:00 +0300 Subject: [PATCH 17/27] try with longer pause --- tests/page-objects/default/common/common.wdio.page.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/page-objects/default/common/common.wdio.page.js b/tests/page-objects/default/common/common.wdio.page.js index 8c8a797ac1c..c0eb2e1517e 100644 --- a/tests/page-objects/default/common/common.wdio.page.js +++ b/tests/page-objects/default/common/common.wdio.page.js @@ -333,9 +333,9 @@ const syncAndWaitForSuccess = async (timeout = 20000, retry = 10) => { await openHamburgerMenu(); } - // await (await syncInProgress()).waitForDisplayed({ reverse: true, timeout }); + await (await syncInProgress()).waitForDisplayed({ reverse: true, timeout }); try { - await (await syncSuccess()).waitForDisplayed({ timeout }); + await (await syncSuccess()).waitForDisplayed({ timeout: ELEMENT_DISPLAY_PAUSE }); } catch { await syncAndWaitForSuccess(timeout, retry - 1); } From 7e0cc3993e6f574fe7cba22bced47873e801e9c3 Mon Sep 17 00:00:00 2001 From: Diana Barsan Date: Wed, 25 Sep 2024 20:38:35 +0300 Subject: [PATCH 18/27] try with longer pause --- tests/page-objects/default/common/common.wdio.page.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/page-objects/default/common/common.wdio.page.js b/tests/page-objects/default/common/common.wdio.page.js index c0eb2e1517e..d629f0e197c 100644 --- a/tests/page-objects/default/common/common.wdio.page.js +++ b/tests/page-objects/default/common/common.wdio.page.js @@ -336,7 +336,8 @@ const syncAndWaitForSuccess = async (timeout = 20000, retry = 10) => { await (await syncInProgress()).waitForDisplayed({ reverse: true, timeout }); try { await (await syncSuccess()).waitForDisplayed({ timeout: ELEMENT_DISPLAY_PAUSE }); - } catch { + } catch (err) { + console.error(err); await syncAndWaitForSuccess(timeout, retry - 1); } }; From 344c1ddecac163c79a080f0605763362626d23e2 Mon Sep 17 00:00:00 2001 From: Diana Barsan Date: Wed, 25 Sep 2024 22:25:01 +0300 Subject: [PATCH 19/27] try with longer pause --- tests/page-objects/default/common/common.wdio.page.js | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/page-objects/default/common/common.wdio.page.js b/tests/page-objects/default/common/common.wdio.page.js index d629f0e197c..726751ca777 100644 --- a/tests/page-objects/default/common/common.wdio.page.js +++ b/tests/page-objects/default/common/common.wdio.page.js @@ -322,6 +322,7 @@ const syncAndNotWaitForSuccess = async () => { }; const syncAndWaitForSuccess = async (timeout = 20000, retry = 10) => { + console.log('retry', retry, new Date().toISOString()); if (retry < 0) { throw new Error('Failed to sync after 10 retries'); } From c4158fdb76775c3868d3f45fa8f5a2311d3ec122 Mon Sep 17 00:00:00 2001 From: Diana Barsan Date: Wed, 25 Sep 2024 23:08:05 +0300 Subject: [PATCH 20/27] try with longer pause --- tests/page-objects/default/common/common.wdio.page.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/page-objects/default/common/common.wdio.page.js b/tests/page-objects/default/common/common.wdio.page.js index 726751ca777..4e0bc586733 100644 --- a/tests/page-objects/default/common/common.wdio.page.js +++ b/tests/page-objects/default/common/common.wdio.page.js @@ -336,7 +336,7 @@ const syncAndWaitForSuccess = async (timeout = 20000, retry = 10) => { await (await syncInProgress()).waitForDisplayed({ reverse: true, timeout }); try { - await (await syncSuccess()).waitForDisplayed({ timeout: ELEMENT_DISPLAY_PAUSE }); + await (await syncSuccess()).waitForDisplayed({ timeout: 2000 }); } catch (err) { console.error(err); await syncAndWaitForSuccess(timeout, retry - 1); From b49caa891e4705bccddbe9077df867e0727db152 Mon Sep 17 00:00:00 2001 From: Diana Barsan Date: Thu, 26 Sep 2024 13:52:18 +0300 Subject: [PATCH 21/27] try with longer pause --- tests/page-objects/default/common/common.wdio.page.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/page-objects/default/common/common.wdio.page.js b/tests/page-objects/default/common/common.wdio.page.js index 4e0bc586733..4ca796f439b 100644 --- a/tests/page-objects/default/common/common.wdio.page.js +++ b/tests/page-objects/default/common/common.wdio.page.js @@ -26,9 +26,10 @@ const getMessagesButtonLabel = () => $('#messages-tab .button-label'); const getTasksButtonLabel = () => $('#tasks-tab .button-label'); const getAllButtonLabels = async () => await $$('.header .tabs .button-label'); const loaders = () => $$('.container-fluid .loader'); -const syncSuccess = () => $(`${hamburgerMenuItemSelector}.sync-status .success`); const syncInProgress = () => $(`${hamburgerMenuItemSelector}.sync-status .in_progress`); +const syncSuccess = () => $(`${hamburgerMenuItemSelector}.sync-status .success`); const syncRequired = () => $(`${hamburgerMenuItemSelector}.sync-status .required`); +const syncDone = () => $(`${hamburgerMenuItemSelector}.sync-status :is(.required,.success)`); const jsonError = async () => (await $('pre')).getText(); const actionBar = () => $('.detail-actions.right-pane'); @@ -330,15 +331,16 @@ const syncAndWaitForSuccess = async (timeout = 20000, retry = 10) => { await openHamburgerMenu(); if (!await (await syncInProgress()).isExisting()) { + console.log('trying to sync'); await (await syncButton()).click(); await openHamburgerMenu(); } - await (await syncInProgress()).waitForDisplayed({ reverse: true, timeout }); + await (await syncInProgress()).waitForDisplayed({ timeout, reverse: true }); + await (await syncDone()).waitForDisplayed({ timeout }); try { - await (await syncSuccess()).waitForDisplayed({ timeout: 2000 }); + await (await syncSuccess()).waitForDisplayed({ timeout: ELEMENT_DISPLAY_PAUSE }); } catch (err) { - console.error(err); await syncAndWaitForSuccess(timeout, retry - 1); } }; From 89846196eeadcc12ab7b71c97c06644279117474 Mon Sep 17 00:00:00 2001 From: Diana Barsan Date: Thu, 26 Sep 2024 14:45:50 +0300 Subject: [PATCH 22/27] try with longer pause --- tests/page-objects/default/common/common.wdio.page.js | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/page-objects/default/common/common.wdio.page.js b/tests/page-objects/default/common/common.wdio.page.js index 4ca796f439b..294f583e2d9 100644 --- a/tests/page-objects/default/common/common.wdio.page.js +++ b/tests/page-objects/default/common/common.wdio.page.js @@ -332,6 +332,7 @@ const syncAndWaitForSuccess = async (timeout = 20000, retry = 10) => { if (!await (await syncInProgress()).isExisting()) { console.log('trying to sync'); + retry < 10 && await browser.saveScreenshot(`allure-results/beforesync-${Date.now()}.png`); await (await syncButton()).click(); await openHamburgerMenu(); } From 7d70f7d8e43a2950816a07fd8e1b7ceb641ab054 Mon Sep 17 00:00:00 2001 From: Diana Barsan Date: Thu, 26 Sep 2024 15:38:50 +0300 Subject: [PATCH 23/27] try with longer pause --- tests/page-objects/default/common/common.wdio.page.js | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/page-objects/default/common/common.wdio.page.js b/tests/page-objects/default/common/common.wdio.page.js index 294f583e2d9..04a652d13d1 100644 --- a/tests/page-objects/default/common/common.wdio.page.js +++ b/tests/page-objects/default/common/common.wdio.page.js @@ -335,6 +335,7 @@ const syncAndWaitForSuccess = async (timeout = 20000, retry = 10) => { retry < 10 && await browser.saveScreenshot(`allure-results/beforesync-${Date.now()}.png`); await (await syncButton()).click(); await openHamburgerMenu(); + retry < 10 && await browser.saveScreenshot(`allure-results/afterSync-${Date.now()}.png`); } await (await syncInProgress()).waitForDisplayed({ timeout, reverse: true }); From 4d2586b30b2d839d80b952fe382094d5325252e3 Mon Sep 17 00:00:00 2001 From: Diana Barsan Date: Wed, 16 Oct 2024 17:26:38 +0300 Subject: [PATCH 24/27] delete feedback docs when sync failures are expected. --- ...ser-for-contacts.replace-user.wdio-spec.js | 55 ++++++++++++++++++- .../default/common/common.wdio.page.js | 23 ++++---- 2 files changed, 62 insertions(+), 16 deletions(-) diff --git a/tests/e2e/default/transitions/create-user-for-contacts.replace-user.wdio-spec.js b/tests/e2e/default/transitions/create-user-for-contacts.replace-user.wdio-spec.js index 213d1e64ee0..b56dfd7583e 100644 --- a/tests/e2e/default/transitions/create-user-for-contacts.replace-user.wdio-spec.js +++ b/tests/e2e/default/transitions/create-user-for-contacts.replace-user.wdio-spec.js @@ -182,6 +182,30 @@ const waitForConflicts = async (getDoc) => { return utils.delayPromise(waitForConflicts(getDoc), 100); }; +/** + * Ongoing replication can be interrupted by the user being edited on the server side. + * A 401 for a replication request will create a feedback doc, which will fail the test. + */ +const assertFeedbackDocs = async () => { + const feedbackDocs = await chtDbUtils.getFeedbackDocs(); + if (!feedbackDocs.length) { + return; + } + + const feedbackDocsToIgnore = [ + 'Http failure response', + 'Server error' + ]; + + const unknownMessages = feedbackDocs + .map(doc => doc.info.message) + .filter(message => !feedbackDocsToIgnore.find(toIgnore => message.includes(toIgnore))); + + if (!unknownMessages.length) { + await chtDbUtils.clearFeedbackDocs(); + } +}; + describe('Create user for contacts', () => { before(async () => { await utils.saveDocIfNotExists(BASIC_FORM_DOC); @@ -245,7 +269,12 @@ describe('Create user for contacts', () => { expect(district.contact._id).to.equal(replacementContactId); await browser.throttle('online'); - await commonPage.syncAndNotWaitForSuccess(); + try { + await commonPage.syncAndNotWaitForSuccess(); + } catch { + // sync can happen organically + } + await (await loginPage.loginButton()).waitForDisplayed(); await sentinelUtils.waitForSentinel(); @@ -284,6 +313,8 @@ describe('Create user for contacts', () => { const basicReport3 = await utils.getDoc(basicReportId3); // New reports written by the old user are not re-parented expect(basicReport3.contact._id).to.equal(originalContactId); + + await assertFeedbackDocs(); }); it('creates a new user when the replace_user form is submitted while online', async () => { @@ -332,6 +363,8 @@ describe('Create user for contacts', () => { await commonPage.waitForPageLoaded(); const [cookie] = await browser.getCookies('userCtx'); expect(cookie.value).to.include(newUserSettings.name); + + await assertFeedbackDocs(); }); it('does not assign new person as primary contact of parent place ' + @@ -384,6 +417,8 @@ describe('Create user for contacts', () => { await commonPage.waitForPageLoaded(); const [cookie] = await browser.getCookies('userCtx'); expect(cookie.value).to.include(newUserSettings.name); + + await assertFeedbackDocs(); }); it('creates new user from latest replace_user form data ' + @@ -449,7 +484,11 @@ describe('Create user for contacts', () => { expect(district.contact._id).to.equal(replacementContactId1); await browser.throttle('online'); - await commonPage.syncAndNotWaitForSuccess(); + try { + await commonPage.syncAndNotWaitForSuccess(); + } catch { + // sync can happen organically + } await (await loginPage.loginButton()).waitForDisplayed(); await sentinelUtils.waitForSentinel(); @@ -481,6 +520,8 @@ describe('Create user for contacts', () => { // Basic form reports were successfully synced to the server const basicReportsFromRemote = await utils.getDocs([basicReportId0, basicReportId1]); basicReportsFromRemote.forEach((report, index) => expect(report).to.deep.equal(basicReports[index])); + + await assertFeedbackDocs(); }); it('creates new user when replace_user form is submitted ' + @@ -548,6 +589,8 @@ describe('Create user for contacts', () => { await loginPage.login(otherUser); await commonPage.waitForPageLoaded(); await commonPage.goToPeople(originalContactId); + + await assertFeedbackDocs(); }); it('creates new user for the first version of a contact ' + @@ -668,6 +711,8 @@ describe('Create user for contacts', () => { // be deleted. This first call will delete the current "winning" version and then the subsequent call in // afterEach will handle deleting the other version. await utils.revertDb([/^form:/], true); + + await assertFeedbackDocs(); }); it('does not create a new user or re-parent reports when the transition is disabled', async () => { @@ -743,7 +788,11 @@ describe('Create user for contacts', () => { await chtDbUtils.updateDoc(newContact._id, { ...newContact, phone: undefined }, true); await browser.throttle('online'); - await commonPage.syncAndNotWaitForSuccess(); + try { + await commonPage.syncAndNotWaitForSuccess(); + } catch { + // sync can happen organically + } await (await loginPage.loginButton()).waitForDisplayed(); await sentinelUtils.waitForSentinel(); diff --git a/tests/page-objects/default/common/common.wdio.page.js b/tests/page-objects/default/common/common.wdio.page.js index e3f0bb34eed..21251521705 100644 --- a/tests/page-objects/default/common/common.wdio.page.js +++ b/tests/page-objects/default/common/common.wdio.page.js @@ -14,7 +14,7 @@ const fastActionListCloseButton = () => $(`${FAST_ACTION_LIST_CONTAINER} .panel- const fastActionById = (id) => $(`${FAST_ACTION_LIST_CONTAINER} .fast-action-item[test-id="${id}"]`); const fastActionItems = () => $$(`${FAST_ACTION_LIST_CONTAINER} .fast-action-item`); const moreOptionsMenu = () => $('aria/Actions menu'); -const hamburgerMenuItemSelector = '#header-dropdown li'; +const hamburgerMenuItemSelector = 'mat-sidenav-content'; const logoutButton = () => $('aria/Log out'); const syncButton = () => $('aria/Sync now'); const messagesTab = () => $('#messages-tab'); @@ -26,9 +26,8 @@ const getTasksButtonLabel = () => $('#tasks-tab .button-label'); const getAllButtonLabels = async () => await $$('.header .tabs .button-label'); const loaders = () => $$('.container-fluid .loader'); const syncSuccess = () => $('aria/All reports synced'); -const syncInProgress = () => $('*="Currently syncing"'); -const syncRequired = () => $(`${hamburgerMenuItemSelector}.sync-status .required`); -const syncDone = () => $(`${hamburgerMenuItemSelector}.sync-status :is(.required,.success)`); +const syncInProgress = () => $(hamburgerMenuItemSelector).$('*="Currently syncing"'); +const syncRequired = () => $(`${hamburgerMenuItemSelector} .sync-status .required`); const jsonError = async () => (await $('pre')).getText(); const REPORTS_CONTENT_SELECTOR = '#reports-content'; const reportsFastActionFAB = () => $(`${REPORTS_CONTENT_SELECTOR} .fast-action-fab-button mat-icon`); @@ -350,23 +349,22 @@ const syncAndNotWaitForSuccess = async () => { }; const syncAndWaitForSuccess = async (timeout = 20000, retry = 10) => { - console.log('retry', retry, new Date().toISOString()); if (retry < 0) { throw new Error('Failed to sync after 10 retries'); } await closeReloadModal(false, 0); - await openHamburgerMenu(); - if (!await (await syncInProgress()).isExisting()) { - await (await syncButton()).click(); + try { await openHamburgerMenu(); - } + if (!await (await syncInProgress()).isExisting()) { + await (await syncButton()).click(); + await openHamburgerMenu(); + } - await (await syncInProgress()).waitForDisplayed({ timeout, reverse: true }); - await (await syncDone()).waitForDisplayed({ timeout }); - try { + await (await syncInProgress()).waitForDisplayed({ timeout, reverse: true }); await (await syncSuccess()).waitForDisplayed({ timeout: ELEMENT_DISPLAY_PAUSE }); } catch (err) { + console.error(err); await syncAndWaitForSuccess(timeout, retry - 1); } }; @@ -407,7 +405,6 @@ const syncAndWaitForFailure = async () => { const closeReloadModal = async (shouldUpdate = false, timeout = 5000) => { try { - await browser.waitUntil( async () => await modalPage.modal().isDisplayed(), { timeout: 10000, interval: 500 } ); shouldUpdate ? await modalPage.submit(timeout) : await modalPage.cancel(timeout); shouldUpdate && await waitForAngularLoaded(); return true; From 04cb54991d94ac97fe7d6a5c0496d31f191cee6f Mon Sep 17 00:00:00 2001 From: Diana Barsan Date: Wed, 16 Oct 2024 18:00:55 +0300 Subject: [PATCH 25/27] What is this value? --- tests/page-objects/default/common/common.wdio.page.js | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/page-objects/default/common/common.wdio.page.js b/tests/page-objects/default/common/common.wdio.page.js index 21251521705..afe520677a0 100644 --- a/tests/page-objects/default/common/common.wdio.page.js +++ b/tests/page-objects/default/common/common.wdio.page.js @@ -51,7 +51,6 @@ const FEEDBACK = '#feedback'; //About menu const ABOUT_MENU = 'aria/About'; //Configuration App -const CONFIGURATION_APP_MENU = '#header-dropdown i.fa-cog'; const ELEMENT_DISPLAY_PAUSE = 500; // 500ms const configurationAppMenuOption = () => $('aria/App Management'); From 707b8cec342bc323cc5bf2a8a44316f2c04b7931 Mon Sep 17 00:00:00 2001 From: Diana Barsan Date: Wed, 16 Oct 2024 20:23:47 +0300 Subject: [PATCH 26/27] resolve conflicts --- ...ser-for-contacts.replace-user.wdio-spec.js | 24 ------------------- 1 file changed, 24 deletions(-) diff --git a/tests/e2e/default/transitions/create-user-for-contacts.replace-user.wdio-spec.js b/tests/e2e/default/transitions/create-user-for-contacts.replace-user.wdio-spec.js index e8652108c4f..9c1ac6c62a2 100644 --- a/tests/e2e/default/transitions/create-user-for-contacts.replace-user.wdio-spec.js +++ b/tests/e2e/default/transitions/create-user-for-contacts.replace-user.wdio-spec.js @@ -87,30 +87,6 @@ const loginAsUser = async (user) => { await commonPage.waitForPageLoaded(); }; -/** - * Ongoing replication can be interrupted by the user being edited on the server side. - * A 401 for a replication request will create a feedback doc, which will fail the test. - */ -const assertFeedbackDocs = async () => { - const feedbackDocs = await chtDbUtils.getFeedbackDocs(); - if (!feedbackDocs.length) { - return; - } - - const feedbackDocsToIgnore = [ - 'Http failure response', - 'Server error' - ]; - - const unknownMessages = feedbackDocs - .map(doc => doc.info.message) - .filter(message => !feedbackDocsToIgnore.find(toIgnore => message.includes(toIgnore))); - - if (!unknownMessages.length) { - await chtDbUtils.clearFeedbackDocs(); - } -}; - const loginAsOfflineUser = () => loginAsUser(ORIGINAL_USER); const loginAsOnlineUser = () => loginAsUser(ONLINE_USER); From e22ddc55e24c72458ac342f905957f5711ff07a9 Mon Sep 17 00:00:00 2001 From: Diana Barsan Date: Wed, 16 Oct 2024 20:46:21 +0300 Subject: [PATCH 27/27] fix sync on client side muting --- tests/e2e/default/transitions/client-side-muting.wdio-spec.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/e2e/default/transitions/client-side-muting.wdio-spec.js b/tests/e2e/default/transitions/client-side-muting.wdio-spec.js index e72e8421187..af7d40be760 100644 --- a/tests/e2e/default/transitions/client-side-muting.wdio-spec.js +++ b/tests/e2e/default/transitions/client-side-muting.wdio-spec.js @@ -197,8 +197,7 @@ describe('Muting', () => { describe('for an offline user', () => { const updateClientSideMutingSettings = async (settings) => { - await utils.updateSettings(settings); - await commonPage.sync(); + await utils.updateSettings(settings, { sync: true, refresh: true, ignoreReload: true }); }; const unmuteContacts = () => {