|
| 1 | +import { unwrap, isJquery } from '../../dom/jquery' |
| 2 | +import { assert, wrap } from './assert' |
| 3 | +import type { Callbacks } from './assert' |
| 4 | +import { scrollBehaviorOptionsMap } from '../../cy/actionability' |
| 5 | +import { fastIsHidden } from '../../dom/visibility/fastIsHidden' |
| 6 | + |
| 7 | +function getSubjects (ref: Chai.AssertionStatic['_obj']): HTMLElement[] { |
| 8 | + const unwrapped = isJquery(ref) ? unwrap(ref) : ref |
| 9 | + |
| 10 | + if (Array.isArray(unwrapped)) { |
| 11 | + return unwrapped |
| 12 | + } |
| 13 | + |
| 14 | + return [unwrapped] |
| 15 | +} |
| 16 | + |
| 17 | +function checkSubjects (subjects: HTMLElement[], checkVisibility: (subject: HTMLElement) => boolean): boolean { |
| 18 | + return subjects.some((subject) => { |
| 19 | + const configuredScrollBehavior = Cypress.config('scrollBehavior') |
| 20 | + |
| 21 | + if (configuredScrollBehavior !== false) { |
| 22 | + const block: ScrollLogicalPosition = scrollBehaviorOptionsMap[configuredScrollBehavior] |
| 23 | + |
| 24 | + subject.scrollIntoView({ behavior: 'instant', block }) |
| 25 | + } |
| 26 | + |
| 27 | + return checkVisibility(subject) |
| 28 | + }) |
| 29 | +} |
| 30 | + |
| 31 | +export function assertVisible ( |
| 32 | + chaiUtils: Chai.ChaiUtils, |
| 33 | + callbacks: Callbacks, |
| 34 | +) { |
| 35 | + return function ( |
| 36 | + this: Chai.AssertionStatic, |
| 37 | + ) { |
| 38 | + const subjects = getSubjects(this._obj) |
| 39 | + |
| 40 | + const isVisible = Cypress.config('experimentalFastVisibility') ? checkSubjects(subjects, (s) => !fastIsHidden(s)) : wrap(this).is(':visible') |
| 41 | + |
| 42 | + return assert( |
| 43 | + this, |
| 44 | + chaiUtils, |
| 45 | + callbacks, |
| 46 | + 'visible', |
| 47 | + isVisible, |
| 48 | + 'expected #{this} to be visible', |
| 49 | + 'expected #{this} not to be visible', |
| 50 | + 'visible', |
| 51 | + ) |
| 52 | + } |
| 53 | +} |
| 54 | + |
| 55 | +export function assertHidden ( |
| 56 | + chaiUtils: Chai.ChaiUtils, |
| 57 | + callbacks: Callbacks, |
| 58 | +) { |
| 59 | + return function (this: Chai.AssertionStatic) { |
| 60 | + const subjects = getSubjects(this._obj) |
| 61 | + const isHidden = Cypress.config('experimentalFastVisibility') ? checkSubjects(subjects, (s) => fastIsHidden(s)) : wrap(this).is(':hidden') |
| 62 | + |
| 63 | + return assert( |
| 64 | + this, |
| 65 | + chaiUtils, |
| 66 | + callbacks, |
| 67 | + 'hidden', |
| 68 | + isHidden, |
| 69 | + 'expected #{this} to be hidden', |
| 70 | + 'expected #{this} not to be hidden', |
| 71 | + 'hidden', |
| 72 | + ) |
| 73 | + } |
| 74 | +} |
0 commit comments