Commit b6128618f640053aac6314c251dc878c22f0622e
Committed by
GitHub
Merge pull request #1836 from SergioCrisostomo/add-spec-for-1807
Add tests for #1807
Showing
2 changed files
with
87 additions
and
1 deletions
Show diff stats
test/unit/specs/select.spec.js
| 1 | -import {createVue, destroyVM, waitForIt} from '../util'; | 1 | +import {createVue, destroyVM, waitForIt, promissedTick} from '../util'; |
| 2 | 2 | ||
| 3 | describe('Select.vue', () => { | 3 | describe('Select.vue', () => { |
| 4 | let vm; | 4 | let vm; |
| @@ -155,6 +155,82 @@ describe('Select.vue', () => { | @@ -155,6 +155,82 @@ describe('Select.vue', () => { | ||
| 155 | }); | 155 | }); |
| 156 | }); | 156 | }); |
| 157 | 157 | ||
| 158 | + describe('Behavior tests', () => { | ||
| 159 | + it('should create different and independent instances', done => { | ||
| 160 | + const options = [ | ||
| 161 | + {value: 'beijing', label: 'Beijing'}, | ||
| 162 | + {value: 'stockholm', label: 'Stockholm'}, | ||
| 163 | + {value: 'lisboa', label: 'Lisboa'} | ||
| 164 | + ]; | ||
| 165 | + | ||
| 166 | + vm = createVue({ | ||
| 167 | + template: ` | ||
| 168 | + <div> | ||
| 169 | + <i-select v-model="modelA" multiple style="width:260px"> | ||
| 170 | + <i-option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</i-option> | ||
| 171 | + </i-select> | ||
| 172 | + <i-select v-model="modelB" multiple style="width:260px"> | ||
| 173 | + <i-option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</i-option> | ||
| 174 | + </i-select> | ||
| 175 | + </div> | ||
| 176 | + `, | ||
| 177 | + data() { | ||
| 178 | + return { | ||
| 179 | + cityList: [], | ||
| 180 | + modelA: [], | ||
| 181 | + modelB: [] | ||
| 182 | + }; | ||
| 183 | + }, | ||
| 184 | + mounted() { | ||
| 185 | + setTimeout(() => (this.cityList = options), 200); | ||
| 186 | + } | ||
| 187 | + }); | ||
| 188 | + const [SelectA, SelectB] = vm.$children; | ||
| 189 | + SelectA.toggleMenu(); | ||
| 190 | + SelectB.toggleMenu(); | ||
| 191 | + | ||
| 192 | + new Promise(resolve => { | ||
| 193 | + const condition = function() { | ||
| 194 | + const optionsA = SelectA.$el.querySelectorAll('.ivu-select-item'); | ||
| 195 | + const optionsB = SelectB.$el.querySelectorAll('.ivu-select-item'); | ||
| 196 | + return optionsA.length > 0 && optionsB.length > 0; | ||
| 197 | + }; | ||
| 198 | + waitForIt(condition, resolve); | ||
| 199 | + }) | ||
| 200 | + .then(() => { | ||
| 201 | + // click in A options | ||
| 202 | + const optionsA = SelectA.$el.querySelectorAll('.ivu-select-item'); | ||
| 203 | + optionsA[0].click(); | ||
| 204 | + return promissedTick(SelectA); | ||
| 205 | + }) | ||
| 206 | + .then(() => { | ||
| 207 | + expect(SelectA.value[0]).to.equal(options[0].value); | ||
| 208 | + expect(SelectA.value.length).to.equal(1); | ||
| 209 | + expect(SelectB.value.length).to.equal(0); | ||
| 210 | + | ||
| 211 | + // click in B options | ||
| 212 | + const optionsB = SelectB.$el.querySelectorAll('.ivu-select-item'); | ||
| 213 | + optionsB[1].click(); | ||
| 214 | + optionsB[2].click(); | ||
| 215 | + return promissedTick(SelectB); | ||
| 216 | + }) | ||
| 217 | + .then(() => { | ||
| 218 | + // lets check the values! | ||
| 219 | + const getSelections = component => { | ||
| 220 | + const tags = component.$el.querySelectorAll('.ivu-select-selection .ivu-tag'); | ||
| 221 | + return [...tags].map(el => el.textContent.trim()).join(','); | ||
| 222 | + }; | ||
| 223 | + const selectAValue = getSelections(SelectA); | ||
| 224 | + const selectBValue = getSelections(SelectB); | ||
| 225 | + | ||
| 226 | + expect(selectAValue).to.equal(options[0].label); | ||
| 227 | + expect(selectBValue).to.equal(options.slice(1, 3).map(obj => obj.label.trim()).join(',')); | ||
| 228 | + | ||
| 229 | + done(); | ||
| 230 | + }); | ||
| 231 | + }); | ||
| 232 | + }); | ||
| 233 | + | ||
| 158 | describe('Performance tests', () => { | 234 | describe('Performance tests', () => { |
| 159 | it('should handle big numbers of options', done => { | 235 | it('should handle big numbers of options', done => { |
| 160 | const manyLaterOptions = Array.apply(null, Array(200)).map((_, i) => { | 236 | const manyLaterOptions = Array.apply(null, Array(200)).map((_, i) => { |
test/unit/util.js
| @@ -103,3 +103,13 @@ exports.waitForIt = function waitForIt(condition, callback) { | @@ -103,3 +103,13 @@ exports.waitForIt = function waitForIt(condition, callback) { | ||
| 103 | if (condition()) callback(); | 103 | if (condition()) callback(); |
| 104 | else setTimeout(() => waitForIt(condition, callback), 50); | 104 | else setTimeout(() => waitForIt(condition, callback), 50); |
| 105 | }; | 105 | }; |
| 106 | + | ||
| 107 | +/** | ||
| 108 | +* Call a components .$nextTick in a promissified way | ||
| 109 | +* @param {Vue Component} the component to work with | ||
| 110 | +*/ | ||
| 111 | +exports.promissedTick = component => { | ||
| 112 | + return new Promise((resolve, reject) => { | ||
| 113 | + component.$nextTick(resolve); | ||
| 114 | + }); | ||
| 115 | +}; |