]> source.dussan.org Git - sonarqube.git/commitdiff
NO JIRA Test selector chain will look all before reducing
authorMathieu Suen <mathieu.suen@sonarsource.com>
Mon, 29 Jan 2024 14:50:34 +0000 (15:50 +0100)
committersonartech <sonartech@sonarsource.com>
Tue, 30 Jan 2024 16:12:36 +0000 (16:12 +0000)
server/sonar-web/src/main/js/helpers/testSelector.ts

index d33d83838c17e449a6276d5719a0a5a60b71f5d6..b3ceca3e2747d8784a4b27a7f4d4bdf1e106c223 100644 (file)
@@ -148,7 +148,24 @@ class ChainDispatch extends QuerySelector {
     container?: HTMLElement,
     waitForOptions?: waitForOptions,
   ) {
-    return this.dispatchQuery.find<T>(await this.innerQuery.find(container, waitForOptions));
+    let inside: HTMLElement;
+    try {
+      inside = await this.innerQuery.find(container, waitForOptions);
+    } catch (e) {
+      const elements = this.innerQuery.getAll(container);
+      const all = (
+        await Promise.all(
+          elements.map((e) => this.dispatchQuery.findAll<T>(e, waitForOptions).catch(() => null)),
+        )
+      )
+        .flat()
+        .filter((e) => e !== null);
+      if (all.length !== 1) {
+        throw e;
+      }
+      return all[0] as T;
+    }
+    return this.dispatchQuery.find<T>(inside, waitForOptions);
   }
 
   async findAll<T extends HTMLElement = HTMLElement>(
@@ -159,7 +176,18 @@ class ChainDispatch extends QuerySelector {
   }
 
   get<T extends HTMLElement = HTMLElement>(container?: HTMLElement) {
-    return this.dispatchQuery.get<T>(this.innerQuery.get(container));
+    let inside: HTMLElement;
+    try {
+      inside = this.innerQuery.get(container);
+    } catch (e) {
+      const elements = this.innerQuery.getAll(container);
+      const all = elements.map((e) => this.dispatchQuery.query<T>(e)).filter((e) => e !== null);
+      if (all.length !== 1) {
+        throw e;
+      }
+      return all[0] as T;
+    }
+    return this.dispatchQuery.get<T>(inside);
   }
 
   getAll<T extends HTMLElement = HTMLElement>(container?: HTMLElement) {
@@ -171,9 +199,19 @@ class ChainDispatch extends QuerySelector {
   }
 
   query<T extends HTMLElement = HTMLElement>(container?: HTMLElement) {
-    const innerContainer = this.innerQuery.query(container);
-    if (innerContainer) {
-      return this.dispatchQuery.query<T>(innerContainer);
+    let inside: HTMLElement | null;
+    try {
+      inside = this.innerQuery.query(container);
+    } catch (e) {
+      const elements = this.innerQuery.queryAll(container);
+      const all = elements?.map((e) => this.dispatchQuery.query<T>(e)).filter((e) => e !== null);
+      if (all?.length !== 1) {
+        throw e;
+      }
+      return all[0];
+    }
+    if (inside) {
+      return this.dispatchQuery.query<T>(inside);
     }
     return null;
   }