import dotenv from 'dotenv';
import path from 'path';
// Load test environment variables
dotenv.config({ path: path.join(__dirname, '..', '.env.test') });
// Mock console methods to reduce noise during tests
const originalConsole = { ...console };
beforeAll(() => {
console.log = jest.fn();
console.info = jest.fn();
console.warn = jest.fn();
console.error = jest.fn();
});
afterAll(() => {
Object.assign(console, originalConsole);
});
// Global test timeout
jest.setTimeout(10000);
// Mock external services
jest.mock('googleapis', () => ({
google: {
calendar: jest.fn().mockReturnValue({
calendarList: {
list: jest.fn().mockResolvedValue({
data: {
items: [
{
id: 'primary',
summary: 'Test Calendar',
timeZone: 'UTC',
accessRole: 'owner'
}
]
}
})
},
events: {
list: jest.fn().mockResolvedValue({
data: {
items: []
}
}),
get: jest.fn().mockResolvedValue({
data: {
id: 'test-event-id',
summary: 'Test Event',
start: { dateTime: '2024-01-01T10:00:00Z' },
end: { dateTime: '2024-01-01T11:00:00Z' }
}
}),
insert: jest.fn().mockResolvedValue({
data: {
id: 'new-event-id',
summary: 'New Event',
start: { dateTime: '2024-01-01T10:00:00Z' },
end: { dateTime: '2024-01-01T11:00:00Z' }
}
}),
update: jest.fn().mockResolvedValue({
data: {
id: 'updated-event-id',
summary: 'Updated Event',
start: { dateTime: '2024-01-01T10:00:00Z' },
end: { dateTime: '2024-01-01T11:00:00Z' }
}
}),
delete: jest.fn().mockResolvedValue({})
},
freebusy: {
query: jest.fn().mockResolvedValue({
data: {
calendars: {}
}
})
}
}),
auth: {
OAuth2: jest.fn().mockImplementation(() => ({
setCredentials: jest.fn(),
generateAuthUrl: jest.fn().mockReturnValue('https://test-auth-url.com'),
getToken: jest.fn().mockResolvedValue({
tokens: {
access_token: 'test-access-token',
refresh_token: 'test-refresh-token',
expiry_date: Date.now() + 3600000
}
}),
refreshAccessToken: jest.fn().mockResolvedValue({
credentials: {
access_token: 'new-access-token',
expiry_date: Date.now() + 3600000
}
})
}))
}
}
}));
// Mock Redis
jest.mock('redis', () => ({
createClient: jest.fn().mockReturnValue({
connect: jest.fn().mockResolvedValue(undefined),
disconnect: jest.fn().mockResolvedValue(undefined),
get: jest.fn().mockResolvedValue(null),
set: jest.fn().mockResolvedValue('OK'),
setEx: jest.fn().mockResolvedValue('OK'),
del: jest.fn().mockResolvedValue(1),
keys: jest.fn().mockResolvedValue([]),
flushDb: jest.fn().mockResolvedValue('OK'),
ping: jest.fn().mockResolvedValue('PONG'),
on: jest.fn()
})
}));
// Mock database
const mockDatabase = {
initialize: jest.fn().mockResolvedValue(undefined),
getUser: jest.fn().mockResolvedValue(null),
getUserByEmail: jest.fn().mockResolvedValue(null),
createUser: jest.fn().mockResolvedValue({
id: 'test-user-id',
email: 'test@example.com',
displayName: 'Test User',
timezone: 'UTC',
preferences: {},
connectedCalendars: [],
created: new Date(),
lastActive: new Date()
}),
updateUser: jest.fn().mockResolvedValue({
id: 'test-user-id',
email: 'test@example.com',
displayName: 'Test User',
timezone: 'UTC',
preferences: {},
connectedCalendars: [],
created: new Date(),
lastActive: new Date()
}),
addConnectedCalendar: jest.fn().mockResolvedValue({
calendarId: 'primary',
provider: 'google',
accessToken: 'test-token',
isDefault: true,
syncEnabled: true
}),
createReminder: jest.fn().mockResolvedValue({
id: 'test-reminder-id',
title: 'Test Reminder',
status: 'pending',
priority: 'medium',
created: new Date(),
updated: new Date()
}),
getReminders: jest.fn().mockResolvedValue([]),
ping: jest.fn().mockResolvedValue(true),
close: jest.fn().mockResolvedValue(undefined)
};
jest.mock('../src/database', () => ({
DatabaseManager: jest.fn().mockImplementation(() => mockDatabase)
}));
// Export test utilities
export const testUtils = {
mockDatabase,
createMockUser: (overrides = {}) => ({
id: 'test-user-id',
email: 'test@example.com',
displayName: 'Test User',
timezone: 'UTC',
preferences: {
defaultCalendarId: 'primary',
workingHours: {
monday: { startTime: '09:00', endTime: '17:00' }
},
defaultEventDuration: 60,
bufferTime: 15,
autoDeclineConflicts: false,
reminderDefaults: {
defaultReminders: [15],
emailReminders: true,
pushReminders: false
}
},
connectedCalendars: [
{
calendarId: 'primary',
provider: 'google' as const,
accessToken: 'test-token',
refreshToken: 'test-refresh-token',
tokenExpiry: new Date(Date.now() + 3600000),
isDefault: true,
syncEnabled: true
}
],
created: new Date(),
lastActive: new Date(),
...overrides
}),
createMockEvent: (overrides = {}) => ({
id: 'test-event-id',
calendarId: 'primary',
title: 'Test Event',
description: 'Test Description',
startTime: new Date('2024-01-01T10:00:00Z'),
endTime: new Date('2024-01-01T11:00:00Z'),
location: 'Test Location',
attendees: [],
status: 'confirmed' as const,
created: new Date(),
updated: new Date(),
...overrides
}),
createMockReminder: (overrides = {}) => ({
id: 'test-reminder-id',
title: 'Test Reminder',
description: 'Test Description',
dueDateTime: new Date('2024-01-01T10:00:00Z'),
priority: 'medium' as const,
status: 'pending' as const,
tags: ['test'],
created: new Date(),
updated: new Date(),
...overrides
})
};