import { mount } from '@vue/test-utils'
import AddChatRoomByUserSearch from './AddChatRoomByUserSearch.vue'
const localVue = global.localVue
const stubs = {
'os-button': {
template:
'',
},
'os-icon': { template: '' },
'os-badge': { template: '' },
'profile-avatar': { template: '
' },
'ocelot-select': {
template:
'
',
props: ['value', 'options', 'loading', 'filter', 'placeholder', 'noOptionsAvailable'],
},
}
describe('AddChatRoomByUserSearch.vue', () => {
let wrapper, mocks
beforeEach(() => {
mocks = {
$t: jest.fn((key) => key),
$apollo: {
queries: {
searchChatTargets: { loading: false },
},
},
}
})
const Wrapper = () => {
return mount(AddChatRoomByUserSearch, {
localVue,
mocks,
stubs,
})
}
describe('mount', () => {
it('renders', () => {
wrapper = Wrapper()
expect(wrapper.exists()).toBe(true)
})
it('shows search headline', () => {
wrapper = Wrapper()
expect(mocks.$t).toHaveBeenCalledWith('chat.addRoomHeadline')
})
})
describe('startSearch computed', () => {
beforeEach(() => {
wrapper = Wrapper()
})
it('returns false for empty query', () => {
wrapper.vm.query = ''
expect(wrapper.vm.startSearch).toBeFalsy()
})
it('returns false for short query', () => {
wrapper.vm.query = 'ab'
expect(wrapper.vm.startSearch).toBe(false)
})
it('returns true for query with 3+ characters', () => {
wrapper.vm.query = 'abc'
expect(wrapper.vm.startSearch).toBe(true)
})
})
describe('handleInput', () => {
beforeEach(() => {
wrapper = Wrapper()
})
it('sets query from event target', () => {
wrapper.vm.handleInput({ target: { value: ' hello ' } })
expect(wrapper.vm.query).toBe('hello')
})
it('sets empty string when no target', () => {
wrapper.vm.handleInput({})
expect(wrapper.vm.query).toBe('')
})
it('clears results when query is too short', () => {
wrapper.vm.results = [{ id: '1' }]
wrapper.vm.handleInput({ target: { value: 'ab' } })
expect(wrapper.vm.results).toEqual([])
})
})
describe('onDelete', () => {
beforeEach(() => {
wrapper = Wrapper()
})
it('clears when value is empty', () => {
wrapper.vm.query = 'test'
wrapper.vm.results = [{ id: '1' }]
wrapper.vm.onDelete({ target: { value: '' } })
expect(wrapper.vm.query).toBe('')
expect(wrapper.vm.results).toEqual([])
})
it('calls handleInput when value is not empty', () => {
wrapper.vm.onDelete({ target: { value: 'abc' } })
expect(wrapper.vm.query).toBe('abc')
})
})
describe('clear', () => {
it('resets query and results', () => {
wrapper = Wrapper()
wrapper.vm.query = 'test'
wrapper.vm.results = [{ id: '1' }]
wrapper.vm.clear()
expect(wrapper.vm.query).toBe('')
expect(wrapper.vm.results).toEqual([])
})
})
describe('onBlur', () => {
beforeEach(() => {
jest.useFakeTimers()
wrapper = Wrapper()
})
afterEach(() => {
jest.useRealTimers()
})
it('clears query and results after timeout', () => {
wrapper.vm.query = 'test'
wrapper.vm.results = [{ id: '1' }]
wrapper.vm.onBlur()
expect(wrapper.vm.query).toBe('test')
jest.advanceTimersByTime(200)
expect(wrapper.vm.query).toBe('')
expect(wrapper.vm.results).toEqual([])
})
})
describe('onSelect', () => {
beforeEach(() => {
wrapper = Wrapper()
})
it('ignores null', () => {
wrapper.vm.onSelect(null)
expect(wrapper.emitted('add-chat-room')).toBeFalsy()
})
it('ignores string', () => {
wrapper.vm.onSelect('some string')
expect(wrapper.emitted('add-chat-room')).toBeFalsy()
})
it('ignores items without __typename', () => {
wrapper.vm.onSelect({ id: '1', name: 'Test' })
expect(wrapper.emitted('add-chat-room')).toBeFalsy()
})
it('emits add-group-chat-room for Group items', async () => {
wrapper.vm.onSelect({ id: 'g1', name: 'Group', __typename: 'Group' })
expect(wrapper.emitted('add-group-chat-room')).toBeTruthy()
expect(wrapper.emitted('add-group-chat-room')[0]).toEqual(['g1'])
})
it('emits add-chat-room for User items', () => {
wrapper.vm.onSelect({
id: 'u1',
name: 'User',
slug: 'user',
avatar: 'avatar.jpg',
__typename: 'User',
})
expect(wrapper.emitted('add-chat-room')).toBeTruthy()
expect(wrapper.emitted('add-chat-room')[0]).toEqual([
{ id: 'u1', name: 'User', slug: 'user', avatar: 'avatar.jpg' },
])
})
it('emits close-user-search after selection', async () => {
wrapper.vm.onSelect({ id: 'u1', name: 'User', __typename: 'User' })
await wrapper.vm.$nextTick()
expect(wrapper.emitted('close-user-search')).toBeTruthy()
})
})
describe('closeSearch', () => {
it('emits close-user-search', () => {
wrapper = Wrapper()
wrapper.vm.closeSearch()
expect(wrapper.emitted('close-user-search')).toBeTruthy()
})
})
describe('beforeDestroy', () => {
it('clears blur timeout', () => {
jest.useFakeTimers()
wrapper = Wrapper()
wrapper.vm.onBlur()
wrapper.destroy()
jest.advanceTimersByTime(200)
// No error thrown = timeout was cleared
jest.useRealTimers()
})
})
})