import { describe, expect, it } from '@jest/globals';
import { render, screen as rtlScreen } from '../../../../../tests/utils';
import { getReadingTimeFrom } from '../../../../utils/helpers';
import { PostPreviewMeta, type PostPreviewMetaData } from './post-preview-meta';
describe('PostPreviewMeta', () => {
it('can render a meta for the author', () => {
const meta = {
author: 'Gilberto70',
} satisfies PostPreviewMetaData;
render();
expect(rtlScreen.getByRole('term')).toHaveTextContent('Written by:');
expect(rtlScreen.getByRole('definition')).toHaveTextContent(meta.author);
});
it('can render a meta for a single comment', () => {
const meta = {
comments: {
count: 1,
postHeading: 'quae commodi deserunt',
},
} satisfies PostPreviewMetaData;
render();
expect(rtlScreen.getByRole('term')).toHaveTextContent('Comments:');
expect(rtlScreen.getByRole('definition').textContent).toBe(
`${meta.comments.count} comment about ${meta.comments.postHeading}`
);
});
it('can render a meta for comments with a link', () => {
const meta = {
comments: {
count: 3,
postHeading: 'quae commodi deserunt',
url: '#temporibus',
},
} satisfies PostPreviewMetaData;
render();
expect(rtlScreen.getByRole('term')).toHaveTextContent('Comments:');
expect(rtlScreen.getByRole('definition').textContent).toBe(
`${meta.comments.count} comments about ${meta.comments.postHeading}`
);
expect(rtlScreen.getByRole('link')).toHaveAttribute(
'href',
meta.comments.url
);
});
it('can render a meta for the publication date', () => {
const meta = {
publicationDate: '2002',
} satisfies PostPreviewMetaData;
render();
expect(rtlScreen.getByRole('term')).toHaveTextContent('Published on:');
expect(rtlScreen.getByRole('definition')).toHaveTextContent(
meta.publicationDate
);
});
it('can render a meta for thematics', () => {
const meta = {
thematics: [{ id: 1, name: 'autem', url: '#est' }],
} satisfies PostPreviewMetaData;
render();
expect(rtlScreen.getByRole('term')).toHaveTextContent('Thematic:');
expect(rtlScreen.getByRole('definition')).toHaveTextContent(
meta.thematics[0].name
);
expect(rtlScreen.getByRole('link')).toHaveAttribute(
'href',
meta.thematics[0].url
);
});
it('can render a meta for topics', () => {
const meta = {
topics: [{ id: 1, name: 'hic', url: '#ipsa' }],
} satisfies PostPreviewMetaData;
render();
expect(rtlScreen.getByRole('term')).toHaveTextContent('Topic:');
expect(rtlScreen.getByRole('definition')).toHaveTextContent(
meta.topics[0].name
);
expect(rtlScreen.getByRole('link')).toHaveAttribute(
'href',
meta.topics[0].url
);
});
it('can render a meta for the update date', () => {
const meta = {
updateDate: '2020',
} satisfies PostPreviewMetaData;
render();
expect(rtlScreen.getByRole('term')).toHaveTextContent('Updated on:');
expect(rtlScreen.getByRole('definition')).toHaveTextContent(
meta.updateDate
);
});
it('does not render a meta for the update date if it is equal to the publication date', () => {
const meta = {
publicationDate: '2020',
updateDate: '2020',
} satisfies PostPreviewMetaData;
render();
const terms = rtlScreen.getAllByRole('term');
expect(terms.length).toBe(1);
expect(terms[0].textContent).toBe('Published on:');
});
it('can render a meta for the reading time', () => {
const meta = {
wordsCount: 500,
} satisfies PostPreviewMetaData;
render();
expect(rtlScreen.getByRole('term')).toHaveTextContent('Reading time:');
expect(rtlScreen.getByRole('definition')).toHaveTextContent(
`${getReadingTimeFrom(meta.wordsCount).inMinutes()} minutes`
);
});
});