import Vue from 'vue' import { mount } from '@vue/test-utils' import { flushPromises } from '../../utils' import ClosetItem from '@/components/user/ClosetItem' import { swal } from '@/js/notify' jest.mock('@/js/notify') function factory(opt = {}) { return { tid: 1, name: 'texture', type: 'steve', ...opt, } } test('computed values', () => { const wrapper = mount(ClosetItem, { propsData: factory() }) expect(wrapper.find('img').attributes('src')).toBe('/preview/1.png') expect(wrapper.find('a.more').attributes('href')).toBe('/skinlib/show/1') }) test('selected item', () => { const wrapper = mount(ClosetItem, { propsData: factory({ selected: true }) }) expect(wrapper.find('.item').classes('item-selected')).toBeTrue() }) test('click item body', () => { const wrapper = mount(ClosetItem, { propsData: factory() }) wrapper.find('.item').trigger('click') expect(wrapper.emitted().select).toBeUndefined() wrapper.find('.item-body').trigger('click') expect(wrapper.emitted().select).toBeTruthy() }) test('rename texture', async () => { Vue.prototype.$http.post .mockResolvedValueOnce({ errno: 0 }) .mockResolvedValueOnce({ errno: 1 }) swal.mockImplementationOnce(() => ({ dismiss: 'cancel' })) .mockImplementation(options => { options.inputValidator('name') options.inputValidator() return { value: 'new-name' } }) const wrapper = mount(ClosetItem, { propsData: factory() }) const button = wrapper.findAll('.dropdown-menu > li').at(0) .find('a') button.trigger('click') await wrapper.vm.$nextTick() expect(Vue.prototype.$http.post).not.toBeCalled() button.trigger('click') await wrapper.vm.$nextTick() button.trigger('click') await flushPromises() expect(wrapper.find('.texture-name > span').text()).toBe('new-name (steve)') expect(Vue.prototype.$http.post).toBeCalledWith( '/user/closet/rename', { tid: 1, new_name: 'new-name' } ) }) test('remove texture', async () => { Vue.prototype.$http.post .mockResolvedValueOnce({ errno: 0 }) .mockResolvedValueOnce({ errno: 1 }) swal .mockResolvedValueOnce({ dismiss: 'cancel' }) .mockResolvedValue({}) const wrapper = mount(ClosetItem, { propsData: factory() }) const button = wrapper.findAll('.dropdown-menu > li').at(1) .find('a') button.trigger('click') await wrapper.vm.$nextTick() expect(Vue.prototype.$http.post).not.toBeCalled() button.trigger('click') await wrapper.vm.$nextTick() button.trigger('click') await flushPromises() expect(wrapper.emitted()['item-removed']).toBeTruthy() expect(Vue.prototype.$http.post).toBeCalledWith('/user/closet/remove', { tid: 1 }) }) test('set as avatar', async () => { Vue.prototype.$http.post .mockResolvedValueOnce({ errno: 0 }) .mockResolvedValueOnce({ errno: 1 }) swal .mockResolvedValueOnce({ dismiss: 'cancel' }) .mockResolvedValue({}) window.$ = jest.fn(() => ({ each(fn) { fn() }, prop() {}, attr() { return '' }, })) const wrapper = mount(ClosetItem, { propsData: factory() }) const button = wrapper.findAll('.dropdown-menu > li').at(2) .find('a') button.trigger('click') await wrapper.vm.$nextTick() expect(Vue.prototype.$http.post).not.toBeCalled() button.trigger('click') await wrapper.vm.$nextTick() button.trigger('click') await flushPromises() await wrapper.vm.$nextTick() expect(Vue.prototype.$http.post).toBeCalledWith('/user/profile/avatar', { tid: 1 }) expect(window.$).toBeCalledWith('[alt="User Image"]') })