UNPKG

petrol

Version:

A javascript unit testing tool designed to be simple, to install it and start writing tests. that's it. No webpack, No karma. No distractions.

180 lines (128 loc) 4.74 kB
import TestCase from "./TestCase.js"; import { mount } from 'vue-test-utils'; class VueTestCase extends TestCase { mount(VueComponent, props = {}) { this.wrapper = mount(VueComponent, { propsData: props }) return this.wrapper; } assertNumberOfElements(selector, expected) { let actual = this.findAll(selector); this.assertCount(expected, actual, `Expected ${expected} [${selector}] elements, but found ${actual.length}`); } assertElementContains(selector, needle) { let wrapper = this.find(selector); this.assertContains(needle, wrapper.html()); } assertElementNotContains(selector, needle) { let wrapper = this.find(selector); this.assertNotContains(needle, wrapper.html()); } assertElementExists(selector) { this.find(selector); } assertElementNotExists(selector) { this.assertNumberOfElements(selector, 0); } click(selector) { this.find(selector).trigger('click'); } fillField(selector, value) { let wrapper = this.find(selector); let element = wrapper.element; if (!this.isInput(element) && !this.isTextarea(element)) { throw new Error(`Element [${selector}] must be an input or textarea`); } element.value = ''; for (let character of value) { this.dispatchEvent(element, 'keydown'); element.value += character; this.dispatchEvent(element, 'keypress'); this.dispatchEvent(element, 'keyup'); } this.dispatchEvent(element, 'change'); this.dispatchEvent(element, 'input'); } checkOption(selector) { let wrapper = this.find(selector); if (!this.isCheckbox(wrapper.element)) { fail(`Element [${selector}] must be a checkbox`); } wrapper.element.checked = true; wrapper.trigger('change'); } uncheckOption(selector) { let wrapper = this.find(selector); if (!this.isCheckbox(wrapper.element)) { throw new Error(`Element [${selector}] must be a checkbox`); } wrapper.element.checked = false; wrapper.trigger('change'); } selectOption(selector, value) { let wrapper = this.find(selector); let element = wrapper.element; if (!this.isSelect(element) && !this.isRadio(element)) { fail(`Element [${selector}] must be a selector or a radio button`); } let options = this.isSelect(element) ? wrapper.findAll('option') : this.findAll(selector); let availableOptions = []; let selectedOption = null; for (let i = 0; i < options.length; i++) { if (this.isRadio(element) && !this.isRadio(options.wrappers[i].element)) { continue; } if (options.wrappers[i].element.value == value) { selectedOption = options.wrappers[i].element.value; if (this.isSelect(element)) { options.wrappers[i].element.selected = true; } else { options.wrappers[i].element.checked = true; } wrapper.trigger('change'); } availableOptions.push(`'${options.wrappers[i].element.value}'`); } if (selectedOption == null) { throw new Error(`Option '${value}' not found on [${selector}] element. Available options: ${availableOptions.join(', ')}`); } } isText(element) { return this.isInput(element) && element.type.toLowerCase() == 'text'; } isRadio(element) { return this.isInput(element) && element.type.toLowerCase() == 'radio'; } isCheckbox(element) { return this.isInput(element) && element.type.toLowerCase() == 'checkbox'; } isInput(element) { return element && element.tagName == 'INPUT'; } isSelect(element) { return element && element.tagName == 'SELECT'; } isTextarea(element) { return element && element.tagName == 'TEXTAREA'; } dispatchEvent(element, name) { var event = document.createEvent("HTMLEvents"); event.initEvent(name, true, true); element.dispatchEvent(event); } findAll(selector) { return this.wrapper.findAll(selector); } find(selector) { let element = this.wrapper.find(selector); if (!element) { throw new Error(`Element [${selector}] was not found`); } return element; } nextTick(callback) { this.wrapper.vm.$nextTick(callback); } } export default VueTestCase;