table-pagination.spec.js 2.96 KB
import { mount } from '@vue/test-utils'
import { BTable } from './table'

const testItems = [
  { a: 1, b: 2, c: 3 },
  { a: 4, b: 5, c: 6 },
  { a: 7, b: 8, c: 9 },
  { a: 10, b: 11, c: 12 },
  { a: 13, b: 14, c: 15 }
]

describe('table > pagination', () => {
  it('default should not be paginated', async () => {
    const wrapper = mount(BTable, {
      propsData: {
        items: testItems
      }
    })
    expect(wrapper.findAll('tbody > tr').length).toBe(5)

    wrapper.destroy()
  })

  it('should have 3 rows when per-page=3', async () => {
    const wrapper = mount(BTable, {
      propsData: {
        items: testItems,
        perPage: 3,
        currentPage: 1
      }
    })
    expect(wrapper.findAll('tbody > tr').length).toBe(3)
    const $trs = wrapper.findAll('tbody > tr')
    expect(
      $trs
        .at(0)
        .find('td')
        .text()
    ).toBe('1')
    expect(
      $trs
        .at(1)
        .find('td')
        .text()
    ).toBe('4')
    expect(
      $trs
        .at(2)
        .find('td')
        .text()
    ).toBe('7')

    wrapper.destroy()
  })

  it('changing pages should update rows', async () => {
    const wrapper = mount(BTable, {
      propsData: {
        items: testItems,
        perPage: 3,
        currentPage: 1
      }
    })
    expect(wrapper.findAll('tbody > tr').length).toBe(3)
    let $trs = wrapper.findAll('tbody > tr')
    expect(
      $trs
        .at(0)
        .find('td')
        .text()
    ).toBe('1')
    expect(
      $trs
        .at(1)
        .find('td')
        .text()
    ).toBe('4')
    expect(
      $trs
        .at(2)
        .find('td')
        .text()
    ).toBe('7')

    await wrapper.setProps({ currentPage: 2 })

    expect(wrapper.findAll('tbody > tr').length).toBe(2)
    $trs = wrapper.findAll('tbody > tr')
    expect(
      $trs
        .at(0)
        .find('td')
        .text()
    ).toBe('10')
    expect(
      $trs
        .at(1)
        .find('td')
        .text()
    ).toBe('13')

    await wrapper.setProps({ currentPage: 3 })

    expect(wrapper.findAll('tbody > tr').length).toBe(0)

    wrapper.destroy()
  })

  it('setting current-page to more than pages shows empty row when show-empty=true', async () => {
    const wrapper = mount(BTable, {
      propsData: {
        items: testItems,
        perPage: 3,
        currentPage: 1,
        showEmpty: true
      }
    })
    expect(wrapper.findAll('tbody > tr').length).toBe(3)

    await wrapper.setProps({ currentPage: 10 })

    expect(wrapper.findAll('tbody > tr').length).toBe(1)
    const $tr = wrapper.find('tbody > tr')
    expect($tr.text()).toBe(wrapper.vm.emptyText)
    expect($tr.classes()).toContain('b-table-empty-row')
    expect($tr.attributes('role')).toBe('row')
    expect(wrapper.find('tbody > tr > td').attributes('role')).toBe('cell')
    expect(wrapper.find('tbody > tr > td > div').attributes('role')).toBe('alert')
    expect(wrapper.find('tbody > tr > td > div').attributes('aria-live')).toBe('polite')

    wrapper.destroy()
  })
})