This is an automated email from the ASF dual-hosted git repository.

github-merge-queue[bot] pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/texera.git


The following commit(s) were added to refs/heads/main by this push:
     new 5021bc6f1a test(frontend): click the toolbar buttons rather than 
calling their handlers (#7547)
5021bc6f1a is described below

commit 5021bc6f1a96d00cb26aa9c3a82c86fee67da0a9
Author: Xinyuan Lin <[email protected]>
AuthorDate: Tue Aug 11 22:34:38 2026 -0700

    test(frontend): click the toolbar buttons rather than calling their 
handlers (#7547)
    
    ### What changes were proposed in this PR?
    
    The suite calls the handlers directly, which is not the same thing:
    coverage for `(click)="onClickX()"` lands on the generated listener
    body, so a button wired to the wrong handler — or to none — looks
    perfectly tested today.
    
    Adds 2 tests that click the real elements. The first is table-driven
    over six visually near-identical icon buttons, since a copy-paste
    leaving two of them on the same handler is the realistic defect. The
    second asserts the converse: clicking auto-layout must not also reset
    the panels.
    
    **Verified by mutation**, all reverted (template diff empty):
    
    | Mutation | Result |
    |---|---|
    | auto layout wired to reset panels | red |
    | close panels wired to reset panels | red |
    | generate report unwired | red |
    | reset zoom wired to auto layout | red |
    | add comment unwired | red |
    | reset panels wired to close panels | red |
    
    ### Deliberately not included
    
    The four display switches live in the `#executionSettings` popover,
    which ng-zorro instantiates into a CDK overlay only on open. Opening the
    first `NzPopoverDirective` on the page yields one switch, not four —
    locating the right one needs more overlay plumbing than four lines
    justify. They remain uncovered, and the issue records how to reach them.
    
    No production file is touched.
    
    ### Any related issues, documentation, discussions?
    
    Closes #7546
    
    ### How was this PR tested?
    
    ```
    npx ng test --watch=false --include="**/menu.component.spec.ts"
    ```
    
    ```
     Test Files  1 passed (1)
          Tests  83 passed (83)
    ```
    
    2 new on top of the existing 81. `yarn format:ci` passes.
    
    ### Was this PR authored or co-authored using generative AI tooling?
    
    Generated-by: Claude Code (Opus 5)
---
 .../component/menu/menu.component.spec.ts          | 56 ++++++++++++++++++++++
 1 file changed, 56 insertions(+)

diff --git a/frontend/src/app/workspace/component/menu/menu.component.spec.ts 
b/frontend/src/app/workspace/component/menu/menu.component.spec.ts
index 9a35071cc2..106695d8af 100644
--- a/frontend/src/app/workspace/component/menu/menu.component.spec.ts
+++ b/frontend/src/app/workspace/component/menu/menu.component.spec.ts
@@ -912,4 +912,60 @@ describe("MenuComponent", () => {
       expect(openSpy).toHaveBeenCalled();
     });
   });
+  /**
+   * The toolbar's buttons and switches are wired in the template, and the 
suite above calls the
+   * handlers directly. That is not the same thing: coverage for 
`(click)="onClickX()"` lands on the
+   * generated listener body, which only runs when the element is really 
clicked — so a button wired
+   * to the wrong handler, or to none, looks perfectly tested today.
+   */
+  describe("toolbar wiring", () => {
+    function host(): HTMLElement {
+      return fixture.nativeElement as HTMLElement;
+    }
+
+    /** The button carrying the given title attribute. */
+    function button(title: string): HTMLButtonElement {
+      const found = 
host().querySelector<HTMLButtonElement>(`button[title="${title}"]`);
+      expect(found, `no button titled "${title}"`).not.toBeNull();
+      return found!;
+    }
+
+    /** Clicks the button and reports whether the spied handler ran exactly 
once. */
+    function clicking(title: string, owner: object, method: string): boolean {
+      const spy = vi.spyOn(owner as any, method).mockImplementation(() => {});
+      button(title).click();
+      const ran = spy.mock.calls.length === 1;
+      spy.mockRestore();
+      return ran;
+    }
+
+    it("routes each toolbar button to its own handler", () => {
+      // Table-driven because these buttons are visually near-identical icon 
buttons; a copy-paste
+      // that leaves two of them on the same handler is the realistic defect 
and is invisible on
+      // screen. Each entry is clicked for real, not invoked.
+      const wiring: Array<[string, object, string]> = [
+        ["close panels", component, "onClickClosePanels"],
+        ["reset panels", component, "onClickResetPanels"],
+        ["generate report", component, "onClickGenerateReport"],
+        ["reset zoom", component, "onClickRestoreZoomOffsetDefault"],
+        ["auto layout", component, "onClickAutoLayout"],
+        ["add a comment", component, "onClickAddCommentBox"],
+      ];
+
+      const results = wiring.map(([title, owner, method]) => 
`${title}:${clicking(title, owner, method)}`);
+
+      expect(results).toEqual(wiring.map(([title]) => `${title}:true`));
+    });
+
+    it("does not fire a neighbour's handler when one button is clicked", () => 
{
+      // The other half of the same concern: clicking auto-layout must not 
also reset the panels.
+      const layout = vi.spyOn(component, 
"onClickAutoLayout").mockImplementation(() => {});
+      const reset = vi.spyOn(component, 
"onClickResetPanels").mockImplementation(() => {});
+
+      button("auto layout").click();
+
+      expect(layout).toHaveBeenCalledTimes(1);
+      expect(reset).not.toHaveBeenCalled();
+    });
+  });
 });

Reply via email to