@oslokommune/punkt-testing-utils 12.27.8 → 12.27.10

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.
Files changed (2) hide show
  1. package/README.md +60 -55
  2. package/package.json +4 -4
package/README.md CHANGED
@@ -1,16 +1,58 @@
1
- # punkt-testing-library
1
+ # punkt-testing-utils
2
2
 
3
3
  Dette biblioteket oppstod for å gjøre det enklere å skrive frontend-tester i applikasjoner som bruker Punkt og testing-library.
4
4
 
5
- Siden testing-library ikke har veldig god støtte for custom elements (web components). Når du oppgraderer til ny Punkt-versjon, og Punkt-teamet har migrert komponenter fra React/Vue til Web components, risikerer du at testene dine begynner å feile på ikke-opplagt vis.
5
+ testing-library ikke har veldig god støtte for custom elements (web components). Når du oppgraderer til ny Punkt-versjon, og Punkt-teamet har migrert komponenter fra React/Vue til Web components, risikerer du at testene dine begynner å feile på ikke-opplagt vis.
6
6
 
7
- punkt-testing-library er ment å gjøre oppgradering til nye Punkt-versjoner mindre smertefullt, ved å abstrahere funksjoner fra testing-library og la deg som webapp-utvikler forholde deg til funksjoner som vedlikeholdes av Punkt.
7
+ punkt-testing-utils er ment å gjøre oppgradering til nye Punkt-versjoner mindre smertefullt, ved å abstrahere funksjoner fra testing-library og la meg som webapp-utvikler forholde meg til funksjoner som vedlikeholdes av Punkt.
8
+
9
+ ## Eksempel:
10
+ I Team Booking har vi en haug med tester på frontend-koden vår. Disse er skrevet i react-testing-library, og er dermed typisk noe sånt:
11
+
12
+ ### Uten punkt-testing-library
13
+ ```
14
+ render()
15
+ const input = screen.getByRole("textbox", "Skriv her")
16
+ fireEvent.change(input, "Noe tekst")
17
+ const submitButton = screen.getByLabelText("button", "Send inn")
18
+ fireEvent.click(button);
19
+ // Assert at noe er sendt inn
20
+ ```
21
+
22
+ Dette funker fint så lenge `getByRole` finner en `<input/>` og en `<button/>`, sånn at verdien blir satt og knappen trykket på, og det har fungert så lenge Punkt-komponentene har vært enkle React-komponenter.
23
+
24
+ Men etterhvert som Punkt skrives om til custom elements, holder ikke lenger den forutsetningen. En `getByRole` kan nå ende opp med å finne punkt-textinput sin interne, skjulte `<input>`, som ikke er ment å herjes med.
25
+ react-testing-library gir ikke noe gratis mtp custom elements.
26
+
27
+ Så hver gang vi har oppdatert webappen vår til ny Punkt-versjon, har en haug av testene våre brukket, og det har vært mye jobb med å fikse dem, **hver gang**.
28
+
29
+ ### Med punkt-testing-library
30
+ ```
31
+ const input = ptl.getPktElementByLabelText("Skriv her"); // ptl = punkt-testing-library
32
+ await ptl.setPktElementValue(input, "Noe tekst");
33
+ const submitButton = screen.getByLabelText("button", "Send inn")
34
+ await ptl.pktClickButton(submitButton);
35
+ // Assert at noe er sendt inn
36
+
37
+ ```
38
+ Dette er mindre sårbart fordi vi ikke trenger å vite om input-feltet er et `PktTextinput` eller et `HTMLInput`-element - så lenge vi holder oss til funksjoner fra punkt-testing-library, vil testene våre fungere uavhengig av hvilken versjon av Punkt vi bruker.
39
+
40
+ Funksjonene i punkt-testing-library støtter både gamle (ikke-custom-elements) og nye (custom elements) versjoner av Punkt-komponentene, sånn at testene ikke brekker når Punkt bytter implementasjon av komponentene sine. punkt-testing-library er i seg selv dekket av tester, og bor i kodebasen til Punkt, så Team Designsystem vil tidlig oppdage tidlig om de har endret noe som gjør at noe brekker.
41
+
42
+ Etter å ha skrevet om testene våre en siste (🤞) gang, denne gang til å bruke punkt-testing-library, har det vært (så godt som) smertefritt å bytte Punkt-versjon i webappen vår.
43
+
44
+ Funksjoner i punkt-testing-library som tar et element som parameter, kan også kalles med label, så eksempelet kan forkortes til
45
+ ```
46
+ await setPktElementValue('Skriv her', 'Noe tekst');
47
+ await pktClickButton('Send inn');
48
+ ```
49
+ Merk at funksjoner i punkt-testing-library som endrer verdier eller trigger events er asynkrone (returnerer et promise), så de bør alltid brukes med `await`.
8
50
 
