diff --git a/superset/assets/spec/javascripts/explore/components/ControlPanelSection_spec.jsx b/superset/assets/spec/javascripts/explore/components/ControlPanelSection_spec.jsx
new file mode 100644
index 00000000000..05eac645729
--- /dev/null
+++ b/superset/assets/spec/javascripts/explore/components/ControlPanelSection_spec.jsx
@@ -0,0 +1,52 @@
+import React from 'react';
+import { expect } from 'chai';
+import { describe, it } from 'mocha';
+import { shallow } from 'enzyme';
+import { Panel } from 'react-bootstrap';
+
+import InfoTooltipWithTrigger from
+ '../../../../javascripts/components/InfoTooltipWithTrigger';
+
+import ControlPanelSection from
+ '../../../../javascripts/explore/components/ControlPanelSection';
+
+const defaultProps = {
+ children:
a child element
,
+};
+
+const optionalProps = {
+ label: 'my label',
+ description: 'my description',
+ tooltip: 'my tooltip',
+};
+
+describe('ControlPanelSection', () => {
+ let wrapper;
+ let props;
+ it('is a valid element', () => {
+ expect(
+ React.isValidElement(),
+ ).to.equal(true);
+ });
+
+ it('renders a Panel component', () => {
+ wrapper = shallow();
+ expect(wrapper.find(Panel)).to.have.length(1);
+ });
+
+ describe('with optional props', () => {
+ beforeEach(() => {
+ props = Object.assign(defaultProps, optionalProps);
+ wrapper = shallow();
+ });
+
+ it('renders a label if present', () => {
+ expect(wrapper.find(Panel).dive().text()).to.contain('my label');
+ });
+
+ it('renders a InfoTooltipWithTrigger if label and tooltip is present', () => {
+ expect(wrapper.find(Panel).dive().find(InfoTooltipWithTrigger))
+ .to.have.length(1);
+ });
+ });
+});