| 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');
  });
});
 |