aglinxinyuan opened a new pull request, #7776:
URL: https://github.com/apache/texera/pull/7776
### What changes were proposed in this PR?
Four workspace and dashboard files whose handlers and bindings were never
driven. 12 tests added; suite 4739 -> **4751**, 201 files green.
Measured from a **full-suite** run, because three of these files are also
touched by other specs and a targets-only run misreports them:
| File | Lines | Branches | Functions |
|---|---|---|---|
| `operator-label.component.ts` | 72.7% -> **100%** | 10/12 -> **12/12** |
4/6 -> **6/6** |
| `user-computing-unit.component.html` | 81.2% -> **100%** | 2/2 | 2/4 ->
**4/4** |
| `operator-menu.service.ts` | 98.0% -> **100%** | 35/36 -> **36/36** |
29/32 -> **32/32** |
| `dynamic-schema.service.ts` | 96.4% -> **98.2%** | 23/25 -> **25/25** |
16/17 (one dead method) |
**None of these is an instance of #7458** — no spec here uses
`TestBed.overrideComponent`, which the non-zero percentages already implied.
Six merged PRs have applied that remedy; it would have been the wrong tool
here, and these were simply untested bindings.
Covered: the operator label's drag start/stop and its read-only guard, the
computing-unit toolbar and per-row terminate, the clipboard's link and
comment-box serialisation ordering and paste offsetting, and `dynamic-schema`'s
boolean-subschema skips.
The computing-unit rows sit in a CDK virtual viewport, and jsdom does no
layout — the viewport measures 0px and renders nothing. They are reached via
`viewport.setRenderedRange(...)`, following the existing precedent in
`computing-unit-create-modal.component.spec.ts`. Row deletion is driven through
the child's bound `deleted` output rather than a library's internal emit timing.
### Verification
12 mutations, **10 killed, 1 equivalent, 2 discarded as compile errors**.
Each applied alone with its anchor asserted to occur exactly once, and the
production diff verified empty after every revert.
| Mutation | Killed by |
|---|---|
| `if (this.draggable)` -> `if (!this.draggable)` | announces the dragged
operator's type… (+1) |
| drag payload `operatorType` -> `additionalMetadata.userFriendlyName` |
announces the dragged operator's type, not its display name |
| **exchange** the drop point's x and y | forwards the drop point of a
completed drag |
| **exchange** the links comparator's operands | serializes the copied links
by joint layer rather than by highlight order |
| **exchange** the comment-box comparator's operands | serializes the copied
comment boxes by joint layer… |
| **exchange** `commentBoxPosition`'s x and y | shifts a pasted comment box
clear of one already on the canvas |
| pasted-link guard `===` -> `!==` | leaves both ends of a pasted link blank
when neither operator was copied (+1) |
| `(click)` -> `(dblclick)` on the toolbar | opens the create-unit modal
from its toolbar button |
| `[entry]="entry.computingUnit"` -> `entries[0]…` | renders one row per
computing unit, in the order the service reported them |
| `terminateComputingUnit(entry…cuid)` -> `entries[0]…cuid` | terminates the
unit belonging to the row that asked, not the first one |
**Two mutations were discarded rather than counted as kills**, because they
were TypeScript errors (TS2345 and TS2559) rather than behaviour changes — a
mutation that only fails to compile proves nothing. Both were replaced: one by
deleting the guard outright (with a cast to keep it compiling), one by
inverting the branch so the boolean entry is acted on instead of skipped.
**The one survivor is a genuine equivalent mutant.**
`dynamic-schema.service.ts:187`'s tuple-item guard has
`mutatePropertyRecurse(item)` as its entire body. Delete it and a boolean
primitive reaches that function, which reads `.properties`, `.definitions` and
`.items` — property access on a boolean yields `undefined` for all three, so
every branch is false and the call is a no-op, behaviourally identical to
skipping. The guard is a TypeScript narrowing device, not a behavioural one;
removing it does not even compile without a cast. The companion mutation
(inverting the branch to act on the boolean) *is* caught, which shows the
assertion is not vacuous.
Fixtures were kept deliberately distinguishable — two units `#7` and `#9`, a
drop point of `x: 137, y: 421`, and layer order inverted against highlight
order — precisely so the "wrong element" and "swapped operand" mutants above
could not survive.
### Deliberately not included
**`user-dataset-list-item.component.html` was rejected entirely: the
component is orphaned.** Its selector `texera-user-dataset-list-item` appears
repo-wide only in its own `@Component` declaration and its own spec's test
host. The one other reference is a standalone entry in `app.module.ts:325` with
no consumer — the dataset page moved to
`texera-card-item`/`texera-search-results` in #5947. All 8 of its uncovered
template listeners belong to a component nothing renders, so testing them would
cement dead code. Deleting it is the right change, and belongs in its own PR.
**`DynamicSchemaService.dynamicSchemaExists` is unused** — exactly one
occurrence repo-wide, its own declaration, while every sibling method has 2 to
5 call sites. Its line is the one line left uncovered here, deliberately.
No production bug was found, and no production file is touched.
### Any related issues, documentation, discussions?
Closes #7775
### How was this PR tested?
```
npx ng test --watch=false
```
```
Test Files 201 passed (201)
Tests 4751 passed | 1 skipped (4752)
```
`yarn format:ci` passes.
### Was this PR authored or co-authored using generative AI tooling?
Generated-by: Claude Code (Opus 5)
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]