|
1 | 1 | import TestUtils from 'react-addons-test-utils' |
| 2 | +import _ from 'lodash' |
2 | 3 |
|
3 | 4 | export default function find(selector){ |
4 | 5 |
|
5 | | - let elements, name |
6 | | - if (!(typeof selector === "string")) { |
7 | | - name = (selector.name || selector.displayName).toLowerCase() |
| 6 | + var self = this |
| 7 | + var foundElements = [] |
| 8 | + var elements |
| 9 | + var selector |
| 10 | + |
| 11 | + if (_.isFunction(selector)){ |
8 | 12 | elements = TestUtils.scryRenderedComponentsWithType(this.instance, selector) |
9 | | - } else if (selector.match(/\./)) { |
10 | | - selector = selector.replace(/\./, '') |
11 | | - elements = TestUtils.scryRenderedDOMComponentsWithClass(this.instance, selector) |
| 13 | + selector = (selector.name || selector.displayName).toLowerCase() |
| 14 | + } else { |
| 15 | + |
| 16 | + var tokens = selector.split(/(?=\.)|(?=#)|(?=\[)/) |
| 17 | + tokens |
| 18 | + .forEach(function(subselector){ |
| 19 | + var els |
| 20 | + switch (subselector[0]){ |
| 21 | + // class |
| 22 | + case '.': |
| 23 | + els = TestUtils.scryRenderedDOMComponentsWithClass(self.instance, subselector.slice(1)) |
| 24 | + foundElements.push( Array.isArray(els) ? els : [els] ) |
| 25 | + break |
| 26 | + |
| 27 | + // id |
| 28 | + case '#': |
| 29 | + els = TestUtils.findAllInRenderedTree(self.instance, function(component){ |
| 30 | + if (component.id === subselector.slice(1)){ |
| 31 | + return true |
| 32 | + } |
| 33 | + }) |
| 34 | + foundElements.push( Array.isArray(els) ? els : [els] ) |
| 35 | + break |
| 36 | + |
| 37 | + // data attribute |
| 38 | + case '[': |
| 39 | + els = TestUtils.findAllInRenderedTree(self.instance, function(component){ |
| 40 | + if (component.getAttribute) { |
| 41 | + return component.getAttribute(subselector.slice(1,-1)) |
| 42 | + } |
| 43 | + }) |
| 44 | + foundElements.push( Array.isArray(els) ? els : [els] ) |
| 45 | + break |
| 46 | + |
| 47 | + // tag |
| 48 | + default: |
| 49 | + els = TestUtils.scryRenderedDOMComponentsWithTag(self.instance, subselector) |
| 50 | + foundElements.push( Array.isArray(els) ? els : [els] ) |
| 51 | + break |
| 52 | + } |
| 53 | + }) |
| 54 | + |
| 55 | + elements = _.intersection.apply(_, foundElements) |
12 | 56 | } |
13 | | - else elements = TestUtils.scryRenderedDOMComponentsWithTag(this.instance, selector) |
14 | 57 |
|
15 | | - if (Array.isArray(elements) && elements.length === 1) { |
16 | | - this.elements[name || selector] = elements[0] |
17 | | - } else { |
18 | | - this.elements[name || selector] = elements |
| 58 | + if (elements){ |
| 59 | + if (Array.isArray(elements) && elements.length === 1) { |
| 60 | + this.elements[selector] = elements[0] |
| 61 | + } else { |
| 62 | + this.elements[selector] = elements |
| 63 | + } |
19 | 64 | } |
| 65 | + |
20 | 66 | } |
0 commit comments