The GitHub Actions job "Required Checks" on texera.git/gh-readonly-queue/main/pr-7681-ae04417af8a7da46c5b3c2a3d8da67c7065b58f4 has succeeded. Run started by GitHub user aglinxinyuan (triggered by aglinxinyuan).
Head commit for run: 00fe327c2ec9d89920db2a11d3959b87a0562fe3 / Xinyuan Lin <[email protected]> test(frontend): drive the dataset detail template through the DOM (#7681) ### What changes were proposed in this PR? `dataset-detail.component.html` was at **92.0% of lines, 72.9% of branches and 42.9% of functions** behind a 129-test spec. This is **not** an instance of #7458 — the spec uses no `TestBed.overrideComponent`, so no attribution is lost. The gaps were real: handlers on child outputs, controls inside CDK overlays, the version-creator block, and the false legs of the header and settings ternaries. | | Before | After | |---|---|---| | lines | 312/339 (92.0%) | **339/339 (100%)** | | branches | 35/48 (72.9%) | **48/48 (100%)** | | functions | 15/35 (42.9%) | **35/35 (100%)** | Tests **129 -> 161**, all 32 new ones in one appended `describe` with its own `TestBed`, no override, real children and real overlays. No existing test or stub is touched. ### Verification — and a correction The first pass reported 25 mutations, all killed, zero survivors. **That did not hold.** Four reviewers were asked to *refute* the suite; between them they predicted 21 distinct surviving mutations, and **every one of the 21 did survive the 154-test suite.** 23 of the 24 findings are now fixed, and each repaired kill was re-proved with **only the new block selected** (`--filter "DatasetDetailComponent rendered template"`, 129 pre-existing tests skipped), so no new test leans on a neighbour. Two failure modes are worth recording, because neither is visible in a coverage report: **Branches counted as covered and still unpinned.** The upload row's tooltip ternary read 2/2 covered, yet swapping its two results passed. Both legs rendered somewhere; nothing asserted *which*. The same shape hid an exchange of the two `nz-switch` models and an exchange of the view/like counters. **Degenerate fixtures.** A row with `totalTime` and `estimatedTimeRemaining` both `undefined` renders `["1s", "1s left"]`, because `formatTime` maps `undefined`, `0` and any `n <= 0` to `"1s"` — so swapping elapsed and remaining, a real user-visible bug, was undetectable. `formatSpeed(1024)` and `formatSpeed(40)` likewise both render `"0.0 MB/s"`. Those tests now use distinguishable values (`12s` / `1m30s left`, `5.0 MB/s`) and keep the degenerate case as a separate, honestly-named floor test. Also fixed: `toContain("2")` against a size of `2048` (passes on the raw number — now `toBe("2.00 KB")`), two `expect.any(Number)` arguments that left chunk-size and concurrency swappable, and an `isLogin` flag hidden behind `expect.anything()`. ### One mutation is deliberately left alive `html:401` `[(ngModel)]="selectedVersion"` -> `[ngModel]` survives, and that is correct rather than a gap: the same element carries `(ngModelChange)="onVersionSelected($event)"`, and `onVersionSelected` assigns `this.selectedVersion` itself (`ts:527`). Removing the two-way sugar leaves an observationally identical component. It is an equivalent mutant, settled by running it rather than by reading. ### A misdiagnosis worth flagging An earlier pass concluded that `[disabled]="isCreatingVersion"` on the version-name input was **inert** — that `NzInputDirective` swallowed the binding because `[(ngModel)]` supplies an `NgControl`. That was wrong, and the test settled it: `NgModel` routes `disabled` through `control.disable()`, which it defers to a **microtask**, so the DOM simply lags one turn behind `detectChanges()`. With the microtask hop the field really does lock. Both the flip and outright deletion of that binding now fail. ### Deliberately not included `html:585`'s `userHasWriteAccess() &&` is redundant — the enclosing `nz-collapse` at `html:452` is already gated on `userDatasetAccessLevel === "WRITE"`, which is exactly what that method returns. Reported, not tested. The read-only leg of the description editor's `[editable]` is unreachable from the template: the Settings tab itself sits behind `*ngIf="userHasWriteAccess()"`, so a reader never gets there. No production file is touched. ### Any related issues, documentation, discussions? Closes #7680 ### How was this PR tested? ``` npx ng test --watch=false --include="**/dataset-detail.component.spec.ts" ``` ``` Test Files 1 passed (1) Tests 161 passed (161) ``` 32 new on top of the existing 129. Coverage measured with `--coverage` on the same run. `yarn format:ci` passes. ### Was this PR authored or co-authored using generative AI tooling? Generated-by: Claude Code (Opus 5) Report URL: https://github.com/apache/texera/actions/runs/31864322064 With regards, GitHub Actions via GitBox
