import { Project } from '@app/domain/projects/project.model';
import { ProjectPresenter } from '@app/adapters/projects/project.presenter';
import { mockProjects } from '@app/testing/project.mock';
import { ProjectViewModel } from '@app/adapters/projects/project.presenter.model';

describe('ProjectPresenter', () => {
  let presenter: ProjectPresenter;

  beforeEach(() => {
    presenter = new ProjectPresenter();
  });

  // ------------------------------------------
  // 🔹 TEST 1 : Conversion d’un seul projet
  // ------------------------------------------
  it('devrait convertir un projet en ProjectViewModel', () => {
    const projet: Project = mockProjects[0];

    const viewModel: ProjectViewModel = presenter.toViewModel(projet);

    expect(viewModel.id).toBe(projet.id);
    expect(viewModel.nom).toBe(projet.nom);
    expect(viewModel.lien).toBe(projet.lien);
    expect(viewModel.utilisateur).toBe(projet.utilisateur);
    expect(viewModel.description).toContain(projet.description);
  });

  // ------------------------------------------
  // 🔹 TEST 2 : Conversion d’une liste de projets
  // ------------------------------------------
  it('devrait convertir une liste de projets en liste de ViewModels', () => {
    const viewModels = presenter.toViewModels(mockProjects);

    expect(Array.isArray(viewModels)).toBe(true);
    expect(viewModels.length).toBe(mockProjects.length);

    // Vérifie que le premier élément est bien mappé
    expect(viewModels[0].nom).toBe(mockProjects[0].nom);
    expect(viewModels[0].lien).toBe(mockProjects[0].lien);
  });

  // ------------------------------------------
  // 🔹 TEST 3 : Vérification d’une conversion cohérente
  // ------------------------------------------
  it('devrait garder les mêmes données essentielles entre domaine et vue', () => {
    const projet = mockProjects[1];
    const vm = presenter.toViewModel(projet);

    expect(vm).toEqual(
      expect.objectContaining({
        id: projet.id,
        nom: projet.nom,
        utilisateur: projet.utilisateur,
        description: projet.description,
      })
    );
  });

  // ------------------------------------------
  // 🔹 TEST 4 : Conversion d’une liste vide
  // ------------------------------------------
  it('devrait renvoyer un tableau vide si aucun projet n’est fourni', () => {
    const result = presenter.toViewModels([]);
    expect(result).toEqual([]);
  });
});
