utils-conflict-format.test.ts•6.22 kB
import { describe, it, expect } from 'vitest';
import { formatConflictWarnings } from '../../../handlers/utils.js';
import { ConflictCheckResult } from '../../../services/conflict-detection/types.js';
import { calendar_v3 } from 'googleapis';
describe('Enhanced Conflict Response Formatting', () => {
  it('should format duplicate warnings with full event details', () => {
    const fullEvent: calendar_v3.Schema$Event = {
      id: 'duplicate123',
      summary: 'Team Meeting',
      description: 'Weekly team sync',
      location: 'Conference Room A',
      start: { dateTime: '2024-01-15T10:00:00Z' },
      end: { dateTime: '2024-01-15T11:00:00Z' },
      attendees: [
        { email: 'john@example.com', displayName: 'John Doe', responseStatus: 'accepted' }
      ],
      htmlLink: 'https://calendar.google.com/event?eid=duplicate123'
    };
    const conflicts: ConflictCheckResult = {
      hasConflicts: true,
      duplicates: [{
        event: {
          id: 'duplicate123',
          title: 'Team Meeting',
          url: 'https://calendar.google.com/event?eid=duplicate123',
          similarity: 0.95
        },
        fullEvent: fullEvent,
        suggestion: 'This appears to be a duplicate. Consider updating the existing event instead.'
      }],
      conflicts: []
    };
    const formatted = formatConflictWarnings(conflicts);
    
    expect(formatted).toContain('POTENTIAL DUPLICATES DETECTED');
    expect(formatted).toContain('95% similar');
    expect(formatted).toContain('Existing event details:');
    expect(formatted).toContain('Event: Team Meeting');
    expect(formatted).toContain('Event ID: duplicate123');
    expect(formatted).toContain('Description: Weekly team sync');
    expect(formatted).toContain('Location: Conference Room A');
    expect(formatted).toContain('John Doe (accepted)');
    expect(formatted).toContain('View: https://calendar.google.com/event?eid=duplicate123');
  });
  it('should format conflict warnings with full event details', () => {
    const conflictingEvent: calendar_v3.Schema$Event = {
      id: 'conflict456',
      summary: 'Design Review',
      description: 'Q4 design review meeting',
      location: 'Room 201',
      start: { dateTime: '2024-01-15T13:30:00Z' },
      end: { dateTime: '2024-01-15T14:30:00Z' },
      htmlLink: 'https://calendar.google.com/event?eid=conflict456'
    };
    const conflicts: ConflictCheckResult = {
      hasConflicts: true,
      duplicates: [],
      conflicts: [{
        type: 'overlap',
        calendar: 'primary',
        event: {
          id: 'conflict456',
          title: 'Design Review',
          url: 'https://calendar.google.com/event?eid=conflict456',
          start: '2024-01-15T13:30:00Z',
          end: '2024-01-15T14:30:00Z'
        },
        fullEvent: conflictingEvent,
        overlap: {
          duration: '30 minutes',
          percentage: 50,
          startTime: '2024-01-15T13:30:00Z',
          endTime: '2024-01-15T14:00:00Z'
        }
      }]
    };
    const formatted = formatConflictWarnings(conflicts);
    
    expect(formatted).toContain('SCHEDULING CONFLICTS DETECTED');
    expect(formatted).toContain('Calendar: primary');
    expect(formatted).toContain('Conflicting Event');
    expect(formatted).toContain('Overlap: 30 minutes (50% of your event)');
    expect(formatted).toContain('Conflicting event details:');
    expect(formatted).toContain('Event: Design Review');
    expect(formatted).toContain('Description: Q4 design review meeting');
    expect(formatted).toContain('Location: Room 201');
  });
  it('should fallback gracefully when full event details are not available', () => {
    const conflicts: ConflictCheckResult = {
      hasConflicts: true,
      duplicates: [{
        event: {
          id: 'dup789',
          title: 'Standup',
          url: 'https://calendar.google.com/event?eid=dup789',
          similarity: 0.85
        },
        suggestion: 'This event is very similar to an existing one. Is this intentional?'
      }],
      conflicts: []
    };
    const formatted = formatConflictWarnings(conflicts);
    
    expect(formatted).toContain('POTENTIAL DUPLICATES DETECTED');
    expect(formatted).toContain('85% similar');
    expect(formatted).toContain('"Standup"');
    expect(formatted).toContain('View existing event: https://calendar.google.com/event?eid=dup789');
    expect(formatted).not.toContain('Existing event details:'); // Should not show this section
  });
  it('should format multiple conflicts with proper separation', () => {
    const conflicts: ConflictCheckResult = {
      hasConflicts: true,
      duplicates: [],
      conflicts: [
        {
          type: 'overlap',
          calendar: 'work@company.com',
          event: {
            id: 'work1',
            title: 'Sprint Planning',
            url: 'https://calendar.google.com/event?eid=work1'
          },
          fullEvent: {
            id: 'work1',
            summary: 'Sprint Planning',
            start: { dateTime: '2024-01-15T09:00:00Z' },
            end: { dateTime: '2024-01-15T10:00:00Z' }
          },
          overlap: {
            duration: '15 minutes',
            percentage: 25,
            startTime: '2024-01-15T09:45:00Z',
            endTime: '2024-01-15T10:00:00Z'
          }
        },
        {
          type: 'overlap',
          calendar: 'work@company.com',
          event: {
            id: 'work2',
            title: 'Daily Standup',
            url: 'https://calendar.google.com/event?eid=work2'
          },
          overlap: {
            duration: '30 minutes',
            percentage: 100,
            startTime: '2024-01-15T10:00:00Z',
            endTime: '2024-01-15T10:30:00Z'
          }
        }
      ]
    };
    const formatted = formatConflictWarnings(conflicts);
    
    expect(formatted).toContain('Calendar: work@company.com');
    expect(formatted.match(/━━━ Conflicting Event ━━━/g)).toHaveLength(2);
    expect(formatted).toContain('Sprint Planning');
    expect(formatted).toContain('Daily Standup');
    expect(formatted).toContain('15 minutes (25% of your event)');
    expect(formatted).toContain('30 minutes (100% of your event)');
  });
});