style: format code for improved readability and consistency across multiple files
This commit is contained in:
@@ -1,14 +1,15 @@
|
||||
import process from "node:process";
|
||||
import {
|
||||
getDatabase,
|
||||
initializeDatabase,
|
||||
} from "../../src/database/drizzle";
|
||||
import { Pool } from "pg";
|
||||
import { getDatabase, initializeDatabase } from "../../src/database/drizzle";
|
||||
|
||||
interface RunnableDatabase {
|
||||
run(sql: string): Promise<unknown>;
|
||||
}
|
||||
|
||||
const SAFE_TEST_DATABASE_NAME = /(^|[_-])(test|testing)([_-]|$)|gmw_test/i;
|
||||
const DEFAULT_TEST_SCHEMA = "gmw_test";
|
||||
const SAFE_TEST_SCHEMA_NAME =
|
||||
/^[a-zA-Z_][a-zA-Z0-9_]*(test|testing)[a-zA-Z0-9_]*$/i;
|
||||
|
||||
function getDatabaseNameFromUrl(databaseUrl: string): string {
|
||||
try {
|
||||
@@ -26,6 +27,41 @@ function getConfiguredDatabaseName(): string {
|
||||
return process.env.POSTGRES_DB ?? "";
|
||||
}
|
||||
|
||||
function getTestSchemaName(): string {
|
||||
const schemaName = process.env.TEST_DATABASE_SCHEMA ?? DEFAULT_TEST_SCHEMA;
|
||||
if (!SAFE_TEST_SCHEMA_NAME.test(schemaName)) {
|
||||
throw new Error(
|
||||
`Refusing to use unsafe test schema "${schemaName}". Schema name must contain "test" and use identifier-safe characters only.`,
|
||||
);
|
||||
}
|
||||
return schemaName;
|
||||
}
|
||||
|
||||
function quoteIdentifier(identifier: string): string {
|
||||
return `"${identifier.replace(/"/g, '""')}"`;
|
||||
}
|
||||
|
||||
async function ensureTestSchemaExists(): Promise<void> {
|
||||
assertSafeTestDatabaseUrl();
|
||||
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
|
||||
const schemaName = getTestSchemaName();
|
||||
|
||||
try {
|
||||
await pool.query(
|
||||
`CREATE SCHEMA IF NOT EXISTS ${quoteIdentifier(schemaName)}`,
|
||||
);
|
||||
} finally {
|
||||
await pool.end();
|
||||
}
|
||||
}
|
||||
|
||||
async function configureTestSearchPath(): Promise<void> {
|
||||
const db = getTestDatabase();
|
||||
await db.run(
|
||||
`SET search_path TO ${quoteIdentifier(getTestSchemaName())}, public`,
|
||||
);
|
||||
}
|
||||
|
||||
export function assertSafeTestDatabaseUrl(): void {
|
||||
if (process.env.NODE_ENV !== "test") {
|
||||
throw new Error(
|
||||
@@ -38,16 +74,24 @@ export function assertSafeTestDatabaseUrl(): void {
|
||||
}
|
||||
|
||||
const databaseName = getConfiguredDatabaseName();
|
||||
if (!SAFE_TEST_DATABASE_NAME.test(databaseName)) {
|
||||
const hasSafeSchema = Boolean(process.env.TEST_DATABASE_SCHEMA);
|
||||
if (!SAFE_TEST_DATABASE_NAME.test(databaseName) && !hasSafeSchema) {
|
||||
throw new Error(
|
||||
`Refusing to run destructive database test against non-test database "${databaseName || "unknown"}". Set TEST_DATABASE_URL or DATABASE_URL to a database whose name contains "test" (for example hub_test).`,
|
||||
`Refusing to run destructive database test against non-test database "${databaseName || "unknown"}" without TEST_DATABASE_SCHEMA. Set TEST_DATABASE_SCHEMA to a safe test schema name or use a database whose name contains "test" (for example hub_test).`,
|
||||
);
|
||||
}
|
||||
|
||||
if (hasSafeSchema) {
|
||||
getTestSchemaName();
|
||||
}
|
||||
}
|
||||
|
||||
export async function initializeTestDatabase() {
|
||||
assertSafeTestDatabaseUrl();
|
||||
return initializeDatabase();
|
||||
await ensureTestSchemaExists();
|
||||
const database = await initializeDatabase();
|
||||
await configureTestSearchPath();
|
||||
return database;
|
||||
}
|
||||
|
||||
export function getTestDatabase(): RunnableDatabase {
|
||||
|
||||
@@ -1,17 +1,23 @@
|
||||
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||
|
||||
vi.mock("../../src/moderation/indonesianTextNormalizer.js", async (importOriginal) => {
|
||||
const actual = await importOriginal<typeof import("../../src/moderation/indonesianTextNormalizer.js")>();
|
||||
return {
|
||||
...actual,
|
||||
formatModerationTextEvidenceForPrompt: vi.fn(async (content: string) => {
|
||||
// Deterministic mock evidence — length tuned for the "tight budget" test:
|
||||
// maxTokens=300, target ~88, c3 ~108, c2 ~108, c1 ~108
|
||||
// Expectation: target+c3 fits (196), target+c3+c2 overflows (304)
|
||||
return "[text_evidence] categories=[\"offensive\",\"profanity\",\"sexual_violence\"] severity=high confidence=0.92 language=id detected=badword normalized=false metadata_v2=true context=true";
|
||||
}),
|
||||
};
|
||||
});
|
||||
vi.mock(
|
||||
"../../src/moderation/indonesianTextNormalizer.js",
|
||||
async (importOriginal) => {
|
||||
const actual =
|
||||
await importOriginal<
|
||||
typeof import("../../src/moderation/indonesianTextNormalizer.js")
|
||||
>();
|
||||
return {
|
||||
...actual,
|
||||
formatModerationTextEvidenceForPrompt: vi.fn(async (content: string) => {
|
||||
// Deterministic mock evidence — length tuned for the "tight budget" test:
|
||||
// maxTokens=300, target ~88, c3 ~108, c2 ~108, c1 ~108
|
||||
// Expectation: target+c3 fits (196), target+c3+c2 overflows (304)
|
||||
return '[text_evidence] categories=["offensive","profanity","sexual_violence"] severity=high confidence=0.92 language=id detected=badword normalized=false metadata_v2=true context=true';
|
||||
}),
|
||||
};
|
||||
},
|
||||
);
|
||||
|
||||
import {
|
||||
buildConversationContext,
|
||||
|
||||
@@ -65,4 +65,4 @@ describe("detectIndonesianBadwords remote fallback", () => {
|
||||
expect(mocks.axiosPost).toHaveBeenCalledTimes(1);
|
||||
expect(mocks.openaiCreate).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { afterAll, afterEach, describe, expect, it } from "vitest";
|
||||
import { config } from "../../src/config";
|
||||
import {
|
||||
buildModerationTextEvidence,
|
||||
detectIndonesianBadwords,
|
||||
@@ -6,7 +7,6 @@ import {
|
||||
normalizeDiscordCustomEmoji,
|
||||
normalizeIndonesianSlang,
|
||||
} from "../../src/moderation/indonesianTextNormalizer";
|
||||
import { config } from "../../src/config";
|
||||
|
||||
const originalNemotronKey = config.NVIDIA_NEMOTRON_API_KEY;
|
||||
const originalPrimaryAiKey = config.AI_LLM_API_KEY;
|
||||
@@ -105,7 +105,9 @@ describe("formatModerationTextEvidenceForPrompt", () => {
|
||||
expect(formatted).toContain("[emoji:hadeh]");
|
||||
expect(formatted).toContain("[normalization_notes:");
|
||||
// The NVIDIA API may or may not detect badwords for this input
|
||||
expect(formatted).toMatch(/no Indonesian badword detected|Indonesian badword detected/);
|
||||
expect(formatted).toMatch(
|
||||
/no Indonesian badword detected|Indonesian badword detected/,
|
||||
);
|
||||
});
|
||||
|
||||
it("includes normalized text even for clean input", async () => {
|
||||
|
||||
@@ -8,13 +8,13 @@ import {
|
||||
vi,
|
||||
} from "vitest";
|
||||
import { closeDatabase } from "../../src/database/drizzle";
|
||||
import { captureMessage } from "../../src/moderation/messageCapture";
|
||||
import type { ModerationBroadcaster } from "../../src/moderation/types";
|
||||
import {
|
||||
clearTestTables,
|
||||
getTestDatabase,
|
||||
initializeTestDatabase,
|
||||
} from "../helpers/testDatabase";
|
||||
import { captureMessage } from "../../src/moderation/messageCapture";
|
||||
import type { ModerationBroadcaster } from "../../src/moderation/types";
|
||||
|
||||
const queueMessageAnalysis = vi.fn();
|
||||
|
||||
|
||||
@@ -1,10 +1,5 @@
|
||||
import { afterAll, beforeAll, beforeEach, describe, expect, it } from "vitest";
|
||||
import { closeDatabase } from "../../src/database/drizzle";
|
||||
import {
|
||||
clearTestTables,
|
||||
getTestDatabase,
|
||||
initializeTestDatabase,
|
||||
} from "../helpers/testDatabase";
|
||||
import { createChildLogger } from "../../src/logger";
|
||||
import {
|
||||
decodeCursor,
|
||||
@@ -18,6 +13,11 @@ import {
|
||||
updateMessageAsEdited,
|
||||
} from "../../src/moderation/messageStore";
|
||||
import type { MessageRecord } from "../../src/moderation/types";
|
||||
import {
|
||||
clearTestTables,
|
||||
getTestDatabase,
|
||||
initializeTestDatabase,
|
||||
} from "../helpers/testDatabase";
|
||||
|
||||
const logger = createChildLogger("messageStoreQueries.test");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user