import { render, screen, fireEvent } from '@testing-library/react'
import { UpcomingMeetings, type UpcomingMeeting } from '../calendar/upcoming-meetings'
const sampleMeetings: UpcomingMeeting[] = [
{
id: 1,
title: 'Sequoia partner sync',
scheduled_at: '2026-04-29T16:00:00Z',
status: 'confirmed',
investor_name: 'Roelof Botha',
investor_email: 'roelof@sequoia.com',
meeting_link: 'https://meet.google.com/abc',
},
{
id: 2,
title: 'Acme partner intro',
scheduled_at: '2026-04-30T14:00:00Z',
status: 'pending',
investor_email: 'partner@acme.vc',
},
{
id: 3,
title: 'Cancelled call',
scheduled_at: '2026-05-01T10:00:00Z',
status: 'cancelled',
},
]
describe('UpcomingMeetings', () => {
it('renders the title and each meeting title', () => {
render()
expect(screen.getByText('Upcoming Meetings')).toBeInTheDocument()
expect(screen.getByText('Sequoia partner sync')).toBeInTheDocument()
expect(screen.getByText('Acme partner intro')).toBeInTheDocument()
expect(screen.getByText('Cancelled call')).toBeInTheDocument()
})
it('shows the right status badge per meeting', () => {
render()
expect(screen.getByText('Confirmed')).toBeInTheDocument()
expect(screen.getByText('Pending')).toBeInTheDocument()
expect(screen.getByText('Cancelled')).toBeInTheDocument()
})
it('renders skeletons in loading state', () => {
const { container } = render(
)
// Skeletons render as empty divs with animate-pulse — count them by class.
const skeletons = container.querySelectorAll('.animate-pulse')
expect(skeletons).toHaveLength(5)
})
it('renders empty state when no meetings', () => {
render()
expect(screen.getByText('No upcoming meetings')).toBeInTheDocument()
})
it('does not render Schedule CTA when onSchedule is not provided', () => {
render()
expect(screen.queryByText('Schedule one')).not.toBeInTheDocument()
})
it('renders Schedule CTA when onSchedule is provided and fires it on click', () => {
const onSchedule = jest.fn()
render()
const cta = screen.getByText('Schedule one')
expect(cta).toBeInTheDocument()
fireEvent.click(cta)
expect(onSchedule).toHaveBeenCalledTimes(1)
})
it('fires onMeetingClick with the original meeting payload', () => {
const onMeetingClick = jest.fn()
render()
fireEvent.click(screen.getByText('Sequoia partner sync'))
expect(onMeetingClick).toHaveBeenCalledTimes(1)
expect(onMeetingClick.mock.calls[0][0].id).toBe(1)
expect(onMeetingClick.mock.calls[0][0].investor_name).toBe('Roelof Botha')
})
it('renders View all link when viewAllHref is provided', () => {
render()
const link = screen.getByText('View all')
expect(link.closest('a')).toHaveAttribute('href', '/calendar')
})
it('renders Join link when meeting_link is set', () => {
render()
const join = screen.getByText('Join')
expect(join.closest('a')).toHaveAttribute('href', 'https://meet.google.com/abc')
})
it("falls back to investor_email when investor_name is absent", () => {
render()
expect(screen.getByText('partner@acme.vc')).toBeInTheDocument()
})
it('uses a custom title when title prop is provided', () => {
render()
expect(screen.getByText("This Week's Calls")).toBeInTheDocument()
expect(screen.queryByText('Upcoming Meetings')).not.toBeInTheDocument()
})
})