eletrotupi / tcc / api/tests/users/update.test.ts master
2.2 KB Raw
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);
});