read-only.test.ts•2.54 kB
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import { parseArgs } from '../src/cli.js';
import { registerGraphTools } from '../src/graph-tools.js';
import type { GraphClient } from '../src/graph-client.js';
vi.mock('../src/cli.js', () => {
const parseArgsMock = vi.fn();
return {
parseArgs: parseArgsMock,
};
});
vi.mock('../src/generated/client.js', () => {
return {
api: {
endpoints: [
{
alias: 'list-mail-messages',
method: 'get',
path: '/me/messages',
parameters: [],
},
{
alias: 'send-mail',
method: 'post',
path: '/me/sendMail',
parameters: [],
},
{
alias: 'delete-mail-message',
method: 'delete',
path: '/me/messages/{message-id}',
parameters: [],
},
],
},
};
});
vi.mock('../src/logger.js', () => {
return {
default: {
info: vi.fn(),
error: vi.fn(),
},
};
});
describe('Read-Only Mode', () => {
let mockServer: { tool: ReturnType<typeof vi.fn> };
beforeEach(() => {
vi.clearAllMocks();
delete process.env.READ_ONLY;
mockServer = {
tool: vi.fn(),
};
});
afterEach(() => {
vi.resetAllMocks();
});
it('should respect --read-only flag from CLI', () => {
vi.mocked(parseArgs).mockReturnValue({ readOnly: true } as ReturnType<typeof parseArgs>);
const options = parseArgs();
expect(options.readOnly).toBe(true);
registerGraphTools(mockServer, {} as GraphClient, options.readOnly);
expect(mockServer.tool).toHaveBeenCalledTimes(1);
const toolCalls = mockServer.tool.mock.calls.map((call: unknown[]) => call[0]);
expect(toolCalls).toContain('list-mail-messages');
expect(toolCalls).not.toContain('send-mail');
expect(toolCalls).not.toContain('delete-mail-message');
});
it('should register all endpoints when not in read-only mode', () => {
vi.mocked(parseArgs).mockReturnValue({ readOnly: false } as ReturnType<typeof parseArgs>);
const options = parseArgs();
expect(options.readOnly).toBe(false);
registerGraphTools(mockServer, {} as GraphClient, options.readOnly);
expect(mockServer.tool).toHaveBeenCalledTimes(3);
const toolCalls = mockServer.tool.mock.calls.map((call: unknown[]) => call[0]);
expect(toolCalls).toContain('list-mail-messages');
expect(toolCalls).toContain('send-mail');
expect(toolCalls).toContain('delete-mail-message');
});
});