UNPKG

@dcodegroup-au/vuetable-3

Version:

Datatable component for Vue 3.x built with Vite/ESM

354 lines (311 loc) 9 kB
import axios from 'axios' import moxios from 'moxios' import { mount, shallow } from '@vue/test-utils' import Vuetable from '@/components/Vuetable.vue' describe('AJAX functionality', () => { let apiUrl, response beforeEach( () => { moxios.install() apiUrl = 'api.example.com/hello' }) afterEach( () => { moxios.uninstall() apiUrl = '' response = null }) describe('load-on-start', () => { it('calls API endpoint when load: load-on-start', (done) => { let wrapper = shallow(Vuetable, { propsData: { apiUrl: apiUrl, fields: ['id', 'code'], paginationPath: '' } }) moxios.wait( () => { let request = moxios.requests.mostRecent() request.respondWith({ status: 200, response: [ {id: 1, code: 'AAA'}, {id: 2, code: 'BBB'} ] }).then( (res) => { expect(res.request.url).toContain('api.example.com/hello') expect(res.data[0].code).toEqual('AAA') done() }) }) }) }) describe('http-method', () => { let stubResponse = [ {id: 1, code: 'AAA'}, {id: 2, code: 'BBB'} ] const shallowVuetable = (httpMethod) => shallow(Vuetable, { propsData: { apiUrl: apiUrl, fields: ['id', 'code'], paginationPath: '', httpMethod } }) it('calls API endpoint using "get" verb', (done) => { let wrapper = shallowVuetable('get') expect(wrapper.vm.httpMethod).toEqual('get') expect(wrapper.vm.$options.props.httpMethod.validator('get')).toBeTruthy() moxios.wait( () => { let request = moxios.requests.mostRecent() request.respondWith({ status: 200, response: stubResponse }).then( (res) => { expect(res.request.url).toContain('api.example.com/hello') expect(res.data[0].code).toEqual('AAA') done() }) }) }) it('calls API endpoint using "post" verb', (done) => { let wrapper = shallowVuetable('post') expect(wrapper.vm.httpMethod).toEqual('post') expect(wrapper.vm.$options.props.httpMethod.validator('post')).toBeTruthy() moxios.wait( () => { let request = moxios.requests.mostRecent() request.respondWith({ status: 200, response: stubResponse }).then( (res) => { expect(res.request.url).toContain('api.example.com/hello') expect(res.data[0].code).toEqual('AAA') done() }) }) }) it('fails prop validation when using verb other than "get" and "post"', () => { let wrapper = shallowVuetable('put') expect(wrapper.vm.httpMethod).toEqual('put') expect(wrapper.vm.$options.props.httpMethod.validator('put')).toBeFalsy() }) }) describe('reactive-api-url', () => { it('makes a new request to API endpoint when api-url changes if reactive-api-url is true', () => { let newUrl = 'api.example.com/anotherEndpoint' let mockLoadData = jest.fn() let mockWatch = jest.fn() let wrapper = shallow(Vuetable, { propsData: { apiUrl: apiUrl, fields: ['id', 'code'], paginationPath: '', reactiveApiUrl: true, }, methods: { loadData: mockLoadData }, watch: { apiUrl: mockWatch } }) expect(mockLoadData).toBeCalled() expect(mockWatch).not.toBeCalled() mockLoadData.mockClear() mockWatch.mockClear() wrapper.setProps({ apiUrl: newUrl }) expect(mockWatch).toBeCalledWith(newUrl, apiUrl) expect(mockLoadData).toBeCalled() }) }) describe('query-params', () => { it('returns correct default', (done) => { let wrapper = shallow(Vuetable, { propsData: { apiUrl: apiUrl, fields: ['id', 'code'], paginationPath: '', } }) expect(wrapper.vm.queryParams).toEqual({ sort: 'sort', page: 'page', perPage: 'per_page' }) moxios.wait( () => { let request = moxios.requests.mostRecent() request.respondWith({ status: 200, response: 'foo' }).then( (payload) => { expect(payload.request.url).toEqual( `${apiUrl}?sort=&page=1&per_page=10` ) done() }) }) }) it('uses the given query params object to make a call to API endpoint', (done) => { let params = { sort: 'sss', page: 'ppp', perPage: 'ggg' } let wrapper = shallow(Vuetable, { propsData: { apiUrl: apiUrl, fields: ['id', 'code'], paginationPath: '', queryParams: params } }) expect(wrapper.vm.queryParams).toEqual(params) moxios.wait( () => { let request = moxios.requests.mostRecent() request.respondWith({ status: 200, response: 'foo' }).then( (payload) => { expect(payload.request.url).toEqual( `${apiUrl}?${params.sort}=&${params.page}=1&${params.perPage}=10` ) done() }) }) }) it('uses the given callback to construct query params', (done) => { let params = (sort, page, perPage) => { return { aaa: 111, bbb: 222, ccc: 333 } } let wrapper = shallow(Vuetable, { propsData: { apiUrl: apiUrl, fields: ['id', 'code'], paginationPath: '', queryParams: params } }) expect(wrapper.vm.queryParams).toEqual(params) moxios.wait( () => { let request = moxios.requests.mostRecent() request.respondWith({ status: 200, response: 'foo' }).then( (payload) => { expect(payload.request.url).toEqual( `${apiUrl}?aaa=111&bbb=222&ccc=333` ) done() }) }) }) it('defaults to empty object when the given queryParams function does not return Object', (done) => { let params = (sort, page, perPage) => 'bar' let wrapper = shallow(Vuetable, { propsData: { apiUrl: apiUrl, fields: ['id', 'code'], paginationPath: '', queryParams: params } }) expect(wrapper.vm.queryParams).toEqual(params) moxios.wait( () => { let request = moxios.requests.mostRecent() request.respondWith({ status: 200, response: 'foo' }).then( (payload) => { expect(payload.request.config.params).toEqual({}) expect(payload.request.url).toEqual(apiUrl) done() }) }) }) }) describe('append-params', () => { let appends = { 'aaa': 111, 'bbb': 222 } it('appends additional parameters to the API request', (done) => { let wrapper = shallow(Vuetable, { propsData: { apiUrl, fields: ['id', 'code'], paginationPath: '', appendParams: appends } }) moxios.wait( () => { let request = moxios.requests.mostRecent() request.respondWith({ status: 200, response: 'foo' }).then( (payload) => { expect(payload.request.config.params).toEqual(expect.objectContaining(appends)) expect(payload.request.url).toEqual(expect.stringContaining(`aaa=111&bbb=222`)) done() }) }) }) }) describe('http-options', () => { let options = { headers: { 'Authorization': 'my-token' } } it('attaches other options to the API request', (done) => { let wrapper = shallow(Vuetable, { propsData: { apiUrl, fields: ['id', 'code'], paginationPath: '', httpOptions: options } }) moxios.wait( () => { let request = moxios.requests.mostRecent() request.respondWith({ status: 200, response: 'foo' }).then( (payload) => { expect(payload.request.headers).toEqual(expect.objectContaining(options.headers)) done() }) }) }) }) describe('http-fetch', () => { it('uses the given http-fetch function when specified', (done) => { const myFetch = jest.fn( () => { return axios.get(apiUrl) }) let wrapper = shallow(Vuetable, { propsData: { apiUrl, fields: ['id', 'code'], paginationPath: '', httpFetch: myFetch } }) moxios.wait( () => { expect(myFetch).toBeCalledWith( apiUrl, { params: { page: 1, per_page: 10, sort: '' } } ) done() }) }) }) })