Skip to content

Commit c3f423b

Browse files
test: add unit tests for ContactExportsApi methods including create and get
1 parent fa1fb87 commit c3f423b

File tree

1 file changed

+192
-0
lines changed

1 file changed

+192
-0
lines changed
Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
import axios from "axios";
2+
import AxiosMockAdapter from "axios-mock-adapter";
3+
4+
import ContactExportsApi from "../../../../lib/api/resources/ContactExports";
5+
import handleSendingError from "../../../../lib/axios-logger";
6+
import MailtrapError from "../../../../lib/MailtrapError";
7+
8+
import CONFIG from "../../../../config";
9+
10+
const { CLIENT_SETTINGS } = CONFIG;
11+
const { GENERAL_ENDPOINT } = CLIENT_SETTINGS;
12+
13+
describe("lib/api/resources/ContactExports: ", () => {
14+
let mock: AxiosMockAdapter;
15+
const accountId = 100;
16+
const contactExportsAPI = new ContactExportsApi(axios, accountId);
17+
18+
const createContactExportRequest = {
19+
filters: [
20+
{ name: "list_id", operator: "equal" as const, value: [101, 102] },
21+
{
22+
name: "subscription_status",
23+
operator: "equal" as const,
24+
value: "subscribed",
25+
},
26+
],
27+
};
28+
29+
const createContactExportResponse: {
30+
id: number;
31+
status: "started" | "created" | "finished";
32+
created_at: string;
33+
updated_at: string;
34+
url: string | null;
35+
} = {
36+
id: 69,
37+
status: "created",
38+
created_at: "2025-11-01T06:29:00.848Z",
39+
updated_at: "2025-11-01T06:29:00.848Z",
40+
url: null,
41+
};
42+
43+
const getContactExportResponse: {
44+
id: number;
45+
status: "started" | "created" | "finished";
46+
created_at: string;
47+
updated_at: string;
48+
url: string | null;
49+
} = {
50+
id: 69,
51+
status: "finished",
52+
created_at: "2025-11-01T06:29:00.848Z",
53+
updated_at: "2025-11-01T06:29:01.053Z",
54+
url: "https://mailsend-us-mailtrap-tmp-uploads.s3.amazonaws.com/data_exports/export.csv.gz",
55+
};
56+
57+
describe("class ContactExportsApi(): ", () => {
58+
describe("init: ", () => {
59+
it("initializes with all necessary params.", () => {
60+
expect(contactExportsAPI).toHaveProperty("create");
61+
expect(contactExportsAPI).toHaveProperty("get");
62+
});
63+
});
64+
});
65+
66+
beforeAll(() => {
67+
/**
68+
* Init Axios interceptors for handling response.data, errors.
69+
*/
70+
axios.interceptors.response.use(
71+
(response) => response.data,
72+
handleSendingError
73+
);
74+
mock = new AxiosMockAdapter(axios);
75+
});
76+
77+
afterEach(() => {
78+
mock.reset();
79+
});
80+
81+
describe("create(): ", () => {
82+
it("successfully creates a contact export.", async () => {
83+
const endpoint = `${GENERAL_ENDPOINT}/api/accounts/${accountId}/contacts/exports`;
84+
const expectedResponseData = createContactExportResponse;
85+
86+
expect.assertions(2);
87+
88+
mock
89+
.onPost(endpoint, createContactExportRequest)
90+
.reply(200, expectedResponseData);
91+
const result = await contactExportsAPI.create(createContactExportRequest);
92+
93+
expect(mock.history.post[0].url).toEqual(endpoint);
94+
expect(result).toEqual(expectedResponseData);
95+
});
96+
97+
it("fails with error when filters are invalid.", async () => {
98+
const endpoint = `${GENERAL_ENDPOINT}/api/accounts/${accountId}/contacts/exports`;
99+
const expectedErrorMessage = {
100+
errors: {
101+
filters: "invalid",
102+
},
103+
};
104+
105+
expect.assertions(2);
106+
107+
mock.onPost(endpoint).reply(422, expectedErrorMessage);
108+
109+
try {
110+
await contactExportsAPI.create(createContactExportRequest);
111+
} catch (error) {
112+
expect(error).toBeInstanceOf(MailtrapError);
113+
if (error instanceof MailtrapError) {
114+
// axios logger returns "[object Object]" for error objects, so we check for that
115+
expect(error.message).toBe("[object Object]");
116+
}
117+
}
118+
});
119+
120+
it("fails with error when accountId is invalid.", async () => {
121+
const endpoint = `${GENERAL_ENDPOINT}/api/accounts/${accountId}/contacts/exports`;
122+
const expectedErrorMessage = "Account not found";
123+
124+
expect.assertions(2);
125+
126+
mock.onPost(endpoint).reply(404, { error: expectedErrorMessage });
127+
128+
try {
129+
await contactExportsAPI.create(createContactExportRequest);
130+
} catch (error) {
131+
expect(error).toBeInstanceOf(MailtrapError);
132+
if (error instanceof MailtrapError) {
133+
expect(error.message).toContain(expectedErrorMessage);
134+
}
135+
}
136+
});
137+
});
138+
139+
describe("get(): ", () => {
140+
const exportId = 69;
141+
142+
it("successfully gets a contact export by id.", async () => {
143+
const endpoint = `${GENERAL_ENDPOINT}/api/accounts/${accountId}/contacts/exports/${exportId}`;
144+
const expectedResponseData = getContactExportResponse;
145+
146+
expect.assertions(2);
147+
148+
mock.onGet(endpoint).reply(200, expectedResponseData);
149+
const result = await contactExportsAPI.get(exportId);
150+
151+
expect(mock.history.get[0].url).toEqual(endpoint);
152+
expect(result).toEqual(expectedResponseData);
153+
});
154+
155+
it("fails with error when export not found.", async () => {
156+
const endpoint = `${GENERAL_ENDPOINT}/api/accounts/${accountId}/contacts/exports/${exportId}`;
157+
const expectedErrorMessage = "Export not found";
158+
159+
expect.assertions(2);
160+
161+
mock.onGet(endpoint).reply(404, { error: expectedErrorMessage });
162+
163+
try {
164+
await contactExportsAPI.get(exportId);
165+
} catch (error) {
166+
expect(error).toBeInstanceOf(MailtrapError);
167+
if (error instanceof MailtrapError) {
168+
expect(error.message).toContain(expectedErrorMessage);
169+
}
170+
}
171+
});
172+
173+
it("fails with error when exportId is invalid.", async () => {
174+
const invalidExportId = 999;
175+
const endpoint = `${GENERAL_ENDPOINT}/api/accounts/${accountId}/contacts/exports/${invalidExportId}`;
176+
const expectedErrorMessage = "Export not found";
177+
178+
expect.assertions(2);
179+
180+
mock.onGet(endpoint).reply(404, { error: expectedErrorMessage });
181+
182+
try {
183+
await contactExportsAPI.get(invalidExportId);
184+
} catch (error) {
185+
expect(error).toBeInstanceOf(MailtrapError);
186+
if (error instanceof MailtrapError) {
187+
expect(error.message).toContain(expectedErrorMessage);
188+
}
189+
}
190+
});
191+
});
192+
});

0 commit comments

Comments
 (0)