import test from "ava";
import { PrismaClient } from '@prisma/client';
import { PrismaPg } from '@prisma/adapter-pg';
import request from 'supertest';
import bcrypt from 'bcryptjs';
import 'dotenv/config';
import { Express } from 'express';
import { createApp } from '../../src/createApp';
let prisma: PrismaClient;
let app: Express;
test.before(() => {
process.env.NODE_ENV = 'test';
const connectionString = process.env.DATABASE_URL || 'postgres://user:password@orbit_db:5432/orbit_test';
const adapter = new PrismaPg({ connectionString });
prisma = new PrismaClient({ adapter });
// Create Express app with test Prisma client
app = createApp(prisma);
});
test.beforeEach(async () => {
// Clean database before each test
try {
await prisma.user.deleteMany({});
} catch (err) {
console.error('Error cleaning test DB:', err);
}
});
test.after.always(async () => {
await prisma?.$disconnect();
});
test("PUT /users/:id updates user profile", async (t) => {
// Create a user first
const user = await prisma.user.create({
data: {
email: "update@example.com",
firstName: "Original",
lastName: "Name",
encryptedPassword: bcrypt.hashSync("password", 10)
}
});
const updateData = {
firstName: "Updated",
lastName: "Profile"
};
// TODO: Gotta check why its failing. Most likely due to the
// cors/credentials: true line
const response = await request(app)
.put(`/users/${user.id}`)
.send(updateData)
.expect('Content-Type', /json/)
.expect(200);
t.is(response.body.user.firstName, updateData.firstName);
t.is(response.body.user.lastName, updateData.lastName);
t.is(response.body.user.email, user.email); // Should remain unchanged
// Verify in database
const dbUser = await prisma.user.findUnique({
where: { id: user.id }
});
t.is(dbUser!.firstName, updateData.firstName);
t.is(dbUser!.lastName, updateData.lastName);
});
test("PUT /users/:id returns 404 for non-existent user", async (t) => {
const response = await request(app)
.put('/users/999999')
.send({
firstName: "Updated",
lastName: "Name"
})
.expect('Content-Type', /json/)
.expect(404);
t.truthy(response.body.error);
});