9
51
  ## Installasjon og oppsett
10
52
  ```
11
- npm install --save-dev @oslokommune/punkt-testing-library
53
+ npm install --save-dev @oslokommune/punkt-testing-utils
12
54
  ```
13
- Du må initialisere punkt-testing-library med din testing-library-implementasjon, for eksempel:
55
+ Du må initialisere punkt-testing-library med din testing-library-implementasjon, med react-testing-library blir det sånn:
14
56
  ```
15
57
  import * as ReactTestingLibrary from '@testing-library/react';
16
58
 
@@ -22,65 +64,28 @@ const {
22
64
  getPktElementByPlaceholderText,
23
65
  waitForPktElementsToBeDefined,
24
66
  getPktSelectOptions,
25
- checkPktElement,
26
67
  } = setupPktTestingLibrary(ReactTestingLibrary)
27
68
  ```
28
69
  Dette kan du gjerne gjøre i en felles-fil som du importerer i testene dine.
29
70
 
30
- ## Eksempel:
31
-
32
- ### Uten punkt-testing-library
33
- ```
34
- const input = (await screen.findByLabelText("Mitt input-felt"));
35
- fireEvent.change(input, "Ny verdi");
36
- ```
37
- Dette er sårbart fordi `findByLabelText` kan returnere et `PktTextinput` eller det underliggende `HTMLInput`-elementet, avhengig av hvilken versjon av Punkt du bruker.
38
-
39
- ### Med punkt-testing-library
40
- ```
41
- const input = punktTestingLibrary.getPktElementByLabelText('Mitt input-felt');
42
- await punktTestingLibrary.changePktElementValue(input, 'Ny verdi');
43
- ```
44
- Dette er mindre sårbart fordi du ikke trenger å vite om input-feltet er et `PktTextinput` eller et `HTMLInput`-element - så lenge du holder deg til funksjoner fra punkt-testing-library, vil testene dine fungere uavhengig av hvilken versjon av Punkt du bruker.
45
-
46
- Funksjoner i punkt-testing-library som tar et element som parameter, kan også kalles med label, så eksempelet kan forkortes til
47
- ```
48
- const element = await punktTestingLibrary.setPktElementValue('Mitt input-felt', 'Ny verdi');
49
- ```
50
- Merk at funksjoner i punkt-testing-library som endrer verdier er asynkrone (returnerer et promise), så de bør alltid brukes med `await`.
51
-
52
71
  ## API
