import React from 'react';
import {render, screen} from '@testing-library/react';

jest.mock('@/services/mediaPageService', () => ({
  getMediaPage: jest.fn(),
}));

jest.mock('next/navigation', () => ({
  notFound: jest.fn(() => {
    throw new Error('NEXT_NOT_FOUND');
  }),
}));

import Page, {generateMetadata} from '../page';
import {getMediaPage} from '@/services/mediaPageService';
import {notFound} from 'next/navigation';

const mockedGetMediaPage = getMediaPage as jest.Mock;

const page = {
  slug: 'mentions-legales',
  langue: 'fr',
  titre: 'Mentions légales',
  contenu: '<p>Éditeur du site</p>',
};

const props = {params: Promise.resolve({locale: 'fr'})};

describe('Page mentions-legales', () => {
  beforeEach(() => {
    jest.clearAllMocks();
  });

  it('shouldRenderTheEditorialPageOfTheLocale', async () => {
    mockedGetMediaPage.mockResolvedValue(page);

    render(await Page(props));

    expect(mockedGetMediaPage).toHaveBeenCalledWith('mentions-legales', 'fr');
    expect(screen.getByRole('heading', {level: 1})).toHaveTextContent('Mentions légales');
    expect(screen.getByText('Éditeur du site')).toBeInTheDocument();
  });

  it('shouldBuildTheDocumentTitleFromThePageTitle', async () => {
    mockedGetMediaPage.mockResolvedValue(page);

    expect(await generateMetadata(props)).toEqual({title: 'Mentions légales - Tamm-Kreiz'});
  });

  it('shouldFallBackToTheSiteNameWhenThePageIsMissing', async () => {
    mockedGetMediaPage.mockResolvedValue(null);

    expect(await generateMetadata(props)).toEqual({title: 'Tamm-Kreiz'});
  });

  it('shouldReturnNotFoundWhenThePageIsMissing', async () => {
    mockedGetMediaPage.mockResolvedValue(null);

    await expect(Page(props)).rejects.toThrow('NEXT_NOT_FOUND');
    expect(notFound).toHaveBeenCalled();
  });
});
