// patch inDoc
require('../../lib/indoc_patch')
var _ = require('../../../../src/util')
var Vue = require('../../../../src/vue')
if (_.inBrowser) {
describe('v-component', function () {
var el
beforeEach(function () {
el = document.createElement('div')
document.body.appendChild(el)
spyOn(_, 'warn')
})
afterEach(function () {
document.body.removeChild(el)
})
it('static', function () {
var vm = new Vue({
el: el,
template: '
',
components: {
test: {
data: function () {
return { a: 123 }
},
template: '{{a}}'
}
}
})
expect(el.innerHTML).toBe('123
')
})
it('replace', function () {
var vm = new Vue({
el: el,
template: '',
components: {
test: {
replace: true,
data: function () {
return { a: 123 }
},
template: '{{a}}
'
}
}
})
expect(el.innerHTML).toBe('123
')
})
it('inline-template', function () {
var vm = new Vue({
el: el,
template: '{{a}}
',
data: {
a: 'parent'
},
components: {
test: {
data: function () {
return { a: 'child' }
},
template: 'child option template'
}
}
})
expect(el.innerHTML).toBe('child
')
})
it('block replace', function () {
var vm = new Vue({
el: el,
template: '',
components: {
test: {
replace: true,
data: function () {
return { a: 123, b: 234 }
},
template: '{{a}}
{{b}}
'
}
}
})
expect(el.innerHTML).toBe('123
234
')
})
it('dynamic', function (done) {
var vm = new Vue({
el: el,
template: '',
data: {
view: 'a'
},
components: {
a: {
template: 'AAA',
data: function () {
return { view: 'a' }
}
},
b: {
template: 'BBB',
data: function () {
return { view: 'b' }
}
}
}
})
expect(el.innerHTML).toBe('AAA
')
vm.view = 'b'
_.nextTick(function () {
expect(el.innerHTML).toBe('BBB
')
vm.view = ''
_.nextTick(function () {
expect(el.innerHTML).toBe('')
done()
})
})
})
it('keep-alive', function (done) {
var spyA = jasmine.createSpy()
var spyB = jasmine.createSpy()
var vm = new Vue({
el: el,
template: '',
data: {
view: 'a'
},
components: {
a: {
created: spyA,
template: 'AAA'
},
b: {
created: spyB,
template: 'BBB'
}
}
})
expect(el.innerHTML).toBe('AAA
')
expect(spyA.calls.count()).toBe(1)
expect(spyB.calls.count()).toBe(0)
vm.view = 'b'
_.nextTick(function () {
expect(el.innerHTML).toBe('BBB
')
expect(spyA.calls.count()).toBe(1)
expect(spyB.calls.count()).toBe(1)
vm.view = 'a'
_.nextTick(function () {
expect(el.innerHTML).toBe('AAA
')
expect(spyA.calls.count()).toBe(1)
expect(spyB.calls.count()).toBe(1)
vm.view = 'b'
_.nextTick(function () {
expect(el.innerHTML).toBe('BBB
')
expect(spyA.calls.count()).toBe(1)
expect(spyB.calls.count()).toBe(1)
done()
})
})
})
})
it('should compile parent template directives & content in parent scope', function (done) {
var vm = new Vue({
el: el,
data: {
ok: false,
message: 'hello'
},
template: '{{message}}
',
components: {
test: {
template: ' {{message}}
',
replace: true,
data: function () {
return {
message: 'world'
}
}
}
}
})
expect(el.firstChild.style.display).toBe('none')
expect(el.firstChild.textContent).toBe('hello world')
vm.ok = true
vm.message = 'bye'
_.nextTick(function () {
expect(el.firstChild.style.display).toBe('')
expect(el.firstChild.textContent).toBe('bye world')
done()
})
})
it('parent content + v-if', function (done) {
var vm = new Vue({
el: el,
data: {
ok: false,
message: 'hello'
},
template: '{{message}}
',
components: {
test: {
template: ' {{message}}',
data: function () {
return {
message: 'world'
}
}
}
}
})
expect(el.textContent).toBe('')
expect(vm._children.length).toBe(0)
expect(vm._directives.length).toBe(1) // v-if
vm.ok = true
_.nextTick(function () {
expect(vm._children.length).toBe(1)
expect(vm._directives.length).toBe(3) // v-if, v-component, v-text
expect(el.textContent).toBe('hello world')
done()
})
})
it('paramAttributes', function () {
var vm = new Vue({
el: el,
data: {
list: [{a:1}, {a:2}]
},
template: '',
components: {
test: {
template: '{{a}}',
paramAttributes: ['collection']
}
}
})
expect(el.innerHTML).toBe('')
})
it('wait-for', function (done) {
var vm = new Vue({
el: el,
data: {
view: 'a'
},
template: '',
components: {
a: {
template: 'AAA'
},
b: {
template: 'BBB'
}
}
})
vm._children[0].$emit('ok')
vm.view = 'b'
_.nextTick(function () {
expect(el.textContent).toBe('AAA')
// old vm is already removed, this is the new vm
vm._children[0].$emit('ok')
expect(el.textContent).toBe('BBB')
done()
})
})
it('transition-mode: in-out', function (done) {
var spy1 = jasmine.createSpy('enter')
var spy2 = jasmine.createSpy('leave')
var next
var vm = new Vue({
el: el,
data: {
view: 'a'
},
template: '',
components: {
a: { template: 'AAA' },
b: { template: 'BBB' }
},
transitions: {
test: {
enter: function (el, done) {
spy1()
next = done
},
leave: function (el, done) {
spy2()
done()
}
}
}
})
expect(el.textContent).toBe('AAA')
vm.view = 'b'
_.nextTick(function () {
expect(spy1).toHaveBeenCalled()
expect(spy2).not.toHaveBeenCalled()
expect(el.textContent).toBe('AAABBB')
next()
expect(spy2).toHaveBeenCalled()
expect(el.textContent).toBe('BBB')
done()
})
})
it('transition-mode: out-in', function (done) {
var spy1 = jasmine.createSpy('enter')
var spy2 = jasmine.createSpy('leave')
var next
var vm = new Vue({
el: el,
data: {
view: 'a'
},
template: '',
components: {
a: { template: 'AAA' },
b: { template: 'BBB' }
},
transitions: {
test: {
enter: function (el, done) {
spy2()
done()
},
leave: function (el, done) {
spy1()
next = done
}
}
}
})
expect(el.textContent).toBe('AAA')
vm.view = 'b'
_.nextTick(function () {
expect(spy1).toHaveBeenCalled()
expect(spy2).not.toHaveBeenCalled()
expect(el.textContent).toBe('AAA')
next()
expect(spy2).toHaveBeenCalled()
expect(el.textContent).toBe('BBB')
done()
})
})
it('teardown', function (done) {
var vm = new Vue({
el: el,
template: '',
data: {
view: 'test'
},
components: {
test: {},
test2: {}
}
})
vm.view = 'test2'
_.nextTick(function () {
expect(vm._children.length).toBe(2)
var child = vm._children[0]
var child2 = vm._children[1]
vm._directives[0].unbind()
expect(vm._directives[0].cache).toBeNull()
expect(vm._children.length).toBe(0)
expect(child._isDestroyed).toBe(true)
expect(child2._isDestroyed).toBe(true)
done()
})
})
it('already mounted warn', function () {
el.setAttribute('v-component', 'test')
var vm = new Vue({
el: el
})
expect(_.warn).toHaveBeenCalled()
})
})
}