import { faker } from '@faker-js/faker'
import { PrismaClient } from '@prisma/client'
import { afterAll, afterEach, describe, expect, test } from 'vitest'
import { extension } from './find-or-create'

const prisma = new PrismaClient({
  // log: ["query"],
})

describe('Find or Create', () => {
  afterEach(async () => {
    await prisma.user.deleteMany()
  })

  afterAll(async () => {
    await prisma.$disconnect()
  })

  const xprisma = prisma.$extends(extension)

  test('find', async () => {
    const user = await xprisma.user.create({
      data: {
        firstName: faker.name.firstName(),
        lastName: faker.name.lastName(),
      },
    })

    const res = await xprisma.user.findOrCreate({
      select: { id: true },
      where: {
        id: user.id,
      },
      create: {
        firstName: faker.name.firstName(),
        lastName: faker.name.lastName(),
      },
    })

    expect(res.id).toEqual(user.id)
  })

  test('create', async () => {
    const res = await xprisma.user.findOrCreate({
      select: { id: true },
      where: {
        id: 0,
      },
      create: {
        firstName: faker.name.firstName(),
        lastName: faker.name.lastName(),
      },
    })

    expect(res).toEqual(
      expect.objectContaining({
        id: expect.any(Number),
      }),
    )
  })
})
