feat: add campaign configuration controls

This commit is contained in:
2026-06-04 14:45:47 +02:00
parent 07841aea0f
commit 585c4eeb2a
24 changed files with 2941 additions and 34 deletions

View File

@@ -0,0 +1,100 @@
import assert from "node:assert/strict";
import test from "node:test";
import {
validateCampaignCreateInput,
validateCampaignUpdateInput,
} from "../lib/campaign-validation";
test("campaign mutation validation normalizes and enforces fixed Germany context", () => {
const payload = validateCampaignCreateInput({
status: "active",
recurrence: "daily",
postalCode: "10115",
radiusKm: 10,
maxNewLeadsPerRun: 5,
maxAuditsPerRun: 5,
});
assert.equal(payload.countryCode, "DE");
assert.equal(payload.country, "Deutschland");
});
test("campaign validation rejects invalid German PLZ", () => {
assert.throws(
() =>
validateCampaignCreateInput({
status: "active",
recurrence: "daily",
postalCode: "1234",
radiusKm: 10,
maxNewLeadsPerRun: 5,
maxAuditsPerRun: 5,
}),
(error: unknown) => {
return (
error instanceof Error &&
error.message.includes("5") &&
/PLZ|Postleitzahl/i.test(error.message)
);
},
);
});
test("campaign validation rejects decimal limits", () => {
assert.throws(
() =>
validateCampaignCreateInput({
status: "active",
recurrence: "daily",
postalCode: "10115",
radiusKm: 10.5,
maxNewLeadsPerRun: 5,
maxAuditsPerRun: 5,
}),
(error: unknown) => {
return error instanceof Error && error.message.includes("ganze");
},
);
});
test("campaign validation rejects invalid recurrence/status in German", () => {
assert.throws(
() =>
validateCampaignCreateInput({
status: "running",
recurrence: "daily",
postalCode: "10115",
radiusKm: 10,
maxNewLeadsPerRun: 5,
maxAuditsPerRun: 5,
}),
(error: unknown) => error instanceof Error && error.message.includes("Status"),
);
assert.throws(
() =>
validateCampaignCreateInput({
status: "active",
recurrence: "hourly",
postalCode: "10115",
radiusKm: 10,
maxNewLeadsPerRun: 5,
maxAuditsPerRun: 5,
}),
(error: unknown) =>
error instanceof Error && /Frequenz|ungültig/.test(error.message),
);
});
test("campaign update validation rejects partial Germany-context payloads", () => {
assert.throws(
() =>
validateCampaignUpdateInput({
countryCode: "DE",
}),
(error: unknown) =>
error instanceof Error &&
/vollständig|Deutschland-Kontext/.test(error.message),
);
});