Skip to content

Commit b8d5023

Browse files
committed
fix integration tests
1 parent 2557748 commit b8d5023

File tree

5 files changed

+55
-64
lines changed

5 files changed

+55
-64
lines changed

.github/workflows/ci.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,9 @@ jobs:
103103
- name: Build Packages
104104
run: pnpm build
105105

106+
- name: Start Docker
107+
run: docker compose -f examples/hackernews/docker-compose.yml up -d --wait
108+
106109
- name: Run Tests
107110
uses: nick-fields/retry@v3
108111
with:

examples/hackernews/__integration-tests__/hackernews.spec.ts

Lines changed: 39 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,51 @@
1-
import path from 'node:path';
1+
import { resolve } from 'node:path';
2+
import { sql } from 'drizzle-orm';
3+
import { drizzle, NodePgDatabase } from 'drizzle-orm/node-postgres';
4+
import { migrate } from 'drizzle-orm/postgres-js/migrator';
25
import { createYoga, YogaServerInstance } from 'graphql-yoga';
3-
import { PrismaClient } from '@prisma/client';
4-
import { DbDrop, MigrateDev } from '@prisma/migrate';
5-
import type { GraphQLContext } from '../src/context';
6-
import { schema } from '../src/schema';
6+
import pg from 'pg';
7+
import type { GraphQLContext } from '../src/context.js';
8+
import { schema } from '../src/schema.js';
9+
10+
const connectionString =
11+
process.env['PG_CONNECTION_STRING'] ??
12+
'postgres://postgres:postgres@localhost:5432/postgres?currentSchema=integration-tests';
13+
14+
export async function resetDatabase(db: NodePgDatabase, schema: string) {
15+
// sql query for resetting the database
16+
const query = sql`
17+
DROP SCHEMA IF EXISTS ${sql.raw(schema)} CASCADE;
18+
CREATE SCHEMA ${sql.raw(schema)};
19+
`;
20+
await db.execute(query);
21+
}
722

823
describe('hackernews example integration', () => {
924
let yoga: YogaServerInstance<GraphQLContext, GraphQLContext>;
25+
let db: NodePgDatabase;
26+
let client: pg.Client;
27+
let currentSchema: string;
1028
beforeAll(async () => {
11-
const { createContext } = await import('../src/context');
12-
yoga = createYoga({ schema, context: createContext });
13-
14-
// migrate
15-
await MigrateDev.new().parse([
16-
`--schema=${path.resolve(__dirname, '..', 'prisma', 'schema.prisma')}`,
17-
]);
18-
19-
// seed
20-
const client = new PrismaClient();
21-
await client.link.create({
22-
data: {
23-
url: 'https://www.prisma.io',
24-
description: 'Prisma replaces traditional ORMs',
25-
},
29+
const url = new URL(connectionString);
30+
const cs = url.searchParams.get('currentSchema');
31+
if (!cs) {
32+
throw new Error("Must provide 'currentSchema' in the connection string");
33+
}
34+
currentSchema = cs;
35+
client = new pg.Client(connectionString);
36+
await client.connect();
37+
db = drizzle(client);
38+
await resetDatabase(db, currentSchema);
39+
await migrate(drizzle(client), {
40+
migrationsSchema: currentSchema,
41+
migrationsFolder: resolve(__dirname, '../src/drizzle'),
2642
});
27-
await client.$disconnect();
43+
yoga = createYoga({ schema, context: { db } });
2844
});
2945

3046
afterAll(async () => {
31-
// drop
32-
await DbDrop.new().parse([
33-
`--schema=${path.resolve(__dirname, '..', 'prisma', 'schema.prisma')}`,
34-
'--preview-feature', // DbDrop is an experimental feature
35-
'--force',
36-
]);
37-
});
38-
39-
it('should get posts from feed', async () => {
40-
const response = await yoga.fetch('http://yoga/graphql?query={feed{url,description}}');
41-
42-
const body = await response.json();
43-
expect(body).toMatchInlineSnapshot(`
44-
{
45-
"data": {
46-
"feed": [
47-
{
48-
"description": "Prisma replaces traditional ORMs",
49-
"url": "https://www.prisma.io",
50-
},
51-
],
52-
},
53-
}
54-
`);
47+
await resetDatabase(db, currentSchema);
48+
await client.end();
5549
});
5650

5751
it('should create a new post', async () => {

examples/hackernews/__integration-tests__/prisma__migrate.d.ts

Lines changed: 0 additions & 17 deletions
This file was deleted.

examples/hackernews/src/main.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import { createServer } from 'node:http';
22
import { drizzle } from 'drizzle-orm/node-postgres';
3-
import { migrate } from 'drizzle-orm/postgres-js/migrator';
43
import { createYoga } from 'graphql-yoga';
54
import pg from 'pg';
5+
import { migrateDatabase } from './migrate-database.js';
66
import { schema } from './schema.js';
77

88
async function main() {
99
const client = new pg.Client(process.env['PG_CONNECTION_STRING']);
1010
await client.connect();
11-
await migrate(drizzle(client), { migrationsFolder: './src/drizzle' });
11+
await migrateDatabase(client);
1212
const db = drizzle(client);
1313
const yoga = createYoga({ schema, context: { db } });
1414
const server = createServer(yoga);
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { resolve } from 'node:path';
2+
import { drizzle } from 'drizzle-orm/node-postgres';
3+
import { migrate } from 'drizzle-orm/postgres-js/migrator';
4+
import type pg from 'pg';
5+
6+
// get current directory in esm
7+
const __dirname = new URL('.', import.meta.url).pathname;
8+
9+
export async function migrateDatabase(client: pg.Client) {
10+
await migrate(drizzle(client), { migrationsFolder: resolve(__dirname, '/drizzle') });
11+
}

0 commit comments

Comments
 (0)