From 9f349b6c128f5947538d749629c1edc952f72f53 Mon Sep 17 00:00:00 2001 From: Narek Hovhannisyan Date: Mon, 17 Nov 2025 17:39:49 +0400 Subject: [PATCH 1/3] test: add additional tests for message retrieval with various query parameters --- .../lib/api/resources/Messages.test.ts | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/src/__tests__/lib/api/resources/Messages.test.ts b/src/__tests__/lib/api/resources/Messages.test.ts index 8b7da8c..9e49e88 100644 --- a/src/__tests__/lib/api/resources/Messages.test.ts +++ b/src/__tests__/lib/api/resources/Messages.test.ts @@ -185,6 +185,70 @@ describe("lib/api/resources/Messages: ", () => { expect(result).toEqual(expectedResponseData); }); + it("successfully gets messages with last_id parameter.", async () => { + const endpoint = `${GENERAL_ENDPOINT}/api/accounts/${accountId}/inboxes/${inboxId}/messages`; + const lastId = 100; + const expectedResponseData = [responseData]; + + mock + .onGet(endpoint, { params: { last_id: lastId } }) + .reply(200, expectedResponseData); + + const result = await messagesAPI.get(inboxId, { last_id: lastId }); + + expect(mock.history.get[0].url).toEqual(endpoint); + expect(mock.history.get[0].params).toEqual({ last_id: lastId }); + expect(result).toEqual(expectedResponseData); + }); + + it("successfully gets messages with page parameter.", async () => { + const endpoint = `${GENERAL_ENDPOINT}/api/accounts/${accountId}/inboxes/${inboxId}/messages`; + const page = 2; + const expectedResponseData = [responseData]; + + mock + .onGet(endpoint, { params: { page } }) + .reply(200, expectedResponseData); + + const result = await messagesAPI.get(inboxId, { page }); + + expect(mock.history.get[0].url).toEqual(endpoint); + expect(mock.history.get[0].params).toEqual({ page }); + expect(result).toEqual(expectedResponseData); + }); + + it("successfully gets messages with search parameter.", async () => { + const endpoint = `${GENERAL_ENDPOINT}/api/accounts/${accountId}/inboxes/${inboxId}/messages`; + const search = "test query"; + const expectedResponseData = [responseData]; + + mock + .onGet(endpoint, { params: { search } }) + .reply(200, expectedResponseData); + + const result = await messagesAPI.get(inboxId, { search }); + + expect(mock.history.get[0].url).toEqual(endpoint); + expect(mock.history.get[0].params).toEqual({ search }); + expect(result).toEqual(expectedResponseData); + }); + + it("successfully gets messages with all query parameters.", async () => { + const endpoint = `${GENERAL_ENDPOINT}/api/accounts/${accountId}/inboxes/${inboxId}/messages`; + const options = { last_id: 100, page: 2, search: "test query" }; + const expectedResponseData = [responseData]; + + mock + .onGet(endpoint, { params: options }) + .reply(200, expectedResponseData); + + const result = await messagesAPI.get(inboxId, options); + + expect(mock.history.get[0].url).toEqual(endpoint); + expect(mock.history.get[0].params).toEqual(options); + expect(result).toEqual(expectedResponseData); + }); + it("fails with error.", async () => { const expectedErrorMessage = "Request failed with status code 404"; From 9c41d982f0a7b4d07e258656de975ff1cebaff24 Mon Sep 17 00:00:00 2001 From: Narek Hovhannisyan Date: Mon, 17 Nov 2025 17:39:54 +0400 Subject: [PATCH 2/3] feat: enhance message retrieval API to support additional query parameters --- src/lib/api/resources/Messages.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/lib/api/resources/Messages.ts b/src/lib/api/resources/Messages.ts index 4e34239..cb8186e 100644 --- a/src/lib/api/resources/Messages.ts +++ b/src/lib/api/resources/Messages.ts @@ -5,6 +5,7 @@ import CONFIG from "../../../config"; import { EmailHeaders, Message, + MessageListOptions, MessageUpdateParams, Report, SpamReport, @@ -58,10 +59,16 @@ export default class MessagesApi { /** * Gets all messages in inboxes. */ - public async get(inboxId: number) { + public async get(inboxId: number, options?: MessageListOptions) { const url = `${this.messagesURL}/${inboxId}/messages`; - return this.client.get(url); + const params = { + ...(options?.last_id !== undefined && { last_id: options.last_id }), + ...(options?.page !== undefined && { page: options.page }), + ...(options?.search && { search: options.search }), + }; + + return this.client.get(url, { params }); } /** From 9c36c348e2e536c6863dbf661b956fd2ebfd41d5 Mon Sep 17 00:00:00 2001 From: Narek Hovhannisyan Date: Mon, 17 Nov 2025 17:39:59 +0400 Subject: [PATCH 3/3] feat: add SmtpInformationData type and extend Message type to include optional smtp_information data --- src/types/api/messages.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/types/api/messages.ts b/src/types/api/messages.ts index e7f3cba..0a376b3 100644 --- a/src/types/api/messages.ts +++ b/src/types/api/messages.ts @@ -1,3 +1,8 @@ +export type SmtpInformationData = { + mail_from_addr: string; + client_ip: string; +}; + export type Message = { id: number; inbox_id: number; @@ -22,6 +27,7 @@ export type Message = { blacklists_report_info: boolean; smtp_information: { ok: boolean; + data?: SmtpInformationData; }; }; @@ -69,3 +75,9 @@ export type SpamReport = { export type MessageUpdateParams = { isRead: boolean; }; + +export type MessageListOptions = { + last_id?: number; + page?: number; + search?: string; +};