From 0c9ea268885ae56ecf5c1b4f0d6e4802d50dcb4d Mon Sep 17 00:00:00 2001 From: Scott Bell Date: Wed, 31 Aug 2022 10:25:00 +0200 Subject: [PATCH] Swallow abort errors in search (#5650) * Imagery thumbnail regression fixes - 5327 (#5591) * Add an active class to thumbnail to indicate current focused image * Differentiate bg color between real-time and fixed * scrollIntoView inline: center * Added watcher for bounds change to trigger thumbnail scroll * Resolve merge conflict with requestHistory change to telemetry collection * Split thumbnail into sub component * Monitor isFixed value to unpause playback status Co-authored-by: Khalid Adil * [e2e] Improve appActions (#5592) * update selectors to use aria labels * Update appActions - Create new function `getHashUrlToDomainObject` to get the browse url to a given object given its uuid - Create new function `getFocusedObjectUuid`... self explanatory :) - Update `createDomainObjectWIthDefaults` to make use of the new url generation - Update `createDomainObject...`'s arguments to be more organized, and accept a parent object - Update some docs, still need to clarify some * Update appActions e2e tests - Refactor for organization - Test our new appActions in one go * Update existing usages of `createDomainObject...` to match the new API * fix accidental renamed export * Fix jsdoc return types * refactor telemetryTable test to use appActions * Improve selectors * Refactor test * improve selector * add clock mode appActions * lint * Fix jsdoc * Code review comments * mark failing visual tests as fixme temporarily * Update package.json (#5601) * Fix menu style in Snow theme (#5557) * Include the plan source map when generating the time list/plan hybrid object (#5604) * Search should indicate in progress and no results states, filter orphaned results (#5599) * no matching result implemented * now filtering annotations that are orphaned * filter object results without valid paths * add progress bar * added e2e tests * removed extraneous click * fix typos * fix unit tests * lint * address pr comments * fix tests * fix tests, centralize logic to object api, check for root instead * remove debug statement * lint * fix documentation * lint * fix doc * made some optimizations after talking with akhenry * fix test * update docs * fix docs * Have in-memory search indexer use composition API (#5578) * need to remove tags and objects on composition removal * had to separate out emits from load as it was causing memory indexer to loop upon itself * Add parsing for areIdsEqual util to consistently remove folders (#5589) * Add parsing util to identifier for ID comparison * Moved firstIdentifier to top of function * Lint fix Co-authored-by: Andrew Henry * Revert "Have in-memory search indexer use composition API (#5578)" (#5609) This reverts commit 7cf11e177c6c48093a6b37902ba3dfb36414ff10. * [e2e] Tests for Display Layout and LAD Tables and telemetry (#5607) * Check for circular references in originalPath - 5615 (#5619) * check for circular references * add test * fix test * address PR comments by making comments better * fix docs...again * Update version number * Prevent cyclic references in link & move actions (#5635) * do not create circular refs * add negative validation test * move to plugin * add link test too * fix docs * refactored per john request * fix path * use appAction lib Co-authored-by: Jesse Mazzella * swallow abort errors in search * [Fault Management] New Example Provider, Unit and e2e tests (#5579) * added unit tests for fault management plugin * modified the example fault provider to work out of the box * updating for new e2e folder structure * part of the e2e tests * WIP * Imagery thumbnail regression fixes - 5327 (#5569) * Add an active class to thumbnail to indicate current focused image * Differentiate bg color between real-time and fixed * scrollIntoView inline: center * Added watcher for bounds change to trigger thumbnail scroll * Resolve merge conflict with requestHistory change to telemetry collection * Split thumbnail into sub component * Monitor isFixed value to unpause playback status * updated search to include name, namespace and description added some more e2e tests * added rest of e2e tests * fixed my init script, had to disable lint for no-force because it was not working without it, saw online this may be a pw bug * fix: removing maelstrom theme from application (#5600) * added some tests for no faults * visual tests * added visual tests for fault management * created utils file for shared functionality between function and visual tests * updating to 2.0.8 * tryin to remove imagery changes from master * trying to trigger a refresh * tryin to refresh * updated search to include name, namespace and description added some more e2e tests * added rest of e2e tests * fix: removing maelstrom theme from application (#5600) * fixed my init script, had to disable lint for no-force because it was not working without it, saw online this may be a pw bug * added some tests for no faults * visual tests * added visual tests for fault management * created utils file for shared functionality between function and visual tests * updating to 2.0.8 * no clue * still no clue * removing imports and chaning to requires * updating utils file to work with require * fixing paths * fixing a test I had messed up when adding static exmaple faults * ONE LAST PATH FIX... hopefully * typo in files fix * fix folder typo * thought I got this one, but apparently not, well I did now! who is laughing now!? Co-authored-by: Michael Rogers Co-authored-by: Vitor Henckel * Sort tree items locally on rename (#5643) * fix typo * Sort the tree items locally on object rename * Use the navigationPath as a key - This ensures that objects AND linked objects will be sorted * add 'tree' and 'treeitem' roles to mct-tree * WIP tree item reordering test * Select the first object that matches * Test that all object links are also reordered * Get the final uuid before queryParams as notebook sections have uuids * Make `openObjectTreeContextMenu` more deterministic and update usage * Add `expandPathToTreeItem` and `expandTreeItemByName` appActions * add `#tree-pane` id for the tree view * Add tree visual component test suite and bump percy-cli * Remove tree appActions * Better variable name Co-authored-by: Scott Bell * Mct5549 fix indexer composition error (#5610) * [Display Layout] Composition and configuration sync (#5669) LGTM * [e2e] Stabilize notebook tag tests (#5681) * Use more deterministic selector * Hover first to "slow down" e2e actions while in headless mode * flush hash in case other requests are awaiting debounce * flush hash in case other requests are awaiting debounce * the debounce will cause this resolve function to never fire, so force a flush * lint * remove debug statements * add a comment * Moves condition set fix into 2.0.8 (#5673) * Set Focused Image index after a imagery is selected from a timestrip - 5632 (#5664) * Set focused image when timestamp prop is passed in * Unused var * Create timestrip with imagery child * Add equality check for hovered image and view large image url * Cleanup * Time List 5534 for release/2.0.8 (#5678) * Changes to Time List view. Closes #5534. - Compacted table row spacing. - Set all timeframes to display by default when creating a new Time List. - Removed 'Upload plan' file button from properties. * Changes to Time List view. Closes #5534. - Better hint text for editing Timeframe Inspector section. Co-authored-by: Andrew Henry * [CI] Enable couchdb e2e testing in open source (#5655) * Handle couch db not found errors so that interceptors are still invoked. (#5654) * Fix tests for interceptors * [e2e] Add test for 'mine' folder initialization * [e2e] don't fail on expected console errors Co-authored-by: Andrew Henry Co-authored-by: Scott Bell Co-authored-by: John Hill Co-authored-by: Jesse Mazzella * [Docs] Update CouchDB local install documentation (#5692) * Update local CouchDB install docs to include docker workflow * reformat to source configuration scripts where possible * correct couchdb case Co-authored-by: John Hill * [Time Conductor] History not working correctly (#5687) * the check for fixed time vs realtime was not updating, have fixed this * merging in related changes from master pr #4414 * lint fixes * Update src/plugins/timeConductor/ConductorHistory.vue Co-authored-by: Jesse Mazzella * setting time mode directly on load * fixing issue where realtime history was being wiped on reloads while viewing fixed time * formatting * stubbed in some tests Co-authored-by: Jesse Mazzella * Only index if provider does not support search - mct5690 (#5693) * only index if provider does not support search * add some tests * fix tests * [e2e] Add search couchdb test for duplicates * [e2e] Modify existing search test instead * lint Co-authored-by: Jesse Mazzella * fixed flakey test maybe? * fixed flakey test maybe? * fail on console errors * turn on console errors for search * revert karma code cov change * couchdb scripting artifacts gitignore * keep couchdb tests separate * remove console true as this is the default * cleanup tests * [e2e][couchdb] fix docker-compose command * [e2e][couchdb] ensure script is run using bash * [e2e][couchdb] try to debug curl in gha * [e2e][couchdb] try 0.0.0.0 * [e2e][couchdb] add debug step * [e2e][couchdb] try -L option * [e2e][couchdb] try 127.0.0.1 * [e2e][couchdb] add http * [e2e][couchdb] provide initial config * [e2e][couchdb] bind to 0.0.0.0 * [e2e][couchdb] debug * [e2e][couchdb] wait for couchdb to start, remove failed hacks * fix typo Co-authored-by: Michael Rogers Co-authored-by: Khalid Adil Co-authored-by: Jesse Mazzella Co-authored-by: John Hill Co-authored-by: Charles Hacskaylo Co-authored-by: Andrew Henry Co-authored-by: Alize Nguyen Co-authored-by: Shefali Co-authored-by: Jamie V Co-authored-by: Vitor Henckel Co-authored-by: Jesse Mazzella --- .github/workflows/e2e-couchdb.yml | 5 +- .gitignore | 4 ++ package.json | 2 +- .../URLTimeSettingsSynchronizer/pluginSpec.js | 61 ++++++++----------- .../persistence/couch/setup-couchdb.sh | 2 +- src/ui/layout/search/GrandSearch.vue | 12 +++- src/ui/router/ApplicationRouterSpec.js | 3 + 7 files changed, 49 insertions(+), 40 deletions(-) mode change 100644 => 100755 src/plugins/persistence/couch/setup-couchdb.sh diff --git a/.github/workflows/e2e-couchdb.yml b/.github/workflows/e2e-couchdb.yml index c6ecf3eab1..0a7ebe4cc2 100644 --- a/.github/workflows/e2e-couchdb.yml +++ b/.github/workflows/e2e-couchdb.yml @@ -17,8 +17,9 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - run : docker-compose up -d -f src/plugins/persistence/couch/couchdb-compose.yaml - - run : sh src/plugins/persistence/couch/setup-couchdb.sh + - run : docker-compose -f src/plugins/persistence/couch/couchdb-compose.yaml up --detach + - run : sleep 3 # wait until CouchDB has started (TODO: there must be a better way) + - run : bash src/plugins/persistence/couch/setup-couchdb.sh - uses: actions/setup-node@v3 with: node-version: '16' diff --git a/.gitignore b/.gitignore index 11481c4c40..a865c26db3 100644 --- a/.gitignore +++ b/.gitignore @@ -36,6 +36,10 @@ report.*.json test-results html-test-results +# couchdb scripting artifacts +src/plugins/persistence/couch/.env.local +index.html.bak + # codecov artifacts .nyc_output coverage diff --git a/package.json b/package.json index b916bc6506..104b7b874c 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,7 @@ "test:e2e:local": "npx playwright test --config=e2e/playwright-local.config.js --project=chrome", "test:e2e:updatesnapshots": "npx playwright test --config=e2e/playwright-ci.config.js --project=chrome --grep @snapshot --update-snapshots", "test:e2e:visual": "percy exec --config ./e2e/.percy.yml -- npx playwright test --config=e2e/playwright-visual.config.js --grep-invert @unstable", - "test:e2e:full": "npx playwright test --config=e2e/playwright-ci.config.js", + "test:e2e:full": "npx playwright test --config=e2e/playwright-ci.config.js --grep-invert @couchdb", "test:perf": "npx playwright test --config=e2e/playwright-performance.config.js", "test:watch": "cross-env NODE_ENV=test NODE_OPTIONS=\"--max_old_space_size=4096\" karma start --no-single-run", "update-about-dialog-copyright": "perl -pi -e 's/20\\d\\d\\-202\\d/2014\\-2022/gm' ./src/ui/layout/AboutDialog.vue", diff --git a/src/plugins/URLTimeSettingsSynchronizer/pluginSpec.js b/src/plugins/URLTimeSettingsSynchronizer/pluginSpec.js index ad09b3b300..196c6732c6 100644 --- a/src/plugins/URLTimeSettingsSynchronizer/pluginSpec.js +++ b/src/plugins/URLTimeSettingsSynchronizer/pluginSpec.js @@ -56,85 +56,76 @@ describe("The URLTimeSettingsSynchronizer", () => { it("initial clock is set to fixed is reflected in URL", (done) => { resolveFunction = () => { oldHash = window.location.hash; - expect(window.location.hash.includes('tc.mode=fixed')).toBe(true); + expect(window.location.hash).toContain('tc.mode=fixed'); openmct.router.removeListener('change:hash', resolveFunction); done(); }; + // We have a debounce set to 300ms on setHash, so if we don't flush, + // the above resolve function sometimes doesn't fire due to a race condition. + openmct.router.setHash.flush(); openmct.router.on('change:hash', resolveFunction); }); it("when the clock is set via the time API, it is reflected in the URL", (done) => { - let success; - resolveFunction = () => { openmct.time.clock('local', { start: -2000, end: 200 }); - - const hasStartDelta = window.location.hash.includes('tc.startDelta=2000'); - const hasEndDelta = window.location.hash.includes('tc.endDelta=200'); - const hasLocalClock = window.location.hash.includes('tc.mode=local'); - success = hasStartDelta && hasEndDelta && hasLocalClock; - if (success) { - expect(success).toBe(true); - - openmct.router.removeListener('change:hash', resolveFunction); - done(); - } + openmct.router.setHash.flush(); + const urlHash = window.location.hash; + expect(urlHash).toContain('tc.startDelta=2000'); + expect(urlHash).toContain('tc.endDelta=200'); + expect(urlHash).toContain('tc.mode=local'); + openmct.router.removeListener('change:hash', resolveFunction); + done(); }; + // We have a debounce set to 300ms on setHash, so if we don't flush, + // the above resolve function sometimes doesn't fire due to a race condition. + openmct.router.setHash.flush(); openmct.router.on('change:hash', resolveFunction); }); it("when the clock mode is set to local, it is reflected in the URL", (done) => { - let success; - resolveFunction = () => { let hash = window.location.hash; hash = hash.replace('tc.mode=fixed', 'tc.mode=local'); window.location.hash = hash; - success = window.location.hash.includes('tc.mode=local'); - if (success) { - expect(success).toBe(true); - done(); - } + expect(window.location.hash).toContain('tc.mode=local'); + done(); }; + // We have a debounce set to 300ms on setHash, so if we don't flush, + // the above resolve function sometimes doesn't fire due to a race condition. + openmct.router.setHash.flush(); openmct.router.on('change:hash', resolveFunction); }); it("when the clock mode is set to local, it is reflected in the URL", (done) => { - let success; - resolveFunction = () => { let hash = window.location.hash; hash = hash.replace('tc.mode=fixed', 'tc.mode=local'); window.location.hash = hash; - success = window.location.hash.includes('tc.mode=local'); - if (success) { - expect(success).toBe(true); - done(); - } + expect(window.location.hash).toContain('tc.mode=local'); + done(); }; + // We have a debounce set to 300ms on setHash, so if we don't flush, + // the above resolve function sometimes doesn't fire due to a race condition. + openmct.router.setHash.flush(); openmct.router.on('change:hash', resolveFunction); }); it("reset hash", (done) => { - let success; - window.location.hash = oldHash; resolveFunction = () => { - success = window.location.hash === oldHash; - if (success) { - expect(success).toBe(true); - done(); - } + expect(window.location.hash).toBe(oldHash); + done(); }; openmct.router.on('change:hash', resolveFunction); diff --git a/src/plugins/persistence/couch/setup-couchdb.sh b/src/plugins/persistence/couch/setup-couchdb.sh old mode 100644 new mode 100755 index 2b8f5e7c17..482f370f90 --- a/src/plugins/persistence/couch/setup-couchdb.sh +++ b/src/plugins/persistence/couch/setup-couchdb.sh @@ -89,7 +89,7 @@ is_cors_enabled() { enable_cors () { curl -su "${CURL_USERPASS_ARG}" -o /dev/null -X PUT $COUCH_BASE_LOCAL/_node/$COUCH_NODE_NAME/_config/httpd/enable_cors -d '"true"' - curl -su "${CURL_USERPASS_ARG}" -o /dev/null -X PUT $COUCH_BASE_LOCAL/_node/$COUCH_NODE_NAME/_config/cors/origins -d '"http://localhost:8080"' + curl -su "${CURL_USERPASS_ARG}" -o /dev/null -X PUT $COUCH_BASE_LOCAL/_node/$COUCH_NODE_NAME/_config/cors/origins -d '"*"' curl -su "${CURL_USERPASS_ARG}" -o /dev/null -X PUT $COUCH_BASE_LOCAL/_node/$COUCH_NODE_NAME/_config/cors/credentials -d '"true"' curl -su "${CURL_USERPASS_ARG}" -o /dev/null -X PUT $COUCH_BASE_LOCAL/_node/$COUCH_NODE_NAME/_config/cors/methods -d '"GET, PUT, POST, HEAD, DELETE"' curl -su "${CURL_USERPASS_ARG}" -o /dev/null -X PUT $COUCH_BASE_LOCAL/_node/$COUCH_NODE_NAME/_config/cors/headers -d '"accept, authorization, content-type, origin, referer, x-csrf-token"' diff --git a/src/ui/layout/search/GrandSearch.vue b/src/ui/layout/search/GrandSearch.vue index 88dfe198e6..f007fc5e8a 100644 --- a/src/ui/layout/search/GrandSearch.vue +++ b/src/ui/layout/search/GrandSearch.vue @@ -95,6 +95,11 @@ export default { }, getPathsForObjects(objectsNeedingPaths) { return Promise.all(objectsNeedingPaths.map(async (domainObject) => { + if (!domainObject) { + // user interrupted search, return back + return null; + } + const keyStringForObject = this.openmct.objects.makeKeyString(domainObject.identifier); const originalPathObjects = await this.openmct.objects.getOriginalPath(keyStringForObject); @@ -127,12 +132,17 @@ export default { this.searchLoading = false; this.showSearchResults(); } catch (error) { - console.error(`😞 Error searching`, error); this.searchLoading = false; if (this.abortSearchController) { delete this.abortSearchController; } + + // Is this coming from the AbortController? + // If so, we can swallow the error. If not, 🤮 it to console + if (error.name !== 'AbortError') { + console.error(`😞 Error searching`, error); + } } }, showSearchResults() { diff --git a/src/ui/router/ApplicationRouterSpec.js b/src/ui/router/ApplicationRouterSpec.js index d356d18543..4e6ca7ac3a 100644 --- a/src/ui/router/ApplicationRouterSpec.js +++ b/src/ui/router/ApplicationRouterSpec.js @@ -28,6 +28,9 @@ describe('Application router utility functions', () => { }; openmct.router.on('change:hash', resolveFunction); + // We have a debounce set to 300ms on setHash, so if we don't flush, + // the above resolve function sometimes doesn't fire due to a race condition. + openmct.router.setHash.flush(); openmct.router.setLocationFromUrl(); });