Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

e2e tests for useOverflow logic #2151

Draft
wants to merge 33 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 15 commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
71a3611
Brought back e2e tests from combined PR
r100-stack Jul 18, 2024
ad14635
Small edits for tests to pass with old useOverflow
r100-stack Jul 18, 2024
24de931
Try to increase await duration
r100-stack Jul 18, 2024
3da2c29
Try not awaiting inside expect.
r100-stack Jul 18, 2024
df16014
Undo build.yml changes
r100-stack Jul 18, 2024
1d4e7bf
Remove nested components
r100-stack Jul 18, 2024
c524246
Added `await`
r100-stack Jul 18, 2024
1cc98a1
Remove nested describe blocks
r100-stack Jul 18, 2024
46e7d99
nit/optional comments
r100-stack Jul 18, 2024
057a5a0
Lenient test selectors; unchanged old tests.
r100-stack Jul 19, 2024
44adeac
Trying review suggestions
r100-stack Jul 19, 2024
a97ff78
Lenient MiddleTextTruncation text comparison
r100-stack Jul 19, 2024
7c90aef
Fixed var undefined error. Old test unchanged.
r100-stack Jul 19, 2024
8de316a
Add missing await
r100-stack Jul 19, 2024
4575008
Un-nest components in Table
r100-stack Jul 19, 2024
24fe514
Deconstruct config variables
r100-stack Jul 19, 2024
262ba5d
Merge remote-tracking branch 'origin/main' into r/unit-tests-to-e2e
r100-stack Aug 6, 2024
a77da3f
Merge remote-tracking branch 'origin/main' into r/unit-tests-to-e2e
r100-stack Aug 29, 2024
77c8afe
Merge remote-tracking branch 'origin/main' into r/unit-tests-to-e2e
r100-stack Aug 29, 2024
42bc280
Fix test failures
r100-stack Aug 30, 2024
0ddb674
Merge branch 'main' into r/unit-tests-to-e2e
r100-stack Sep 23, 2024
9fca3bc
Merge branch 'main' into r/unit-tests-to-e2e
r100-stack Sep 26, 2024
1651f27
Fixed e2e test
r100-stack Sep 26, 2024
fe9ccb9
Merge branch 'main' into r/unit-tests-to-e2e
r100-stack Sep 26, 2024
9fe39a3
Merge branch 'main' into r/unit-tests-to-e2e
r100-stack Sep 30, 2024
f55d709
Improvements
r100-stack Sep 30, 2024
b7c05ae
Simplicity
r100-stack Sep 30, 2024
3e82ea5
Improvements
r100-stack Sep 30, 2024
aa8b849
Remove unrelated test
r100-stack Oct 1, 2024
314aac7
Reduce diff
r100-stack Oct 1, 2024
c67f2ff
Update outdated test
r100-stack Oct 2, 2024
e5bab06
Merge branch 'main' into r/unit-tests-to-e2e
r100-stack Oct 2, 2024
557e096
Fix test
r100-stack Oct 2, 2024
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
25 changes: 25 additions & 0 deletions testing/e2e/app/routes/Breadcrumbs/route.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { Breadcrumbs, Button } from '@itwin/itwinui-react';

export default function BreadcrumbsTest() {
const items = Array(5)
.fill(null)
.map((_, index) => (
<Breadcrumbs.Item key={index} data-testid='item'>
Item {index}
</Breadcrumbs.Item>
));

return (
<>
<div data-testid='container'>
<Breadcrumbs
overflowButton={(visibleCount: number) => {
return <Button styleType='borderless'>{visibleCount}</Button>;
}}
>
{items}
</Breadcrumbs>
</div>
</>
);
}
91 changes: 91 additions & 0 deletions testing/e2e/app/routes/Breadcrumbs/spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import { test, expect, Page } from '@playwright/test';

test.describe('Breadcrumbs', () => {
test(`should overflow whenever there is not enough space`, async ({
page,
}) => {
await page.goto(`/Breadcrumbs`);

await expectOverflowState({
page,
expectedItemLength: 5,
expectedOverflowButtonVisibleCount: undefined,
});

await setContainerSize(page, '200px');

await expectOverflowState({
page,
expectedItemLength: 2,
expectedOverflowButtonVisibleCount: 2,
});

// should restore hidden items when space is available again
await setContainerSize(page, undefined);

await expectOverflowState({
page,
expectedItemLength: 5,
expectedOverflowButtonVisibleCount: undefined,
});
});

test(`should at minimum always show one overflow button and one item`, async ({
page,
}) => {
await page.goto(`/Breadcrumbs`);

await expectOverflowState({
page,
expectedItemLength: 5,
expectedOverflowButtonVisibleCount: undefined,
});

await setContainerSize(page, '10px');

await expectOverflowState({
page,
expectedItemLength: 1,
expectedOverflowButtonVisibleCount: 1,
});
});
});

