forked from linode/manager
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMaskableText.test.tsx
More file actions
105 lines (83 loc) · 3.66 KB
/
MaskableText.test.tsx
File metadata and controls
105 lines (83 loc) · 3.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import { screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import React from 'react';
import { renderWithTheme } from 'src/utilities/testHelpers';
import { MaskableText } from './MaskableText';
const SECRET_TEXT = 'text-to-be-masked';
const TOGGLE_TEST_ID = 'maskable-text-toggle';
const queryMocks = vi.hoisted(() => ({
usePreferences: vi.fn(),
}));
vi.mock('@linode/queries', async () => {
const actual = await vi.importActual('@linode/queries');
return { ...actual, usePreferences: queryMocks.usePreferences };
});
describe('MaskableText', () => {
describe('when masking is disabled', () => {
beforeEach(() => {
queryMocks.usePreferences.mockReturnValue({ data: false });
});
it('renders the plain text unmasked', () => {
renderWithTheme(<MaskableText text={SECRET_TEXT} />);
expect(screen.getByText(SECRET_TEXT)).toBeVisible();
});
it('renders children instead of text when provided', () => {
renderWithTheme(
<MaskableText text={SECRET_TEXT}>
<span>custom child</span>
</MaskableText>
);
expect(screen.getByText('custom child')).toBeVisible();
expect(screen.queryByText(SECRET_TEXT)).not.toBeInTheDocument();
});
it('renders nothing when text is empty', () => {
const { container } = renderWithTheme(<MaskableText text="" />);
expect(container).toBeEmptyDOMElement();
});
it('does not render the toggle button', () => {
renderWithTheme(<MaskableText isToggleable text={SECRET_TEXT} />);
expect(screen.queryByTestId(TOGGLE_TEST_ID)).not.toBeInTheDocument();
});
});
describe('when masking is enabled', () => {
beforeEach(() => {
queryMocks.usePreferences.mockReturnValue({ data: true });
});
it('renders masked dots instead of plain text by default', () => {
renderWithTheme(<MaskableText text="secret-value" />);
expect(screen.queryByText('secret-value')).not.toBeInTheDocument();
expect(screen.getByText('•'.repeat(12))).toBeVisible();
});
it('renders masked dots with custom length', () => {
renderWithTheme(<MaskableText length={6} text="secret-value" />);
expect(screen.getByText('•'.repeat(6))).toBeVisible();
});
it('renders nothing when text is empty', () => {
const { container } = renderWithTheme(<MaskableText text="" />);
expect(container).toBeEmptyDOMElement();
});
describe('toggle behavior', () => {
it('does not render toggle button when isToggleable is false', () => {
renderWithTheme(<MaskableText text={SECRET_TEXT} />);
expect(screen.queryByTestId(TOGGLE_TEST_ID)).not.toBeInTheDocument();
});
it('renders toggle button when isToggleable is true', () => {
renderWithTheme(<MaskableText isToggleable text={SECRET_TEXT} />);
screen.getByTestId(TOGGLE_TEST_ID);
});
it('reveals text when toggle button is clicked', async () => {
renderWithTheme(<MaskableText isToggleable text={SECRET_TEXT} />);
expect(screen.queryByText(SECRET_TEXT)).not.toBeInTheDocument();
await userEvent.click(screen.getByTestId(TOGGLE_TEST_ID));
expect(screen.getByText(SECRET_TEXT)).toBeVisible();
});
it('masks text again when toggle button is clicked twice', async () => {
renderWithTheme(<MaskableText isToggleable text={SECRET_TEXT} />);
await userEvent.click(screen.getByTestId(TOGGLE_TEST_ID));
await userEvent.click(screen.getByTestId(TOGGLE_TEST_ID));
expect(screen.queryByText(SECRET_TEXT)).not.toBeInTheDocument();
expect(screen.getByText('•'.repeat(12))).toBeVisible();
});
});
});
});