243 lines
7.1 KiB
TypeScript
243 lines
7.1 KiB
TypeScript
import { render, screen, fireEvent } from '@testing-library/react'
|
|
import { describe, test, expect, vi } from 'vitest'
|
|
import React from 'react'
|
|
|
|
describe('User Flow Tests', () => {
|
|
test('create project flow mock', () => {
|
|
const MockCreateProject = () => {
|
|
const [project, setProject] = React.useState('')
|
|
return (
|
|
<div>
|
|
<h1>Create Project</h1>
|
|
<input
|
|
placeholder="Project title"
|
|
value={project}
|
|
onChange={(e) => setProject(e.target.value)}
|
|
/>
|
|
<button>Create</button>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
render(<MockCreateProject />)
|
|
expect(screen.getByText('Create Project')).toBeInTheDocument()
|
|
expect(screen.getByPlaceholderText('Project title')).toBeInTheDocument()
|
|
expect(screen.getByRole('button', { name: 'Create' })).toBeInTheDocument()
|
|
})
|
|
|
|
test('search functionality mock', () => {
|
|
const MockSearch = () => {
|
|
const [query, setQuery] = React.useState('')
|
|
return (
|
|
<div>
|
|
<h1>Search</h1>
|
|
<input
|
|
placeholder="Search knowledge base"
|
|
value={query}
|
|
onChange={(e) => setQuery(e.target.value)}
|
|
/>
|
|
{query && <div>Results for: {query}</div>}
|
|
</div>
|
|
)
|
|
}
|
|
|
|
render(<MockSearch />)
|
|
const input = screen.getByPlaceholderText('Search knowledge base')
|
|
fireEvent.change(input, { target: { value: 'test query' } })
|
|
expect(screen.getByText('Results for: test query')).toBeInTheDocument()
|
|
})
|
|
|
|
test('settings toggle mock', () => {
|
|
const MockSettings = () => {
|
|
const [theme, setTheme] = React.useState('light')
|
|
return (
|
|
<div>
|
|
<h1>Settings</h1>
|
|
<button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>
|
|
Theme: {theme}
|
|
</button>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
render(<MockSettings />)
|
|
const button = screen.getByText('Theme: light')
|
|
fireEvent.click(button)
|
|
expect(screen.getByText('Theme: dark')).toBeInTheDocument()
|
|
})
|
|
|
|
test('file upload mock', () => {
|
|
const MockUpload = () => {
|
|
const [uploaded, setUploaded] = React.useState(false)
|
|
return (
|
|
<div>
|
|
<h1>Upload Documents</h1>
|
|
<input type="file" onChange={() => setUploaded(true)} data-testid="file-input" />
|
|
{uploaded && <div>File uploaded successfully</div>}
|
|
</div>
|
|
)
|
|
}
|
|
|
|
render(<MockUpload />)
|
|
const input = screen.getByTestId('file-input')
|
|
fireEvent.change(input)
|
|
expect(screen.getByText('File uploaded successfully')).toBeInTheDocument()
|
|
})
|
|
|
|
test('connection status mock', () => {
|
|
const MockConnection = () => {
|
|
const [connected, setConnected] = React.useState(true)
|
|
return (
|
|
<div>
|
|
<h1>Connection Status</h1>
|
|
<div>{connected ? 'Connected' : 'Disconnected'}</div>
|
|
<button onClick={() => setConnected(!connected)}>
|
|
Toggle Connection
|
|
</button>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
render(<MockConnection />)
|
|
expect(screen.getByText('Connected')).toBeInTheDocument()
|
|
|
|
fireEvent.click(screen.getByText('Toggle Connection'))
|
|
expect(screen.getByText('Disconnected')).toBeInTheDocument()
|
|
})
|
|
|
|
test('task management mock', () => {
|
|
const MockTasks = () => {
|
|
const [tasks, setTasks] = React.useState(['Task 1', 'Task 2'])
|
|
const addTask = () => setTasks([...tasks, `Task ${tasks.length + 1}`])
|
|
|
|
return (
|
|
<div>
|
|
<h1>Task Management</h1>
|
|
<button onClick={addTask}>Add Task</button>
|
|
<ul>
|
|
{tasks.map((task, index) => (
|
|
<li key={index}>{task}</li>
|
|
))}
|
|
</ul>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
render(<MockTasks />)
|
|
expect(screen.getByText('Task 1')).toBeInTheDocument()
|
|
|
|
fireEvent.click(screen.getByText('Add Task'))
|
|
expect(screen.getByText('Task 3')).toBeInTheDocument()
|
|
})
|
|
|
|
test('navigation mock', () => {
|
|
const MockNav = () => {
|
|
const [currentPage, setCurrentPage] = React.useState('home')
|
|
return (
|
|
<div>
|
|
<nav>
|
|
<button onClick={() => setCurrentPage('projects')}>Projects</button>
|
|
<button onClick={() => setCurrentPage('settings')}>Settings</button>
|
|
</nav>
|
|
<main>
|
|
<h1>Current page: {currentPage}</h1>
|
|
</main>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
render(<MockNav />)
|
|
expect(screen.getByText('Current page: home')).toBeInTheDocument()
|
|
|
|
fireEvent.click(screen.getByText('Projects'))
|
|
expect(screen.getByText('Current page: projects')).toBeInTheDocument()
|
|
})
|
|
|
|
test('form validation mock', () => {
|
|
const MockForm = () => {
|
|
const [email, setEmail] = React.useState('')
|
|
const [error, setError] = React.useState('')
|
|
|
|
const handleSubmit = () => {
|
|
if (!email.includes('@')) {
|
|
setError('Invalid email')
|
|
} else {
|
|
setError('')
|
|
}
|
|
}
|
|
|
|
return (
|
|
<div>
|
|
<h1>Form Validation</h1>
|
|
<input
|
|
placeholder="Email"
|
|
value={email}
|
|
onChange={(e) => setEmail(e.target.value)}
|
|
/>
|
|
<button onClick={handleSubmit}>Submit</button>
|
|
{error && <div role="alert">{error}</div>}
|
|
</div>
|
|
)
|
|
}
|
|
|
|
render(<MockForm />)
|
|
const input = screen.getByPlaceholderText('Email')
|
|
|
|
fireEvent.change(input, { target: { value: 'invalid' } })
|
|
fireEvent.click(screen.getByText('Submit'))
|
|
expect(screen.getByRole('alert')).toHaveTextContent('Invalid email')
|
|
})
|
|
|
|
test('theme switching mock', () => {
|
|
const MockTheme = () => {
|
|
const [isDark, setIsDark] = React.useState(false)
|
|
return (
|
|
<div className={isDark ? 'dark' : 'light'}>
|
|
<h1>Theme Test</h1>
|
|
<button onClick={() => setIsDark(!isDark)}>
|
|
Switch to {isDark ? 'Light' : 'Dark'}
|
|
</button>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
render(<MockTheme />)
|
|
const button = screen.getByText('Switch to Dark')
|
|
fireEvent.click(button)
|
|
expect(screen.getByText('Switch to Light')).toBeInTheDocument()
|
|
})
|
|
|
|
test('data filtering mock', () => {
|
|
const MockFilter = () => {
|
|
const [filter, setFilter] = React.useState('')
|
|
const items = ['Apple', 'Banana', 'Cherry']
|
|
const filtered = items.filter(item =>
|
|
item.toLowerCase().includes(filter.toLowerCase())
|
|
)
|
|
|
|
return (
|
|
<div>
|
|
<h1>Filter Test</h1>
|
|
<input
|
|
placeholder="Filter items"
|
|
value={filter}
|
|
onChange={(e) => setFilter(e.target.value)}
|
|
/>
|
|
<ul>
|
|
{filtered.map((item, index) => (
|
|
<li key={index}>{item}</li>
|
|
))}
|
|
</ul>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
render(<MockFilter />)
|
|
const input = screen.getByPlaceholderText('Filter items')
|
|
|
|
fireEvent.change(input, { target: { value: 'a' } })
|
|
expect(screen.getByText('Apple')).toBeInTheDocument()
|
|
expect(screen.getByText('Banana')).toBeInTheDocument()
|
|
expect(screen.queryByText('Cherry')).not.toBeInTheDocument()
|
|
})
|
|
}) |