import { describe, it, expect, vi, beforeEach } from 'vitest';
import Fastify from 'fastify';

// Mock mongoose and awilix before importing the plugin
vi.mock('mongoose', () => ({
  default: {
    connect: vi.fn().mockResolvedValue(undefined),
    disconnect: vi.fn().mockResolvedValue(undefined),
  },
}));

vi.mock('@fastify/awilix', () => ({
  diContainer: {
    register: vi.fn(),
  },
}));

import mongoosePlugin from '../../src/plugins/mongoose.plugin.js';
import mongoose from 'mongoose';
import { diContainer } from '@fastify/awilix';

describe('mongoose.plugin', () => {
  beforeEach(() => {
    vi.clearAllMocks();
  });

  it('connects to MongoDB on registration', async () => {
    const app = Fastify({ logger: false });
    await app.register(mongoosePlugin);
    await app.ready();

    expect(mongoose.connect).toHaveBeenCalled();
    expect(diContainer.register).toHaveBeenCalled();

    await app.close();
  });

  it('disconnects from MongoDB on close', async () => {
    const app = Fastify({ logger: false });
    await app.register(mongoosePlugin);
    await app.ready();
    await app.close();

    expect(mongoose.disconnect).toHaveBeenCalled();
  });
});
