diff --git a/__tests__/Callout.test.tsx b/__tests__/Callout.test.tsx index c395eebc..ed34d085 100644 --- a/__tests__/Callout.test.tsx +++ b/__tests__/Callout.test.tsx @@ -68,3 +68,246 @@ test('Renders with container effect', () => { expect(document.querySelectorAll('.reqore-callout').length).toBe(1); expect(document.querySelector('.reqore-callout')!.textContent).toBe('Gradient surface'); }); + +test('Renders with label and description', () => { + render( + + + + + + + + ); + + expect(document.querySelector('.reqore-callout-label')!.textContent).toBe('Heads up'); + expect(document.querySelector('.reqore-callout-description')!.textContent).toBe( + 'Something to look at' + ); +}); + +test('Falls back to children when label/description are not provided', () => { + render( + + + + Plain children content + + + + ); + + expect(document.querySelectorAll('.reqore-callout-content').length).toBe(1); + expect(document.querySelectorAll('.reqore-callout-label').length).toBe(0); +}); + +test('Renders with icon', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-callout-icon').length).toBe(1); +}); + +test('Renders with badge (string)', () => { + render( + + + + + + + + ); + + expect(document.querySelector('.reqore-button-badge')!.textContent).toContain('New'); +}); + +test('Renders with badge array', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-button-badge').length).toBe(2); +}); + +test('Renders with onClose and fires it', () => { + const handleClose = jest.fn(); + + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-callout-close').length).toBe(1); + + fireEvent.click(document.querySelector('.reqore-callout-close')!); + expect(handleClose).toHaveBeenCalledTimes(1); +}); + +test('Close button click does not bubble to onClick', () => { + const handleClick = jest.fn(); + const handleClose = jest.fn(); + + render( + + + + + + + + ); + + fireEvent.click(document.querySelector('.reqore-callout-close')!); + expect(handleClose).toHaveBeenCalledTimes(1); + expect(handleClick).toHaveBeenCalledTimes(0); +}); + +test('Renders with intents', () => { + render( + + + + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-callout').length).toBe(4); +}); + +test('Renders with different sizes', () => { + render( + + + + Tiny + Small + Normal + Big + + + + ); + + expect(document.querySelectorAll('.reqore-callout').length).toBe(4); +}); + +test('Renders bordered with flat={false}', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-callout').length).toBe(1); +}); + +test('Renders with rounded={false}', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-callout').length).toBe(1); +}); + +test('Renders with transparent background', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-callout').length).toBe(1); +}); + +test('Renders with labelEffect / descriptionEffect', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-callout-label').length).toBe(1); + expect(document.querySelectorAll('.reqore-callout-description').length).toBe(1); +}); + +test('Renders disabled', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-callout').length).toBe(1); +}); + +test('Renders with raised effect', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-callout').length).toBe(1); +}); diff --git a/__tests__/EmptyState.test.tsx b/__tests__/EmptyState.test.tsx index b4aa77b6..2c89f21f 100644 --- a/__tests__/EmptyState.test.tsx +++ b/__tests__/EmptyState.test.tsx @@ -279,3 +279,17 @@ test('Renders with all features', () => { ); expect(document.querySelectorAll('.reqore-empty-state-actions').length).toBe(1); }); + +test('Renders with raised effect', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-empty-state').length).toBe(1); +}); diff --git a/__tests__/EntityRow.test.tsx b/__tests__/EntityRow.test.tsx new file mode 100644 index 00000000..ec92a1e0 --- /dev/null +++ b/__tests__/EntityRow.test.tsx @@ -0,0 +1,324 @@ +import { fireEvent, render } from '@testing-library/react'; +import { + ReqoreContent, + ReqoreEntityRow, + ReqoreLayoutContent, + ReqoreUIProvider, +} from '../src'; + +test('Renders with label', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-entity-row').length).toBe(1); + expect(document.querySelector('.reqore-entity-row-label')!.textContent).toContain( + 'Process Incoming Order' + ); +}); + +test('Renders with description and metadata', () => { + render( + + + + + + + + ); + + expect(document.querySelector('.reqore-entity-row-description')!.textContent).toBe( + 'Routes Shopify orders' + ); + expect(document.querySelector('.reqore-entity-row-metadata')!.textContent).toBe( + 'Last run: success · just now' + ); +}); + +test('Renders with icon tile', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-entity-row-icon-tile').length).toBe(1); +}); + +test('Does not render icon tile without icon or image', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-entity-row-icon-tile').length).toBe(0); +}); + +test('Renders with badge (object)', () => { + render( + + + + + + + + ); + + expect(document.querySelector('.reqore-entity-row-label')!.textContent).toContain('Failed'); +}); + +test('Renders with badge array', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-button-badge').length).toBe(2); +}); + +test('Renders with actions', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-entity-row-actions').length).toBe(1); + expect(document.querySelector('.reqore-entity-row-actions')!.textContent).toContain('Run'); +}); + +test('Calls onClick when row is clicked', () => { + const handleClick = jest.fn(); + + render( + + + + + + + + ); + + fireEvent.click(document.querySelector('.reqore-entity-row')!); + expect(handleClick).toHaveBeenCalledTimes(1); +}); + +test('Renders with intents', () => { + render( + + + + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-entity-row').length).toBe(4); +}); + +test('Renders with different sizes', () => { + render( + + + + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-entity-row').length).toBe(4); +}); + +test('Renders bordered with flat={false}', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-entity-row').length).toBe(1); +}); + +test('Renders with rounded={false}', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-entity-row').length).toBe(1); +}); + +test('Renders with transparent background', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-entity-row').length).toBe(1); +}); + +test('Renders with effect / labelEffect / descriptionEffect / metadataEffect', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-entity-row').length).toBe(1); + expect(document.querySelectorAll('.reqore-entity-row-description').length).toBe(1); + expect(document.querySelectorAll('.reqore-entity-row-metadata').length).toBe(1); +}); + +test('Renders with iconImage', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-entity-row-icon-tile').length).toBe(1); +}); + +test('Does not render description/metadata when not provided', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-entity-row-description').length).toBe(0); + expect(document.querySelectorAll('.reqore-entity-row-metadata').length).toBe(0); +}); + +test('Renders with wrap=false (single-line ellipsis)', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-entity-row-description').length).toBe(1); + expect(document.querySelectorAll('.reqore-entity-row-metadata').length).toBe(1); +}); + +test('Renders with wrap=true by default', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-entity-row-description').length).toBe(1); +}); + +test('Renders with raised effect', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-entity-row').length).toBe(1); +}); diff --git a/__tests__/FeatureCard.test.tsx b/__tests__/FeatureCard.test.tsx index d5ded4fd..803adde2 100644 --- a/__tests__/FeatureCard.test.tsx +++ b/__tests__/FeatureCard.test.tsx @@ -68,3 +68,194 @@ test('Calls onClick handler', () => { fireEvent.click(document.querySelector('.reqore-feature-card')!); expect(handleClick).toHaveBeenCalledTimes(1); }); + +test('Renders with badge (string)', () => { + render( + + + + + + + + ); + + expect(document.querySelector('.reqore-button-badge')!.textContent).toContain('New'); +}); + +test('Renders with badge array', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-button-badge').length).toBe(2); +}); + +test('Renders with intents', () => { + render( + + + + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-feature-card').length).toBe(4); +}); + +test('Renders with different sizes', () => { + render( + + + + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-feature-card').length).toBe(4); +}); + +test('Renders bordered with flat={false}', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-feature-card').length).toBe(1); +}); + +test('Renders with rounded={false}', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-feature-card').length).toBe(1); +}); + +test('Renders with transparent background', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-feature-card').length).toBe(1); +}); + +test('Renders disabled', () => { + render( + + + + {}} /> + + + + ); + + expect(document.querySelectorAll('.reqore-feature-card').length).toBe(1); +}); + +test('Renders with effect / labelEffect / descriptionEffect', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-feature-card').length).toBe(1); + expect(document.querySelectorAll('.reqore-feature-card-description').length).toBe(1); +}); + +test('Renders with wrap=false (single-line ellipsis)', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-feature-card-label').length).toBe(1); + expect(document.querySelectorAll('.reqore-feature-card-description').length).toBe(1); +}); + +test('Auto-detects interactive when onClick is provided', () => { + const handleClick = jest.fn(); + + render( + + + + + + + + ); + + fireEvent.click(document.querySelector('.reqore-feature-card')!); + expect(handleClick).toHaveBeenCalledTimes(1); +}); + +test('Renders with raised effect', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-feature-card').length).toBe(1); +}); diff --git a/__tests__/Message.test.tsx b/__tests__/Message.test.tsx new file mode 100644 index 00000000..ca66c512 --- /dev/null +++ b/__tests__/Message.test.tsx @@ -0,0 +1,37 @@ +import { render } from '@testing-library/react'; +import { + ReqoreContent, + ReqoreLayoutContent, + ReqoreMessage, + ReqoreUIProvider, +} from '../src'; + +test('Renders properly', () => { + render( + + + + Heads up + + + + ); + + expect(document.body.textContent).toContain('Heads up'); +}); + +test('Renders with raised effect', () => { + render( + + + + + Raised + + + + + ); + + expect(document.body.textContent).toContain('Raised'); +}); diff --git a/__tests__/SeverityRow.test.tsx b/__tests__/SeverityRow.test.tsx new file mode 100644 index 00000000..6a3a8748 --- /dev/null +++ b/__tests__/SeverityRow.test.tsx @@ -0,0 +1,346 @@ +import { fireEvent, render } from '@testing-library/react'; +import { + ReqoreContent, + ReqoreLayoutContent, + ReqoreSeverityRow, + ReqoreTag, + ReqoreUIProvider, +} from '../src'; + +test('Renders with label', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-severity-row').length).toBe(1); + expect(document.querySelector('.reqore-severity-row-label')!.textContent).toContain( + 'Critical issue' + ); +}); + +test('Renders with description', () => { + render( + + + + + + + + ); + + expect(document.querySelector('.reqore-severity-row-description')!.textContent).toBe( + 'Threshold exceeded' + ); +}); + +test('Renders with strip by default', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-severity-row-strip').length).toBe(1); +}); + +test('Hides strip when showStrip is false', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-severity-row-strip').length).toBe(0); +}); + +test('Renders with leading content', () => { + render( + + + + } + /> + + + + ); + + expect(document.querySelector('.reqore-severity-row-label')!.textContent).toContain('Critical'); +}); + +test('Renders with badge (string)', () => { + render( + + + + + + + + ); + + expect(document.querySelector('.reqore-button-badge')!.textContent).toContain('3 open'); +}); + +test('Renders with badge array', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-button-badge').length).toBe(2); +}); + +test('Renders with actions', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-severity-row-actions').length).toBe(1); + expect(document.querySelector('.reqore-severity-row-actions')!.textContent).toContain( + 'Investigate' + ); +}); + +test('Calls onClick when row is clicked', () => { + const handleClick = jest.fn(); + + render( + + + + + + + + ); + + fireEvent.click(document.querySelector('.reqore-severity-row')!); + expect(handleClick).toHaveBeenCalledTimes(1); +}); + +test('Renders with intents', () => { + render( + + + + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-severity-row').length).toBe(4); +}); + +test('Renders with different sizes', () => { + render( + + + + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-severity-row').length).toBe(4); +}); + +test('Renders bordered with flat={false}', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-severity-row').length).toBe(1); +}); + +test('Renders with rounded={false}', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-severity-row').length).toBe(1); +}); + +test('Renders with transparent background', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-severity-row').length).toBe(1); +}); + +test('Renders with effect/labelEffect/descriptionEffect', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-severity-row').length).toBe(1); + expect(document.querySelectorAll('.reqore-severity-row-description').length).toBe(1); +}); + +test('Renders disabled', () => { + const handleClick = jest.fn(); + + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-severity-row').length).toBe(1); +}); + +test('Does not render description when not provided', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-severity-row-description').length).toBe(0); +}); + +test('Does not render actions when not provided', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-severity-row-actions').length).toBe(0); +}); + +test('Renders with wrap=false (single-line ellipsis)', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-severity-row-description').length).toBe(1); +}); + +test('Renders with wrap=true by default', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-severity-row-description').length).toBe(1); +}); + +test('Renders with raised effect', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-severity-row').length).toBe(1); +}); diff --git a/__tests__/Statistic.test.tsx b/__tests__/Statistic.test.tsx index 9ae9ef61..6e038d2b 100644 --- a/__tests__/Statistic.test.tsx +++ b/__tests__/Statistic.test.tsx @@ -316,3 +316,17 @@ test('Renders as interactive when onClick is provided', () => { expect(handleClick).toHaveBeenCalledTimes(1); }); + +test('Renders with raised effect', () => { + render( + + + + + + + + ); + + expect(document.querySelectorAll('.reqore-statistic').length).toBe(1); +}); diff --git a/__tests__/button.test.tsx b/__tests__/button.test.tsx index 1e114776..e79166ad 100644 --- a/__tests__/button.test.tsx +++ b/__tests__/button.test.tsx @@ -215,3 +215,17 @@ test('Tooltip on