Files
smoothschedule/frontend/src/components/__tests__/FloatingHelpButton.test.tsx
poduck e52b56d51c Add comprehensive tenant API documentation and settings help pages
- 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>
2025-12-16 23:16:30 -05:00

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');
});
});
});