Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 12 additions & 21 deletions e2e/drawer.e2e.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
import { expect, test } from "@playwright/test"
import { DrawerModel } from "./models/drawer.model"

Expand Down Expand Up @@ -189,11 +189,8 @@
await I.seeContent()
await I.waitForOpenState()

let currentHeight = await I.getContentVisibleHeight()

// Calculate expected heights based on actual content height
// First, drag to 100% to get the full height
await I.dragGrabber("up", 600)
// First, measure full height at the 100% snap point.
await I.dragGrabber("up", 800)
await I.waitForSnapComplete()

const fullHeight = await I.getContentVisibleHeight()
Expand All @@ -203,35 +200,29 @@
// Close and reopen to test default snap point
await I.pressKey("Escape")
await I.dontSeeContent()

// Small delay to ensure state is fully reset
await I.wait(100)
await I.waitForClosedState()

await I.clickTrigger()
await I.seeContent()
await I.waitForOpenState()

currentHeight = await I.getContentVisibleHeight()

// Should open at default snap point (25%)
expect(currentHeight).toBeCloseTo(lowerHeight, 0)
await I.waitForVisibleHeightNear(lowerHeight, 6)

// Drag up to reach 250px snap point
await I.dragGrabber("up", 100)
// Drag up to reach 250px snap point using distance from measured default height.
const dragTo250 = Math.max(80, Math.ceil(250 - lowerHeight + 40))
await I.dragGrabber("up", dragTo250)
await I.waitForSnapComplete()

currentHeight = await I.getContentVisibleHeight()

// Should have snapped to 250px fixed snap point
expect(currentHeight).toBeCloseTo(250, 0)
await I.waitForVisibleHeightNear(250, 6)

// Drag up more to reach full height (100%)
await I.dragGrabber("up", 500)
// Drag up to reach full height (100%) from the 250px snap point.
const dragToFull = Math.max(100, Math.ceil(fullHeight - 250 + 40))
await I.dragGrabber("up", dragToFull)
await I.waitForSnapComplete()

currentHeight = await I.getContentVisibleHeight()

// Should be at maximum height (100% snap point)
expect(currentHeight).toBeCloseTo(fullHeight, 0)
await I.waitForVisibleHeightNear(fullHeight, 6)
})
})
14 changes: 11 additions & 3 deletions e2e/models/drawer.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@

const translateY = await this.content.evaluate((el) => getComputedStyle(el).getPropertyValue("--drawer-translate"))

const parsedTranslateY = parseInt(translateY, 10)
const parsedTranslateY = parseFloat(translateY)
return initialHeight - (isNaN(parsedTranslateY) ? 0 : parsedTranslateY)
}

Expand All @@ -114,18 +114,18 @@
}

async isScrollableAtTop() {
const scrollTop = await this.scrollable.evaluate((el) => el.scrollTop)

Check failure on line 117 in e2e/models/drawer.model.ts

View workflow job for this annotation

GitHub Actions / End-to-end Tests (4)

e2e/drawer.e2e.ts:85:7 › drawer › should allow scrolling within content

2) e2e/drawer.e2e.ts:85:7 › drawer › should allow scrolling within content ─────────────────────── Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: locator.evaluate: Test timeout of 30000ms exceeded. Call log: - waiting for locator('.scrollable') at models/drawer.model.ts:117 115 | 116 | async isScrollableAtTop() { > 117 | const scrollTop = await this.scrollable.evaluate((el) => el.scrollTop) | ^ 118 | return scrollTop === 0 119 | } 120 | at DrawerModel.isScrollableAtTop (/home/runner/work/lib-zag/lib-zag/e2e/models/drawer.model.ts:117:45) at /home/runner/work/lib-zag/lib-zag/e2e/drawer.e2e.ts:89:29

Check failure on line 117 in e2e/models/drawer.model.ts

View workflow job for this annotation

GitHub Actions / End-to-end Tests (4)

e2e/drawer.e2e.ts:85:7 › drawer › should allow scrolling within content

2) e2e/drawer.e2e.ts:85:7 › drawer › should allow scrolling within content ─────────────────────── Error: locator.evaluate: Test timeout of 30000ms exceeded. Call log: - waiting for locator('.scrollable') at models/drawer.model.ts:117 115 | 116 | async isScrollableAtTop() { > 117 | const scrollTop = await this.scrollable.evaluate((el) => el.scrollTop) | ^ 118 | return scrollTop === 0 119 | } 120 | at DrawerModel.isScrollableAtTop (/home/runner/work/lib-zag/lib-zag/e2e/models/drawer.model.ts:117:45) at /home/runner/work/lib-zag/lib-zag/e2e/drawer.e2e.ts:89:29

Check failure on line 117 in e2e/models/drawer.model.ts

View workflow job for this annotation

GitHub Actions / End-to-end Tests (4)

e2e/drawer.e2e.ts:85:7 › drawer › should allow scrolling within content

