Skip to content

Commit

Permalink
test(ui-modal): migrate old Modal tests
Browse files Browse the repository at this point in the history
Closes: INSTUI-3920
  • Loading branch information
git-nandor committed Feb 14, 2024
1 parent e8ebb97 commit 5b75e28
Show file tree
Hide file tree
Showing 18 changed files with 949 additions and 888 deletions.
9 changes: 9 additions & 0 deletions cypress.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,15 @@ import { defineConfig } from 'cypress'
import webpackConfig from './packages/ui-webpack-config/config'

export default defineConfig({
retries: {
experimentalStrategy: 'detect-flake-and-pass-on-threshold',
experimentalOptions: {
maxRetries: 10,
passesRequired: 1
},
openMode: true,
runMode: true
},
screenshotOnRunFailure: false,
component: {
devServer: {
Expand Down
94 changes: 94 additions & 0 deletions cypress/component/Modal.cy.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
/*
* The MIT License (MIT)
*
* Copyright (c) 2015 - present Instructure, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
import React, { useState } from 'react'
import { Modal, View } from '../../packages/ui'

import '../support/component'
import 'cypress-real-events'

describe('<Modal/>', () => {
it('should call onDismiss prop when Esc key pressed by default', () => {
const onDismissSpy = cy.spy()
cy.mount(
<Modal
open={true}
onDismiss={onDismissSpy}
label="Modal Dialog"
shouldReturnFocus={false}
>
<p>Modal body text</p>
</Modal>
)
cy.root().should('contain', 'Modal body text')

cy.get('body').trigger('keydown', { keyCode: 27 })
cy.get('body').trigger('keyup', { keyCode: 27 })
cy.wrap(onDismissSpy).should('have.been.calledOnce')
})

it('should not call stale callbacks', () => {
const handleDismissSpy = cy.spy()
interface ExampleProps {
handleDismiss: (value: number) => void
}

function Example({ handleDismiss }: ExampleProps) {
const [value, setValue] = useState(0)

function onButtonClick() {
setValue(value + 1)
}

return (
<View>
<Modal
label="Modal"
open
onDismiss={() => {
handleDismiss(value)
}}
>
<Modal.Body>
<p>Modal body text</p>
<div id="value-indicator">{value}</div>
<button id="increment-btn" onClick={onButtonClick}>
Increment Button
</button>
</Modal.Body>
</Modal>
</View>
)
}
cy.mount(<Example handleDismiss={handleDismissSpy} />)

cy.root().should('contain', 'Modal body text')

cy.get('#increment-btn').realClick().wait(100)
cy.get('#value-indicator').should('contain', '1')
cy.wrap(handleDismissSpy).should('not.have.been.called')

cy.get('body').click(0, 0)
cy.wrap(handleDismissSpy).should('have.been.calledOnceWith', 1)
})
})
20 changes: 19 additions & 1 deletion cypress/support/component.ts → cypress/support/component.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@ import './commands'
// require('./commands')

import { mount } from 'cypress/react18'
import React from 'react'

import { CacheProvider } from '@emotion/react'
import createCache from '@emotion/cache'
import { ROOT_SELECTOR } from 'cypress/mount-utils'

// Augment the Cypress namespace to include type definitions for
// your custom command.
Expand All @@ -57,7 +62,20 @@ declare global {
}
}

Cypress.Commands.add('mount', mount)
Cypress.Commands.add('mount', (component, options) => {
// Wrap any parent components needed
// ie: return mount(<MyProvider>{component}</MyProvider>, options)

const myCache = createCache({
key: 'plugin-cache',
container: document.querySelector<HTMLElement>(ROOT_SELECTOR)!
})

return mount(
<CacheProvider value={myCache}>{component}</CacheProvider>,
options
)
})

// Example use:
// cy.mount(<MyComponent />)
24 changes: 15 additions & 9 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@
"@babel/cli": "^7.23.0",
"@commitlint/cli": "^17.8.0",
"@commitlint/config-conventional": "^17.8.0",
"@emotion/cache": "^11.11.0",
"@emotion/react": "^11.11.3",
"@instructure/ui-scripts": "8",
"@testing-library/dom": "^9.3.3",
"@testing-library/jest-dom": "^6.1.4",
Expand Down
Loading

0 comments on commit 5b75e28

Please sign in to comment.