// ----------------------------------------------------------------------------

const setContainerSize = async (page: Page, value: string | undefined) => {
await page.getByTestId('container').evaluate(
(element, args) => {
if (args.value != null) {
element.style.setProperty('width', args.value);
} else {
element.style.removeProperty('width');
}
},
{ value },
);
await page.waitForTimeout(200);
};

const expectOverflowState = async ({
page,
expectedItemLength,
expectedOverflowButtonVisibleCount,
}: {
page: Page;
expectedItemLength: number;
expectedOverflowButtonVisibleCount: number | undefined;
}) => {
const items = page.getByTestId('item');
expect(items).toHaveCount(expectedItemLength);

const overflowButton = page.locator('button');

if (expectedOverflowButtonVisibleCount != null) {
await expect(overflowButton).toHaveText(
`${expectedOverflowButtonVisibleCount}`,
);
} else {
await expect(overflowButton).not.toBeVisible();
}
};
122 changes: 108 additions & 14 deletions testing/e2e/app/routes/ButtonGroup/route.tsx
Original file line number Diff line number Diff line change
@@ -1,23 +1,117 @@
import { ButtonGroup, IconButton } from '@itwin/itwinui-react';
import { Button, ButtonGroup, Flex, IconButton } from '@itwin/itwinui-react';
import { SvgPlaceholder } from '@itwin/itwinui-icons-react';
import { useSearchParams } from '@remix-run/react';
import * as React from 'react';

export default function ButtonGroupTest() {
const [searchParams] = useSearchParams();
const config = getConfigFromSearchParams(searchParams);

const orientation = searchParams.get('orientation') || 'horizontal';
return config.exampleType === 'default' ? (
<Default config={config} />
) : (
<Overflow config={config} />
);
}

const getConfigFromSearchParams = (searchParams: URLSearchParams) => {
const exampleType = (searchParams.get('exampleType') ?? 'default') as
| 'default'
| 'overflow';
const initialProvideOverflowButton =
searchParams.get('provideOverflowButton') !== 'false';
const orientation =
(searchParams.get('orientation') as 'horizontal' | 'vertical') ||
'horizontal';
const overflowPlacement =
(searchParams.get('overflowPlacement') as 'start' | 'end') || undefined;
const showToggleProvideOverflowButton =
searchParams.get('showToggleProvideOverflowButton') === 'true';

return {
exampleType,
initialProvideOverflowButton,
orientation,
overflowPlacement,
showToggleProvideOverflowButton,
};
};

const Default = ({
config,
}: {
config: ReturnType<typeof getConfigFromSearchParams>;
}) => {
const [provideOverflowButton, setProvideOverflowButton] = React.useState(
config.initialProvideOverflowButton,
);

return (
<ButtonGroup role='toolbar' orientation={orientation as any}>
<IconButton label='Button 1'>
<SvgPlaceholder />
</IconButton>
<IconButton label='Button 2' isActive>
<SvgPlaceholder />
</IconButton>
<IconButton disabled label='Button 3'>
<SvgPlaceholder />
</IconButton>
</ButtonGroup>
<Flex flexDirection='column' alignItems='flex-start'>
{config.showToggleProvideOverflowButton && (
<Button
data-testid='toggle-provide-overflow-container'
onClick={() => setProvideOverflowButton((prev) => !prev)}
>
{`Toggle provide overflow container (current = ${provideOverflowButton})`}
</Button>
)}

<div id='container' style={{ background: 'hotpink' }}>
<ButtonGroup
role='toolbar'
orientation={config.orientation as any}
style={{
width: config.orientation === 'horizontal' ? '100%' : undefined,
height: config.orientation === 'vertical' ? '100%' : undefined,
}}
overflowPlacement={config.overflowPlacement}
overflowButton={
provideOverflowButton
? (firstOverflowingIndex) => {
return (
<IconButton data-testid='overflow-button'>
{firstOverflowingIndex}
</IconButton>
);
}
: undefined
}
>
<IconButton label='Button 1'>
<SvgPlaceholder />
</IconButton>
<IconButton label='Button 2' isActive>
<SvgPlaceholder />
</IconButton>
<IconButton disabled label='Button 3'>
<SvgPlaceholder />
</IconButton>
</ButtonGroup>
</div>
</Flex>
);
}
};

const Overflow = ({
config,
}: {
config: ReturnType<typeof getConfigFromSearchParams>;
}) => {
const buttons = [...Array(10)].map((_, index) => (
<IconButton key={index}>
<SvgPlaceholder />
</IconButton>
));

return (
<div id='container' style={{ background: 'hotpink' }}>
<ButtonGroup
overflowButton={(startIndex) => <IconButton>{startIndex}</IconButton>}
overflowPlacement={config.overflowPlacement}
>
{buttons}
</ButtonGroup>
</div>
);
};
Loading
Loading