shootismoke/backend

View on GitHub
e2e/util/apollo.ts

Summary

Maintainability
A
0 mins
Test Coverage
import {
    ApolloServerTestClient,
    createTestClient,
} from 'apollo-server-testing';
import mongoose from 'mongoose';

import { createServer } from '../../src/apollo';

// process.env.MONGO_URL ends with '?', which we remove
export const MONGO_TEST_DB = `${process.env.MONGO_URL as string}`.slice(0, -1);

/**
 * Reset DB, and setup fresh Apollo server
 */
export async function reset(testName: string): Promise<ApolloServerTestClient> {
    const uri = `${MONGO_TEST_DB}-${testName}`;
    process.env.MONGODB_ATLAS_URI = uri;
    const server = await createServer({ uri });
    await mongoose.connection.dropDatabase();

    return createTestClient(server);
}

/**
 * Teardown the db connection
 */
export async function teardown(): Promise<void> {
    await mongoose.connection.close();
}

/**
 * A jest `describe` block, wrapped in an Apollo server
 */
export function describeApollo(
    testName: string,
    fn: (client: Promise<ApolloServerTestClient>) => void
): void {
    const client = reset(testName);

    describe(testName, () => {
        beforeAll(async (done) => {
            await client;

            done();
        });

        fn(client);

        afterAll(async (done) => {
            await teardown();

            done();
        });
    });
}