65 lines
2.2 KiB
TypeScript
65 lines
2.2 KiB
TypeScript
import { heteroPostgresTest } from "@internal/testcontainers";
|
|
import { PrismaClient } from "@trigger.dev/database";
|
|
import { describe, expect, vi } from "vitest";
|
|
import { probeDistinctDatabases } from "~/v3/runOpsMigration/distinctDbSentinel.server";
|
|
|
|
// Spinning up two separate postgres clusters and probing each can exceed the 5s default.
|
|
vi.setConfig({ testTimeout: 60_000 });
|
|
|
|
function urlWithDatabase(uri: string, database: string): string {
|
|
const url = new URL(uri);
|
|
url.pathname = `/${database}`;
|
|
return url.toString();
|
|
}
|
|
|
|
describe("probeDistinctDatabases", () => {
|
|
heteroPostgresTest(
|
|
"reports distinct for two separate physical clusters",
|
|
async ({ uri14, uri17 }) => {
|
|
const result = await probeDistinctDatabases(uri14, uri17);
|
|
expect(result).toEqual({ distinct: true });
|
|
}
|
|
);
|
|
|
|
heteroPostgresTest(
|
|
"reports NOT distinct, citing the same physical database, when both URLs point at it",
|
|
async ({ uri14 }) => {
|
|
const result = await probeDistinctDatabases(uri14, uri14);
|
|
expect(result.distinct).toBe(false);
|
|
if (result.distinct === false) {
|
|
expect(result.reason).toMatch(/same physical database/i);
|
|
}
|
|
}
|
|
);
|
|
|
|
heteroPostgresTest(
|
|
"reports distinct for two databases in the SAME cluster",
|
|
async ({ postgresContainer14, uri14 }) => {
|
|
const otherDb = `sentinel_other_${Date.now()}`;
|
|
const admin = new PrismaClient({
|
|
datasources: {
|
|
db: { url: urlWithDatabase(postgresContainer14.getConnectionUri(), "postgres") },
|
|
},
|
|
});
|
|
try {
|
|
await admin.$executeRawUnsafe(`CREATE DATABASE "${otherDb}"`);
|
|
} finally {
|
|
await admin.$disconnect();
|
|
}
|
|
|
|
const otherUrl = urlWithDatabase(uri14, otherDb);
|
|
const result = await probeDistinctDatabases(uri14, otherUrl);
|
|
expect(result).toEqual({ distinct: true });
|
|
}
|
|
);
|
|
|
|
heteroPostgresTest(
|
|
"fails closed to NOT distinct when a probe cannot reach a database",
|
|
async ({ uri14 }) => {
|
|
const unreachable = "postgresql://nobody:nobody@127.0.0.1:1/does_not_exist";
|
|
const result = await probeDistinctDatabases(uri14, unreachable);
|
|
expect(result.distinct).toBe(false);
|
|
}
|
|
);
|
|
});
|