- Create 6 new tenant API documentation pages: - HelpApiOverview: Authentication, scopes, rate limits, errors - HelpApiAppointments: CRUD operations for appointments - HelpApiServices: Read-only service catalog access - HelpApiResources: Staff, rooms, equipment endpoints - HelpApiCustomers: Customer management endpoints - HelpApiWebhooks: Real-time event subscriptions - Create 6 new settings help pages for granular documentation - Update HelpComprehensive with API section linking to new docs - Update platform HelpApiDocs with comprehensive endpoint coverage - Fix non-clickable /api/v1/docs/ links (now opens in new tab) - Add routes for all new help pages in App.tsx - Update FloatingHelpButton with new help page mappings 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
218 lines
8.4 KiB
TypeScript
218 lines
8.4 KiB
TypeScript
import { describe, it, expect, vi } from 'vitest';
|
|
import { render, screen } from '@testing-library/react';
|
|
import { MemoryRouter } from 'react-router-dom';
|
|
import FloatingHelpButton from '../FloatingHelpButton';
|
|
|
|
// Mock react-i18next
|
|
vi.mock('react-i18next', () => ({
|
|
useTranslation: () => ({
|
|
t: (key: string, defaultValue?: string) => defaultValue || key,
|
|
}),
|
|
}));
|
|
|
|
describe('FloatingHelpButton', () => {
|
|
const renderWithRouter = (initialPath: string) => {
|
|
return render(
|
|
<MemoryRouter initialEntries={[initialPath]}>
|
|
<FloatingHelpButton />
|
|
</MemoryRouter>
|
|
);
|
|
};
|
|
|
|
describe('tenant dashboard routes (prefixed with /dashboard)', () => {
|
|
it('renders help link on tenant dashboard', () => {
|
|
renderWithRouter('/dashboard');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toBeInTheDocument();
|
|
});
|
|
|
|
it('links to /dashboard/help/dashboard for /dashboard', () => {
|
|
renderWithRouter('/dashboard');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('href', '/dashboard/help/dashboard');
|
|
});
|
|
|
|
it('links to /dashboard/help/scheduler for /dashboard/scheduler', () => {
|
|
renderWithRouter('/dashboard/scheduler');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('href', '/dashboard/help/scheduler');
|
|
});
|
|
|
|
it('links to /dashboard/help/services for /dashboard/services', () => {
|
|
renderWithRouter('/dashboard/services');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('href', '/dashboard/help/services');
|
|
});
|
|
|
|
it('links to /dashboard/help/resources for /dashboard/resources', () => {
|
|
renderWithRouter('/dashboard/resources');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('href', '/dashboard/help/resources');
|
|
});
|
|
|
|
it('links to /dashboard/help/settings/general for /dashboard/settings/general', () => {
|
|
renderWithRouter('/dashboard/settings/general');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('href', '/dashboard/help/settings/general');
|
|
});
|
|
|
|
it('links to /dashboard/help/customers for /dashboard/customers/123', () => {
|
|
renderWithRouter('/dashboard/customers/123');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('href', '/dashboard/help/customers');
|
|
});
|
|
|
|
it('returns null on /dashboard/help pages', () => {
|
|
const { container } = renderWithRouter('/dashboard/help/dashboard');
|
|
expect(container.firstChild).toBeNull();
|
|
});
|
|
|
|
it('links to /dashboard/help for unknown dashboard routes', () => {
|
|
renderWithRouter('/dashboard/unknown-route');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('href', '/dashboard/help');
|
|
});
|
|
|
|
it('links to /dashboard/help/site-builder for /dashboard/site-editor', () => {
|
|
renderWithRouter('/dashboard/site-editor');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('href', '/dashboard/help/site-builder');
|
|
});
|
|
|
|
it('links to /dashboard/help/site-builder for /dashboard/gallery', () => {
|
|
renderWithRouter('/dashboard/gallery');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('href', '/dashboard/help/site-builder');
|
|
});
|
|
|
|
it('links to /dashboard/help/locations for /dashboard/locations', () => {
|
|
renderWithRouter('/dashboard/locations');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('href', '/dashboard/help/locations');
|
|
});
|
|
|
|
it('links to /dashboard/help/settings/business-hours for /dashboard/settings/business-hours', () => {
|
|
renderWithRouter('/dashboard/settings/business-hours');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('href', '/dashboard/help/settings/business-hours');
|
|
});
|
|
|
|
it('links to /dashboard/help/settings/email-templates for /dashboard/settings/email-templates', () => {
|
|
renderWithRouter('/dashboard/settings/email-templates');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('href', '/dashboard/help/settings/email-templates');
|
|
});
|
|
|
|
it('links to /dashboard/help/settings/embed-widget for /dashboard/settings/embed-widget', () => {
|
|
renderWithRouter('/dashboard/settings/embed-widget');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('href', '/dashboard/help/settings/embed-widget');
|
|
});
|
|
|
|
it('links to /dashboard/help/settings/staff-roles for /dashboard/settings/staff-roles', () => {
|
|
renderWithRouter('/dashboard/settings/staff-roles');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('href', '/dashboard/help/settings/staff-roles');
|
|
});
|
|
|
|
it('links to /dashboard/help/settings/communication for /dashboard/settings/sms-calling', () => {
|
|
renderWithRouter('/dashboard/settings/sms-calling');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('href', '/dashboard/help/settings/communication');
|
|
});
|
|
});
|
|
|
|
describe('non-dashboard routes (public/platform)', () => {
|
|
it('links to /help/scheduler for /scheduler', () => {
|
|
renderWithRouter('/scheduler');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('href', '/help/scheduler');
|
|
});
|
|
|
|
it('links to /help/services for /services', () => {
|
|
renderWithRouter('/services');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('href', '/help/services');
|
|
});
|
|
|
|
it('links to /help/resources for /resources', () => {
|
|
renderWithRouter('/resources');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('href', '/help/resources');
|
|
});
|
|
|
|
it('links to /help/settings/general for /settings/general', () => {
|
|
renderWithRouter('/settings/general');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('href', '/help/settings/general');
|
|
});
|
|
|
|
it('links to /help/locations for /locations', () => {
|
|
renderWithRouter('/locations');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('href', '/help/locations');
|
|
});
|
|
|
|
it('links to /help/settings/business-hours for /settings/business-hours', () => {
|
|
renderWithRouter('/settings/business-hours');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('href', '/help/settings/business-hours');
|
|
});
|
|
|
|
it('links to /help/settings/email-templates for /settings/email-templates', () => {
|
|
renderWithRouter('/settings/email-templates');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('href', '/help/settings/email-templates');
|
|
});
|
|
|
|
it('links to /help/settings/embed-widget for /settings/embed-widget', () => {
|
|
renderWithRouter('/settings/embed-widget');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('href', '/help/settings/embed-widget');
|
|
});
|
|
|
|
it('links to /help/settings/staff-roles for /settings/staff-roles', () => {
|
|
renderWithRouter('/settings/staff-roles');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('href', '/help/settings/staff-roles');
|
|
});
|
|
|
|
it('links to /help/settings/communication for /settings/sms-calling', () => {
|
|
renderWithRouter('/settings/sms-calling');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('href', '/help/settings/communication');
|
|
});
|
|
|
|
it('returns null on /help pages', () => {
|
|
const { container } = renderWithRouter('/help/dashboard');
|
|
expect(container.firstChild).toBeNull();
|
|
});
|
|
|
|
it('links to /help for unknown routes', () => {
|
|
renderWithRouter('/unknown-route');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('href', '/help');
|
|
});
|
|
|
|
it('handles dynamic routes by matching prefix', () => {
|
|
renderWithRouter('/customers/123');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('href', '/help/customers');
|
|
});
|
|
});
|
|
|
|
describe('accessibility', () => {
|
|
it('has aria-label', () => {
|
|
renderWithRouter('/dashboard');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('aria-label', 'Help');
|
|
});
|
|
|
|
it('has title attribute', () => {
|
|
renderWithRouter('/dashboard');
|
|
const link = screen.getByRole('link');
|
|
expect(link).toHaveAttribute('title', 'Help');
|
|
});
|
|
});
|
|
});
|