Skip to content

Commit

Permalink
updates
Browse files Browse the repository at this point in the history
  • Loading branch information
Cami committed Aug 1, 2024
1 parent 8b49a97 commit 22b41be
Show file tree
Hide file tree
Showing 8 changed files with 144 additions and 9 deletions.
1 change: 0 additions & 1 deletion .eslintignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,3 @@
*.testjs
*.testts
LICENSE
src/ag-mock.js
1 change: 0 additions & 1 deletion .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,3 @@ yarn.lock
.idea
.gitkeep
.yarn/
src/ag-mock.js
8 changes: 3 additions & 5 deletions jest.setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,10 @@ import { readFileSync } from 'fs';
import { airgapStub } from './src/playground/airgapStub';
import { testWindow } from './src/tests/utils'

const mockAg = readFileSync('./src/ag-mock.js').toString();
import { init as initMockAirgap } from './src/tests/ag-mock'
import { MOCK_PURPOSES } from './src/tests/constants'

const newScript = document.createElement('script');
newScript.innerHTML = mockAg;

document.head.append(newScript);
initMockAirgap(MOCK_PURPOSES)

testWindow.JEST_SETUP_VARS = { messages: {} };

Expand Down
3 changes: 2 additions & 1 deletion src/tests/CompleteOptions.test.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import '@testing-library/jest-dom';

import { h } from 'preact';
import { clickPurposeCheckbox, getPurposeCheckState, render } from './utils';
import { render } from './utils/render';
import { clickPurposeCheckbox, getPurposeCheckState } from './utils/checkbox';
import { test, expect } from '@jest/globals';

import { CompleteOptions } from '../components/CompleteOptions';
Expand Down
55 changes: 55 additions & 0 deletions src/tests/ag-mock.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import {
AirgapAPI,
ConsentOptions,
TrackingConsent,
TrackingConsentDetails,
TrackingPurposesTypes
} from '@transcend-io/airgap.js-types';

export const init = (purposeTypes: TrackingPurposesTypes): void => {
let consentCache: TrackingConsentDetails = {
confirmed: false,
prompted: false,
timestamp: '',
purposes: Object.fromEntries(
Object.entries(purposeTypes)
.map(([key, purpose]) => ([key, purpose.defaultConsent]))
) as TrackingConsent
}

const getPurposeTypes = (): TrackingPurposesTypes => purposeTypes;
const optIn = (): void => {
const optedInEntries = Object.entries(consentCache.purposes).map(([key]) => ([key, true]))
consentCache.purposes = Object.fromEntries(optedInEntries)
}
const optOut = (): void => {
const optedOutEntries = Object.entries(consentCache.purposes).map(([key]) => ([key, false]))
consentCache.purposes = Object.fromEntries(optedOutEntries)
}
const setConsent = (event: Event, purposes: TrackingConsent, options: ConsentOptions): void => {
consentCache = {
...consentCache,
...options,
purposes: {
...consentCache.purposes,
...purposes
}
} as TrackingConsentDetails
}
const getConsent = (): TrackingConsentDetails => ({
...consentCache,
purposes: { ...consentCache.purposes }
});
const getPrivacySignals = (): Set<"DNT" | "GPC"> => new Set()
const getRegimePurposes = (): Set<string> => new Set(Object.keys(purposeTypes));

window.airgap = {
getPurposeTypes,
optIn,
optOut,
setConsent,
getConsent,
getPrivacySignals,
getRegimePurposes,
} as unknown as AirgapAPI
}
2 changes: 1 addition & 1 deletion src/tests/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,4 +63,4 @@ export const MOCK_PURPOSES = {
trackingType: 'UniquePurpose',
optOutSignals: [],
},
} as const;
};
24 changes: 24 additions & 0 deletions src/tests/utils/checkbox.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import {
fireEvent,
RenderResult,
} from '@testing-library/preact';

export const getPurposeCheckState = <T extends RenderResult>(
screen: T,
purposeName: string,
): boolean => {
const checkboxEl = screen
.getByText(purposeName, { exact: false })
?.querySelector('input');
return !!checkboxEl?.checked;
};

export const clickPurposeCheckbox = <T extends RenderResult>(
screen: T,
purposeName: string,
): void => {
const checkboxEl = screen
.getByText(purposeName, { exact: false })
?.querySelector('input');
if (checkboxEl) fireEvent.click(checkboxEl);
};
59 changes: 59 additions & 0 deletions src/tests/utils/render.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import { ComponentChild, h } from 'preact';
import {
render,
RenderOptions,
RenderResult,
} from '@testing-library/preact';
import { AirgapProvider } from '../../hooks/useAirgap';
import { IntlProvider } from 'react-intl';
import { ConsentManagerLanguageKey } from '@transcend-io/internationalization';
import { AirgapAPI } from '@transcend-io/airgap.js-types';
import * as prettier from '@prettier/sync';
import { TestWindow } from '../types';

export const testWindow = window as unknown as TestWindow;

interface CustomRenderResult extends RenderResult {
/** Prettified container outerHTML for use in snapshotting */
snapshot: string;
}

interface RenderWrapperProps {
/** Arbitrary children to be provided by the test */
children: ComponentChild[]
}

const wrapper = ({ children }: RenderWrapperProps): ComponentChild => {
const { messages } = testWindow.JEST_SETUP_VARS;
return (
<IntlProvider
locale={ConsentManagerLanguageKey.En}
messages={messages || {}}
defaultLocale={ConsentManagerLanguageKey.En}
>
{
(
<AirgapProvider newAirgap={window.airgap as AirgapAPI}>
{children}
</AirgapProvider>
// eslint-disable-next-line @typescript-eslint/no-explicit-any
) as any
}
</IntlProvider>
);
};

const customRender = (
ui: ComponentChild,
options: RenderOptions = {},
): CustomRenderResult => {
const result = render(ui, { wrapper, ...options });
const snapshot = result.container.outerHTML;
const prettySnapshot = prettier.format(snapshot, { parser: 'html' })
return {
snapshot: prettySnapshot,
...result,
};
};

export { customRender as render };

0 comments on commit 22b41be

Please sign in to comment.