Files
n8n-enterprise-unlocked/packages/nodes-base/nodes/Microsoft/Teams/test/trigger/MicrosoftTeamTrigger.test.ts
2025-05-15 12:03:00 +01:00

233 lines
7.1 KiB
TypeScript

import { mock } from 'jest-mock-extended';
import { MicrosoftTeamsTrigger } from '../../MicrosoftTeamsTrigger.node';
import { microsoftApiRequest, microsoftApiRequestAllItems } from '../../v2/transport';
jest.mock('../../v2/transport', () => ({
microsoftApiRequest: {
call: jest.fn(),
},
microsoftApiRequestAllItems: {
call: jest.fn(),
},
}));
describe('Microsoft Teams Trigger Node', () => {
let mockWebhookFunctions: any;
beforeEach(() => {
mockWebhookFunctions = mock();
jest.clearAllMocks();
});
describe('webhookMethods', () => {
describe('checkExists', () => {
it('should return true if the subscription exists', async () => {
(microsoftApiRequestAllItems.call as jest.Mock).mockResolvedValue([
{
id: 'sub1',
notificationUrl: 'https://webhook.url',
resource: '/me/chats',
expirationDateTime: new Date(Date.now() + 3600000).toISOString(),
},
]);
mockWebhookFunctions.getNodeWebhookUrl.mockReturnValue('https://webhook.url');
mockWebhookFunctions.getWorkflowStaticData.mockReturnValue({
node: {
subscriptionIds: ['sub1'],
},
});
mockWebhookFunctions.getNodeParameter.mockImplementation((paramName: string) => {
if (paramName === 'event') return 'newChat';
return false;
});
const result = await new MicrosoftTeamsTrigger().webhookMethods.default.checkExists.call(
mockWebhookFunctions,
);
expect(result).toBe(true);
});
it('should return false if the subscription does not exist', async () => {
(microsoftApiRequestAllItems.call as jest.Mock).mockResolvedValue([]);
mockWebhookFunctions.getNodeWebhookUrl.mockReturnValue('https://webhook.url');
mockWebhookFunctions.getWorkflowStaticData.mockReturnValue({
node: {},
});
const result = await new MicrosoftTeamsTrigger().webhookMethods.default.checkExists.call(
mockWebhookFunctions,
);
expect(result).toBe(false);
});
it('should throw an error if the API request fails', async () => {
(microsoftApiRequestAllItems.call as jest.Mock).mockRejectedValue(
new Error('API request failed'),
);
mockWebhookFunctions.getNodeWebhookUrl.mockReturnValue('https://webhook.url');
mockWebhookFunctions.getWorkflowStaticData.mockReturnValue({
node: {},
});
const result = await new MicrosoftTeamsTrigger().webhookMethods.default.checkExists.call(
mockWebhookFunctions,
);
expect(result).toBe(false);
});
});
describe('create', () => {
it('should create a subscription successfully', async () => {
(microsoftApiRequest.call as jest.Mock).mockResolvedValue({ id: 'subscription123' });
mockWebhookFunctions.getNodeWebhookUrl.mockReturnValue('https://webhook.url');
mockWebhookFunctions.getNodeParameter.mockReturnValue('newChat');
mockWebhookFunctions.getWorkflowStaticData.mockReturnValue({
node: {
subscriptionIds: [],
},
});
(microsoftApiRequest.call as jest.Mock).mockResolvedValue({
value: [{ id: 'team1', displayName: 'Team 1' }],
});
const result = await new MicrosoftTeamsTrigger().webhookMethods.default.create.call(
mockWebhookFunctions,
);
expect(result).toBe(true);
expect(microsoftApiRequest.call).toHaveBeenCalledWith(
mockWebhookFunctions,
'POST',
'/v1.0/subscriptions',
expect.objectContaining({
changeType: 'created',
notificationUrl: 'https://webhook.url',
resource: '/me/chats',
expirationDateTime: expect.any(String),
latestSupportedTlsVersion: 'v1_2',
lifecycleNotificationUrl: 'https://webhook.url',
}),
);
});
it('should throw an error if the URL is invalid', async () => {
mockWebhookFunctions.getNodeWebhookUrl.mockReturnValue('invalid-url');
await expect(
new MicrosoftTeamsTrigger().webhookMethods.default.create.call(mockWebhookFunctions),
).rejects.toThrow('Invalid Notification URL');
});
});
describe('delete', () => {
it('should delete subscriptions using stored IDs and clean static data', async () => {
const mockWebhookData = {
subscriptionIds: ['subscription123'],
};
mockWebhookFunctions.getWorkflowStaticData.mockReturnValue(mockWebhookData);
(microsoftApiRequest.call as jest.Mock).mockResolvedValue({});
const result = await new MicrosoftTeamsTrigger().webhookMethods.default.delete.call(
mockWebhookFunctions,
);
expect(result).toBe(true);
expect(microsoftApiRequest.call).toHaveBeenCalledWith(
mockWebhookFunctions,
'DELETE',
'/v1.0/subscriptions/subscription123',
);
expect(mockWebhookData.subscriptionIds).toBeUndefined();
});
it('should return false if no subscription matches', async () => {
(microsoftApiRequestAllItems.call as jest.Mock).mockResolvedValue([]);
mockWebhookFunctions.getNodeWebhookUrl.mockReturnValue('https://webhook.url');
mockWebhookFunctions.getWorkflowStaticData.mockReturnValue({
node: {
subscriptionIds: [],
},
});
const result = await new MicrosoftTeamsTrigger().webhookMethods.default.delete.call(
mockWebhookFunctions,
);
expect(result).toBe(false);
});
it('should throw an error if the API request fails', async () => {
(microsoftApiRequestAllItems.call as jest.Mock).mockResolvedValue([
{ id: 'subscription123', notificationUrl: 'https://webhook.url' },
]);
(microsoftApiRequest.call as jest.Mock).mockRejectedValue(new Error('API request failed'));
mockWebhookFunctions.getNodeWebhookUrl.mockReturnValue('https://webhook.url');
mockWebhookFunctions.getWorkflowStaticData.mockReturnValue({
node: {
subscriptionIds: ['subscription123'],
},
});
const result = await new MicrosoftTeamsTrigger().webhookMethods.default.delete.call(
mockWebhookFunctions,
);
expect(result).toBe(false);
});
});
});
describe('webhook', () => {
it('should handle Microsoft Graph validation request correctly', async () => {
const mockRequest = {
query: {
validationToken: 'validation-token',
},
};
const mockResponse = {
status: jest.fn().mockReturnThis(),
send: jest.fn(),
};
mockWebhookFunctions.getRequestObject.mockReturnValue(mockRequest);
mockWebhookFunctions.getResponseObject.mockReturnValue(mockResponse);
const result = await new MicrosoftTeamsTrigger().webhook.call(mockWebhookFunctions);
expect(mockResponse.status).toHaveBeenCalledWith(200);
expect(mockResponse.send).toHaveBeenCalledWith('validation-token');
expect(result.noWebhookResponse).toBe(true);
});
it('should process incoming event notifications', async () => {
const mockRequest = {
body: {
value: [{ resourceData: { message: 'test message' } }],
},
query: {},
};
const mockResponse = {
status: jest.fn().mockReturnThis(),
send: jest.fn(),
};
mockWebhookFunctions.getRequestObject.mockReturnValue(mockRequest);
mockWebhookFunctions.getResponseObject.mockReturnValue(mockResponse);
const result = await new MicrosoftTeamsTrigger().webhook.call(mockWebhookFunctions);
expect(result.workflowData).toEqual([
[
{
json: { message: 'test message' },
},
],
]);
});
});
});