Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions src/client/campaigns.ts
Original file line number Diff line number Diff line change
Expand Up @@ -134,10 +134,8 @@ export function Campaigns<T extends Constructor<BaseIterableClient>>(Base: T) {
): Promise<CampaignMetricsResponse> {
const params = new URLSearchParams();
params.append("campaignId", options.campaignId.toString());
if (options.startDateTime)
params.append("startDateTime", options.startDateTime);
if (options.endDateTime)
params.append("endDateTime", options.endDateTime);
params.append("startDateTime", options.startDateTime);
params.append("endDateTime", options.endDateTime);

const response = await this.client.get(
`/api/campaigns/metrics?${params.toString()}`,
Expand Down
8 changes: 4 additions & 4 deletions src/types/campaigns.ts
Original file line number Diff line number Diff line change
Expand Up @@ -134,11 +134,11 @@ export type GetChildCampaignsParams = z.infer<

export const GetCampaignMetricsParamsSchema = z.object({
campaignId: z.number().describe("Campaign ID to get metrics for"),
startDateTime: IterableDateTimeSchema.optional().describe(
"Start date for metrics (YYYY-MM-DD HH:MM:SS format)"
startDateTime: IterableDateTimeSchema.describe(
"Start of the metrics date range (YYYY-MM-DD HH:MM:SS format). Always use the narrowest window possible for performance."
),
endDateTime: IterableDateTimeSchema.optional().describe(
"End date for metrics (YYYY-MM-DD HH:MM:SS format)"
endDateTime: IterableDateTimeSchema.describe(
"End of the metrics date range (YYYY-MM-DD HH:MM:SS format). Always use the narrowest window possible for performance."
),
});

Expand Down
2 changes: 2 additions & 0 deletions tests/integration/campaigns.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -293,6 +293,8 @@ describe("Campaign Management Integration Tests", () => {
withTimeout(
client.getCampaignMetrics({
campaignId: campaign.id,
startDateTime: new Date(campaign.createdAt).toISOString(),
endDateTime: new Date().toISOString(),
})
),
"Get campaign metrics"
Expand Down
43 changes: 38 additions & 5 deletions tests/unit/campaigns.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -239,13 +239,17 @@ describe("Campaign Management", () => {
it("should parse CSV metrics correctly", async () => {
const mockCsvData = "id,sent,delivered\n12345,1000,950\n12346,500,475";
const mockResponse = { data: mockCsvData };
const options = { campaignId: 12345, startDateTime: "2023-01-01" };
const options = {
campaignId: 12345,
startDateTime: "2023-01-01",
endDateTime: "2023-12-31",
};
mockAxiosInstance.get.mockResolvedValue(mockResponse);

const result = await client.getCampaignMetrics(options);

expect(mockAxiosInstance.get).toHaveBeenCalledWith(
"/api/campaigns/metrics?campaignId=12345&startDateTime=2023-01-01",
"/api/campaigns/metrics?campaignId=12345&startDateTime=2023-01-01&endDateTime=2023-12-31",
{ responseType: "text" }
);
expect(result).toHaveLength(2);
Expand All @@ -261,7 +265,11 @@ describe("Campaign Management", () => {
const mockResponse = { data: "" };
mockAxiosInstance.get.mockResolvedValue(mockResponse);

const result = await client.getCampaignMetrics({ campaignId: 12345 });
const result = await client.getCampaignMetrics({
campaignId: 12345,
startDateTime: "2023-01-01",
endDateTime: "2023-12-31",
});

expect(result).toEqual([]);
});
Expand All @@ -270,7 +278,11 @@ describe("Campaign Management", () => {
const mockResponse = { data: "id,sent,delivered" };
mockAxiosInstance.get.mockResolvedValue(mockResponse);

const result = await client.getCampaignMetrics({ campaignId: 12345 });
const result = await client.getCampaignMetrics({
campaignId: 12345,
startDateTime: "2023-01-01",
endDateTime: "2023-12-31",
});

expect(result).toEqual([]);
});
Expand All @@ -296,7 +308,11 @@ describe("Campaign Management", () => {
mockAxiosInstance.get.mockResolvedValue(mockResponse);

await expect(
client.getCampaignMetrics({ campaignId: 12345 })
client.getCampaignMetrics({
campaignId: 12345,
startDateTime: "2023-01-01",
endDateTime: "2023-12-31",
})
).rejects.toThrow("CSV parse error");
});
});
Expand Down Expand Up @@ -518,6 +534,23 @@ describe("Campaign Management", () => {
expect(() =>
GetCampaignMetricsParamsSchema.parse({
startDateTime: new Date("2023-01-01T00:00:00Z"),
endDateTime: new Date("2023-12-31T23:59:59Z"),
})
).toThrow();

// Missing required startDateTime
expect(() =>
GetCampaignMetricsParamsSchema.parse({
campaignId: 12345,
endDateTime: new Date("2023-12-31T23:59:59Z"),
})
).toThrow();

// Missing required endDateTime
expect(() =>
GetCampaignMetricsParamsSchema.parse({
campaignId: 12345,
startDateTime: new Date("2023-01-01T00:00:00Z"),
})
).toThrow();
});
Expand Down
Loading