describe('UNIT: API', function () { describe('config()', function () { it('should work when changing prefix', function () { var testId = 'config-1' Vue.config({ prefix: 'test' }) mock(testId, '') new Vue({ el: '#' + testId, scope: { test: testId } }) assert.strictEqual(document.querySelector('#' + testId + ' span').innerHTML, testId) }) after(function () { Vue.config({ prefix: 'v' }) }) }) describe('filter()', function () { var reverse = function (input) { return input.split('').reverse().join('') } it('should create custom filter', function () { var testId = 'filter-1', msg = '12345' Vue.filter('reverse', reverse) mock(testId, '{{ test | reverse }}') new Vue({ el: '#' + testId, scope: { test: msg } }) assert.strictEqual(document.querySelector('#' + testId).innerHTML, '54321') }) it('should return filter function if only one arg is given', function () { var f = Vue.filter('reverse') assert.strictEqual(f, reverse) }) }) describe('directive()', function () { var dirTest it('should create custom directive with set function only', function () { var testId = 'directive-1', msg = 'wowow' Vue.directive('test', function (value) { this.el.setAttribute(testId, value + '123') }) mock(testId, '') new Vue({ el: '#' + testId, scope: { test: msg } }) var el = document.querySelector('#' + testId + ' span') assert.strictEqual(el.getAttribute(testId), msg + '123') }) it('should create custom directive with object', function () { var testId = 'directive-2', msg = 'wowaaaa?' dirTest = { bind: function () { this.el.setAttribute(testId + 'bind', 'bind') }, update: function (value) { this.el.setAttribute(testId + 'update', value + 'update') }, unbind: function () { this.el.removeAttribute(testId + 'bind') } } Vue.directive('test2', dirTest) mock(testId, '') var vm = new Vue({ el: '#' + testId, scope: { test: msg } }), el = document.querySelector('#' + testId + ' span') assert.strictEqual(el.getAttribute(testId + 'bind'), 'bind', 'should have called bind()') assert.strictEqual(el.getAttribute(testId + 'update'), msg + 'update', 'should have called update()') vm.$destroy() // assuming this works assert.notOk(el.getAttribute(testId + 'bind'), 'should have called unbind()') }) it('should return directive object/fn if only one arg is given', function () { var dir = Vue.directive('test2') assert.strictEqual(dir, dirTest) }) }) describe('component()', function () { var testId = 'api-component-test', testId2 = testId + '2', opts = { className: 'hihi', scope: { hi: 'ok' } }, Test = Vue.extend(opts), utils = require('vue/src/utils') it('should register a Component constructor', function () { Vue.component(testId, Test) assert.strictEqual(utils.components[testId], Test) }) it('should also work with option objects', function () { Vue.component(testId2, opts) assert.ok(utils.components[testId2].prototype instanceof Vue) }) it('should retrieve the VM if has only one arg', function () { assert.strictEqual(Vue.component(testId), Test) }) it('should work with v-component', function () { mock(testId, '
hi
', replace: true }) var t = new Test({ el: '#' + testId }) assert.strictEqual(t.$el.tagName, 'P') assert.strictEqual(t.$el.textContent, 'hi') assert.strictEqual(t.$el.parentNode, parent) var now = document.getElementById(testId) assert.strictEqual(now, null) }) it('should replace an off DOM Vue\'s $el', function () { var Test = Vue.extend({ template: 'hi
', replace: true }) var t = new Test() assert.strictEqual(t.$el.tagName, 'P') assert.strictEqual(t.$el.textContent, 'hi') }) it('should not work if template has more than one child node', function () { var Test = Vue.extend({ template: 'hi
ho
', replace: true }) var t = new Test() assert.notStrictEqual(t.$el.tagName, 'P') assert.strictEqual(t.$el.innerHTML, 'hi
ho
') }) }) describe('DOM element options', function () { it('should not accept el as an extension option', function () { var el = document.createElement('div'), Test = Vue.extend({ el: el }), t = new Test() assert.notStrictEqual(t.$el, el) }) it('should create el with options: tagName, id, className and attributes', function () { var Test = Vue.extend({ tagName: 'p', id: 'extend-test', className: 'extend', attributes: { 'test': 'hi', 'v-text': 'hoho' }, scope: { hoho: 'what' } }) var t = new Test() assert.strictEqual(t.$el.nodeName, 'P', 'tagName should match') assert.strictEqual(t.$el.id, 'extend-test', 'id should match') assert.strictEqual(t.$el.className, 'extend', 'className should match') assert.strictEqual(t.$el.getAttribute('test'), 'hi', 'normal attr should work') assert.strictEqual(t.$el.textContent, 'what', 'directives passed in as attr should work') }) it('should ignore tagName when el is passed as an instance option', function () { var el = document.createElement('div'), Test = Vue.extend({ tagName: 'p', id: 'extend-test', className: 'extend', attributes: { 'test': 'hi', 'v-text': 'hoho' }, scope: { hoho: 'what' } }), t = new Test({ el: el }) assert.strictEqual(t.$el, el, 'should use instance el') assert.notStrictEqual(t.$el.nodeName, 'P', 'tagName should NOT match') assert.strictEqual(t.$el.id, 'extend-test', 'id should match') assert.strictEqual(t.$el.className, 'extend', 'className should match') assert.strictEqual(t.$el.getAttribute('test'), 'hi', 'normal attr should work') assert.strictEqual(t.$el.textContent, 'what', 'directives passed in as attr should work') }) }) describe('template', function () { var raw = '{{hello}}haha' it('should take direct string template and work', function () { var Test = Vue.extend({ tagName: 'p', template: raw, scope: { hello: 'Ahaha' } }), vm = new Test(), text1 = vm.$el.querySelector('span').textContent, text2 = vm.$el.querySelector('a').textContent assert.strictEqual(vm.$el.nodeName, 'P') assert.strictEqual(text1, 'Ahaha') assert.strictEqual(text2, 'haha') }) it('should take a #id and work', function () { var testId = 'template-test', tpl = document.createElement('script') tpl.id = testId tpl.type = 'text/template' tpl.innerHTML = raw document.getElementById('test').appendChild(tpl) var Test = Vue.extend({ template: '#' + testId, scope: { hello: testId } }) var t = new Test() assert.strictEqual(t.$el.querySelector('span').textContent, testId) }) it('should be overwritable', function () { var Test = Vue.extend({ template: '{{name}}
{{name}}
{{b}}
' }, scope: { a: 'hi', b: 'ho' } }) var t = new Test() assert.strictEqual(t.$el.querySelector('a').textContent, 'hi') assert.strictEqual(t.$el.querySelector('p').textContent, 'ho') }) }) describe('transitions', function () { it('should get called during transitions', function () { var enterCalled = false, leaveCalled = false var t = new Vue({ attributes: { 'v-show': 'show', 'v-transition': 'test' }, transitions: { test: { enter: function (el, done) { enterCalled = true done() }, leave: function (el, done) { leaveCalled = true done() } } }, scope: { show: false } }) document.body.appendChild(t.$el) t.show = true assert.ok(enterCalled) assert.strictEqual(t.$el.style.display, '') t.show = false assert.ok(leaveCalled) assert.strictEqual(t.$el.style.display, 'none') t.$destroy() }) }) describe('hooks', function () { describe('beforeCompile / created', function () { it('should be called before compile', function () { var called = false, Test = Vue.extend({ beforeCompile: function (options) { assert.ok(options.ok) called = true }}), Test2 = Vue.extend({ created: function (options) { assert.ok(options.ok) called = true }}) new Test({ ok: true }) assert.ok(called) called = false new Test2({ ok: true }) assert.ok(called) }) }) describe('afterCompile / ready', function () { it('should be called after compile with options', function () { var called = false, hook = function (options) { assert.ok(options.ok) assert.notOk(this.$compiler.init) called = true }, Test = Vue.extend({ afterCompile: hook }), Test2 = Vue.extend({ ready: hook }) new Test({ ok: true }) assert.ok(called) called = false new Test2({ ok: true }) assert.ok(called) }) }) describe('beforeDestroy', function () { it('should be called before a vm is destroyed', function () { var called = false var Test = Vue.extend({ beforeDestroy: function () { called = true } }) var test = new Test() test.$destroy() assert.ok(called) }) }) describe('afterDestroy', function () { it('should be called after a vm is destroyed', function () { var called = false, Test = Vue.extend({ afterDestroy: function () { assert.notOk(this.$el.parentNode) called = true } }) var test = new Test() document.body.appendChild(test.$el) test.$destroy() assert.ok(called) }) }) }) }) }) })