From 66dd1ab65eff9a8c99bd07c3b86e6635df8a1743 Mon Sep 17 00:00:00 2001 From: Janne Savolainen Date: Mon, 17 Oct 2022 14:55:59 +0300 Subject: [PATCH] Introduce test helper to abstract discovery of HTML elements Co-authored-by: Mikko Aspiala Signed-off-by: Janne Savolainen --- .../test-utils/discovery-of-html-elements.ts | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/renderer/components/test-utils/discovery-of-html-elements.ts diff --git a/src/renderer/components/test-utils/discovery-of-html-elements.ts b/src/renderer/components/test-utils/discovery-of-html-elements.ts new file mode 100644 index 0000000000..622f01dcaa --- /dev/null +++ b/src/renderer/components/test-utils/discovery-of-html-elements.ts @@ -0,0 +1,44 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import type { RenderResult } from "@testing-library/react"; + +export const querySingleElement = + (attributeName: string, attributeValue: string) => + (rendered: RenderResult) => { + const dataAttribute = `data-${attributeName}-test`; + + return rendered.baseElement.querySelector( + `[${dataAttribute}="${attributeValue}"]`, + ); + }; + +export const queryAllElements = + (attributeName: string) => (rendered: RenderResult) => { + const dataAttribute = `data-${attributeName}-test`; + + return [...rendered.baseElement.querySelectorAll(`[${dataAttribute}]`)]; + }; + +export const getSingleElement = + (attributeName: string, attributeValue: string) => + (rendered: RenderResult) => { + const dataAttribute = `data-${attributeName}-test`; + + const element = querySingleElement(attributeName, attributeValue)(rendered); + + if (!element) { + const validValues = queryAllElements(attributeName)(rendered).map( + (elem) => elem.getAttribute(dataAttribute), + ); + + throw new Error( + `Couldn't find HTML element with attribute "${dataAttribute}" with value "${attributeValue}". Valid values are:\n\n"${validValues.join( + '",\n"', + )}"`, + ); + } + + return element; + };