From d9a9b4a42c71b303d4d3aaddfbb378202f4b9d1c Mon Sep 17 00:00:00 2001 From: Valeryia Zimnitskaya Date: Tue, 19 May 2026 18:44:05 +0200 Subject: [PATCH 1/7] [chore] unit tests --- .../base-components/__tests__/Grid.test.jsx | 21 ++-- .../__tests__/flex-box.test.jsx | 44 +++---- .../__tests__/scroll-area.test.tsx | 19 +-- semcore/base-trigger/__tests__/index.test.tsx | 34 ++++-- semcore/button/__tests__/index.test.tsx | 46 ++++++- semcore/card/__tests__/index.test.tsx | 28 +++-- semcore/carousel/__tests__/index.test.tsx | 52 +++++--- semcore/checkbox/__tests__/index.test.tsx | 30 +++-- semcore/counter/__tests__/index.test.tsx | 18 ++- semcore/d3-chart/__tests__/index.test.tsx | 29 +++-- semcore/divider/__tests__/index.test.tsx | 13 +- semcore/dot/__tests__/index.test.tsx | 13 +- .../feature-popover/__tests__/index.test.jsx | 115 ++++-------------- .../feedback-form/__tests__/index.test.jsx | 20 +-- .../fullscreen-modal/__tests__/index.test.tsx | 27 ++-- semcore/icon/__tests__/index.test.jsx | 21 +--- semcore/inline-input/__tests__/index.test.tsx | 19 ++- semcore/input-mask/__tests__/index.test.tsx | 25 ++-- semcore/input/__tests__/index.test.tsx | 20 +-- semcore/link/__tests__/index.test.tsx | 45 ++----- semcore/modal/__tests__/index.test.tsx | 33 ++--- .../notice-bubble/__tests__/index.test.tsx | 10 +- semcore/notice/__tests__/index.test.jsx | 32 ++--- semcore/progress-bar/__tests__/index.test.jsx | 27 ++-- semcore/radio/__tests__/index.test.jsx | 30 +++-- semcore/select/__tests__/index.test.tsx | 21 ++-- semcore/spin/__tests__/index.test.tsx | 18 ++- semcore/textarea/__tests__/index.test.tsx | 14 +-- semcore/tooltip/__tests__/index.test.jsx | 56 +++------ tools/testing-utils/setupTests.ts | 21 ++++ .../shared-tests/contractTestUtils.tsx | 34 ++++++ tools/testing-utils/shared-tests/index.ts | 13 ++ .../shared-tests/runComponentContractTests.ts | 80 ++++++++++++ .../shared-tests/shouldHaveDataUiName.tsx | 17 +++ .../shared-tests/shouldSupportChildren.tsx | 26 ++++ .../shared-tests/shouldSupportClassName.tsx | 13 +- .../shouldSupportClickHandler.tsx | 23 ++++ .../shouldSupportDataAttributes.tsx | 26 ++++ .../shared-tests/shouldSupportDisabled.tsx | 21 ++++ .../shared-tests/shouldSupportRef.tsx | 6 +- .../shared-tests/shouldSupportStyle.tsx | 19 +++ .../shared-tests/shouldSupportTag.tsx | 51 ++++++++ tools/testing-utils/vitest.ts | 21 ++-- vitest.config.mts | 6 +- 44 files changed, 806 insertions(+), 451 deletions(-) create mode 100644 tools/testing-utils/shared-tests/contractTestUtils.tsx create mode 100644 tools/testing-utils/shared-tests/runComponentContractTests.ts create mode 100644 tools/testing-utils/shared-tests/shouldHaveDataUiName.tsx create mode 100644 tools/testing-utils/shared-tests/shouldSupportChildren.tsx create mode 100644 tools/testing-utils/shared-tests/shouldSupportClickHandler.tsx create mode 100644 tools/testing-utils/shared-tests/shouldSupportDataAttributes.tsx create mode 100644 tools/testing-utils/shared-tests/shouldSupportDisabled.tsx create mode 100644 tools/testing-utils/shared-tests/shouldSupportStyle.tsx create mode 100644 tools/testing-utils/shared-tests/shouldSupportTag.tsx diff --git a/semcore/base-components/__tests__/Grid.test.jsx b/semcore/base-components/__tests__/Grid.test.jsx index 01e3771f6f..fafaca4ae1 100644 --- a/semcore/base-components/__tests__/Grid.test.jsx +++ b/semcore/base-components/__tests__/Grid.test.jsx @@ -1,17 +1,22 @@ -import * as sharedTests from '@semcore/testing-utils/shared-tests'; +import { runComponentContractTests } from '@semcore/testing-utils/shared-tests'; import { cleanup } from '@semcore/testing-utils/testing-library'; import { describe, beforeEach } from '@semcore/testing-utils/vitest'; -import React from 'react'; import { Col, Row } from '../src'; -const { shouldSupportClassName, shouldSupportRef } = sharedTests; - describe('Grid', () => { beforeEach(cleanup); - shouldSupportClassName(Row); - shouldSupportRef(Row); - shouldSupportClassName(Col, Row); - shouldSupportRef(Col, Row); + runComponentContractTests({ + Component: Row, + expectedDataUiName: 'Row', + preset: 'root', + }); + + runComponentContractTests({ + Component: Col, + Wrapper: Row, + expectedDataUiName: 'Row.Col', + preset: 'root', + }); }); diff --git a/semcore/base-components/__tests__/flex-box.test.jsx b/semcore/base-components/__tests__/flex-box.test.jsx index 30f9b76007..07ce544cfe 100644 --- a/semcore/base-components/__tests__/flex-box.test.jsx +++ b/semcore/base-components/__tests__/flex-box.test.jsx @@ -1,17 +1,22 @@ -import * as sharedTests from '@semcore/testing-utils/shared-tests'; +import { runComponentContractTests } from '@semcore/testing-utils/shared-tests'; import { cleanup, render } from '@semcore/testing-utils/testing-library'; import { expect, test, describe, beforeEach } from '@semcore/testing-utils/vitest'; import React from 'react'; import { Box, Flex } from '../src'; -const { shouldSupportClassName, shouldSupportRef } = sharedTests; +const SpanTag = function SpanTag(props) { + return ; +}; describe('Flex', () => { beforeEach(cleanup); - shouldSupportClassName(Flex); - shouldSupportRef(Flex); + runComponentContractTests({ + Component: Flex, + expectedDataUiName: 'Flex', + preset: 'root', + }); test.concurrent('Verify supports css property', async () => { const MAP_CSS = { @@ -80,28 +85,15 @@ describe('Flex', () => { describe('Box', () => { beforeEach(cleanup); - shouldSupportClassName(Box); - shouldSupportRef(Box); - - test('Verify \'tag\' prop', () => { - const { getByTestId } = render( - - tag - , - ); - expect(getByTestId('box').tagName).toBe('SPAN'); - }); - - test('Verify \'tag\' prop component', () => { - const Span = function (props) { - return ; - }; - const { getByTestId } = render( - - tag - , - ); - expect(getByTestId('box').tagName).toBe('SPAN'); + runComponentContractTests({ + Component: Box, + expectedDataUiName: 'Box', + preset: 'root', + include: ['tag'], + tagCases: [ + { tag: 'button', expectedTagName: 'BUTTON' }, + { tag: SpanTag, name: 'SpanTag', expectedTagName: 'SPAN' }, + ], }); test('Verify clear non html props', () => { diff --git a/semcore/base-components/__tests__/scroll-area.test.tsx b/semcore/base-components/__tests__/scroll-area.test.tsx index a828080131..43d0ede511 100644 --- a/semcore/base-components/__tests__/scroll-area.test.tsx +++ b/semcore/base-components/__tests__/scroll-area.test.tsx @@ -1,12 +1,10 @@ -import * as sharedTests from '@semcore/testing-utils/shared-tests'; +import { runComponentContractTests } from '@semcore/testing-utils/shared-tests'; import { cleanup, render, fireEvent, waitFor } from '@semcore/testing-utils/testing-library'; import { expect, test, describe, beforeEach, vi } from '@semcore/testing-utils/vitest'; import React from 'react'; import { ScrollArea, eventCalculate } from '../src'; -const { shouldSupportClassName, shouldSupportRef } = sharedTests; - describe('ScrollArea', () => { beforeEach(cleanup); @@ -25,8 +23,11 @@ describe('ScrollArea', () => { ).toBe(1); }); - shouldSupportClassName(ScrollArea); - shouldSupportRef(ScrollArea); + runComponentContractTests({ + Component: ScrollArea, + expectedDataUiName: 'ScrollArea', + preset: 'root', + }); test.concurrent('Verify trigger calculate event on container', () => { const { getByTestId } = render( @@ -84,6 +85,10 @@ describe('ScrollArea', () => { describe('ScrollArea.Container', () => { beforeEach(cleanup); - shouldSupportClassName(ScrollArea.Container, ScrollArea); - shouldSupportRef(ScrollArea.Container, ScrollArea); + runComponentContractTests({ + Component: ScrollArea.Container, + Wrapper: ScrollArea, + expectedDataUiName: 'ScrollArea.Container', + preset: 'root', + }); }); diff --git a/semcore/base-trigger/__tests__/index.test.tsx b/semcore/base-trigger/__tests__/index.test.tsx index a2dc1caa50..03b0283bf9 100644 --- a/semcore/base-trigger/__tests__/index.test.tsx +++ b/semcore/base-trigger/__tests__/index.test.tsx @@ -1,5 +1,4 @@ -import * as sharedTests from '@semcore/testing-utils/shared-tests'; -import { runDependencyCheckTests } from '@semcore/testing-utils/shared-tests'; +import { runComponentContractTests, runDependencyCheckTests } from '@semcore/testing-utils/shared-tests'; import { cleanup, render, userEvent } from '@semcore/testing-utils/testing-library'; import { expect, test, describe, beforeEach } from '@semcore/testing-utils/vitest'; import React from 'react'; @@ -10,20 +9,24 @@ describe('BaseTrigger Dependency imports', () => { runDependencyCheckTests('base-trigger'); }); -const { shouldSupportClassName, shouldSupportRef } = sharedTests; - describe('BaseTrigger', () => { beforeEach(cleanup); - shouldSupportClassName(BaseTrigger); - shouldSupportRef(BaseTrigger); + runComponentContractTests({ + Component: BaseTrigger, + expectedDataUiName: 'BaseTrigger', + preset: 'root', + }); }); describe('ButtonTrigger', () => { beforeEach(cleanup); - shouldSupportClassName(ButtonTrigger); - shouldSupportRef(ButtonTrigger); + runComponentContractTests({ + Component: ButtonTrigger, + expectedDataUiName: 'ButtonTrigger', + preset: 'root', + }); test.concurrent('Should work as button with labels', async () => { const component = ( @@ -46,13 +49,20 @@ describe('ButtonTrigger', () => { describe('FilterTrigger', () => { beforeEach(cleanup); - shouldSupportClassName(FilterTrigger); - shouldSupportRef(FilterTrigger); + runComponentContractTests({ + Component: FilterTrigger, + expectedDataUiName: 'FilterTrigger', + preset: 'root', + }); }); describe('LinkTrigger', () => { beforeEach(cleanup); - shouldSupportClassName(LinkTrigger); - shouldSupportRef(LinkTrigger); + runComponentContractTests({ + Component: LinkTrigger, + props: { children: 'Link trigger' }, + expectedDataUiName: 'LinkTrigger', + preset: 'root', + }); }); diff --git a/semcore/button/__tests__/index.test.tsx b/semcore/button/__tests__/index.test.tsx index 6df32c40f8..c18a9cdebd 100644 --- a/semcore/button/__tests__/index.test.tsx +++ b/semcore/button/__tests__/index.test.tsx @@ -1,15 +1,51 @@ -import { runDependencyCheckTests } from '@semcore/testing-utils/shared-tests'; -import { render } from '@semcore/testing-utils/testing-library'; -import { expect, test, describe } from '@semcore/testing-utils/vitest'; +import Link from '@semcore/link'; +import { runComponentContractTests, runDependencyCheckTests } from '@semcore/testing-utils/shared-tests'; +import { cleanup, render } from '@semcore/testing-utils/testing-library'; +import { beforeEach, expect, test, describe } from '@semcore/testing-utils/vitest'; import React from 'react'; -import Button from '../src'; +import Button, { ButtonLink } from '../src'; describe('Button Dependency imports', () => { runDependencyCheckTests('button'); }); describe('Button', () => { + beforeEach(cleanup); + + runComponentContractTests({ + Component: Button, + props: { children: 'Button' }, + expectedDataUiName: 'Button', + preset: ['root', 'interactive'], + include: ['tag'], + tagCases: [ + { tag: 'a', expectedTagName: 'A', props: { href: '#' } }, + { tag: Link, name: 'Link', expectedTagName: 'A', props: { href: '#' } }, + ], + }); + + runComponentContractTests({ + Component: Button.Text, + props: { children: 'Button text' }, + expectedDataUiName: 'Button.Text', + preset: 'root', + }); + + runComponentContractTests({ + Component: Button.Addon, + props: { children: Addon }, + expectedDataUiName: 'Button.Addon', + preset: 'root', + }); + + runComponentContractTests({ + Component: ButtonLink, + props: { children: 'ButtonLink' }, + expectedDataUiName: 'ButtonLink', + preset: 'root', + }); + test('Verify loading attributes', () => { const { queryByTestId } = render(