Skip to content
This repository was archived by the owner on Sep 20, 2021. It is now read-only.

Commit 00880f2

Browse files
committed
Added some test generation to get the full matrix of popover scenarios
1 parent d1ac553 commit 00880f2

File tree

1 file changed

+163
-207
lines changed

1 file changed

+163
-207
lines changed

src/popover.test.tsx

Lines changed: 163 additions & 207 deletions
Original file line numberDiff line numberDiff line change
@@ -54,220 +54,176 @@ describe("Popover", () => {
5454
expect(popperHover).toEqual(wrapperElement.childAt(1));
5555
});
5656

57-
describe("Popper hover type", () => {
58-
beforeEach(() => {
59-
defaultProps = {
60-
...defaultProps,
61-
popperType: "hover"
62-
};
63-
});
64-
65-
it("Renders closed by default", () => {
66-
let wrapper = shallow(<Popover {...defaultProps} />);
67-
68-
let popperHover = wrapper.find(PopperHover);
69-
expect(popperHover).toHaveLength(1);
70-
expect(popperHover.hasClass("visible")).toBe(false);
71-
});
72-
73-
it("Renders open when being hovered", () => {
74-
let wrapper = shallow(<Popover {...defaultProps} />);
75-
76-
let popperHover = wrapper.find(PopperHover);
77-
popperHover.props().onHoverChange(true);
78-
79-
popperHover = wrapper.find(PopperHover);
80-
expect(popperHover).toHaveLength(1);
81-
expect(popperHover.hasClass("visible")).toBe(true);
82-
});
83-
});
84-
85-
describe("Popper none type", () => {
86-
beforeEach(() => {
87-
defaultProps = {
88-
...defaultProps,
89-
popperType: "none"
90-
};
91-
});
92-
93-
it("Renders closed by default", () => {
94-
let wrapper = shallow(<Popover {...defaultProps} />);
95-
96-
let popperHover = wrapper.find(PopperHover);
97-
expect(popperHover).toHaveLength(1);
98-
expect(popperHover.hasClass("visible")).toBe(false);
99-
});
100-
101-
it("Renders closed even if hovered on", () => {
102-
let wrapper = shallow(<Popover {...defaultProps} />);
103-
104-
let popperHover = wrapper.find(PopperHover);
105-
popperHover.props().onHoverChange(true);
106-
107-
popperHover = wrapper.find(PopperHover);
108-
expect(popperHover).toHaveLength(1);
109-
expect(popperHover.hasClass("visible")).toBe(false);
110-
});
111-
});
112-
113-
describe("Popper click type", () => {
114-
beforeEach(() => {
115-
defaultProps = {
116-
...defaultProps,
117-
popperType: "click"
118-
};
119-
});
120-
121-
it("Renders closed by default", () => {
122-
let wrapper = shallow(<Popover {...defaultProps} />);
123-
124-
let popperClick = wrapper.find(PopperClick);
125-
expect(popperClick).toHaveLength(1);
126-
expect(popperClick.hasClass("visible")).toBe(false);
127-
});
128-
129-
it("Renders closed when dismissed", () => {
130-
let wrapper = shallow(<Popover {...defaultProps} />);
131-
132-
// Hover on the target to open the popper
133-
let targetHover = wrapper.find(TargetHover);
134-
targetHover.props().onHoverChange(true);
135-
136-
// Verify the popper is open
137-
let popperClick = wrapper.find(PopperClick);
138-
expect(popperClick).toHaveLength(1);
139-
expect(popperClick.hasClass("visible")).toBe(true);
140-
141-
// Now close and verify the popper
142-
popperClick.props().onDismiss({} as any);
143-
popperClick = wrapper.find(PopperClick);
144-
expect(popperClick).toHaveLength(1);
145-
expect(popperClick.hasClass("visible")).toBe(false);
146-
});
147-
});
148-
149-
describe("Popper blur type", () => {
150-
beforeEach(() => {
151-
defaultProps = {
152-
...defaultProps,
153-
popperType: "blur"
154-
};
155-
});
156-
157-
it("Renders closed by default", () => {
158-
let wrapper = shallow(<Popover {...defaultProps} />);
159-
160-
let popper = wrapper.find(PopperBlur);
161-
expect(popper).toHaveLength(1);
162-
expect(popper.hasClass("visible")).toBe(false);
163-
});
164-
165-
it("Renders closed when dismissed", () => {
166-
let wrapper = shallow(<Popover {...defaultProps} />);
167-
168-
// Hover on the target to open the popper
169-
let targetHover = wrapper.find(TargetHover);
170-
targetHover.props().onHoverChange(true);
171-
172-
// Verify the popper is open
173-
let popper = wrapper.find(PopperBlur);
174-
expect(popper).toHaveLength(1);
175-
expect(popper.hasClass("visible")).toBe(true);
176-
177-
// Now close and verify the popper
178-
popper.props().onDismiss({} as any);
179-
popper = wrapper.find(PopperBlur);
180-
expect(popper).toHaveLength(1);
181-
expect(popper.hasClass("visible")).toBe(false);
182-
});
183-
});
184-
185-
let targetHoverState: boolean = false;
186-
let targetInfos: Array<{
187-
targetType: TargetType;
188-
component: any;
189-
activateTarget: (component: any) => void;
190-
}> = [
191-
{
192-
component: TargetClick,
193-
targetType: "click",
194-
activateTarget: target => {
195-
target.props().onClick({} as any);
57+
describe("Open/Close scenarios", () => {
58+
let targetHoverState: boolean = false;
59+
let targetInfos: Array<{
60+
targetType: TargetType;
61+
component: any;
62+
activateTarget: (component: any) => void;
63+
}> = [
64+
{
65+
component: TargetClick,
66+
targetType: "click",
67+
activateTarget: target => {
68+
target.props().onClick({} as any);
69+
}
70+
},
71+
{
72+
component: TargetHover,
73+
targetType: "hover",
74+
activateTarget: target => {
75+
targetHoverState = !targetHoverState;
76+
target.props().onHoverChange(targetHoverState);
77+
}
19678
}
197-
},
198-
{
199-
component: TargetHover,
200-
targetType: "hover",
201-
activateTarget: target => {
202-
targetHoverState = !targetHoverState;
203-
target.props().onHoverChange(targetHoverState);
79+
];
80+
let popperInfos: Array<{
81+
popperType: PopperType;
82+
component: any;
83+
activateTarget: (component: any) => void;
84+
}> = [
85+
{
86+
component: PopperHover,
87+
popperType: "hover",
88+
activateTarget: target => {
89+
target.props().onHoverChange(false);
90+
}
91+
},
92+
{
93+
component: PopperHover,
94+
popperType: "none",
95+
activateTarget: target => {
96+
target.props().onHoverChange(false);
97+
}
98+
},
99+
{
100+
component: PopperClick,
101+
popperType: "click",
102+
activateTarget: target => {
103+
target.props().onDismiss();
104+
}
105+
},
106+
{
107+
component: PopperBlur,
108+
popperType: "blur",
109+
activateTarget: target => {
110+
target.props().onDismiss({} as any);
111+
}
204112
}
205-
}
206-
];
207-
let popperInfos: Array<{
208-
popperType: PopperType;
209-
component: any;
210-
}> = [
211-
{
212-
component: PopperHover,
213-
popperType: "hover"
214-
},
215-
{
216-
component: PopperHover,
217-
popperType: "none"
218-
},
219-
{
220-
component: PopperClick,
221-
popperType: "click"
222-
},
223-
{
224-
component: PopperBlur,
225-
popperType: "blur"
226-
}
227-
];
228-
for (let targetType of targetInfos) {
229-
describe(`TargetType: ${targetType.targetType}`, () => {
230-
for (let popperType of popperInfos) {
231-
describe(`PopperType: ${popperType.popperType}`, () => {
232-
beforeEach(() => {
233-
defaultProps = {
234-
...defaultProps,
235-
popperType: popperType.popperType,
236-
targetType: targetType.targetType
237-
};
238-
});
239-
240-
it("Renders closed by default", () => {
241-
let wrapper = shallow(<Popover {...defaultProps} />);
242-
243-
let popper = wrapper.find(popperType.component);
244-
expect(popper).toHaveLength(1);
245-
expect(popper.hasClass("visible")).toBe(false);
113+
];
114+
115+
describe("Target events", () => {
116+
for (let targetType of targetInfos) {
117+
for (let popperType of popperInfos) {
118+
describe(`TargetType: ${targetType.targetType}, PopperType: ${
119+
popperType.popperType
120+
}`, () => {
121+
beforeEach(() => {
122+
targetHoverState = false;
123+
defaultProps = {
124+
...defaultProps,
125+
popperType: popperType.popperType,
126+
targetType: targetType.targetType
127+
};
128+
});
129+
130+
it("Renders closed by default", () => {
131+
let wrapper = shallow(<Popover {...defaultProps} />);
132+
133+
let popper = wrapper.find(popperType.component);
134+
expect(popper).toHaveLength(1);
135+
expect(popper.hasClass("visible")).toBe(false);
136+
});
137+
138+
it("Renders open/closed when clicked", () => {
139+
let wrapper = shallow(<Popover {...defaultProps} />);
140+
141+
// Click the target and open it
142+
let targetClick = wrapper.find(targetType.component);
143+
targetType.activateTarget(targetClick);
144+
145+
// Verify the popper is open
146+
let popper = wrapper.find(popperType.component);
147+
expect(popper).toHaveLength(1);
148+
expect(popper.hasClass("visible")).toBe(true);
149+
150+
// Now click the target again to close it
151+
targetClick = wrapper.find(targetType.component);
152+
targetType.activateTarget(targetClick);
153+
154+
// Verify the popper is in expected state
155+
popper = wrapper.find(popperType.component);
156+
expect(popper).toHaveLength(1);
157+
if (
158+
targetType.targetType === "hover" &&
159+
(popperType.popperType === "click" ||
160+
popperType.popperType === "blur")
161+
) {
162+
// For these types, the popper should open by the target but only the popper can close it, not the target
163+
expect(popper.hasClass("visible")).toBe(true);
164+
} else {
165+
// For these two types the popper should disappear when no longer focused on the target
166+
expect(popper.hasClass("visible")).toBe(false);
167+
}
168+
});
246169
});
170+
}
171+
}
172+
});
247173

248-
it("Renders open/closed when clicked", () => {
249-
let wrapper = shallow(<Popover {...defaultProps} />);
250-
251-
// Click the target and open it
252-
let targetClick = wrapper.find(targetType.component);
253-
targetType.activateTarget(targetClick);
254-
255-
// Verify the popper is open
256-
let popper = wrapper.find(popperType.component);
257-
expect(popper).toHaveLength(1);
258-
expect(popper.hasClass("visible")).toBe(true);
259-
260-
// Now click the target again to close it
261-
targetClick = wrapper.find(targetType.component);
262-
targetType.activateTarget(targetClick);
263-
popper = wrapper.find(popperType.component);
264-
expect(popper).toHaveLength(1);
265-
expect(popper.hasClass("visible")).toBe(false);
174+
describe("Popper events", () => {
175+
for (let targetType of targetInfos) {
176+
for (let popperType of popperInfos) {
177+
describe(`TargetType: ${targetType.targetType}, PopperType: ${
178+
popperType.popperType
179+
}`, () => {
180+
beforeEach(() => {
181+
targetHoverState = false;
182+
defaultProps = {
183+
...defaultProps,
184+
popperType: popperType.popperType,
185+
targetType: targetType.targetType
186+
};
187+
});
188+
189+
it("Renders closed by default", () => {
190+
let wrapper = shallow(<Popover {...defaultProps} />);
191+
192+
let popper = wrapper.find(popperType.component);
193+
expect(popper).toHaveLength(1);
194+
expect(popper.hasClass("visible")).toBe(false);
195+
});
196+
197+
it("Closes when requested", () => {
198+
let wrapper = shallow(<Popover {...defaultProps} />);
199+
200+
// Click the target and open it
201+
let targetClick = wrapper.find(targetType.component);
202+
targetType.activateTarget(targetClick);
203+
204+
// Verify the popper is open
205+
let popper = wrapper.find(popperType.component);
206+
expect(popper).toHaveLength(1);
207+
expect(popper.hasClass("visible")).toBe(true);
208+
209+
// Now activate the close scenario to close the popper
210+
popper = wrapper.find(popperType.component);
211+
popperType.activateTarget(popper);
212+
213+
// Verify the popper is closed
214+
popper = wrapper.find(popperType.component);
215+
expect(popper).toHaveLength(1);
216+
if (popperType.popperType === "none") {
217+
expect(popper.hasClass("visible")).toBe(true);
218+
} else {
219+
expect(popper.hasClass("visible")).toBe(false);
220+
}
221+
});
266222
});
267-
});
223+
}
268224
}
269225
});
270-
}
226+
});
271227

272228
describe("Uncontrolled component methods", () => {
273229
let spy: jest.SpyInstance<((isOpen: boolean) => void) | undefined>;

0 commit comments

Comments
 (0)