mcp-memory-libsql
by spences10
Verified
import { GmailService } from '../services/base.js';
import { gmail_v1 } from 'googleapis';
import { Label } from '../types.js';
import { getAccountManager } from '../../../modules/accounts/index.js';
import { AccountManager } from '../../../modules/accounts/manager.js';
import logger from '../../../utils/logger.js';
jest.mock('../../../modules/accounts/index.js');
jest.mock('../../../modules/accounts/manager.js');
jest.mock('../../../utils/logger.js', () => ({
default: {
error: jest.fn(),
warn: jest.fn(),
info: jest.fn(),
debug: jest.fn()
}
}));
describe('Gmail Label Service', () => {
let gmailService: GmailService;
let mockClient: any;
const testEmail = 'test@example.com';
beforeAll(() => {
// Mock getAccountManager at module level
(getAccountManager as jest.Mock).mockReturnValue({
validateToken: jest.fn().mockResolvedValue({ valid: true, token: {} }),
getAuthClient: jest.fn().mockResolvedValue({})
});
});
beforeEach(async () => {
// Create a fresh instance for each test
gmailService = new GmailService();
// Create mock client
mockClient = {
users: {
labels: {
list: jest.fn(),
create: jest.fn(),
patch: jest.fn(),
delete: jest.fn()
},
messages: {
modify: jest.fn()
}
}
};
// Mock the Gmail client methods at service level
(gmailService as any).getGmailClient = jest.fn().mockResolvedValue(mockClient);
// Initialize the service and update label service client
await gmailService.initialize();
(gmailService as any).labelService.updateClient(mockClient);
});
describe('manageLabel - read', () => {
it('should fetch all labels', async () => {
// Simple mock response
const mockResponse = {
data: {
labels: [
{
id: 'label1',
name: 'Test Label',
type: 'user',
messageListVisibility: 'show',
labelListVisibility: 'labelShow'
}
]
}
};
// Set up mock
(mockClient.users.labels.list as jest.Mock).mockResolvedValue(mockResponse);
const result = await gmailService.manageLabel({
action: 'read',
email: testEmail
});
// Simple assertions
expect((result as any).labels).toHaveLength(1);
expect((result as any).labels[0].id).toBe('label1');
expect((result as any).labels[0].name).toBe('Test Label');
expect(mockClient.users.labels.list).toHaveBeenCalledWith({
userId: testEmail
});
});
it('should handle empty labels response', async () => {
// Simple mock for empty response
(mockClient.users.labels.list as jest.Mock).mockResolvedValue({
data: { labels: [] }
});
const result = await gmailService.manageLabel({
action: 'read',
email: testEmail
});
expect((result as any).labels).toHaveLength(0);
});
it('should handle errors when fetching labels', async () => {
// Simple error mock
(mockClient.users.labels.list as jest.Mock).mockRejectedValue(new Error('API Error'));
await expect(gmailService.manageLabel({
action: 'read',
email: testEmail
}))
.rejects
.toThrow('Failed to fetch labels');
});
});
describe('manageLabel - create', () => {
it('should create a new label', async () => {
// Simple mock response
const mockResponse = {
data: {
id: 'label1',
name: 'Test Label',
type: 'user',
messageListVisibility: 'show',
labelListVisibility: 'labelShow'
}
};
// Set up mock
(mockClient.users.labels.create as jest.Mock).mockResolvedValue(mockResponse);
const result = await gmailService.manageLabel({
action: 'create',
email: testEmail,
data: {
name: 'Test Label'
}
});
// Simple assertions
expect((result as Label).id).toBe('label1');
expect((result as Label).name).toBe('Test Label');
expect(mockClient.users.labels.create).toHaveBeenCalledWith({
userId: testEmail,
requestBody: expect.objectContaining({
name: 'Test Label'
})
});
});
it('should handle errors when creating a label', async () => {
// Simple error mock
(mockClient.users.labels.create as jest.Mock).mockRejectedValue(new Error('API Error'));
await expect(gmailService.manageLabel({
action: 'create',
email: testEmail,
data: {
name: 'Test Label'
}
})).rejects.toThrow('Failed to create label');
});
});
describe('manageLabel - update', () => {
it('should update an existing label', async () => {
// Simple mock response
const mockResponse = {
data: {
id: 'label1',
name: 'Updated Label',
type: 'user',
messageListVisibility: 'show',
labelListVisibility: 'labelShow'
}
};
// Set up mock
(mockClient.users.labels.patch as jest.Mock).mockResolvedValue(mockResponse);
const result = await gmailService.manageLabel({
action: 'update',
email: testEmail,
labelId: 'label1',
data: {
name: 'Updated Label'
}
});
// Simple assertions
expect((result as Label).id).toBe('label1');
expect((result as Label).name).toBe('Updated Label');
expect(mockClient.users.labels.patch).toHaveBeenCalledWith({
userId: testEmail,
id: 'label1',
requestBody: expect.objectContaining({
name: 'Updated Label'
})
});
});
it('should handle errors when updating a label', async () => {
// Simple error mock
(mockClient.users.labels.patch as jest.Mock).mockRejectedValue(new Error('API Error'));
await expect(gmailService.manageLabel({
action: 'update',
email: testEmail,
labelId: 'label1',
data: {
name: 'Updated Label'
}
})).rejects.toThrow('Failed to update label');
});
});
describe('manageLabel - delete', () => {
it('should delete a label', async () => {
// Simple mock response
(mockClient.users.labels.delete as jest.Mock).mockResolvedValue({});
// Execute and verify
await gmailService.manageLabel({
action: 'delete',
email: testEmail,
labelId: 'label1'
});
// Simple assertions
expect(mockClient.users.labels.delete).toHaveBeenCalledWith({
userId: testEmail,
id: 'label1'
});
});
it('should handle errors when deleting a label', async () => {
// Simple error mock
(mockClient.users.labels.delete as jest.Mock).mockRejectedValue(new Error('API Error'));
await expect(gmailService.manageLabel({
action: 'delete',
email: testEmail,
labelId: 'label1'
})).rejects.toThrow('Failed to delete label');
});
});
describe('manageLabelAssignment', () => {
it('should add labels to a message', async () => {
// Simple mock response
(mockClient.users.messages.modify as jest.Mock).mockResolvedValue({});
// Execute and verify
await gmailService.manageLabelAssignment({
action: 'add',
email: testEmail,
messageId: 'msg1',
labelIds: ['label1']
});
// Simple assertions
expect(mockClient.users.messages.modify).toHaveBeenCalledWith({
userId: testEmail,
id: 'msg1',
requestBody: {
addLabelIds: ['label1'],
removeLabelIds: []
}
});
});
it('should remove labels from a message', async () => {
// Simple mock response
(mockClient.users.messages.modify as jest.Mock).mockResolvedValue({});
// Execute and verify
await gmailService.manageLabelAssignment({
action: 'remove',
email: testEmail,
messageId: 'msg1',
labelIds: ['label2']
});
// Simple assertions
expect(mockClient.users.messages.modify).toHaveBeenCalledWith({
userId: testEmail,
id: 'msg1',
requestBody: {
addLabelIds: [],
removeLabelIds: ['label2']
}
});
});
it('should handle errors when modifying message labels', async () => {
// Simple error mock
(mockClient.users.messages.modify as jest.Mock).mockRejectedValue(new Error('API Error'));
await expect(gmailService.manageLabelAssignment({
action: 'add',
email: testEmail,
messageId: 'msg1',
labelIds: ['label1']
})).rejects.toThrow('Failed to modify message labels');
});
});
});