2) e2e/drawer.e2e.ts:85:7 › drawer › should allow scrolling within content ─────────────────────── Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: locator.evaluate: Test timeout of 30000ms exceeded. Call log: - waiting for locator('.scrollable') at models/drawer.model.ts:117 115 | 116 | async isScrollableAtTop() { > 117 | const scrollTop = await this.scrollable.evaluate((el) => el.scrollTop) | ^ 118 | return scrollTop === 0 119 | } 120 | at DrawerModel.isScrollableAtTop (/home/runner/work/lib-zag/lib-zag/e2e/models/drawer.model.ts:117:45) at /home/runner/work/lib-zag/lib-zag/e2e/drawer.e2e.ts:89:29

Check failure on line 117 in e2e/models/drawer.model.ts

View workflow job for this annotation

GitHub Actions / End-to-end Tests (4)

e2e/drawer.e2e.ts:85:7 › drawer › should allow scrolling within content

2) e2e/drawer.e2e.ts:85:7 › drawer › should allow scrolling within content ─────────────────────── Error: locator.evaluate: Test timeout of 30000ms exceeded. Call log: - waiting for locator('.scrollable') at models/drawer.model.ts:117 115 | 116 | async isScrollableAtTop() { > 117 | const scrollTop = await this.scrollable.evaluate((el) => el.scrollTop) | ^ 118 | return scrollTop === 0 119 | } 120 | at DrawerModel.isScrollableAtTop (/home/runner/work/lib-zag/lib-zag/e2e/models/drawer.model.ts:117:45) at /home/runner/work/lib-zag/lib-zag/e2e/drawer.e2e.ts:89:29
return scrollTop === 0
}

clickOutsideSheet() {
return this.page.locator("main").click({ position: { x: 5, y: 5 } })

Check failure on line 122 in e2e/models/drawer.model.ts

View workflow job for this annotation

GitHub Actions / End-to-end Tests (4)

e2e/drawer.e2e.ts:23:7 › drawer › should close when clicked outside

1) e2e/drawer.e2e.ts:23:7 › drawer › should close when clicked outside ─────────────────────────── Retry #2 ─────────────────────────────────────────────────────────────────────────────────────── Error: locator.click: Test timeout of 30000ms exceeded. Call log: - waiting for locator('main') - locator resolved to <main>…</main> - attempting click action 2 × waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <html>…</html> intercepts pointer events - retrying click action - waiting 20ms 2 × waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <html>…</html> intercepts pointer events - retrying click action - waiting 100ms 55 × waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <html>…</html> intercepts pointer events - retrying click action - waiting 500ms at models/drawer.model.ts:122 120 | 121 | clickOutsideSheet() { > 122 | return this.page.locator("main").click({ position: { x: 5, y: 5 } }) | ^ 123 | } 124 | 125 | async waitForOpenState() { at DrawerModel.clickOutsideSheet (/home/runner/work/lib-zag/lib-zag/e2e/models/drawer.model.ts:122:38) at /home/runner/work/lib-zag/lib-zag/e2e/drawer.e2e.ts:28:13

Check failure on line 122 in e2e/models/drawer.model.ts

View workflow job for this annotation

GitHub Actions / End-to-end Tests (4)

e2e/drawer.e2e.ts:23:7 › drawer › should close when clicked outside

1) e2e/drawer.e2e.ts:23:7 › drawer › should close when clicked outside ─────────────────────────── Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: locator.click: Test timeout of 30000ms exceeded. Call log: - waiting for locator('main') - locator resolved to <main>…</main> - attempting click action 2 × waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <html>…</html> intercepts pointer events - retrying click action - waiting 20ms 2 × waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <html>…</html> intercepts pointer events - retrying click action - waiting 100ms 56 × waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <html>…</html> intercepts pointer events - retrying click action - waiting 500ms at models/drawer.model.ts:122 120 | 121 | clickOutsideSheet() { > 122 | return this.page.locator("main").click({ position: { x: 5, y: 5 } }) | ^ 123 | } 124 | 125 | async waitForOpenState() { at DrawerModel.clickOutsideSheet (/home/runner/work/lib-zag/lib-zag/e2e/models/drawer.model.ts:122:38) at /home/runner/work/lib-zag/lib-zag/e2e/drawer.e2e.ts:28:13

Check failure on line 122 in e2e/models/drawer.model.ts

View workflow job for this annotation

GitHub Actions / End-to-end Tests (4)

e2e/drawer.e2e.ts:23:7 › drawer › should close when clicked outside

1) e2e/drawer.e2e.ts:23:7 › drawer › should close when clicked outside ─────────────────────────── Error: locator.click: Test timeout of 30000ms exceeded. Call log: - waiting for locator('main') - locator resolved to <main>…</main> - attempting click action 2 × waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <html>…</html> intercepts pointer events - retrying click action - waiting 20ms 2 × waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <html>…</html> intercepts pointer events - retrying click action - waiting 100ms 55 × waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <html>…</html> intercepts pointer events - retrying click action - waiting 500ms at models/drawer.model.ts:122 120 | 121 | clickOutsideSheet() { > 122 | return this.page.locator("main").click({ position: { x: 5, y: 5 } }) | ^ 123 | } 124 | 125 | async waitForOpenState() { at DrawerModel.clickOutsideSheet (/home/runner/work/lib-zag/lib-zag/e2e/models/drawer.model.ts:122:38) at /home/runner/work/lib-zag/lib-zag/e2e/drawer.e2e.ts:28:13

Check failure on line 122 in e2e/models/drawer.model.ts

View workflow job for this annotation

GitHub Actions / End-to-end Tests (4)

e2e/drawer.e2e.ts:23:7 › drawer › should close when clicked outside

1) e2e/drawer.e2e.ts:23:7 › drawer › should close when clicked outside ─────────────────────────── Retry #2 ─────────────────────────────────────────────────────────────────────────────────────── Error: locator.click: Test timeout of 30000ms exceeded. Call log: - waiting for locator('main') - locator resolved to <main>…</main> - attempting click action 2 × waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <html>…</html> intercepts pointer events - retrying click action - waiting 20ms 2 × waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <html>…</html> intercepts pointer events - retrying click action - waiting 100ms 55 × waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <html>…</html> intercepts pointer events - retrying click action - waiting 500ms at models/drawer.model.ts:122 120 | 121 | clickOutsideSheet() { > 122 | return this.page.locator("main").click({ position: { x: 5, y: 5 } }) | ^ 123 | } 124 | 125 | async waitForOpenState() { at DrawerModel.clickOutsideSheet (/home/runner/work/lib-zag/lib-zag/e2e/models/drawer.model.ts:122:38) at /home/runner/work/lib-zag/lib-zag/e2e/drawer.e2e.ts:28:13

