Skip to content

Commit 4be3bef

Browse files
committed
Fix unit test
1 parent 4a1bb3b commit 4be3bef

6 files changed

Lines changed: 53 additions & 89 deletions

File tree

cover.jpg

-1.49 KB
Binary file not shown.

my-data-1776734445651.json

Lines changed: 0 additions & 76 deletions
This file was deleted.

src/components/Pages/MyData/client/__tests__/index.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ describe('PrivacyForm behavior', () => {
144144
const elements = getPrivacyFormElements(element)
145145
const accessSubmitButton = elements.accessForm.querySelector('button[type="submit"]')
146146

147-
expect(elements.accessForm.dataset.privacyState).toBe('loading')
147+
expect(elements.accessForm.dataset['privacyState']).toBe('loading')
148148
expect(elements.accessForm.getAttribute('aria-busy')).toBe('true')
149149
expect(accessSubmitButton).toBeInstanceOf(HTMLButtonElement)
150150
expect((accessSubmitButton as HTMLButtonElement).disabled).toBe(true)
@@ -155,7 +155,7 @@ describe('PrivacyForm behavior', () => {
155155
expect(accessLoadingToast?.textContent).toContain('Sending Request')
156156
expect(accessLoadingToast?.textContent).toContain('Your request is being prepared and submitted.')
157157

158-
expect(elements.deleteForm.dataset.privacyState).toBe('validation')
158+
expect(elements.deleteForm.dataset['privacyState']).toBe('validation')
159159
expect(elements.deleteEmailInput.getAttribute('aria-invalid')).toBe('true')
160160
expect(elements.deleteConfirmCheckbox.getAttribute('aria-invalid')).toBe('true')
161161

src/components/Pages/MyData/client/index.ts

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,12 @@ import { addScriptBreadcrumb, ClientScriptError } from '@components/scripts/erro
44
import { handleScriptError } from '@components/scripts/errors/handler'
55
import { defineCustomElement } from '@components/scripts/utils'
66
import type { WebComponentModule } from '@components/scripts/@types/webComponentModule'
7-
import { getPrivacyFormElements } from './selectors'
7+
import {
8+
getPrivacyFormElements,
9+
getPrivacyPreviewToastElement,
10+
getPrivacyPreviewToastElements,
11+
getPrivacySubmitButton,
12+
} from './selectors'
813

914
type MessageType = 'success' | 'error' | 'info'
1015
type RequestType = 'ACCESS' | 'DELETE'
@@ -70,10 +75,7 @@ export class PrivacyFormElement extends LitElement {
7075
private deleteMessage!: HTMLElement
7176

7277
private getPreviewToastElements(requestType: RequestType): HTMLElement[] {
73-
const prefix = requestType === 'ACCESS' ? 'access' : 'delete'
74-
return ['success', 'loading', 'error', 'validation']
75-
.map(state => this.querySelector<HTMLElement>(`#${prefix}-preview-toast-${state}`))
76-
.filter((el): el is HTMLElement => el !== null)
78+
return getPrivacyPreviewToastElements(requestType, this)
7779
}
7880

7981
override connectedCallback(): void {
@@ -160,7 +162,7 @@ export class PrivacyFormElement extends LitElement {
160162
state: RequestPreviewState | 'idle',
161163
requestType?: RequestType
162164
): void {
163-
form.dataset.privacyState = state
165+
form.dataset['privacyState'] = state
164166
form.setAttribute('aria-busy', String(state === 'loading'))
165167

166168
if (!requestType) {
@@ -172,8 +174,8 @@ export class PrivacyFormElement extends LitElement {
172174
}
173175

174176
private setSubmitLoading(form: HTMLFormElement, loading: boolean): void {
175-
const submitButton = form.querySelector('button[type="submit"]')
176-
if (submitButton instanceof HTMLButtonElement) {
177+
const submitButton = getPrivacySubmitButton(form)
178+
if (submitButton) {
177179
submitButton.disabled = loading
178180
}
179181
}
@@ -397,13 +399,12 @@ export class PrivacyFormElement extends LitElement {
397399
const isAccessRequest = requestType === 'ACCESS'
398400
const form = isAccessRequest ? this.accessForm : this.deleteForm
399401
const emailInput = isAccessRequest ? this.accessEmailInput : this.deleteEmailInput
400-
const prefix = isAccessRequest ? 'access' : 'delete'
401402

402403
// Show only the matching static SSR preview toast; hide all others for this form.
403404
for (const el of this.getPreviewToastElements(requestType)) {
404405
el.classList.add('hidden')
405406
}
406-
this.querySelector<HTMLElement>(`#${prefix}-preview-toast-${previewState}`)?.classList.remove('hidden')
407+
getPrivacyPreviewToastElement(requestType, previewState, this)?.classList.remove('hidden')
407408

408409
this.setRequestState(form, previewState, requestType)
409410
this.setSubmitLoading(form, previewState === 'loading')

src/components/Pages/MyData/client/selectors.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/**
22
* Selectors for PrivacyForm component elements
33
*/
4+
import { isButtonElement } from '@components/scripts/assertions/elements'
45
import { ClientScriptError } from '@components/scripts/errors'
56

67
type SelectorRoot = Document | DocumentFragment | Element
@@ -28,6 +29,19 @@ function queryRequiredElement<TElement extends Element>(
2829

2930
const isHtmlElement = (element: Element): element is HTMLElement => element instanceof HTMLElement
3031

32+
type RequestType = 'ACCESS' | 'DELETE'
33+
type RequestPreviewState = 'loading' | 'success' | 'error' | 'validation'
34+
35+
const previewToastStates: RequestPreviewState[] = ['success', 'loading', 'error', 'validation']
36+
37+
const getPreviewToastSelector = (
38+
requestType: RequestType,
39+
previewState: RequestPreviewState
40+
): string => {
41+
const prefix = requestType === 'ACCESS' ? 'access' : 'delete'
42+
return `#${prefix}-preview-toast-${previewState}`
43+
}
44+
3145
export interface PrivacyFormElements {
3246
statusMessage: HTMLElement | undefined
3347

@@ -93,3 +107,28 @@ export function getPrivacyFormElements(root?: SelectorRoot): PrivacyFormElements
93107
),
94108
}
95109
}
110+
111+
export function getPrivacyPreviewToastElements(
112+
requestType: RequestType,
113+
root?: SelectorRoot
114+
): HTMLElement[] {
115+
const resolvedRoot = resolveRoot(root)
116+
117+
return previewToastStates
118+
.map(previewState => resolvedRoot.querySelector(getPreviewToastSelector(requestType, previewState)))
119+
.filter((element): element is HTMLElement => element instanceof HTMLElement)
120+
}
121+
122+
export function getPrivacyPreviewToastElement(
123+
requestType: RequestType,
124+
previewState: RequestPreviewState,
125+
root?: SelectorRoot
126+
): HTMLElement | undefined {
127+
const element = resolveRoot(root).querySelector(getPreviewToastSelector(requestType, previewState))
128+
return element instanceof HTMLElement ? element : undefined
129+
}
130+
131+
export function getPrivacySubmitButton(form: HTMLFormElement): HTMLButtonElement | undefined {
132+
const button = form.querySelector('button[type="submit"]')
133+
return isButtonElement(button) ? button : undefined
134+
}

src/components/Pages/MyData/index.astro

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,7 @@ const deletePreviewState = resolvePreviewState(Astro.url.searchParams.get('delet
387387
</div>
388388
<div>
389389
<h3 class="mb-2 text-lg font-semibold text-danger">Check Your Details</h3>
390-
<p class="text-sm">Enter a valid email address and confirm the deletion request befope submitting.</p>
390+
<p class="text-sm">Enter a valid email address and confirm the deletion request before submitting.</p>
391391
</div>
392392
</div>
393393
</div>

0 commit comments

Comments
 (0)