@windstream/react-shared-components 0.2.46 → 0.2.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,204 +1,232 @@
1
+ /// <reference types="jest" />
2
+ /// <reference types="@testing-library/jest-dom" />
3
+
1
4
  import { EmailInputBlock } from "./index";
5
+ import { EmailInputBlockProps } from "./types";
2
6
 
3
7
  import { fireEvent, render, screen } from "@testing-library/react";
4
8
 
5
- describe("EmailInputBlock", () => {
6
- const defaultProps = {
7
- onSubmit: jest.fn(),
8
- };
9
+ const defaultProps: EmailInputBlockProps = {
10
+ onSubmit: jest.fn(),
11
+ };
9
12
 
13
+ describe("EmailInputBlock", () => {
10
14
  beforeEach(() => {
11
15
  jest.clearAllMocks();
12
16
  });
13
17
 
14
- it("renders with default props", () => {
15
- const { container } = render(<EmailInputBlock {...defaultProps} />);
16
- expect(container.querySelector("#email-input")).toBeInTheDocument();
17
- });
18
+ describe("Rendering", () => {
19
+ it("renders with default props", () => {
20
+ const { container } = render(<EmailInputBlock {...defaultProps} />);
21
+ expect(container.querySelector("#email-input")).toBeInTheDocument();
22
+ });
18
23
 
19
- it("renders custom anchorId", () => {
20
- const { container } = render(
21
- <EmailInputBlock {...defaultProps} anchorId="custom-anchor" />
22
- );
23
- expect(container.querySelector("#custom-anchor")).toBeInTheDocument();
24
- });
24
+ it("renders custom anchorId", () => {
25
+ const { container } = render(
26
+ <EmailInputBlock {...defaultProps} anchorId="custom-anchor" />
27
+ );
28
+ expect(container.querySelector("#custom-anchor")).toBeInTheDocument();
29
+ });
25
30
 
26
- it("renders title when provided", () => {
27
- render(<EmailInputBlock {...defaultProps} title="Join us" />);
28
- expect(screen.getByText("Join us")).toBeInTheDocument();
29
- expect(screen.getByText("Join us").tagName).toBe("H1");
30
- });
31
+ it("renders title when provided", () => {
32
+ render(<EmailInputBlock {...defaultProps} title="Join us" />);
33
+ const title = screen.getByText("Join us");
34
+ expect(title).toBeInTheDocument();
35
+ expect(title.tagName).toBe("H1");
36
+ });
31
37
 
32
- it("does not render title when not provided", () => {
33
- const { container } = render(<EmailInputBlock {...defaultProps} />);
34
- expect(container.querySelector("h1")).not.toBeInTheDocument();
35
- });
38
+ it("does not render title when not provided", () => {
39
+ const { container } = render(<EmailInputBlock {...defaultProps} />);
40
+ expect(container.querySelector("h1")).not.toBeInTheDocument();
41
+ });
36
42
 
37
- it("renders subTitle when provided", () => {
38
- render(<EmailInputBlock {...defaultProps} subTitle="Stay updated" />);
39
- expect(screen.getByText("Stay updated")).toBeInTheDocument();
40
- expect(screen.getByText("Stay updated").tagName).toBe("H2");
41
- });
43
+ it("renders subTitle when provided", () => {
44
+ render(<EmailInputBlock {...defaultProps} subTitle="Stay updated" />);
45
+ const subtitle = screen.getByText("Stay updated");
46
+ expect(subtitle).toBeInTheDocument();
47
+ expect(subtitle.tagName).toBe("H2");
48
+ });
42
49
 
43
- it("does not render subTitle when not provided", () => {
44
- const { container } = render(<EmailInputBlock {...defaultProps} />);
45
- expect(container.querySelector("h2")).not.toBeInTheDocument();
46
- });
50
+ it("does not render subTitle when not provided", () => {
51
+ const { container } = render(<EmailInputBlock {...defaultProps} />);
52
+ expect(container.querySelector("h2")).not.toBeInTheDocument();
53
+ });
47
54
 
48
- it("renders emailInputDescription when provided", () => {
49
- render(
50
- <EmailInputBlock {...defaultProps} emailInputDescription="Sign up now" />
51
- );
52
- expect(screen.getByText("Sign up now")).toBeInTheDocument();
53
- });
55
+ it("renders emailInputDescription when provided", () => {
56
+ render(
57
+ <EmailInputBlock
58
+ {...defaultProps}
59
+ emailInputDescription="Sign up now"
60
+ />
61
+ );
62
+ expect(screen.getByText("Sign up now")).toBeInTheDocument();
63
+ });
54
64
 
55
- it("renders caption when provided", () => {
56
- render(<EmailInputBlock {...defaultProps} caption="No spam" />);
57
- expect(screen.getByText("No spam")).toBeInTheDocument();
58
- });
65
+ it("renders caption when provided", () => {
66
+ render(<EmailInputBlock {...defaultProps} caption="No spam" />);
67
+ expect(screen.getByText("No spam")).toBeInTheDocument();
68
+ });
59
69
 
60
- it("does not render caption when not provided", () => {
61
- render(<EmailInputBlock {...defaultProps} />);
62
- expect(screen.queryByText("No spam")).not.toBeInTheDocument();
63
- });
70
+ it("does not render caption when not provided", () => {
71
+ render(<EmailInputBlock {...defaultProps} />);
72
+ expect(screen.queryByText("No spam")).not.toBeInTheDocument();
73
+ });
64
74
 
65
- it("uses default placeholder text", () => {
66
- render(<EmailInputBlock {...defaultProps} />);
67
- expect(
68
- screen.getByPlaceholderText("Enter your email here")
69
- ).toBeInTheDocument();
70
- });
75
+ it("uses default placeholder text", () => {
76
+ render(<EmailInputBlock {...defaultProps} />);
77
+ expect(
78
+ screen.getByPlaceholderText("Enter your email here")
79
+ ).toBeInTheDocument();
80
+ });
71
81
 
72
- it("uses custom placeholder text", () => {
73
- render(<EmailInputBlock {...defaultProps} inputPlaceholder="Your email" />);
74
- expect(screen.getByPlaceholderText("Your email")).toBeInTheDocument();
82
+ it("uses custom placeholder text", () => {
83
+ render(
84
+ <EmailInputBlock {...defaultProps} inputPlaceholder="Your email" />
85
+ );
86
+ expect(screen.getByPlaceholderText("Your email")).toBeInTheDocument();
87
+ });
75
88
  });
76
89
 
77
- it("calls onSubmit with email on valid submission", () => {
78
- render(<EmailInputBlock {...defaultProps} />);
79
- const input = screen.getByPlaceholderText("Enter your email here");
80
- fireEvent.change(input, { target: { value: "test@example.com" } });
81
- fireEvent.click(screen.getByText("Sign me up"));
82
- expect(defaultProps.onSubmit).toHaveBeenCalledWith({
83
- email: "test@example.com",
90
+ describe("Form submission", () => {
91
+ it("calls onSubmit with email on valid submission", () => {
92
+ render(<EmailInputBlock {...defaultProps} />);
93
+ const input = screen.getByPlaceholderText("Enter your email here");
94
+ fireEvent.change(input, { target: { value: "test@example.com" } });
95
+ fireEvent.click(screen.getByText("Sign me up"));
96
+ expect(defaultProps.onSubmit).toHaveBeenCalledWith({
97
+ email: "test@example.com",
98
+ });
84
99
  });
85
- });
86
100
 
87
- it("clears email after successful submission", () => {
88
- render(<EmailInputBlock {...defaultProps} />);
89
- const input = screen.getByPlaceholderText(
90
- "Enter your email here"
91
- ) as HTMLInputElement;
92
- fireEvent.change(input, { target: { value: "test@example.com" } });
93
- fireEvent.click(screen.getByText("Sign me up"));
94
- expect(input.value).toBe("");
101
+ it("clears email after successful submission", () => {
102
+ render(<EmailInputBlock {...defaultProps} />);
103
+ const input = screen.getByPlaceholderText(
104
+ "Enter your email here"
105
+ ) as HTMLInputElement;
106
+ fireEvent.change(input, { target: { value: "test@example.com" } });
107
+ fireEvent.click(screen.getByText("Sign me up"));
108
+ expect(input.value).toBe("");
109
+ });
95
110
  });
96
111
 
97
- it("shows error for invalid email", () => {
98
- render(<EmailInputBlock {...defaultProps} />);
99
- const input = screen.getByPlaceholderText("Enter your email here");
100
- fireEvent.change(input, { target: { value: "invalid" } });
101
- fireEvent.click(screen.getByText("Sign me up"));
102
- expect(screen.getByText("Invalid email address")).toBeInTheDocument();
103
- expect(defaultProps.onSubmit).not.toHaveBeenCalled();
104
- });
112
+ describe("Validation", () => {
113
+ it("shows error for invalid email", () => {
114
+ render(<EmailInputBlock {...defaultProps} />);
115
+ const input = screen.getByPlaceholderText("Enter your email here");
116
+ fireEvent.change(input, { target: { value: "invalid" } });
117
+ fireEvent.click(screen.getByText("Sign me up"));
118
+ expect(screen.getByText("Invalid email address")).toBeInTheDocument();
119
+ expect(defaultProps.onSubmit).not.toHaveBeenCalled();
120
+ });
105
121
 
106
- it("shows required error for empty email", () => {
107
- render(<EmailInputBlock {...defaultProps} />);
108
- fireEvent.click(screen.getByText("Sign me up"));
109
- expect(screen.getByText("Email is required")).toBeInTheDocument();
110
- expect(defaultProps.onSubmit).not.toHaveBeenCalled();
111
- });
122
+ it("shows required error for empty email", () => {
123
+ render(<EmailInputBlock {...defaultProps} />);
124
+ fireEvent.click(screen.getByText("Sign me up"));
125
+ expect(screen.getByText("Email is required")).toBeInTheDocument();
126
+ expect(defaultProps.onSubmit).not.toHaveBeenCalled();
127
+ });
112
128
 
113
- it("clears error when user types a valid email after error", () => {
114
- render(<EmailInputBlock {...defaultProps} />);
115
- const input = screen.getByPlaceholderText("Enter your email here");
116
- fireEvent.change(input, { target: { value: "invalid" } });
117
- fireEvent.click(screen.getByText("Sign me up"));
118
- expect(screen.getByText("Invalid email address")).toBeInTheDocument();
119
-
120
- fireEvent.change(input, { target: { value: "user@test.com" } });
121
- expect(
122
- screen.queryByText("Invalid email address")
123
- ).not.toBeInTheDocument();
129
+ it("clears error when user types a valid email after error", () => {
130
+ render(<EmailInputBlock {...defaultProps} />);
131
+ const input = screen.getByPlaceholderText("Enter your email here");
132
+ fireEvent.change(input, { target: { value: "invalid" } });
133
+ fireEvent.click(screen.getByText("Sign me up"));
134
+ expect(screen.getByText("Invalid email address")).toBeInTheDocument();
135
+
136
+ fireEvent.change(input, { target: { value: "user@test.com" } });
137
+ expect(
138
+ screen.queryByText("Invalid email address")
139
+ ).not.toBeInTheDocument();
140
+ });
124
141
  });
125
142
 
126
- it("shows success feedback after valid submission", () => {
127
- render(<EmailInputBlock {...defaultProps} successFeedback="Thanks!" />);
128
- const input = screen.getByPlaceholderText("Enter your email here");
129
- fireEvent.change(input, { target: { value: "user@test.com" } });
130
- fireEvent.click(screen.getByText("Sign me up"));
131
- expect(screen.getByText("Thanks!")).toBeInTheDocument();
132
- });
143
+ describe("Success feedback", () => {
144
+ it("shows success feedback after valid submission", () => {
145
+ render(<EmailInputBlock {...defaultProps} successFeedback="Thanks!" />);
146
+ const input = screen.getByPlaceholderText("Enter your email here");
147
+ fireEvent.change(input, { target: { value: "user@test.com" } });
148
+ fireEvent.click(screen.getByText("Sign me up"));
149
+ expect(screen.getByText("Thanks!")).toBeInTheDocument();
150
+ });
133
151
 
134
- it("hides success feedback when user types again", () => {
135
- render(<EmailInputBlock {...defaultProps} successFeedback="Thanks!" />);
136
- const input = screen.getByPlaceholderText("Enter your email here");
137
- fireEvent.change(input, { target: { value: "user@test.com" } });
138
- fireEvent.click(screen.getByText("Sign me up"));
139
- expect(screen.getByText("Thanks!")).toBeInTheDocument();
152
+ it("hides success feedback when user types again", () => {
153
+ render(<EmailInputBlock {...defaultProps} successFeedback="Thanks!" />);
154
+ const input = screen.getByPlaceholderText("Enter your email here");
155
+ fireEvent.change(input, { target: { value: "user@test.com" } });
156
+ fireEvent.click(screen.getByText("Sign me up"));
157
+ expect(screen.getByText("Thanks!")).toBeInTheDocument();
140
158
 
141
- fireEvent.change(input, { target: { value: "x" } });
142
- expect(screen.queryByText("Thanks!")).not.toBeInTheDocument();
143
- });
159
+ fireEvent.change(input, { target: { value: "x" } });
160
+ expect(screen.queryByText("Thanks!")).not.toBeInTheDocument();
161
+ });
144
162
 
145
- it("does not show success feedback without successFeedback prop", () => {
146
- render(<EmailInputBlock {...defaultProps} />);
147
- const input = screen.getByPlaceholderText("Enter your email here");
148
- fireEvent.change(input, { target: { value: "user@test.com" } });
149
- fireEvent.click(screen.getByText("Sign me up"));
150
- // No success text rendered
151
- expect(screen.queryByText("Thanks!")).not.toBeInTheDocument();
163
+ it("does not show success feedback without successFeedback prop", () => {
164
+ render(<EmailInputBlock {...defaultProps} />);
165
+ const input = screen.getByPlaceholderText("Enter your email here");
166
+ fireEvent.change(input, { target: { value: "user@test.com" } });
167
+ fireEvent.click(screen.getByText("Sign me up"));
168
+ expect(screen.queryByText("Thanks!")).not.toBeInTheDocument();
169
+ });
152
170
  });
153
171
 
154
- it("applies green theme background by default", () => {
155
- const { container } = render(<EmailInputBlock {...defaultProps} />);
156
- expect(container.querySelector(".bg-bg-fill-brand")).toBeInTheDocument();
157
- });
172
+ describe("Themes", () => {
173
+ it("applies green theme background by default", () => {
174
+ const { container } = render(<EmailInputBlock {...defaultProps} />);
175
+ expect(
176
+ container.querySelector(".bg-bg-fill-brand")
177
+ ).toBeInTheDocument();
178
+ });
158
179
 
159
- it("applies blue theme background class", () => {
160
- const { container } = render(
161
- <EmailInputBlock {...defaultProps} themeColor="blue" />
162
- );
163
- expect(
164
- container.querySelector(".bg-bg-fill-brand-supporting")
165
- ).toBeInTheDocument();
166
- });
180
+ it("applies blue theme background class", () => {
181
+ const { container } = render(
182
+ <EmailInputBlock {...defaultProps} themeColor="blue" />
183
+ );
184
+ expect(
185
+ container.querySelector(".bg-bg-fill-brand-supporting")
186
+ ).toBeInTheDocument();
187
+ });
167
188
 
168
- it("applies purple theme background class", () => {
169
- const { container } = render(
170
- <EmailInputBlock {...defaultProps} themeColor="purple" />
171
- );
172
- expect(
173
- container.querySelector(".bg-bg-fill-brand-tertiary")
174
- ).toBeInTheDocument();
175
- });
189
+ it("applies purple theme background class", () => {
190
+ const { container } = render(
191
+ <EmailInputBlock {...defaultProps} themeColor="purple" />
192
+ );
193
+ expect(
194
+ container.querySelector(".bg-bg-fill-brand-tertiary")
195
+ ).toBeInTheDocument();
196
+ });
176
197
 
177
- it("applies white outer background class by default", () => {
178
- const { container } = render(<EmailInputBlock {...defaultProps} />);
179
- expect(container.querySelector("section")).toHaveClass("bg-bg");
180
- });
198
+ it("applies white outer background class by default", () => {
199
+ const { container } = render(<EmailInputBlock {...defaultProps} />);
200
+ expect(container.querySelector("section")).toHaveClass("bg-bg");
201
+ });
181
202
 
182
- it("uses white text for dark themes", () => {
183
- render(
184
- <EmailInputBlock {...defaultProps} themeColor="blue" title="Blue title" />
185
- );
186
- expect(screen.getByText("Blue title").className).toContain("text-white");
187
- });
203
+ it("uses white text for dark themes", () => {
204
+ render(
205
+ <EmailInputBlock
206
+ {...defaultProps}
207
+ themeColor="blue"
208
+ title="Blue title"
209
+ />
210
+ );
211
+ expect(screen.getByText("Blue title")).toHaveClass("text-white");
212
+ });
188
213
 
189
- it("uses dark text for the white theme", () => {
190
- render(
191
- <EmailInputBlock
192
- {...defaultProps}
193
- themeColor="white"
194
- title="White title"
195
- />
196
- );
197
- expect(screen.getByText("White title").className).toContain("text-text");
214
+ it("uses dark text for the white theme", () => {
215
+ render(
216
+ <EmailInputBlock
217
+ {...defaultProps}
218
+ themeColor="white"
219
+ title="White title"
220
+ />
221
+ );
222
+ expect(screen.getByText("White title")).toHaveClass("text-text");
223
+ });
198
224
  });
199
225
 
200
- it("uses custom ctaText", () => {
201
- render(<EmailInputBlock {...defaultProps} ctaText="Subscribe" />);
202
- expect(screen.getByText("Subscribe")).toBeInTheDocument();
226
+ describe("Call to action", () => {
227
+ it("uses custom ctaText", () => {
228
+ render(<EmailInputBlock {...defaultProps} ctaText="Subscribe" />);
229
+ expect(screen.getByText("Subscribe")).toBeInTheDocument();
230
+ });
203
231
  });
204
232
  });