Check failure on line 122 in e2e/models/drawer.model.ts

View workflow job for this annotation

GitHub Actions / End-to-end Tests (4)

e2e/drawer.e2e.ts:23:7 › drawer › should close when clicked outside

1) e2e/drawer.e2e.ts:23:7 › drawer › should close when clicked outside ─────────────────────────── Retry #1 ─────────────────────────────────────────────────────────────────────────────────────── Error: locator.click: Test timeout of 30000ms exceeded. Call log: - waiting for locator('main') - locator resolved to <main>…</main> - attempting click action 2 × waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <html>…</html> intercepts pointer events - retrying click action - waiting 20ms 2 × waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <html>…</html> intercepts pointer events - retrying click action - waiting 100ms 55 × waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <html>…</html> intercepts pointer events - retrying click action - waiting 500ms - waiting for element to be visible, enabled and stable at models/drawer.model.ts:122 120 | 121 | clickOutsideSheet() { > 122 | return this.page.locator("main").click({ position: { x: 5, y: 5 } }) | ^ 123 | } 124 | 125 | async waitForOpenState() { at DrawerModel.clickOutsideSheet (/home/runner/work/lib-zag/lib-zag/e2e/models/drawer.model.ts:122:38) at /home/runner/work/lib-zag/lib-zag/e2e/drawer.e2e.ts:28:13

Check failure on line 122 in e2e/models/drawer.model.ts

View workflow job for this annotation

GitHub Actions / End-to-end Tests (4)

e2e/drawer.e2e.ts:23:7 › drawer › should close when clicked outside

1) e2e/drawer.e2e.ts:23:7 › drawer › should close when clicked outside ─────────────────────────── Error: locator.click: Test timeout of 30000ms exceeded. Call log: - waiting for locator('main') - locator resolved to <main>…</main> - attempting click action 2 × waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <html>…</html> intercepts pointer events - retrying click action - waiting 20ms 2 × waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <html>…</html> intercepts pointer events - retrying click action - waiting 100ms 56 × waiting for element to be visible, enabled and stable - element is visible, enabled and stable - scrolling into view if needed - done scrolling - <html>…</html> intercepts pointer events - retrying click action - waiting 500ms at models/drawer.model.ts:122 120 | 121 | clickOutsideSheet() { > 122 | return this.page.locator("main").click({ position: { x: 5, y: 5 } }) | ^ 123 | } 124 | 125 | async waitForOpenState() { at DrawerModel.clickOutsideSheet (/home/runner/work/lib-zag/lib-zag/e2e/models/drawer.model.ts:122:38) at /home/runner/work/lib-zag/lib-zag/e2e/drawer.e2e.ts:28:13
}

async waitForOpenState() {
// Wait for element to be visible and animations to complete
await expect(this.content).toBeVisible()
await this.content.evaluate((el) => Promise.all(el.getAnimations().map((animation) => animation.finished)))
await this.content.evaluate((el) => Promise.allSettled(el.getAnimations().map((animation) => animation.finished)))
}

waitForClosedState() {
Expand All @@ -134,6 +134,14 @@

async waitForSnapComplete() {
// Wait for snap animation/transition to complete after drag
await this.content.evaluate((el) => Promise.all([...el.getAnimations()].map((animation) => animation.finished)))
await this.content.evaluate((el) =>
Promise.allSettled([...el.getAnimations()].map((animation) => animation.finished)),
)
}

async waitForVisibleHeightNear(targetHeight: number, tolerance = 4, timeout = 2000) {
await expect
.poll(async () => Math.abs((await this.getContentVisibleHeight()) - targetHeight), { timeout })
.toBeLessThanOrEqual(tolerance)
}
}
Loading