Skip to content

Commit 9f2de9a

Browse files
committed
[New] Add hasClass method
1 parent 94162c8 commit 9f2de9a

File tree

6 files changed

+81
-0
lines changed

6 files changed

+81
-0
lines changed

docs/SUMMARY.md

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
* [contains](/api/mount/contains.md)
77
* [find](/api/mount/find.md)
88
* [hasAttribute](/api/mount/hasAttribute.md)
9+
* [hasClass](/api/mount/hasClass.md)
910
* [update](/api/mount/update.md)
1011
* [setData](/api/mount/setData.md)
1112
* [setProps](/api/mount/setProps.md)

docs/api/mount/hasClass.md

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# hasClass(className)
2+
3+
Check if wrapper DOM node has a class name. Returns a boolean.
4+
5+
### Arguments
6+
7+
`className` (`String`): class name to assert element contains.
8+
9+
### Returns
10+
11+
(`Boolean`): `true` if element contains class. `false` otherwise.
12+
13+
## Example
14+
15+
```js
16+
import { mount } from 'avoriaz';
17+
import Foo from './Foo.vue';
18+
19+
const wrapper = mount(Foo);
20+
expect(wrapper.hasClass('bar')).to.equal(true);
21+
```

src/Wrapper.js

+14
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,20 @@ export default class Wrapper {
5050
return this.element.getAttribute(attribute) === value
5151
}
5252

53+
/**
54+
* Asserts wrapper has a class name
55+
*
56+
* @param {String} className - class name to assert
57+
* @returns {Boolean}
58+
*/
59+
hasClass (className) {
60+
if (typeof className !== 'string') {
61+
throw new Error('wrapper.hasClass() must be passed a string')
62+
}
63+
64+
return this.element.className.split(' ').indexOf(className) !== -1
65+
}
66+
5367
/**
5468
* Finds every node in the mount tree of the current wrapper that matches the provided selector.
5569
*

src/WrapperArray.js

+4
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ export default class WrapperArray {
1616
return this.wrappers.every(wrapper => wrapper.hasAttribute(attribute, value))
1717
}
1818

19+
hasClass (className) {
20+
return this.wrappers.every(wrapper => wrapper.hasClass(className))
21+
}
22+
1923
find (selector) {
2024
if (this.wrappers.length === 0) {
2125
throw new Error('find cannot be called on 0 items')

test/unit/specs/WrapperArray.spec.js

+13
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,19 @@ describe('WrapperArray', () => {
5858
expect(wrapperArray.hasAttribute('attribute', 'value')).to.equal(false)
5959
})
6060

61+
it('hasClass returns true if every wrapper.hasClass() returns true', () => {
62+
const className = 'class'
63+
const hasClass = sinon.stub()
64+
hasClass.withArgs(className).returns(true)
65+
const wrapperArray = new WrapperArray([{ hasClass }, { hasClass }])
66+
expect(wrapperArray.hasClass(className)).to.equal(true)
67+
})
68+
69+
it('hasClass returns false if not every wrapper.hasClass() returns true', () => {
70+
const wrapperArray = new WrapperArray([{ hasClass: () => true }, { hasClass: () => false }])
71+
expect(wrapperArray.hasClass('class')).to.equal(false)
72+
})
73+
6174
it('setData calls setData on each wrapper', () => {
6275
const setData = sinon.stub()
6376
const data = {}
+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { compileToFunctions } from 'vue-template-compiler'
2+
import mount from '../../../../src/mount'
3+
4+
describe('hasClass', () => {
5+
it('returns true if wrapper has class name', () => {
6+
const compiled = compileToFunctions('<div class="a-class" />')
7+
const wrapper = mount(compiled)
8+
expect(wrapper.hasClass('a-class')).to.equal(true)
9+
})
10+
11+
it('returns false if wrapper does not have class name', () => {
12+
const compiled = compileToFunctions('<div />')
13+
const wrapper = mount(compiled)
14+
expect(wrapper.hasClass('not-class-name')).to.equal(false)
15+
})
16+
17+
it('throws an error if selector is not a string', () => {
18+
const compiled = compileToFunctions('<div />')
19+
const wrapper = mount(compiled)
20+
const invalidSelectors = [
21+
undefined, null, NaN, 0, 2, true, false, () => {}, {}, []
22+
]
23+
invalidSelectors.forEach((invalidSelector) => {
24+
const message = 'wrapper.hasClass() must be passed a string'
25+
expect(() => wrapper.hasClass(invalidSelector)).to.throw(Error, message)
26+
})
27+
})
28+
})

0 commit comments

Comments
 (0)