Write tests with Testcontainers
Create src/customer-repository.test.js with the test:
const { Client } = require("pg");
const { PostgreSqlContainer } = require("@testcontainers/postgresql");
const {
createCustomerTable,
createCustomer,
getCustomers,
} = require("./customer-repository");
describe("Customer Repository", () => {
jest.setTimeout(60000);
let postgresContainer;
let postgresClient;
beforeAll(async () => {
postgresContainer = await new PostgreSqlContainer().start();
postgresClient = new Client({
connectionString: postgresContainer.getConnectionUri(),
});
await postgresClient.connect();
await createCustomerTable(postgresClient);
});
afterAll(async () => {
await postgresClient.end();
await postgresContainer.stop();
});
it("should create and return multiple customers", async () => {
const customer1 = { id: 1, name: "John Doe" };
const customer2 = { id: 2, name: "Jane Doe" };
await createCustomer(postgresClient, customer1);
await createCustomer(postgresClient, customer2);
const customers = await getCustomers(postgresClient);
expect(customers).toEqual([customer1, customer2]);
});
});Here's what the test does:
- The
beforeAllblock starts a real PostgreSQL container usingPostgreSqlContainer. It then creates apgclient connected to the container and sets up thecustomerstable. - The
afterAllblock closes the client connection and stops the container. - The test inserts two customers, fetches all customers, and asserts the results match.
The test timeout is set to 60 seconds to allow time for the container to start on the first run (when the Docker image needs to be pulled).