aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/molecules/card/card.test.tsx
blob: 40a5830e276110b5e9c68446c79f9f990b0ef007 (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
import { describe, expect, it } from '@jest/globals';
import { render, screen as rtlScreen } from '@testing-library/react';
import NextImage from 'next/image';
import { Card } from './card';
import { CardFooter } from './card-footer';
import { CardHeader } from './card-header';
import { CardMeta } from './card-meta';

describe('Card', () => {
  it('renders its children', () => {
    const body = 'eveniet error voluptas';

    render(<Card>{body}</Card>);

    expect(rtlScreen.getByText(body)).toBeInTheDocument();
  });

  it('can render a cover in the card header', () => {
    const altTxt = 'quo expedita eveniet';

    render(
      <Card
        cover={
          <NextImage
            alt={altTxt}
            height={480}
            src="https://picsum.photos/640/480"
            width={640}
          />
        }
      >
        <CardHeader />
      </Card>
    );

    expect(rtlScreen.getByRole('img', { name: altTxt })).toBeInTheDocument();
  });

  it('does not render a cover without card header', () => {
    const body = 'necessitatibus maiores sed';
    const altTxt = 'quo expedita eveniet';

    render(
      <Card
        cover={
          <NextImage
            alt={altTxt}
            height={480}
            src="https://picsum.photos/640/480"
            width={640}
          />
        }
      >
        {body}
      </Card>
    );

    expect(
      rtlScreen.queryByRole('img', { name: altTxt })
    ).not.toBeInTheDocument();
  });

  it('can render some meta in the card footer', () => {
    const term = 'ut';
    const desc = 'repudiandae';

    render(
      <Card
        meta={<CardMeta items={[{ id: 'any', label: term, value: desc }]} />}
      >
        <CardFooter />
      </Card>
    );

    expect(rtlScreen.getByRole('term')).toHaveTextContent(term);
    expect(rtlScreen.getByRole('definition')).toHaveTextContent(desc);
  });

  it('does not render the meta without card footer', () => {
    const body = 'rerum dolore et';
    const term = 'ut';
    const desc = 'repudiandae';

    render(
      <Card
        meta={<CardMeta items={[{ id: 'any', label: term, value: desc }]} />}
      >
        {body}
      </Card>
    );

    expect(
      rtlScreen.queryByRole('term', { name: term })
    ).not.toBeInTheDocument();
    expect(
      rtlScreen.queryByRole('definition', { name: desc })
    ).not.toBeInTheDocument();
  });

  it('can render a card as link to another page', () => {
    const body = 'Et qui harum voluptas est quos qui.';
    const cta = 'asperiores optio incidunt';
    const target = '#molestiae';

    render(
      <Card aria-label={cta} linkTo={target}>
        {body}
      </Card>
    );

    expect(rtlScreen.getByRole('link', { name: cta })).toHaveAttribute(
      'href',
      target
    );
  });

  it('can render a card with centered text', () => {
    const body = 'Et qui harum voluptas est quos qui.';
    const label = 'asperiores optio incidunt';

    render(
      <Card aria-label={label} isCentered>
        {body}
      </Card>
    );

    expect(rtlScreen.getByLabelText(label)).toHaveClass('wrapper--centered');
  });
});