Newer
Older
Import / research / reflection / vue / my-project / src / components / navbar / navbar.spec.ts
import Vue from 'vue'
import VueRouter from 'vue-router'
import Component from 'vue-class-component'
import { spy, assert } from 'sinon'
import { expect } from 'chai'
import { ComponentTest, MockLogger } from '../../util/component-test'
import { NavbarComponent } from './navbar'

let loggerSpy = spy()

@Component({
  template: require('./navbar.html')
})
class MockNavbarComponent extends NavbarComponent {
  constructor () {
    super()
    this.logger = new MockLogger(loggerSpy)
  }
}

describe('Navbar component', () => {
  let directiveTest: ComponentTest
  let router: VueRouter

  before(() => {
    Vue.use(VueRouter)
    directiveTest = new ComponentTest('<div><navbar></navbar><router-view>loading...</router-view></div>', { 'navbar': MockNavbarComponent })

    let homeComponent = { template: '<div class="home">Home</div>' }
    let aboutComponent = { template: '<div class="about">About</div>' }
    let listComponent = { template: '<div class="list">List</div>' }

    router = new VueRouter({
      routes: [
        { path: '/', component: homeComponent },
        { path: '/about', component: aboutComponent },
        { path: '/list', component: listComponent }
      ]
    })
  })

  it('should render correct contents', async () => {
    directiveTest.createComponent({ router: router })

    await directiveTest.execute((vm) => { // ensure Vue has bootstrapped/run change detection
      debugger
      assert.calledWith(loggerSpy, 'Default object property!')
      expect(vm.$el.querySelectorAll('.navbar-nav a').length).to.equal(3)
    })
  })

  describe('When clicking the about link', () => {
    beforeEach(async () => {
      directiveTest.createComponent({ router: router })

      await directiveTest.execute((vm) => {
        let anchor = vm.$el.querySelector('.navbar-nav a[href="#/about"]') as HTMLAnchorElement
        anchor.click()
      })
    })

    it('should render correct about contents', async () => {
      await directiveTest.execute((vm) => {
        expect(vm.$el.querySelector('div.about').textContent).to.equal('About')
      })
    })
  })

  describe('When clicking the list link', () => {
    beforeEach(async () => {
      directiveTest.createComponent({ router: router })

      await directiveTest.execute((vm) => {
        let anchor = vm.$el.querySelector('.navbar-nav a[href="#/list"]') as HTMLAnchorElement
        anchor.click()
      })
    })

    it('should render correct about contents', async () => {
      await directiveTest.execute((vm) => {
        expect(vm.$el.querySelector('div.list').textContent).to.equal('List')
      })
    })
  })

})