From 641cfdb0b28ffa0e6cd5d2342bc218613ce4d051 Mon Sep 17 00:00:00 2001
From: Armand Philippot <git@armandphilippot.com>
Date: Thu, 24 Mar 2022 19:14:15 +0100
Subject: test(jest): define a custom render function to set providers

---
 __tests__/utils/test-utils.tsx | 44 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)
 create mode 100644 __tests__/utils/test-utils.tsx

(limited to '__tests__/utils/test-utils.tsx')

diff --git a/__tests__/utils/test-utils.tsx b/__tests__/utils/test-utils.tsx
new file mode 100644
index 0000000..4befd47
--- /dev/null
+++ b/__tests__/utils/test-utils.tsx
@@ -0,0 +1,44 @@
+import { render, RenderOptions } from '@testing-library/react';
+import { ThemeProvider } from 'next-themes';
+import { FC } from 'react';
+import { IntlProvider } from 'react-intl';
+
+type ProvidersConfig = {
+  locale?: 'en' | 'fr';
+};
+
+type CustomRenderOptions = {
+  providers: ProvidersConfig;
+  testingLibrary: Omit<RenderOptions, 'wrapper'>;
+};
+
+/**
+ * Return a component wrapped with Intl and Theme Provider.
+ *
+ * @returns A component wrapped Intl and Theme providers.
+ */
+const AllTheProviders: FC<ProvidersConfig> = ({ children, locale = 'en' }) => {
+  return (
+    <IntlProvider locale={locale}>
+      <ThemeProvider>{children}</ThemeProvider>
+    </IntlProvider>
+  );
+};
+
+/**
+ * Render a component with all the providers.
+ *
+ * @param {JSX.Element} ui - A React component.
+ * @param {CustomRenderOptions} [options] - An object of render options and providers options.
+ * @returns A React component wrapped with all the providers.
+ */
+const customRender = (ui: JSX.Element, options?: CustomRenderOptions) => {
+  const Component = () => ui;
+  render(<Component />, {
+    wrapper: () => <AllTheProviders {...options?.providers} />,
+    ...options?.testingLibrary,
+  });
+};
+
+export * from '@testing-library/react';
+export { customRender as render };
-- 
cgit v1.2.3


From 2de1ca173ee3d8e5886a1b3fdc4afbe102fad22f Mon Sep 17 00:00:00 2001
From: Armand Philippot <git@armandphilippot.com>
Date: Thu, 24 Mar 2022 21:31:21 +0100
Subject: test(jest): add a mock for windows matchMedia

---
 __tests__/jest/__mocks__/matchMedia.mock.js | 15 +++++++++++++++
 __tests__/utils/test-utils.tsx              |  6 ++----
 2 files changed, 17 insertions(+), 4 deletions(-)
 create mode 100644 __tests__/jest/__mocks__/matchMedia.mock.js

(limited to '__tests__/utils/test-utils.tsx')

diff --git a/__tests__/jest/__mocks__/matchMedia.mock.js b/__tests__/jest/__mocks__/matchMedia.mock.js
new file mode 100644
index 0000000..a983ad3
--- /dev/null
+++ b/__tests__/jest/__mocks__/matchMedia.mock.js
@@ -0,0 +1,15 @@
+Object.defineProperty(window, 'matchMedia', {
+  writable: true,
+  value: jest.fn().mockImplementation((query) => ({
+    matches: false,
+    media: query,
+    onchange: null,
+    addListener: jest.fn(), // deprecated
+    removeListener: jest.fn(), // deprecated
+    addEventListener: jest.fn(),
+    removeEventListener: jest.fn(),
+    dispatchEvent: jest.fn(),
+  })),
+});
+
+export {};
diff --git a/__tests__/utils/test-utils.tsx b/__tests__/utils/test-utils.tsx
index 4befd47..e47bbe1 100644
--- a/__tests__/utils/test-utils.tsx
+++ b/__tests__/utils/test-utils.tsx
@@ -32,13 +32,11 @@ const AllTheProviders: FC<ProvidersConfig> = ({ children, locale = 'en' }) => {
  * @param {CustomRenderOptions} [options] - An object of render options and providers options.
  * @returns A React component wrapped with all the providers.
  */
-const customRender = (ui: JSX.Element, options?: CustomRenderOptions) => {
-  const Component = () => ui;
-  render(<Component />, {
+const customRender = (ui: JSX.Element, options?: CustomRenderOptions) =>
+  render(ui, {
     wrapper: () => <AllTheProviders {...options?.providers} />,
     ...options?.testingLibrary,
   });
-};
 
 export * from '@testing-library/react';
 export { customRender as render };
-- 
cgit v1.2.3