53
72
  ```
54
- export type LabelOrElement = string | RegExp | Element
55
-
56
- /**
57
- * Representerer en option i en PktSelect.
58
- *
59
- * @property {string} 0 - verdien (value)
60
- * @property {string | null} 1 - Tekstinnholdet, <option>tekstinnhold</option>
61
- * @property {boolean} 2 - Om denne er valgt (selected)
62
- */
73
+ type PktElementType = PktDatepicker | PktProgressbar | PktTextarea | PktInputWrapper | PktSelect | PktRadioButton;
74
+ export declare const waitForPktElementsToBeDefined: () => Promise<(CustomElementConstructor | undefined)[]>;
75
+ export declare const getPktElementByLabelText: (label: string, container?: HTMLElement) => PktElementType;
76
+ export declare function setPktElementValue(element: PktElementType, valueOrValues: string | Array<string>): Promise<boolean>;
77
+ export declare const setPktElementChecked: (element: PktElementType, checked: boolean) => Promise<boolean>;
63
78
  type PktOption = [string, string | null, boolean];
64
-
65
- export type PktTestingLibrary = {
66
- checkPktElement: (labelOrElement: LabelOrElement) => Promise<boolean>
67
- getPktElementByLabelText: (label: string, container?: HTMLElement) => Element
68
- getPktElementByPlaceholderText: (labelOrElement: LabelOrElement) => Element
69
- getPktSelectOptions: (labelOrElement: LabelOrElement<PktSelect>) => Array<PktOption>
70
- getAllPktElementsByLabelText: (label: string, container?: HTMLElement) => Element[]
71
- setPktElementChecked: (labelOrElement: LabelOrElement, checked: boolean) => Promise<boolean>
72
- setPktElementValue: (
73
- labelOrElement: LabelOrElement,
74
- valueOrValues: string | Array<string>,
75
- useInputEvent?: boolean,
76
- ) => Promise<boolean>
77
- pktClickButton: (labelOrElement: LabelOrElement) => Promise<boolean>
78
- waitForPktElementsToBeDefined: () => Promise<any>
79
- }
79
+ export declare const getPktSelectOptions: (selectElement: PktSelect) => Array<PktOption>;
80
+ export declare const setPktSelectedOptionsByLabel: (selectElement: PktElementType | HTMLSelectElement, ...optionLabels: Array<string>) => Promise<boolean>;
81
+ export declare const checkPktElement: (element: PktRadioButton) => Promise<boolean>;
82
+ export declare const getAllPktElementsByLabelText: (label: string, container?: HTMLElement) => Element[];
83
+ export declare const getPktElementByPlaceholderText: (container: Element, placeholder: string) => Element;
80
84
  ```
81
85
 
82
- ## Er dette bare for React?
83
- Nja - foreløpig er punkt-testing-library bare testet med react-testing-library. Bruker Punkt med Vue? Det _kan_ det hende at mye vil fungere med vue-testing-library også. Hvis du prøver, gi oss gjerne tilbakemelding, så er vi interesserte i å få det til å funke!
86
+ ## Men vent! Er dette bare for React? Hva med Vue? Svelte? Cypress? Playwright?
87
+ Foreløpig har vi ikke gjort noe for å støtte Vue, men det er en liten, teoretisk sjanse for at det funker ut av boksen. punkt-testing-library har en dependency til dom-testing-library, men ikke til react-testing-library. Du kan plugge inn ditt favoritt (testing-library-kompatible) test-bibliotek, for eksempel vue-testing-library og håpe at det funker - men det har vi som sagt ikke testa, ennå. Men prøv gjerne, og se hvor det tryner, så kan vi fikse det i fellesskap.
88
+ Hvis du bruker et testbibliotek som ikke er basert på testing-library, må du implementere en del funksjoner selv. I så fall kan det være best å kopiere koden lage et nytt testbibliotek.
84
89
 
85
90
  Det kan også være mulig å bruke punkt-testing-library med helt andre testrammeverk. Du må i så fall implementere `PktTestingLibraryOptions`-interfacet selv, og initialisere punkt-testing-library med din implementasjon:
86
91
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oslokommune/punkt-testing-utils",
3
- "version": "12.27.8",
3
+ "version": "12.27.10",
4
4
  "description": "Test-utilities for Punkt",
5
5
  "homepage": "https://punkt.oslo.kommune.no",
6
6
  "author": "Team Designsystem, Oslo Origo",
@@ -17,8 +17,8 @@
17
17
  "element-internals-polyfill": "^1.3.10"
18
18
  },
19
19
  "devDependencies": {
20
- "@oslokommune/punkt-elements": "^12.27.7",
21
- "@oslokommune/punkt-react": "^12.27.7",
20
+ "@oslokommune/punkt-elements": "^12.27.9",
21
+ "@oslokommune/punkt-react": "^12.27.9",
22
22
  "@testing-library/jest-dom": "^6.1.0",
23
23
  "@types/jest": "^29.5.0",
24
24
  "@types/testing-library__jest-dom": "^5.14.9",
@@ -65,5 +65,5 @@
65
65
  "url": "https://github.com/oslokommune/punkt/issues"
66
66
  },
67
67
  "license": "MIT",
68
- "gitHead": "c6df591fffd757aa56122b1897e79cdf11649d06"
68
+ "gitHead": "9a1c0b685b7d0358ef4f0b6c41344221bec593e3"
69
69
  }