Validation: the dump validators refuse the nulls their shared types don't allow (a null title or note on creation, a null URL on edit); a playlist title of spaces is refused and titles are stored trimmed; usernames and emails are checked by the same USERNAME_RE and EMAIL_RE in shared/validation.ts on sign-up, on PATCH /api/users/me (which checked other limits) and in the sign-up form. Mentions are read by shared/mention.ts's mentionedUsernames, which skips code and URLs as Markdown shows them: https://mastodon.social/@bob or a `@bob` in code notified bob; the editor's suggestions derive their trigger from the same pattern instead of a copy. Following an unknown user is a 404 rather than a foreign-key 500, and following a private playlist a 404 rather than a 403 that confirmed it exists. `ws` and `emojibase` are reserved category slugs, since the server answers them before the app. GET /api/users/me no longer turns every error into a 500. Dead code goes: adminOnlyMiddleware, verifyEmailTransport, listUsers, deleteUser with disconnectUser and the force_logout message only it sent, PATCH /api/notifications/:id/read (with markOneRead), isSlugAvailable, the unreachable 500 in fetchComment, and the `if (!ctx.state.user)` checks behind authMiddleware. 214 backend and 627 frontend tests pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
38 lines
1.3 KiB
TypeScript
38 lines
1.3 KiB
TypeScript
import "../setup.ts";
|
|
import { assert, assertFalse } from "@std/assert";
|
|
import {
|
|
isCreateUrlDumpRequest,
|
|
isUpdateDumpRequest,
|
|
} from "../../validators/dump.ts";
|
|
|
|
Deno.test("dump requests", () => {
|
|
assert(isCreateUrlDumpRequest({ url: "https://x" }));
|
|
assert(
|
|
isCreateUrlDumpRequest({
|
|
url: "https://x",
|
|
title: "t",
|
|
comment: "c",
|
|
isPrivate: true,
|
|
categoryIds: ["a"],
|
|
}),
|
|
);
|
|
assertFalse(isCreateUrlDumpRequest({}));
|
|
assertFalse(isCreateUrlDumpRequest({ url: "https://x", comment: null }));
|
|
assertFalse(isCreateUrlDumpRequest({ url: "https://x", title: null }));
|
|
assertFalse(
|
|
isCreateUrlDumpRequest({ url: "https://x", title: "x".repeat(201) }),
|
|
);
|
|
assertFalse(
|
|
isCreateUrlDumpRequest({ url: "https://x", comment: "x".repeat(5001) }),
|
|
);
|
|
assertFalse(isCreateUrlDumpRequest({ url: "https://x", isPrivate: "true" }));
|
|
assertFalse(isCreateUrlDumpRequest({ url: "https://x", categoryIds: [1] }));
|
|
|
|
assert(isUpdateDumpRequest({}));
|
|
assert(isUpdateDumpRequest({ comment: null }));
|
|
assertFalse(isUpdateDumpRequest({ url: null }));
|
|
assertFalse(isUpdateDumpRequest({ title: " " }));
|
|
assertFalse(isUpdateDumpRequest({ title: "x".repeat(201) }));
|
|
assertFalse(isUpdateDumpRequest({ categoryIds: "a" }));
|
|
});
|