183 lines
5.9 KiB
TypeScript
183 lines
5.9 KiB
TypeScript
import { STAGES, Stage, Contact } from '@/lib/types'
|
|
|
|
describe('Kanban Board', () => {
|
|
describe('3.1 Column Component Tests', () => {
|
|
it('test_renders_four_columns', () => {
|
|
const { STAGE_LIST } = require('@/lib/types')
|
|
expect(STAGE_LIST).toHaveLength(4)
|
|
expect(STAGE_LIST).toContain('LEADS DE ENTRADA')
|
|
expect(STAGE_LIST).toContain('DECIDINDO')
|
|
expect(STAGE_LIST).toContain('DISCUSSAO DE CONTRATO')
|
|
expect(STAGE_LIST).toContain('DECISAO FINAL')
|
|
})
|
|
|
|
it('test_column_displays_contact_count', () => {
|
|
const contacts: Contact[] = [
|
|
{ id: 1, name: 'Contact 1', phone: '+5511999999991', stage: STAGES.LEADS_DE_ENTRADA, notes: null, schedule_date: null, follow_up_date: null, payment_status: 'pending', created_at: '', updated_at: '' },
|
|
{ id: 2, name: 'Contact 2', phone: '+5511999999992', stage: STAGES.LEADS_DE_ENTRADA, notes: null, schedule_date: null, follow_up_date: null, payment_status: 'pending', created_at: '', updated_at: '' },
|
|
]
|
|
|
|
const leadsContacts = contacts.filter(c => c.stage === STAGES.LEADS_DE_ENTRADA)
|
|
expect(leadsContacts.length).toBe(2)
|
|
})
|
|
|
|
it('test_empty_column_shows_placeholder', () => {
|
|
const contacts: Contact[] = []
|
|
const leadsContacts = contacts.filter(c => c.stage === STAGES.LEADS_DE_ENTRADA)
|
|
|
|
const shouldShowEmpty = leadsContacts.length === 0
|
|
expect(shouldShowEmpty).toBe(true)
|
|
})
|
|
})
|
|
|
|
describe('3.2 Contact Card Tests', () => {
|
|
it('test_card_displays_contact_name', () => {
|
|
const contact: Contact = {
|
|
id: 1,
|
|
name: 'John Doe',
|
|
phone: '+5511999999999',
|
|
stage: STAGES.LEADS_DE_ENTRADA,
|
|
notes: null,
|
|
schedule_date: null,
|
|
follow_up_date: null,
|
|
payment_status: 'pending',
|
|
created_at: '',
|
|
updated_at: ''
|
|
}
|
|
|
|
expect(contact.name).toBe('John Doe')
|
|
})
|
|
|
|
it('test_card_displays_formatted_phone', () => {
|
|
const formatPhone = (phone: string) => {
|
|
const cleaned = phone.replace(/\D/g, '')
|
|
if (cleaned.length === 13) {
|
|
return `+${cleaned.slice(0, 2)} (${cleaned.slice(3, 5)}) ${cleaned.slice(5, 10)}-${cleaned.slice(10)}`
|
|
}
|
|
if (cleaned.length === 12) {
|
|
return `+${cleaned.slice(0, 2)} (${cleaned.slice(2, 4)}) ${cleaned.slice(4, 9)}-${cleaned.slice(9)}`
|
|
}
|
|
if (cleaned.length === 11) {
|
|
return `(${cleaned.slice(0, 2)}) ${cleaned.slice(2, 7)}-${cleaned.slice(7)}`
|
|
}
|
|
return phone
|
|
}
|
|
|
|
const formatted = formatPhone('+5511999999999')
|
|
expect(formatted).toContain('+55')
|
|
expect(formatted).toContain('99999')
|
|
})
|
|
|
|
it('test_card_displays_message_preview', () => {
|
|
const contact: Contact = {
|
|
id: 1,
|
|
name: 'John Doe',
|
|
phone: '+5511999999999',
|
|
stage: STAGES.LEADS_DE_ENTRADA,
|
|
notes: 'This is a very long note that should be truncated when displayed in the card preview area',
|
|
schedule_date: null,
|
|
follow_up_date: null,
|
|
payment_status: 'pending',
|
|
created_at: '',
|
|
updated_at: ''
|
|
}
|
|
|
|
const preview = contact.notes ? contact.notes.substring(0, 50) + (contact.notes.length > 50 ? '...' : '') : ''
|
|
expect(preview.length).toBe(53)
|
|
expect(preview).toContain('...')
|
|
})
|
|
|
|
it('test_card_displays_task_count_badge', () => {
|
|
const contact: Contact = {
|
|
id: 1,
|
|
name: 'John Doe',
|
|
phone: '+5511999999999',
|
|
stage: STAGES.LEADS_DE_ENTRADA,
|
|
notes: null,
|
|
schedule_date: null,
|
|
follow_up_date: null,
|
|
payment_status: 'pending',
|
|
created_at: '',
|
|
updated_at: '',
|
|
taskCount: 3
|
|
}
|
|
|
|
expect(contact.taskCount).toBe(3)
|
|
expect(contact.taskCount! > 0).toBe(true)
|
|
})
|
|
|
|
it('test_card_displays_overdue_indicator', () => {
|
|
const pastDate = '2020-01-01'
|
|
const futureDate = '2030-01-01'
|
|
|
|
const isPastOverdue = pastDate && new Date(pastDate) < new Date()
|
|
const isFutureOverdue = futureDate && new Date(futureDate) < new Date()
|
|
|
|
expect(isPastOverdue).toBe(true)
|
|
expect(isFutureOverdue).toBe(false)
|
|
})
|
|
})
|
|
|
|
describe('3.3 Drag and Drop Tests', () => {
|
|
it('test_drag_card_to_different_stage', () => {
|
|
const contact: Contact = {
|
|
id: 1,
|
|
name: 'John Doe',
|
|
phone: '+5511999999999',
|
|
stage: STAGES.LEADS_DE_ENTRADA,
|
|
notes: null,
|
|
schedule_date: null,
|
|
follow_up_date: null,
|
|
payment_status: 'pending',
|
|
created_at: '',
|
|
updated_at: ''
|
|
}
|
|
|
|
const newStage = STAGES.DECIDINDO
|
|
const updatedContact = { ...contact, stage: newStage }
|
|
|
|
expect(updatedContact.stage).toBe(STAGES.DECIDINDO)
|
|
expect(updatedContact.stage).not.toBe(contact.stage)
|
|
})
|
|
|
|
it('test_cannot_drag_to_same_column', () => {
|
|
const contact: Contact = {
|
|
id: 1,
|
|
name: 'John Doe',
|
|
phone: '+5511999999999',
|
|
stage: STAGES.LEADS_DE_ENTRADA,
|
|
notes: null,
|
|
schedule_date: null,
|
|
follow_up_date: null,
|
|
payment_status: 'pending',
|
|
created_at: '',
|
|
updated_at: ''
|
|
}
|
|
|
|
const sameStage = STAGES.LEADS_DE_ENTRADA
|
|
const updatedContact = { ...contact, stage: sameStage }
|
|
|
|
expect(updatedContact.stage).toBe(contact.stage)
|
|
expect(updatedContact.stage).not.toBe(STAGES.DECIDINDO)
|
|
})
|
|
|
|
it('test_drag_cancelled_returns_card', () => {
|
|
const contact: Contact = {
|
|
id: 1,
|
|
name: 'John Doe',
|
|
phone: '+5511999999999',
|
|
stage: STAGES.LEADS_DE_ENTRADA,
|
|
notes: null,
|
|
schedule_date: null,
|
|
follow_up_date: null,
|
|
payment_status: 'pending',
|
|
created_at: '',
|
|
updated_at: ''
|
|
}
|
|
|
|
const originalContact = { ...contact }
|
|
|
|
expect(contact.stage).toBe(originalContact.stage)
|
|
})
|
|
})
|
|
}) |