Skip to content

Commit f6e754a

Browse files
committed
add getUnhandled props util, fix some tests
1 parent bc0025d commit f6e754a

7 files changed

Lines changed: 61 additions & 52 deletions

File tree

src/elements/Image/Image.js

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,10 @@ export default class Image extends Component {
2323
this.props.className,
2424
'image'
2525
);
26-
const props = _.clone(this.props);
27-
delete props.src;
28-
delete props.alt;
2926

3027
return (
31-
<div {...props} className={classes}>
32-
<img src={this.props.src} alt={this.props.alt} />
28+
<div className={classes}>
29+
<img {...this.props} />
3330
</div>
3431
);
3532
}

src/elements/List/List.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import META from 'src/utils/Meta';
44

55
export default class List extends Component {
66
static propTypes = {
7+
children: PropTypes.node,
78
className: PropTypes.string,
89
};
910

@@ -16,7 +17,9 @@ export default class List extends Component {
1617
render() {
1718
const classes = classNames('sd-list', 'ui', this.props.className, 'list');
1819
return (
19-
<div {...this.props} className={classes}></div>
20+
<div {...this.props} className={classes}>
21+
{this.props.children}
22+
</div>
2023
);
2124
}
2225
}

src/modules/Dropdown/Dropdown.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import $ from 'jquery';
33
import classNames from 'classnames';
44
import React, {Component, PropTypes} from 'react';
55
import META from 'src/utils/Meta';
6+
import getUnhandledProps from 'src/utils/getUnhandledProps';
67

78
export default class Dropdown extends Component {
89
static propTypes = {
@@ -43,8 +44,7 @@ export default class Dropdown extends Component {
4344
'dropdown'
4445
);
4546

46-
const props = _.clone(this.props);
47-
delete props.options;
47+
const props = getUnhandledProps(this);
4848

4949
return (
5050
<select {...props} className={classes} ref='select'>

src/modules/Modal/Modal.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, {Component, PropTypes} from 'react';
22
import classNames from 'classnames';
33
import META from 'src/utils/Meta';
44

5-
class Modal extends Component {
5+
export default class Modal extends Component {
66
static propTypes = {
77
children: PropTypes.any,
88
className: PropTypes.string,
@@ -46,5 +46,3 @@ class Modal extends Component {
4646
);
4747
}
4848
}
49-
50-
export default Modal;

test/specs/Conformance-test.js

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,16 @@ describe('Conformance', () => {
2929
});
3030

3131
it(`has the "${sdClass}" element as its first child (no wrapper elements)`, () => {
32-
expect(firstChild.props.className).to.contain(sdClass);
32+
if (isDOMComponent(firstChild)) {
33+
expect(firstChild.getAttribute('class')).to.contain(sdClass);
34+
} else {
35+
expect(firstChild.props.className).to.contain(sdClass);
36+
}
3337
});
3438

3539
describe('_meta', () => {
36-
const _meta = _.get(SDComponent, '_meta');
40+
const _meta = SDComponent._meta;
41+
3742
it('is a static object prop', () => {
3843
expect(_meta).to.be.an('object');
3944
});
@@ -74,29 +79,32 @@ describe('Conformance', () => {
7479
describe('props', () => {
7580
it('spreads props', () => {
7681
const props = {};
77-
_.times(2, () => {
78-
// single word props
79-
props[faker.hacker.noun()] = faker.hacker.noun();
80-
// camelCased props
81-
props[_.camelCase(faker.hacker.phrase())] = faker.hacker.phrase();
82-
// kebab-cased props
83-
props[_.kebabCase(faker.hacker.phrase())] = faker.hacker.phrase();
84-
});
82+
// JSX does not render custom html attributes so we prefix them with data-*.
83+
// https://facebook.github.io/react/docs/jsx-gotchas.html#custom-html-attributes
84+
props[`data-${faker.hacker.noun()}`] = faker.hacker.noun();
8585

8686
// create element with random props
87-
const componentWithProps = <SDComponent {...props} />;
88-
89-
const hasSpreadProps = render(componentWithProps)
87+
render(<SDComponent {...props} />)
9088
.children()
91-
.some(element => _.every([element.props], props));
92-
93-
hasSpreadProps.should.equal(true);
89+
.some(child => {
90+
return _.every(props, (val, key) => {
91+
return isDOMComponent(child)
92+
? child.getAttribute(key) === val
93+
: child.props[key] === val;
94+
});
95+
})
96+
.should.equal(true);
9497
});
9598
describe('className', () => {
9699
it(`has props.className after "${sdClass}"`, () => {
97-
const renderedClasses = render(<SDComponent className={classes} />)
98-
.findClass(sdClass)
99-
.props.className;
100+
let renderedClasses;
101+
const rendered = render(<SDComponent className={classes} />)
102+
.findClass(sdClass);
103+
if (isDOMComponent(rendered)) {
104+
renderedClasses = rendered.getAttribute('class');
105+
} else {
106+
renderedClasses = rendered.props.className;
107+
}
100108
const sdClassIndex = renderedClasses.indexOf(sdClass);
101109
const classesIndex = renderedClasses.indexOf(classes);
102110
expect(sdClassIndex).to.be.below(classesIndex);

test/specs/addons/Confirm-test.js

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,29 +7,28 @@ describe('Confirm', () => {
77
render(<Confirm />).first().props.abortLabel.should.equal('Cancel');
88
});
99
it('default prop confirmLabel should be "Yes"', () => {
10-
render(<Confirm />).first().props.confirmLabel.should.equal('Yes');
10+
Confirm.defaultProps.confirmLabel.should.equal('Yes');
1111
});
1212
it('default prop ref should be "modal"', () => {
13-
render(<Confirm />).first().props.ref.should.equal('modal');
13+
Confirm.defaultProps.ref.should.equal('modal');
14+
var foo = true;
1415
});
1516
it('should return true on confirm', () => {
1617
const confirm = render(<Confirm />);
17-
const confirmationButton = confirm.findClass('sd-confirm-button');
18-
const confirmButtonNode = confirmationButton.getDOMNode();
19-
confirm.first().show('Delete item?')
20-
.then((isConfirmed) => {
21-
isConfirmed.should.be.true;
22-
});
23-
Simulate.click(confirmButtonNode );
18+
const button = confirm.findClass('sd-confirm-button');
19+
confirm
20+
.first()
21+
.show()
22+
.then(isConfirmed => isConfirmed.should.equal(true);
23+
Simulate.click(button);
2424
});
2525
it('should return false on abort', () => {
2626
const confirm = render(<Confirm />);
27-
const abortButton = confirm.findClass('sd-abort-button');
28-
const abortButtonNode = abortButton.getDOMNode();
29-
confirm.first().show('Delete item?')
30-
.then((isConfirmed) => {
31-
isConfirmed.should.be.false;
32-
});
33-
Simulate.click(abortButtonNode );
27+
const button = confirm.findClass('sd-abort-button');
28+
confirm
29+
.first()
30+
.show()
31+
.then(isConfirmed => isConfirmed.should.equal(false));
32+
Simulate.click(button);
3433
});
3534
});
Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
import React from 'react';
22
import {Dropdown} from 'stardust';
33

4-
describe('Dropdown', () => {
4+
describe.only('Dropdown', () => {
55
it('has a default value', () => {
66
const options = [
77
{value: '', text: 'Please select a role'},
88
{value: 'admin', text: 'Admin'},
99
{value: 'editor', text: 'Editor'}
1010
];
11-
const renderedDropdown = render(<Dropdown label='Roles' value='admin' options={options} />).findTag('select');
12-
renderedDropdown.props.value.should.equal('admin');
11+
render(<Dropdown label='Roles' defaultValue='admin' options={options} />)
12+
.findTag('select')
13+
.value.should.equal('admin');
1314
});
1415
it('has assigned amount of options', () => {
1516
const options = [
@@ -20,8 +21,11 @@ describe('Dropdown', () => {
2021
{value: 'purple', text: 'purple'},
2122
{value: 'blue', text: 'blue'}
2223
];
23-
const renderedDropdown = render(<Dropdown options={options} />);
24-
renderedDropdown.findTag('select').props.children.length.should.equal(6);
25-
renderedDropdown.scryTag('option')[2].props.value.should.equal('green');
24+
render(<Dropdown options={options} />)
25+
.scryTag('option')
26+
.map((opt, i) => {
27+
opt.text.should.equal(options[i].text);
28+
opt.value.should.equal(options[i].value);
29+
});
2630
});
2731
});

0 commit comments

Comments
 (0)