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
63 changes: 48 additions & 15 deletions packages/manager/src/features/Firewalls/shared.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -249,9 +249,9 @@
const { getByText } = renderWithTheme(<>{result}</>);

// Check PLs with proper suffixes
expect(getByText(/pl:system:test-1 \(IPv4, IPv6\)/)).toBeVisible();
expect(getByText(/pl::test-2 \(IPv4\)/)).toBeVisible();
expect(getByText(/pl::test-3 \(IPv6\)/)).toBeVisible();
expect(getByText('pl:system:test-1 (IPv4, IPv6)')).toBeVisible();

Check warning on line 252 in packages/manager/src/features/Firewalls/shared.test.tsx

View workflow job for this annotation

GitHub Actions / ESLint Review (manager)

[eslint] reported by reviewdog 🐢 Define a constant instead of duplicating this literal 4 times. Raw Output: {"ruleId":"sonarjs/no-duplicate-string","severity":1,"message":"Define a constant instead of duplicating this literal 4 times.","line":252,"column":22,"nodeType":"Literal","endLine":252,"endColumn":53}
expect(getByText('pl::test-2 (IPv4)')).toBeVisible();

Check warning on line 253 in packages/manager/src/features/Firewalls/shared.test.tsx

View workflow job for this annotation

GitHub Actions / ESLint Review (manager)

[eslint] reported by reviewdog 🐢 Define a constant instead of duplicating this literal 4 times. Raw Output: {"ruleId":"sonarjs/no-duplicate-string","severity":1,"message":"Define a constant instead of duplicating this literal 4 times.","line":253,"column":22,"nodeType":"Literal","endLine":253,"endColumn":41}
expect(getByText('pl::test-3 (IPv6)')).toBeVisible();

Check warning on line 254 in packages/manager/src/features/Firewalls/shared.test.tsx

View workflow job for this annotation

GitHub Actions / ESLint Review (manager)

[eslint] reported by reviewdog 🐢 Define a constant instead of duplicating this literal 5 times. Raw Output: {"ruleId":"sonarjs/no-duplicate-string","severity":1,"message":"Define a constant instead of duplicating this literal 5 times.","line":254,"column":22,"nodeType":"Literal","endLine":254,"endColumn":41}
});

it('renders individual IP addresses correctly', () => {
Expand Down Expand Up @@ -302,34 +302,30 @@
});

it('handles truncation and shows Chip for hidden items', () => {
const addressesMany = {
ipv4: ['1.1.1.1', '2.2.2.2', '3.3.3.3'],
ipv6: ['::1', '::2'],
};
const result = generateAddressesLabelV2({
addresses: addressesMany,
addresses,
showTruncateChip: true,
truncateAt: 2,
});
const { container } = renderWithTheme(<>{result}</>);
expect(container.textContent).toContain('+3'); // 5 total items (2 visible and 3 hidden)
});

it('renders only 1 visible item and shows Chip when showTruncateChip is true and truncateAt is 1', () => {
it('renders only 1 visible item and shows a Chip for the remaining when showTruncateChip is true and truncateAt is 1', () => {
const result = generateAddressesLabelV2({
addresses,
showTruncateChip: true,
truncateAt: 1,
});
const { getByText, queryByText } = renderWithTheme(<>{result}</>);

expect(getByText(/pl:system:test-1 \(IPv4, IPv6\)/)).toBeVisible();
expect(getByText('pl:system:test-1 (IPv4, IPv6)')).toBeVisible();

expect(getByText('+4')).toBeVisible(); // 5 total elements (1 shown + 4 hidden)

// Hidden items are not rendered outside tooltip
expect(queryByText(/pl::test-2 \(IPv4\)/)).toBeNull();
expect(queryByText(/pl::test-3 \(IPv6\)/)).toBeNull();
expect(queryByText('pl::test-2 (IPv4)')).toBeNull();
expect(queryByText('pl::test-3 (IPv6)')).toBeNull();
expect(queryByText('192.168.1.1')).toBeNull();
expect(queryByText('2001:db8:85a3::8a2e:370:7334/128')).toBeNull();
});
Expand All @@ -342,12 +338,49 @@
});
const { getByText } = renderWithTheme(<>{result}</>);

expect(getByText(/pl:system:test-1 \(IPv4, IPv6\)/)).toBeVisible();
expect(getByText(/pl::test-2 \(IPv4\)/)).toBeVisible();
expect(getByText(/pl::test-3 \(IPv6\)/)).toBeVisible();
expect(getByText('pl:system:test-1 (IPv4, IPv6)')).toBeVisible();
expect(getByText('pl::test-2 (IPv4)')).toBeVisible();
expect(getByText('pl::test-3 (IPv6)')).toBeVisible();
expect(getByText('192.168.1.1')).toBeVisible();
expect(getByText('2001:db8:85a3::8a2e:370:7334/128')).toBeVisible();
});

it('tooltip shows only hidden elements when showTruncateChip is true', async () => {
const result = generateAddressesLabelV2({
addresses,
showTruncateChip: true,
truncateAt: 2,
});

const { findAllByTestId, getByText, queryByText } = renderWithTheme(
<>{result}</> // 5 total elements (2 shown + 3 hidden)
);

// Only the first 2 elements are visible outside tooltip
expect(getByText('pl:system:test-1 (IPv4, IPv6)')).toBeVisible();
expect(getByText('pl::test-2 (IPv4)')).toBeVisible();
expect(queryByText('pl::test-3 (IPv6)')).toBeNull();
expect(queryByText('192.168.1.1')).toBeNull();
expect(queryByText('2001:db8:85a3::8a2e:370:7334/128')).toBeNull();

// Chip shows correct hidden count
const chip = getByText('+3');
expect(chip).toBeVisible();

// Hover on chip
await userEvent.hover(chip);

// Query all items in the tooltip
const tooltipItems = await findAllByTestId('tooltip-item');

// Check that only hidden items are present in tooltip
expect(tooltipItems).toHaveLength(3);
expect(tooltipItems.map((item) => item.textContent)).toEqual([
'pl::test-3 (IPv6)',
'192.168.1.1',
'2001:db8:85a3::8a2e:370:7334/128',
]);
});
});

describe('useIsFirewallRulesetsPrefixlistsEnabled', () => {
Expand Down
15 changes: 10 additions & 5 deletions packages/manager/src/features/Firewalls/shared.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -446,9 +446,10 @@ export const generateAddressesLabelV2 = (
if (elements.length === 0) return 'None';

// Truncation / Chip logic
const truncated = showTruncateChip ? elements.slice(0, truncateAt) : elements;
const hidden = elements.length - truncateAt;
const hasMore = showTruncateChip && elements.length > truncateAt;
const truncated = hasMore ? elements.slice(0, truncateAt) : elements;
const hiddenElements = hasMore ? elements.slice(truncateAt) : [];
const hiddenCount = hiddenElements.length;

const fullTooltip = (
<Box
Expand All @@ -468,8 +469,12 @@ export const generateAddressesLabelV2 = (
margin: 0,
}}
>
{elements.map((el, i) => (
<li key={i} style={{ listStyleType: 'disc' }}>
{hiddenElements.map((el, i) => (
<li
data-testid="tooltip-item"
key={i}
style={{ listStyleType: 'disc' }}
>
{el}
</li>
))}
Expand Down Expand Up @@ -508,7 +513,7 @@ export const generateAddressesLabelV2 = (
title={fullTooltip}
>
<Chip
label={`+${hidden}`}
label={`+${hiddenCount}`}
sx={(theme) => ({
cursor: 'pointer',
borderRadius: '12px',
Expand Down