75 lines
2.6 KiB
TypeScript
75 lines
2.6 KiB
TypeScript
import React, { useState } from 'react'
|
|
import { render, fireEvent } from '@testing-library/react'
|
|
import { on } from '@/scripts/event'
|
|
import EmailSuggestion from '@/components/EmailSuggestion'
|
|
|
|
const Wrapper: React.FC = () => {
|
|
const [email, setEmail] = useState('')
|
|
|
|
return <EmailSuggestion value={email} onChange={setEmail} />
|
|
}
|
|
|
|
test('basic typing', () => {
|
|
const { getByDisplayValue, queryByText } = render(<Wrapper />)
|
|
const input = getByDisplayValue('')
|
|
|
|
fireEvent.input(input, { target: { value: 'abc' } })
|
|
fireEvent.focus(input)
|
|
expect(queryByText('abc@qq.com')).toBeInTheDocument()
|
|
expect(queryByText('abc@163.com')).toBeInTheDocument()
|
|
expect(queryByText('abc@gmail.com')).toBeInTheDocument()
|
|
expect(queryByText('abc@hotmail.com')).toBeInTheDocument()
|
|
|
|
fireEvent.input(input, { target: { value: '' } })
|
|
expect(queryByText('abc@qq.com')).not.toBeInTheDocument()
|
|
})
|
|
|
|
test('apply suggestion', () => {
|
|
const { getByDisplayValue, getByText } = render(<Wrapper />)
|
|
const input = getByDisplayValue('')
|
|
|
|
fireEvent.input(input, { target: { value: 'abc' } })
|
|
fireEvent.focus(input)
|
|
fireEvent.click(getByText('abc@hotmail.com'))
|
|
expect(input).toHaveValue('abc@hotmail.com')
|
|
})
|
|
|
|
test('do not suggest when `at` is existed', () => {
|
|
const { getByDisplayValue, queryByText } = render(<Wrapper />)
|
|
const input = getByDisplayValue('')
|
|
|
|
fireEvent.input(input, { target: { value: 'abc@outlook.com' } })
|
|
fireEvent.focus(input)
|
|
expect(queryByText('abc@outlook.com@qq.com')).not.toBeInTheDocument()
|
|
expect(queryByText('abc@outlook.com@163.com')).not.toBeInTheDocument()
|
|
expect(queryByText('abc@outlook.com@gmail.com')).not.toBeInTheDocument()
|
|
expect(queryByText('abc@outlook.com@hotmail.com')).not.toBeInTheDocument()
|
|
})
|
|
|
|
test('display suggestions when typing with configured domain names', () => {
|
|
const { getByDisplayValue, queryByText } = render(<Wrapper />)
|
|
const input = getByDisplayValue('')
|
|
|
|
fireEvent.input(input, { target: { value: 'abc@hotmail.com' } })
|
|
fireEvent.focus(input)
|
|
expect(queryByText('abc@qq.com')).toBeInTheDocument()
|
|
expect(queryByText('abc@163.com')).toBeInTheDocument()
|
|
expect(queryByText('abc@gmail.com')).toBeInTheDocument()
|
|
expect(queryByText('abc@hotmail.com')).toBeInTheDocument()
|
|
})
|
|
|
|
test('events', () => {
|
|
const off = on('emailDomainsSuggestion', (names: Set<string>) => {
|
|
names.add('outlook.com')
|
|
})
|
|
|
|
const { getByDisplayValue, queryByText } = render(<Wrapper />)
|
|
const input = getByDisplayValue('')
|
|
|
|
fireEvent.input(input, { target: { value: 'abc' } })
|
|
fireEvent.focus(input)
|
|
expect(queryByText('abc@outlook.com')).toBeInTheDocument()
|
|
|
|
off()
|
|
})
|