@oslokommune/punkt-elements 13.5.1 → 13.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,49 +1,48 @@
1
1
  import '@testing-library/jest-dom'
2
2
  import { axe, toHaveNoViolations } from 'jest-axe'
3
3
  import { fireEvent } from '@testing-library/dom'
4
+ import { createElementTest, BaseTestConfig } from '../../tests/test-framework'
5
+ import { CustomElementFor } from '../../tests/component-registry'
6
+ import './calendar'
4
7
 
5
8
  expect.extend(toHaveNoViolations)
6
9
 
7
- import './calendar'
8
- import { PktCalendar } from './calendar'
9
-
10
- const waitForCustomElements = async () => {
11
- await customElements.whenDefined('pkt-calendar')
10
+ export interface CalendarTestConfig extends BaseTestConfig {
11
+ withcontrols?: boolean
12
+ weeknumbers?: boolean
13
+ multiple?: boolean
14
+ range?: boolean
15
+ earliest?: string
16
+ latest?: string
17
+ currentmonth?: string
18
+ excludedates?: string
19
+ excludeweekdays?: string
12
20
  }
13
21
 
14
- // Helper function to create calendar markup
15
- const createCalendar = async (calendarProps = '') => {
16
- const container = document.createElement('div')
17
- container.innerHTML = `
18
- <pkt-calendar ${calendarProps}></pkt-calendar>
19
- `
20
- document.body.appendChild(container)
21
- await waitForCustomElements()
22
- return container
22
+ // Use shared framework
23
+ export const createCalendarTest = async (config: CalendarTestConfig = {}) => {
24
+ const { container, element } = await createElementTest<
25
+ CustomElementFor<'pkt-calendar'>,
26
+ CalendarTestConfig
27
+ >('pkt-calendar', config)
28
+
29
+ return {
30
+ container,
31
+ calendar: element,
32
+ }
23
33
  }
24
34
 
25
- // Cleanup after each test
26
- afterEach(() => {
27
- document.body.innerHTML = ''
28
- })
29
-
30
35
  describe('PktCalendar', () => {
31
36
  describe('Accessibility', () => {
32
37
  test('has no accessibility violations', async () => {
33
- const container = await createCalendar('withcontrols weeknumbers')
34
-
35
- const calendar = container.querySelector('pkt-calendar') as PktCalendar
36
- await calendar.updateComplete
38
+ const { calendar } = await createCalendarTest({ withcontrols: true, weeknumbers: true })
37
39
 
38
40
  const results = await axe(calendar)
39
41
  expect(results).toHaveNoViolations()
40
42
  })
41
43
 
42
44
  test('has proper ARIA attributes', async () => {
43
- const container = await createCalendar('withcontrols')
44
-
45
- const calendar = container.querySelector('pkt-calendar') as PktCalendar
46
- await calendar.updateComplete
45
+ const { calendar } = await createCalendarTest({ withcontrols: true })
47
46
 
48
47
  const calendarTable = calendar.querySelector('.pkt-calendar__body')
49
48
  expect(calendarTable).toHaveAttribute('role', 'grid')
@@ -56,10 +55,7 @@ describe('PktCalendar', () => {
56
55
  })
57
56
 
58
57
  test('navigation buttons have proper labels', async () => {
59
- const container = await createCalendar('withcontrols')
60
-
61
- const calendar = container.querySelector('pkt-calendar') as PktCalendar
62
- await calendar.updateComplete
58
+ const { calendar } = await createCalendarTest({ withcontrols: true })
63
59
 
64
60
  const prevButton = calendar.querySelector('.pkt-calendar__prev-month')
65
61
  const nextButton = calendar.querySelector('.pkt-calendar__next-month')
@@ -69,10 +65,7 @@ describe('PktCalendar', () => {
69
65
  })
70
66
 
71
67
  test('date buttons have proper accessible names', async () => {
72
- const container = await createCalendar()
73
-
74
- const calendar = container.querySelector('pkt-calendar') as PktCalendar
75
- await calendar.updateComplete
68
+ const { calendar } = await createCalendarTest()
76
69
 
77
70
  const dateButtons = calendar.querySelectorAll('.pkt-calendar__date')
78
71
  dateButtons.forEach((button) => {
@@ -82,10 +75,7 @@ describe('PktCalendar', () => {
82
75
  })
83
76
 
84
77
  test('selected dates have proper ARIA state', async () => {
85
- const container = await createCalendar()
86
-
87
- const calendar = container.querySelector('pkt-calendar') as PktCalendar
88
- await calendar.updateComplete
78
+ const { calendar } = await createCalendarTest()
89
79
 
90
80
  const firstDate = calendar.querySelector(
91
81
  '.pkt-calendar__date:not(.pkt-calendar__date--disabled)',
@@ -97,10 +87,7 @@ describe('PktCalendar', () => {
97
87
  })
98
88
 
99
89
  test('disabled dates have proper ARIA state', async () => {
100
- const container = await createCalendar('excludeweekdays="0,6"')
101
-
102
- const calendar = container.querySelector('pkt-calendar') as PktCalendar
103
- await calendar.updateComplete
90
+ const { calendar } = await createCalendarTest({ excludeweekdays: '0,6' })
104
91
 
105
92
  const disabledDates = calendar.querySelectorAll('.pkt-calendar__date--disabled')
106
93
  disabledDates.forEach((date) => {
@@ -1,26 +1,40 @@
1
1
  import '@testing-library/jest-dom'
2
2
  import { axe, toHaveNoViolations } from 'jest-axe'
3
+ import { createElementTest, BaseTestConfig } from '../../tests/test-framework'
4
+ import { CustomElementFor } from '../../tests/component-registry'
5
+ import './card'
3
6
 
4
7
  expect.extend(toHaveNoViolations)
5
8
 
6
- import './card'
7
- import { PktCard } from './card'
8
-
9
- const waitForCustomElements = async () => {
10
- await customElements.whenDefined('pkt-card')
9
+ export interface CardTestConfig extends BaseTestConfig {
10
+ skin?: string
11
+ layout?: string
12
+ padding?: string
13
+ borderOnHover?: boolean
14
+ heading?: string
15
+ subheading?: string
16
+ headingLevel?: number
17
+ href?: string
18
+ linkText?: string
19
+ image?: string
20
+ imageAlt?: string
21
+ tags?: string
22
+ metaPrefix?: string
23
+ metaLabel?: string
24
+ metaDate?: string
11
25
  }
12
26
 
13
- // Helper function to create card markup
14
- const createCard = async (cardProps = '', content = 'Card content') => {
15
- const container = document.createElement('div')
16
- container.innerHTML = `
17
- <pkt-card ${cardProps}>
18
- ${content}
19
- </pkt-card>
20
- `
21
- document.body.appendChild(container)
22
- await waitForCustomElements()
23
- return container
27
+ // Use shared framework
28
+ export const createCardTest = async (config: CardTestConfig = {}) => {
29
+ const { container, element } = await createElementTest<
30
+ CustomElementFor<'pkt-card'>,
31
+ CardTestConfig
32
+ >('pkt-card', config)
33
+
34
+ return {
35
+ container,
36
+ card: element,
37
+ }
24
38
  }
25
39
 
26
40
  // Cleanup after each test
@@ -43,9 +57,8 @@ afterEach(() => {
43
57
  describe('PktCard', () => {
44
58
  describe('Rendering and basic functionality', () => {
45
59
  test('renders without errors', async () => {
46
- const container = await createCard()
60
+ const { card } = await createCardTest()
47
61
 
48
- const card = container.querySelector('pkt-card') as PktCard
49
62
  expect(card).toBeInTheDocument()
50
63
 
51
64
  await card.updateComplete
@@ -57,9 +70,7 @@ describe('PktCard', () => {
57
70
  })
58
71
 
59
72
  test('renders content in slot', async () => {
60
- const container = await createCard('', '<p>Test content here</p>')
61
-
62
- const card = container.querySelector('pkt-card') as PktCard
73
+ const { card } = await createCardTest({ content: '<p>Test content here</p>' })
63
74
  await card.updateComplete
64
75
 
65
76
  const content = card.querySelector('.pkt-card__content')
@@ -68,9 +79,7 @@ describe('PktCard', () => {
68
79
  })
69
80
 
70
81
  test('renders basic structure correctly', async () => {
71
- const container = await createCard('heading="Test Heading"', 'Test content')
72
-
73
- const card = container.querySelector('pkt-card') as PktCard
82
+ const { card } = await createCardTest({ heading: 'Test Heading', content: 'Test content' })
74
83
  await card.updateComplete
75
84
 
76
85
  const article = card.querySelector('article')
@@ -86,9 +95,7 @@ describe('PktCard', () => {
86
95
 
87
96
  describe('Properties and attributes', () => {
88
97
  test('applies default properties correctly', async () => {
89
- const container = await createCard()
90
-
91
- const card = container.querySelector('pkt-card') as PktCard
98
+ const { card } = await createCardTest()
92
99
  await card.updateComplete
93
100
 
94
101
  expect(card.skin).toBe('outlined')
@@ -111,8 +118,7 @@ describe('PktCard', () => {
111
118
  const skins = ['outlined', 'outlined-beige', 'gray', 'beige', 'green', 'blue']
112
119
 
113
120
  for (const skin of skins) {
114
- const container = await createCard(`skin="${skin}"`)
115
- const card = container.querySelector('pkt-card') as PktCard
121
+ const { card } = await createCardTest({ skin })
116
122
  await card.updateComplete
117
123
 
118
124
  expect(card.skin).toBe(skin)
@@ -120,9 +126,6 @@ describe('PktCard', () => {
120
126
 
121
127
  const article = card.querySelector('article')
122
128
  expect(article).toHaveClass(`pkt-card--${skin}`)
123
-
124
- // Cleanup for next iteration
125
- container.remove()
126
129
  }
127
130
  })
128
131
 
@@ -130,8 +133,7 @@ describe('PktCard', () => {
130
133
  const unsupportedSkins = ['zebra', 'goldenrod', 'hotpink', 'rainbow', 'invalid']
131
134
 
132
135
  for (const invalidSkin of unsupportedSkins) {
133
- const container = await createCard(`skin="${invalidSkin}"`)
134
- const card = container.querySelector('pkt-card') as PktCard
136
+ const { card } = await createCardTest({ skin: invalidSkin })
135
137
  await card.updateComplete
136
138
 
137
139
  // The component should now validate skin values and fall back to default
@@ -143,9 +145,6 @@ describe('PktCard', () => {
143
145
  expect(article).not.toHaveClass(`pkt-card--${invalidSkin}`)
144
146
  // Should have the default skin class instead
145
147
  expect(article).toHaveClass('pkt-card--outlined')
146
-
147
- // Cleanup for next iteration
148
- container.remove()
149
148
  }
150
149
  })
151
150
 
@@ -154,8 +153,7 @@ describe('PktCard', () => {
154
153
  consoleWarnSpy.mockRestore()
155
154
  const localConsoleSpy = jest.spyOn(console, 'warn').mockImplementation(() => {})
156
155
 
157
- const container = await createCard(`skin="zebra"`)
158
- const card = container.querySelector('pkt-card') as PktCard
156
+ const { card } = await createCardTest({ skin: 'zebra' })
159
157
  await card.updateComplete
160
158
 
161
159
  // Should have logged a warning with the correct default value from spec
@@ -175,8 +173,7 @@ describe('PktCard', () => {
175
173
  const layouts = ['vertical', 'horizontal']
176
174
 
177
175
  for (const layout of layouts) {
178
- const container = await createCard(`layout="${layout}"`)
179
- const card = container.querySelector('pkt-card') as PktCard
176
+ const { card } = await createCardTest({ layout })
180
177
  await card.updateComplete
181
178
 
182
179
  expect(card.layout).toBe(layout)
@@ -184,9 +181,6 @@ describe('PktCard', () => {
184
181
 
185
182
  const article = card.querySelector('article')
186
183
  expect(article).toHaveClass(`pkt-card--${layout}`)
187
-
188
- // Cleanup for next iteration
189
- container.remove()
190
184
  }
191
185
  })
192
186
 
@@ -194,8 +188,7 @@ describe('PktCard', () => {
194
188
  const paddingOptions = ['none', 'default']
195
189
 
196
190
  for (const padding of paddingOptions) {
197
- const container = await createCard(`padding="${padding}"`)
198
- const card = container.querySelector('pkt-card') as PktCard
191
+ const { card } = await createCardTest({ padding })
199
192
  await card.updateComplete
200
193
 
201
194
  expect(card.padding).toBe(padding)
@@ -203,16 +196,12 @@ describe('PktCard', () => {
203
196
 
204
197
  const article = card.querySelector('article')
205
198
  expect(article).toHaveClass(`pkt-card--padding-${padding}`)
206
-
207
- // Cleanup for next iteration
208
- container.remove()
209
199
  }
210
200
  })
211
201
 
212
202
  test('handles borderOnHover property correctly', async () => {
213
203
  // Test with borderOnHover false
214
- const container = await createCard()
215
- const card = container.querySelector('pkt-card') as PktCard
204
+ const { card } = await createCardTest()
216
205
  card.borderOnHover = false
217
206
  await card.updateComplete
218
207
 
@@ -225,9 +214,7 @@ describe('PktCard', () => {
225
214
 
226
215
  describe('Heading functionality', () => {
227
216
  test('renders heading when provided', async () => {
228
- const container = await createCard('heading="Test Card Title"')
229
-
230
- const card = container.querySelector('pkt-card') as PktCard
217
+ const { card } = await createCardTest({ heading: 'Test Card Title' })
231
218
  await card.updateComplete
232
219
 
233
220
  expect(card.heading).toBe('Test Card Title')
@@ -239,9 +226,7 @@ describe('PktCard', () => {
239
226
  })
240
227
 
241
228
  test('renders subheading when provided', async () => {
242
- const container = await createCard('subheading="Test Subheading"')
243
-
244
- const card = container.querySelector('pkt-card') as PktCard
229
+ const { card } = await createCardTest({ subheading: 'Test Subheading' })
245
230
  await card.updateComplete
246
231
 
247
232
  expect(card.subheading).toBe('Test Subheading')
@@ -252,9 +237,7 @@ describe('PktCard', () => {
252
237
  })
253
238
 
254
239
  test('applies correct heading level', async () => {
255
- const container = await createCard('heading="Test" headinglevel="2"')
256
-
257
- const card = container.querySelector('pkt-card') as PktCard
240
+ const { card } = await createCardTest({ heading: 'Test', headingLevel: 2 })
258
241
  await card.updateComplete
259
242
 
260
243
  expect(card.headinglevel).toBe(2)
@@ -264,9 +247,7 @@ describe('PktCard', () => {
264
247
  })
265
248
 
266
249
  test('does not render header when no heading or subheading', async () => {
267
- const container = await createCard()
268
-
269
- const card = container.querySelector('pkt-card') as PktCard
250
+ const { card } = await createCardTest()
270
251
  await card.updateComplete
271
252
 
272
253
  const header = card.querySelector('.pkt-card__header')
@@ -276,9 +257,7 @@ describe('PktCard', () => {
276
257
 
277
258
  describe('Link functionality', () => {
278
259
  test('renders as regular card when no clickCardLink', async () => {
279
- const container = await createCard('heading="Test Title"')
280
-
281
- const card = container.querySelector('pkt-card') as PktCard
260
+ const { card } = await createCardTest({ heading: 'Test Title' })
282
261
  await card.updateComplete
283
262
 
284
263
  expect(card.clickCardLink).toBe(null)
@@ -293,8 +272,7 @@ describe('PktCard', () => {
293
272
  })
294
273
 
295
274
  test('renders as link card when clickCardLink provided', async () => {
296
- const container = await createCard('heading="Test Title"')
297
- const card = container.querySelector('pkt-card') as PktCard
275
+ const { card } = await createCardTest({ heading: 'Test Title' })
298
276
  card.clickCardLink = '/test-url'
299
277
  await card.updateComplete
300
278
 
@@ -312,8 +290,7 @@ describe('PktCard', () => {
312
290
  })
313
291
 
314
292
  test('handles openLinkInNewTab correctly', async () => {
315
- const container = await createCard('heading="Test"')
316
- const card = container.querySelector('pkt-card') as PktCard
293
+ const { card } = await createCardTest({ heading: 'Test' })
317
294
  card.clickCardLink = '/test'
318
295
  card.openLinkInNewTab = true
319
296
  await card.updateComplete
@@ -325,8 +302,7 @@ describe('PktCard', () => {
325
302
  })
326
303
 
327
304
  test('applies correct aria-label for link cards', async () => {
328
- const container = await createCard()
329
- const card = container.querySelector('pkt-card') as PktCard
305
+ const { card } = await createCardTest()
330
306
  card.clickCardLink = '/test'
331
307
  card.ariaLabel = 'Custom aria label'
332
308
  await card.updateComplete
@@ -338,8 +314,7 @@ describe('PktCard', () => {
338
314
 
339
315
  describe('Image functionality', () => {
340
316
  test('renders image when provided', async () => {
341
- const container = await createCard()
342
- const card = container.querySelector('pkt-card') as PktCard
317
+ const { card } = await createCardTest()
343
318
  card.image = { src: '/test-image.jpg', alt: 'Test image' }
344
319
  await card.updateComplete
345
320
 
@@ -355,9 +330,7 @@ describe('PktCard', () => {
355
330
  })
356
331
 
357
332
  test('does not render image when not provided', async () => {
358
- const container = await createCard()
359
-
360
- const card = container.querySelector('pkt-card') as PktCard
333
+ const { card } = await createCardTest()
361
334
  await card.updateComplete
362
335
 
363
336
  const imageDiv = card.querySelector('.pkt-card__image')
@@ -368,8 +341,7 @@ describe('PktCard', () => {
368
341
  const shapes = ['square', 'round'] as const
369
342
 
370
343
  for (const shape of shapes) {
371
- const container = await createCard()
372
- const card = container.querySelector('pkt-card') as PktCard
344
+ const { card } = await createCardTest()
373
345
  card.image = { src: '/test.jpg', alt: 'Test' }
374
346
  card.imageShape = shape
375
347
  await card.updateComplete
@@ -378,17 +350,13 @@ describe('PktCard', () => {
378
350
 
379
351
  const imageDiv = card.querySelector('.pkt-card__image')
380
352
  expect(imageDiv).toHaveClass(`pkt-card__image-${shape}`)
381
-
382
- // Cleanup for next iteration
383
- container.remove()
384
353
  }
385
354
  })
386
355
  })
387
356
 
388
357
  describe('Tags functionality', () => {
389
358
  test('renders tags when provided', async () => {
390
- const container = await createCard()
391
- const card = container.querySelector('pkt-card') as PktCard
359
+ const { card } = await createCardTest()
392
360
  card.tags = [
393
361
  { text: 'Tag 1', skin: 'blue' },
394
362
  { text: 'Tag 2', skin: 'green' },
@@ -405,8 +373,7 @@ describe('PktCard', () => {
405
373
  })
406
374
 
407
375
  test('renders single tag with correct aria-label', async () => {
408
- const container = await createCard()
409
- const card = container.querySelector('pkt-card') as PktCard
376
+ const { card } = await createCardTest()
410
377
  card.tags = [{ text: 'Single Tag' }]
411
378
  await card.updateComplete
412
379
 
@@ -418,8 +385,7 @@ describe('PktCard', () => {
418
385
  const positions = ['top', 'bottom'] as const
419
386
 
420
387
  for (const position of positions) {
421
- const container = await createCard()
422
- const card = container.querySelector('pkt-card') as PktCard
388
+ const { card, container } = await createCardTest()
423
389
  card.tags = [{ text: 'Test Tag' }]
424
390
  card.tagPosition = position
425
391
  await card.updateComplete
@@ -435,9 +401,7 @@ describe('PktCard', () => {
435
401
  })
436
402
 
437
403
  test('does not render tags when array is empty', async () => {
438
- const container = await createCard()
439
-
440
- const card = container.querySelector('pkt-card') as PktCard
404
+ const { card } = await createCardTest()
441
405
  await card.updateComplete
442
406
 
443
407
  const tagsContainer = card.querySelector('.pkt-card__tags')
@@ -447,8 +411,7 @@ describe('PktCard', () => {
447
411
 
448
412
  describe('Metadata functionality', () => {
449
413
  test('renders metadata when provided', async () => {
450
- const container = await createCard()
451
- const card = container.querySelector('pkt-card') as PktCard
414
+ const { card } = await createCardTest()
452
415
  card.metaLead = 'Author Name'
453
416
  card.metaTrail = '2023-12-01'
454
417
  await card.updateComplete
@@ -468,8 +431,7 @@ describe('PktCard', () => {
468
431
  })
469
432
 
470
433
  test('renders only metaLead when metaTrail not provided', async () => {
471
- const container = await createCard()
472
- const card = container.querySelector('pkt-card') as PktCard
434
+ const { card } = await createCardTest()
473
435
  card.metaLead = 'Author Only'
474
436
  await card.updateComplete
475
437
 
@@ -484,8 +446,7 @@ describe('PktCard', () => {
484
446
  })
485
447
 
486
448
  test('renders only metaTrail when metaLead not provided', async () => {
487
- const container = await createCard()
488
- const card = container.querySelector('pkt-card') as PktCard
449
+ const { card } = await createCardTest()
489
450
  card.metaTrail = 'Date Only'
490
451
  await card.updateComplete
491
452
 
@@ -500,9 +461,7 @@ describe('PktCard', () => {
500
461
  })
501
462
 
502
463
  test('does not render metadata when neither provided', async () => {
503
- const container = await createCard()
504
-
505
- const card = container.querySelector('pkt-card') as PktCard
464
+ const { card } = await createCardTest()
506
465
  await card.updateComplete
507
466
 
508
467
  const metadata = card.querySelector('.pkt-card__metadata')
@@ -512,11 +471,10 @@ describe('PktCard', () => {
512
471
 
513
472
  describe('Content placement and structure', () => {
514
473
  test('renders content elements in correct order', async () => {
515
- const container = await createCard(
516
- 'heading="Test Title" subheading="Test Sub"',
517
- 'Main content here',
518
- )
519
- const card = container.querySelector('pkt-card') as PktCard
474
+ const { card } = await createCardTest({
475
+ heading: 'Test Title',
476
+ subheading: 'Test Sub',
477
+ })
520
478
  card.tags = [{ text: 'Test Tag' }]
521
479
  card.image = { src: '/test.jpg', alt: 'Test' }
522
480
  card.metaLead = 'Author'
@@ -541,8 +499,7 @@ describe('PktCard', () => {
541
499
  })
542
500
 
543
501
  test('places tags at bottom when tagPosition is bottom', async () => {
544
- const container = await createCard('heading="Test Title"', 'Main content')
545
- const card = container.querySelector('pkt-card') as PktCard
502
+ const { card } = await createCardTest({ heading: 'Test Title' })
546
503
  card.tags = [{ text: 'Test Tag' }]
547
504
  card.tagPosition = 'bottom'
548
505
  await card.updateComplete
@@ -559,12 +516,10 @@ describe('PktCard', () => {
559
516
 
560
517
  describe('Accessibility', () => {
561
518
  test('has no accessibility violations', async () => {
562
- const container = await createCard(
563
- 'heading="Accessible Card" aria-label="Test card"',
564
- 'Accessible content',
565
- )
566
-
567
- const card = container.querySelector('pkt-card') as PktCard
519
+ const { card } = await createCardTest({
520
+ heading: 'Accessible Card',
521
+ })
522
+ await card.updateComplete
568
523
  await card.updateComplete
569
524
 
570
525
  const results = await axe(card)
@@ -572,8 +527,7 @@ describe('PktCard', () => {
572
527
  })
573
528
 
574
529
  test('applies correct ARIA attributes', async () => {
575
- const container = await createCard('heading="Test"')
576
- const card = container.querySelector('pkt-card') as PktCard
530
+ const { card } = await createCardTest({ heading: 'Test' })
577
531
  card.ariaLabel = 'Custom accessible label'
578
532
  await card.updateComplete
579
533
 
@@ -584,9 +538,7 @@ describe('PktCard', () => {
584
538
  })
585
539
 
586
540
  test('falls back to heading for aria-label when no explicit aria-label', async () => {
587
- const container = await createCard('heading="Default Aria Label"')
588
-
589
- const card = container.querySelector('pkt-card') as PktCard
541
+ const { card } = await createCardTest({ heading: 'Default Aria Label' })
590
542
  await card.updateComplete
591
543
 
592
544
  const article = card.querySelector('article')
@@ -594,9 +546,7 @@ describe('PktCard', () => {
594
546
  })
595
547
 
596
548
  test('falls back to "kort" when no heading or aria-label', async () => {
597
- const container = await createCard()
598
-
599
- const card = container.querySelector('pkt-card') as PktCard
549
+ const { card } = await createCardTest()
600
550
  await card.updateComplete
601
551
 
602
552
  const article = card.querySelector('article')