mirror of
https://github.com/juherr/kill-the-news.git
synced 2026-06-21 06:13:48 +00:00
refactor(domain): add FeedId, EmailAddress and Domain value objects
Encapsulate the email/domain/feed-id parsing that was scattered as ad-hoc
regexes and split("@") calls into three small immutable value objects under
src/domain/value-objects/. EmailParser.extractFeedId and generateFeedId now
delegate to FeedId; the sender policy, favicon domain extraction and the admin
SenderField parse through EmailAddress/Domain.
Left as-is on purpose: forwardemail's multi-address free-text extraction and the
admin allow/block list normaliser, which operate on mixed email-or-domain input
that the single-address value objects would reject.
Behaviour-preserving; adds unit tests for each value object.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
import { describe, it, expect } from "vitest";
|
||||
import { FeedId } from "./feed-id";
|
||||
|
||||
describe("FeedId.parse", () => {
|
||||
it("extracts the feed id from an inbound address", () => {
|
||||
expect(FeedId.parse("river.castle.42@example.com")?.value).toBe(
|
||||
"river.castle.42",
|
||||
);
|
||||
});
|
||||
|
||||
it("preserves the original casing of the local part", () => {
|
||||
expect(FeedId.parse("River.Castle.42@example.com")?.value).toBe(
|
||||
"River.Castle.42",
|
||||
);
|
||||
});
|
||||
|
||||
it("rejects malformed feed ids", () => {
|
||||
expect(FeedId.parse("user@example.com")).toBeNull();
|
||||
expect(FeedId.parse("notanemail")).toBeNull();
|
||||
expect(FeedId.parse("river.castle.4@example.com")).toBeNull();
|
||||
expect(FeedId.parse("river.castle.123@example.com")).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
describe("FeedId.generate", () => {
|
||||
it("produces the noun.noun.NN format", () => {
|
||||
for (let i = 0; i < 50; i++) {
|
||||
expect(FeedId.generate().value).toMatch(/^[a-z]+\.[a-z]+\.\d{2}$/);
|
||||
}
|
||||
});
|
||||
|
||||
it("round-trips through parse from an address", () => {
|
||||
const id = FeedId.generate();
|
||||
expect(FeedId.parse(`${id.value}@example.com`)?.value).toBe(id.value);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user