@@ -86,4 +86,99 @@ describe("Replication Client", () => {
8686 await client.stop();
8787 }
8888 );
89+
90+ postgresAndRedisTest(
91+ "should be able to teardown",
92+ async ({ postgresContainer, prisma, redisOptions }) => {
93+ await prisma.$executeRawUnsafe(`ALTER TABLE public."TaskRun" REPLICA IDENTITY FULL;`);
94+
95+ const client = new LogicalReplicationClient({
96+ name: "test",
97+ slotName: "test_slot",
98+ publicationName: "test_publication",
99+ redisOptions,
100+ table: "TaskRun",
101+ pgConfig: {
102+ connectionString: postgresContainer.getConnectionUri(),
103+ },
104+ });
105+
106+ const logs: Array<{
107+ lsn: string;
108+ log: unknown;
109+ }> = [];
110+
111+ client.events.on("data", (data) => {
112+ console.log(data);
113+ logs.push(data);
114+ });
115+
116+ client.events.on("error", (error) => {
117+ console.error(error);
118+ });
119+
120+ await client.subscribe();
121+
122+ const organization = await prisma.organization.create({
123+ data: {
124+ title: "test",
125+ slug: "test",
126+ },
127+ });
128+
129+ const project = await prisma.project.create({
130+ data: {
131+ name: "test",
132+ slug: "test",
133+ organizationId: organization.id,
134+ externalRef: "test",
135+ },
136+ });
137+
138+ const runtimeEnvironment = await prisma.runtimeEnvironment.create({
139+ data: {
140+ slug: "test",
141+ type: "DEVELOPMENT",
142+ projectId: project.id,
143+ organizationId: organization.id,
144+ apiKey: "test",
145+ pkApiKey: "test",
146+ shortcode: "test",
147+ },
148+ });
149+
150+ // Now we insert a row into the table
151+ await prisma.taskRun.create({
152+ data: {
153+ friendlyId: "run_1234",
154+ taskIdentifier: "my-task",
155+ payload: JSON.stringify({ foo: "bar" }),
156+ traceId: "1234",
157+ spanId: "1234",
158+ queue: "test",
159+ runtimeEnvironmentId: runtimeEnvironment.id,
160+ projectId: project.id,
161+ },
162+ });
163+
164+ // Wait for a bit of time
165+ await setTimeout(50);
166+
167+ // Now we should see the row in the logs
168+ expect(logs.length).toBeGreaterThan(0);
169+
170+ const slotDropped = await client.teardown();
171+
172+ expect(slotDropped).toBe(true);
173+
174+ // Now the replication slot should be gone
175+ const slotExists = await prisma.$queryRaw<
176+ { exists: boolean }[]
177+ >`SELECT EXISTS (SELECT 1 FROM pg_replication_slots WHERE slot_name = 'test_slot');`;
178+
179+ console.log(slotExists);
180+
181+ expect(slotExists[0].exists).toBe(false);
182+ }
183+ );
89184});
0 commit comments