aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/organisms/post-preview/post-preview-meta/post-preview-meta.test.tsx
blob: 188afccf82d2e6e0eb5c82648b9c7bd6253cb0ef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
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(<PostPreviewMeta meta={meta} />);

    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(<PostPreviewMeta meta={meta} />);

    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(<PostPreviewMeta meta={meta} />);

    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(<PostPreviewMeta meta={meta} />);

    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(<PostPreviewMeta meta={meta} />);

    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(<PostPreviewMeta meta={meta} />);

    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(<PostPreviewMeta meta={meta} />);

    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(<PostPreviewMeta meta={meta} />);

    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(<PostPreviewMeta meta={meta} />);

    expect(rtlScreen.getByRole('term')).toHaveTextContent('Reading time:');
    expect(rtlScreen.getByRole('definition')).toHaveTextContent(
      `${getReadingTimeFrom(meta.wordsCount).inMinutes()} minutes`
    );
  });
});