From 0bb705c185aa59ebcc6d2a38d936f984ac51f26b Mon Sep 17 00:00:00 2001 From: Kukhyeon Heo Date: Wed, 12 Oct 2022 03:41:54 +0900 Subject: [PATCH] chore: Migrate react Highlight component to Vue (#23973) * add test. * Add Highlight vue component + remove react component. * Remove floating-ui dependency. * fix test failure Co-authored-by: Lachlan Miller --- .../cypress/component/support/ctSupport.ts | 1 - .../e2e/runner/selector-playground.cy.ts | 71 ++++++++ packages/app/src/runner/aut-iframe.ts | 15 +- packages/app/src/runner/index.ts | 1 - .../selector-playground/Highlight.ce.vue | 81 +++++++++ .../selector-playground/HighlightApp.ce.vue | 17 ++ .../selector-playground/highlight-mounter.ts | 19 ++ .../runner/src/selector-playground/css.js | 166 ------------------ .../src/selector-playground/highlight.jsx | 37 ---- .../runner/src/selector-playground/index.js | 8 - packages/runner/unified-runner.tsx | 2 - .../selector-playground/cypress.config.js | 5 + .../cypress/e2e/empty.cy.js | 0 .../cypress/e2e/index.html | 20 +++ .../cypress/e2e/spec.cy.js | 3 + 15 files changed, 221 insertions(+), 225 deletions(-) create mode 100644 packages/app/cypress/e2e/runner/selector-playground.cy.ts create mode 100644 packages/app/src/runner/selector-playground/Highlight.ce.vue create mode 100644 packages/app/src/runner/selector-playground/HighlightApp.ce.vue create mode 100644 packages/app/src/runner/selector-playground/highlight-mounter.ts delete mode 100644 packages/runner/src/selector-playground/css.js delete mode 100644 packages/runner/src/selector-playground/highlight.jsx delete mode 100644 packages/runner/src/selector-playground/index.js create mode 100644 system-tests/projects/selector-playground/cypress.config.js create mode 100644 system-tests/projects/selector-playground/cypress/e2e/empty.cy.js create mode 100644 system-tests/projects/selector-playground/cypress/e2e/index.html create mode 100644 system-tests/projects/selector-playground/cypress/e2e/spec.cy.js diff --git a/packages/app/cypress/component/support/ctSupport.ts b/packages/app/cypress/component/support/ctSupport.ts index 76eb3749b959..737d9a58e0d9 100644 --- a/packages/app/cypress/component/support/ctSupport.ts +++ b/packages/app/cypress/component/support/ctSupport.ts @@ -47,6 +47,5 @@ export const createTestAutIframe = (eventManager = createEventManager()) => { 'Test Project', eventManager, null, // CypressJQuery, shouldn't be using driver in component tests anyway - window.top?.UnifiedRunner.highlight, ) } diff --git a/packages/app/cypress/e2e/runner/selector-playground.cy.ts b/packages/app/cypress/e2e/runner/selector-playground.cy.ts new file mode 100644 index 000000000000..992288ab4984 --- /dev/null +++ b/packages/app/cypress/e2e/runner/selector-playground.cy.ts @@ -0,0 +1,71 @@ +function launchApp () { + cy.scaffoldProject('selector-playground') + cy.openProject('selector-playground') + cy.startAppServer('e2e') + cy.visitApp() + cy.get(`[data-cy-row="spec.cy.js"]`).click() + + cy.waitForSpecToFinish() +} + +describe('selector playground', () => { + it('highlight the element when hover over it.', () => { + launchApp() + + cy.get('[data-cy="playground-activator"]').click() + + const backgroundColor = 'rgba(159, 196, 231, 0.6)' + + cy.getAutIframe().within(() => { + cy.get('h1').realHover() + cy.get('.__cypress-selector-playground').shadow().within(() => { + // Test highlight exists + cy.get('.highlight').should('exist') + cy.get('.highlight').should('have.css', 'background-color', backgroundColor) + + // Test tooltip text is correct + cy.get('.tooltip').should('have.text', 'h1') + + // Test placement of tooltip + let highlightTop: any + let tooltipTop: any + + cy.get('.highlight').then(($el) => { + highlightTop = parseFloat($el.css('top')) + }) + + cy.get('.tooltip').then(($el) => { + tooltipTop = parseFloat($el.css('top')) + + expect(tooltipTop).to.be.greaterThan(highlightTop) + }) + }) + }) + + cy.getAutIframe().within(() => { + cy.get('h2').realHover() + cy.get('.__cypress-selector-playground').shadow().within(() => { + // Test highlight exists + cy.get('.highlight').should('exist') + cy.get('.highlight').should('have.css', 'background-color', backgroundColor) + + // Test tooltip text is correct + cy.get('.tooltip').should('have.text', '[data-cy="h2-contents"]') + + // Test placement of tooltip + let highlightTop: any + let tooltipTop: any + + cy.get('.highlight').then(($el) => { + highlightTop = parseFloat($el.css('top')) + }) + + cy.get('.tooltip').then(($el) => { + tooltipTop = parseFloat($el.css('top')) + + expect(tooltipTop).to.be.lessThan(highlightTop) + }) + }) + }) + }) +}) diff --git a/packages/app/src/runner/aut-iframe.ts b/packages/app/src/runner/aut-iframe.ts index f8fba8d44a93..670181a5ed3b 100644 --- a/packages/app/src/runner/aut-iframe.ts +++ b/packages/app/src/runner/aut-iframe.ts @@ -7,6 +7,8 @@ import type { DebouncedFunc } from 'lodash' import { useStudioStore } from '../store/studio-store' import { getElementDimensions, setOffset } from './dimensions' import { getOrCreateHelperDom, getSelectorHighlightStyles, getZIndex, INT32_MAX } from './dom' +import highlightMounter from './selector-playground/highlight-mounter' +import Highlight from './selector-playground/Highlight.ce.vue' // JQuery bundled w/ Cypress type $CypressJQuery = any @@ -22,7 +24,6 @@ export class AutIframe { private projectName: string, private eventManager: any, private $: $CypressJQuery, - private highlight: any, ) { this.debouncedToggleSelectorPlayground = _.debounce(this.toggleSelectorPlayground, 300) } @@ -758,10 +759,10 @@ export class AutIframe { private listeners: any[] = [] private _addOrUpdateSelectorPlaygroundHighlight ({ $el, $body, selector, showTooltip, onClick }: any) { - const { container, shadowRoot, vueContainer } = getOrCreateHelperDom({ + const { container, vueContainer } = getOrCreateHelperDom({ body: $body?.get(0) || document.body, className: '__cypress-selector-playground', - css: this.highlight.css, + css: Highlight.styles[0], }) const removeContainerClickListeners = () => { @@ -773,7 +774,6 @@ export class AutIframe { } if (!$el) { - this.highlight.unmount(vueContainer) removeContainerClickListeners() container.remove() @@ -792,11 +792,6 @@ export class AutIframe { } } - this.highlight.render(vueContainer, { - selector, - appendTo: shadowRoot, - showTooltip, - styles, - }) + highlightMounter.mount(vueContainer, selector, styles) } } diff --git a/packages/app/src/runner/index.ts b/packages/app/src/runner/index.ts index 7a421b32f647..54b16d42e082 100644 --- a/packages/app/src/runner/index.ts +++ b/packages/app/src/runner/index.ts @@ -147,7 +147,6 @@ function setupRunner () { 'Test Project', getEventManager(), window.UnifiedRunner.CypressJQuery, - window.UnifiedRunner.highlight, ) createIframeModel() diff --git a/packages/app/src/runner/selector-playground/Highlight.ce.vue b/packages/app/src/runner/selector-playground/Highlight.ce.vue new file mode 100644 index 000000000000..914f3d460281 --- /dev/null +++ b/packages/app/src/runner/selector-playground/Highlight.ce.vue @@ -0,0 +1,81 @@ + + + + + diff --git a/packages/app/src/runner/selector-playground/HighlightApp.ce.vue b/packages/app/src/runner/selector-playground/HighlightApp.ce.vue new file mode 100644 index 000000000000..8db516ba9a0e --- /dev/null +++ b/packages/app/src/runner/selector-playground/HighlightApp.ce.vue @@ -0,0 +1,17 @@ + + + diff --git a/packages/app/src/runner/selector-playground/highlight-mounter.ts b/packages/app/src/runner/selector-playground/highlight-mounter.ts new file mode 100644 index 000000000000..1d229e11b3a2 --- /dev/null +++ b/packages/app/src/runner/selector-playground/highlight-mounter.ts @@ -0,0 +1,19 @@ +import { App, createApp } from 'vue' +import HighlightApp from './HighlightApp.ce.vue' + +let app: App | null = null + +export default { + mount (container: Element, selector: string, styles: any[]) { + if (app) { + app.unmount() + } + + app = createApp(HighlightApp, { + selector, + styles, + }) + + app.mount(container) + }, +} diff --git a/packages/runner/src/selector-playground/css.js b/packages/runner/src/selector-playground/css.js deleted file mode 100644 index 2dae181f74e6..000000000000 --- a/packages/runner/src/selector-playground/css.js +++ /dev/null @@ -1,166 +0,0 @@ -export const css = ` -/** -* This is a standalone file that gets included with the selector playground -* highlight in the user's app html -*/ -.tooltip { - background: #333; - border: solid 1px #333; - border-radius: 3px; - color: #e3e3e3; - display: inline-block; - font-size: 12px; - left: 0; - max-width: 200px; - padding: 4px 6px; - text-align: center; - top: 0; - z-index: 100; -} -.tooltip-arrow { - height: 0; - overflow: hidden; - position: absolute; - width: 0; -} -.tooltip-arrow svg { - fill: #333; - position: relative; - stroke: #333; - stroke-width: 1px; -} -.tooltip-top, -.tooltip-top-start, -.tooltip-top-end, -.tooltip-bottom.tooltip-flipped, -.tooltip-bottom-start.tooltip-flipped, -.tooltip-bottom-end.tooltip-flipped { - margin-bottom: 5px; -} -.tooltip-top .tooltip-arrow, -.tooltip-top-start .tooltip-arrow, -.tooltip-top-end .tooltip-arrow, -.tooltip-bottom.tooltip-flipped .tooltip-arrow, -.tooltip-bottom-start.tooltip-flipped .tooltip-arrow, -.tooltip-bottom-end.tooltip-flipped .tooltip-arrow { - top: auto; - bottom: -6px; - height: 6px; - width: 12px; -} -.tooltip-top .tooltip-arrow svg, -.tooltip-top-start .tooltip-arrow svg, -.tooltip-top-end .tooltip-arrow svg, -.tooltip-bottom.tooltip-flipped .tooltip-arrow svg, -.tooltip-bottom-start.tooltip-flipped .tooltip-arrow svg, -.tooltip-bottom-end.tooltip-flipped .tooltip-arrow svg { - top: -5px; -} -.tooltip-right, -.tooltip-right-start, -.tooltip-right-end, -.tooltip-left.tooltip-flipped, -.tooltip-left-start.tooltip-flipped, -.tooltip-left-end.tooltip-flipped { - margin-left: 5px; -} -.tooltip-right .tooltip-arrow, -.tooltip-right-start .tooltip-arrow, -.tooltip-right-end .tooltip-arrow, -.tooltip-left.tooltip-flipped .tooltip-arrow, -.tooltip-left-start.tooltip-flipped .tooltip-arrow, -.tooltip-left-end.tooltip-flipped .tooltip-arrow { - right: auto; - left: -6px; - height: 12px; - width: 6px; -} -.tooltip-right svg, -.tooltip-right-start svg, -.tooltip-right-end svg, -.tooltip-left.tooltip-flipped svg, -.tooltip-left-start.tooltip-flipped svg, -.tooltip-left-end.tooltip-flipped svg { - left: 0; -} -.tooltip-left, -.tooltip-left-start, -.tooltip-left-end, -.tooltip-right.tooltip-flipped, -.tooltip-right-start.tooltip-flipped, -.tooltip-right-end.tooltip-flipped { - margin-right: 5px; -} -.tooltip-left .tooltip-arrow, -.tooltip-left-start .tooltip-arrow, -.tooltip-left-end .tooltip-arrow, -.tooltip-right.tooltip-flipped .tooltip-arrow, -.tooltip-right-start.tooltip-flipped .tooltip-arrow, -.tooltip-right-end.tooltip-flipped .tooltip-arrow { - left: auto; - right: -6px; - height: 12px; - width: 6px; -} -.tooltip-left .tooltip-arrow svg, -.tooltip-left-start .tooltip-arrow svg, -.tooltip-left-end .tooltip-arrow svg, -.tooltip-right.tooltip-flipped .tooltip-arrow svg, -.tooltip-right-start.tooltip-flipped .tooltip-arrow svg, -.tooltip-right-end.tooltip-flipped .tooltip-arrow svg { - left: -5px; -} -.tooltip-bottom, -.tooltip-bottom-start, -.tooltip-bottom-end, -.tooltip-top.tooltip-flipped, -.tooltip-top-start.tooltip-flipped, -.tooltip-top-end.tooltip-flipped { - margin-top: 5px; -} -.tooltip-bottom .tooltip-arrow, -.tooltip-bottom-start .tooltip-arrow, -.tooltip-bottom-end .tooltip-arrow, -.tooltip-top.tooltip-flipped .tooltip-arrow, -.tooltip-top-start.tooltip-flipped .tooltip-arrow, -.tooltip-top-end.tooltip-flipped .tooltip-arrow { - bottom: auto; - height: 6px; - top: -6px; - width: 12px; -} -.tooltip-bottom svg, -.tooltip-bottom-start svg, -.tooltip-bottom-end svg, -.tooltip-top.tooltip-flipped svg, -.tooltip-top-start.tooltip-flipped svg, -.tooltip-top-end.tooltip-flipped svg { - top: 0; -} -.tooltip-top-start .tooltip-arrow, -.tooltip-bottom-start .tooltip-arrow { - left: 0; -} -.tooltip-top-end .tooltip-arrow, -.tooltip-bottom-end .tooltip-arrow { - right: 0; -} -.tooltip-left-start .tooltip-arrow, -.tooltip-right-start .tooltip-arrow { - top: 0; -} -.tooltip-left-end .tooltip-arrow, -.tooltip-right-end .tooltip-arrow { - bottom: 0; -} -.highlight { - background: rgba(159, 196, 231, 0.6); - border: solid 2px #9FC4E7; - cursor: pointer; -} -.tooltip { - font-family: sans-serif; - font-size: 14px; - max-width: 400px !important; -} -` diff --git a/packages/runner/src/selector-playground/highlight.jsx b/packages/runner/src/selector-playground/highlight.jsx deleted file mode 100644 index 5ea47f7e5a5c..000000000000 --- a/packages/runner/src/selector-playground/highlight.jsx +++ /dev/null @@ -1,37 +0,0 @@ -import _ from 'lodash' -import React from 'react' -import { render, unmountComponentAtNode } from 'react-dom' -import Tooltip from '@cypress/react-tooltip' - -const Highlight = ({ selector, appendTo, styles, showTooltip = true }) => { - return ( -
- {_.map(styles, (style, i) => { - // indicates that tooltip should change if one of these props change - const updateCue = _.values(_.pick(style, 'width', 'height', 'top', 'left', 'transform')).join() - - return ( - -
- - ) - })} -
- ) -} - -function renderHighlight (container, props) { - render(, container) -} - -export const selectorPlaygroundHighlight = { - render: renderHighlight, - unmount: unmountComponentAtNode, -} diff --git a/packages/runner/src/selector-playground/index.js b/packages/runner/src/selector-playground/index.js deleted file mode 100644 index c9e80478ca73..000000000000 --- a/packages/runner/src/selector-playground/index.js +++ /dev/null @@ -1,8 +0,0 @@ -import { selectorPlaygroundHighlight } from './highlight' -import { css } from './css' - -export const highlight = { - render: selectorPlaygroundHighlight.render, - unmount: selectorPlaygroundHighlight.unmount, - css, -} diff --git a/packages/runner/unified-runner.tsx b/packages/runner/unified-runner.tsx index 06bc21e7ec0d..dfff25ad12d8 100644 --- a/packages/runner/unified-runner.tsx +++ b/packages/runner/unified-runner.tsx @@ -6,7 +6,6 @@ import shortcuts from '@packages/reporter/src/lib/shortcuts' import * as MobX from 'mobx' import { dom } from './src/dom' -import { highlight } from './src/selector-playground' export const UnifiedRunner = { CypressJQuery: $Cypress.$, @@ -14,7 +13,6 @@ export const UnifiedRunner = { CypressDriver: $Cypress, dom, - highlight, shortcuts, diff --git a/system-tests/projects/selector-playground/cypress.config.js b/system-tests/projects/selector-playground/cypress.config.js new file mode 100644 index 000000000000..d12d96d7e3e0 --- /dev/null +++ b/system-tests/projects/selector-playground/cypress.config.js @@ -0,0 +1,5 @@ +module.exports = { + e2e: { + supportFile: false, + }, +} diff --git a/system-tests/projects/selector-playground/cypress/e2e/empty.cy.js b/system-tests/projects/selector-playground/cypress/e2e/empty.cy.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/system-tests/projects/selector-playground/cypress/e2e/index.html b/system-tests/projects/selector-playground/cypress/e2e/index.html new file mode 100644 index 000000000000..b380b7ef0a00 --- /dev/null +++ b/system-tests/projects/selector-playground/cypress/e2e/index.html @@ -0,0 +1,20 @@ + + + + + + + Hello Selector Playground + + +

Hello, Selector Playground!

+
+ +

Some contents

+ +

Para 1

+

Para 2

+

Para 3

+

Para 4

+ + diff --git a/system-tests/projects/selector-playground/cypress/e2e/spec.cy.js b/system-tests/projects/selector-playground/cypress/e2e/spec.cy.js new file mode 100644 index 000000000000..14398fef3b5c --- /dev/null +++ b/system-tests/projects/selector-playground/cypress/e2e/spec.cy.js @@ -0,0 +1,3 @@ +it('visits a basic html page', () => { + cy.visit('cypress/e2e/index.html') +})