Skip to content

Commit d959b0b

Browse files
test(app-shell): fold six more RecordDetailView pins over the shared chrome mocks onto the harness (#31057)
<!-- claude-projects-attribution: {"github_login":"os-tesla"} --> _Requested by **Tesla** · [project thread](https://claude.ai/code/project/chan_01AXsQkLFKRdQCqQ3RTr6Jao?thread=cmsg_01AXsQkLFKRdQCqQ3RTr6Jao6CPiJykR19ZgQhCLgp8Wkm)_ Fixes #29469 Clause-②: no Metadata-protocol: none ## 维护者速读 - **改了什么**:再把记录详情页 `RecordDetailView`(`app-shell` 包)的 6 个单卡测试文件并入 #31051 建的共享测试文件 `RecordDetailView.harness.test.tsx`,每个原文件变成一个顶层 `describe`,断言和标题一字未改;复原帮手 `restoreAfterBlock()` 多复原一样东西:地址栏(其中一个原文件把记录地址写进真实 `history` 后不放回)。 - **为什么改**:#29469 最后一族 RecordDetailView 的第二片,也是这张卡的最后一个 PR(席位修订 2:每族最多两个 PR),所以写 Fixes。本地同机实测,这 6 个文件加上 4a 那份共享文件合计约 48 秒 CPU,并入后整个共享文件约 9 秒;没折的 90 个文件全部列在下面的表里,每一行写了不折的原因。 - **风险与回滚**:只动测试文件,不改源码、门禁、CI,不发布任何东西。块之间串状态的风险用探针在原顺序和三种乱序下排除(13 个块,每块开头状态相同)。回滚 = revert 本 PR。 - **先看**:`restoreAfterBlock()` 里新加的两行(`href` 的记录与 `history.replaceState`),再随便挑一块对照原文件;下面「留下的 pin」表是卡的收尾清单。 - **两分钟验证**:在 `ui/` 下跑 `pnpm exec vitest run packages/app-shell/src/views/RecordDetailView.harness.test.tsx`,应见 1 个文件、49 个测试全过。 - **需要你做的**:无,席位落地。 - **席位意见**:ui 席 2 对照 head `bed3e2b3` 的 diff 复核:7 个文件、+1229 / −1467,纯测试改动,无受治理路径。RecordDetailView 家族再并入 6 个用例文件(含 4 个 `vi.spyOn` 用例,各自在 afterEach 里 `vi.restoreAllMocks()`,`RelatedCountStore._reset()` 按块执行);it 20 = 20、expect 99 = 99、标题一致,乱序种子下通过;`restoreAfterBlock` 另外复原地址栏(recordTabRowUrl 会把记录地址写进 history)。并入的文件 CPU 约 48 s → 9 s。正文列出其余 90 个未并入用例及原因。CI 全绿,Clause-② no,不欠契约复审。这是本卡最后一个 PR,同意落地。 ## What changes Slice 4b, the second and last `RecordDetailView*` PR of the shared-setup rollout (ruling 6583487846 on #29469; seat amendment 2, 6672694520: at most two PRs per family), and the card's last PR. Slice 4a (#31051, merged as `81deb548`) created `ui/packages/app-shell/src/views/RecordDetailView.harness.test.tsx` with 7 blocks; this PR adds 6 more from the same cluster, the pins that share the harness's eight mocks verbatim (`@object-ui/auth`, `@object-ui/collaboration`, `sonner`, `./ActionConfirmDialog`, `./ActionParamDialog`, `./ActionResultDialog`, `./FlowRunner`, `./MetadataInspector`). - **The six.** The two that passed every census check at 4a's head, `relatedListTitlePlural-11733` and `feedRefusal-11195`, and the four smallest of the `vi.spyOn` row, `relatedListsOrder-27241`, `bodyTablePredicate-27478`, `relatedCountsFirst-27056` and `recordTabRowUrl-27524`. Each of those four spies on `HTMLElement.prototype.getBoundingClientRect` in its own `beforeEach` and undoes it with `vi.restoreAllMocks()` in its own `afterEach`, so the spy never outlives a test of its block. - **How they move.** As in 4a: each former file is a top-level `describe` named after its stem (`RecordDetailView.STEM`), docblock above it, `restoreAfterBlock()` first, the rest of the file after its imports and mocks moved verbatim and re-indented two spaces (template-literal lines keep their bytes). The six files are deleted. The harness's imports gain `screen`, `act` and `fireEvent` from `@testing-library/react`, `BrowserRouter` from `react-router-dom`, `RelatedCountStore` from `@object-ui/components` and `createI18n` from `@object-ui/i18n`; no two files bound one local name to different modules. Those 4 import lines and the helper are the only harness lines from 4a that change. - **What was dropped:** each file's license header, its import lines and its eight `vi.mock` calls, and the one-line comments directly above those mocks. A line-multiset check of the six former files against the harness finds nothing else missing. - **`restoreAfterBlock()` also puts back the address bar.** `recordTabRowUrl-27524` writes the record's path into the real `window.history` (`replaceState` in its render helper, then the view's own pushes) and leaves it there; its former file got a fresh window, and a block after it in the harness would now start at `/app/demo/showcase_project/p-1`. The helper reads `window.location.href` in its `beforeAll` and calls `window.history.replaceState(null, '', href)` in its `afterAll`. The probe found this under three shuffle seeds, where `recordTabRowUrl-27524` is not the last block (see Verification). No other file names any of the six (`git grep` of each stem over the whole tree finds only the harness), so no comment elsewhere changes. Test files only: no source file, no changeset (`skip-changeset`). ## Tests ### Former file → describe (no title or assertion dropped) TypeScript AST walk of each former file at `origin/main` (`81deb548`) against the `describe` of the same name in the harness at this PR's head. An `it` is a call to `it` / `test`; an `expect(` is a call to `expect`; titles are the `describe > it` paths under the block, compared as sorted lists. | former file | it before | it after | expect( before | expect( after | titles identical | |---|--:|--:|--:|--:|:-:| | `RecordDetailView.relatedListTitlePlural-11733.test.tsx` | 4 | 4 | 15 | 15 | yes | | `RecordDetailView.feedRefusal-11195.test.tsx` | 7 | 7 | 25 | 25 | yes | | `RecordDetailView.relatedListsOrder-27241.test.tsx` | 2 | 2 | 4 | 4 | yes | | `RecordDetailView.bodyTablePredicate-27478.test.tsx` | 2 | 2 | 8 | 8 | yes | | `RecordDetailView.relatedCountsFirst-27056.test.tsx` | 2 | 2 | 19 | 19 | yes | | `RecordDetailView.recordTabRowUrl-27524.test.tsx` | 3 | 3 | 28 | 28 | yes | | **total** | 20 | 20 | 99 | 99 | yes | The whole harness holds 49 `it` and 153 `expect(` calls: 4a's 29 and 54, which this PR does not change, plus the 20 and 99 above. No statement outside the blocks holds either. ### CPU before and after (local A/B, one machine) **CI after: NOT MEASURED**: the per-file timings reporter (#29517) uploads on `main`'s full-battery runs only. Its first after-reading is the first full-battery `main` run after this merges. Local A/B on one 4-vCPU container, under `os-verify-lock` (shared-box seconds), same command both legs, from `ui/`: `pnpm exec vitest run packages/app-shell/src/views/RecordDetailView. --maxWorkers=2` (every `RecordDetailView.*` file), with a throwaway reporter summing each module's `diagnostic()`. Fixed = environment + prepare + setup + collect (import). The "before" leg writes the six files and the harness from `origin/main` (`81deb548`, 4a's harness of 7 blocks) into the branch's tree, so both legs run the same 90 other files; the tree is reset to `HEAD` after each before leg and checked clean. Run order: before 1, after 1, before 2, after 2. | | files | tests passed | fixed CPU | test CPU | total CPU | wall | |---|--:|--:|--:|--:|--:|--:| | RecordDetailView family, before (run 1 / 2) | 97 | 653 | 455.2 / 471.1 s | 95.2 / 98.0 s | 550.4 / 569.1 s | 288.7 / 297.8 s | | RecordDetailView family, after (run 1 / 2) | 91 | 653 | 435.5 / 431.8 s | 93.2 / 93.3 s | 528.8 / 525.1 s | 275.4 / 273.7 s | | the six files, before (run 1 / 2) | 6 | 20 | 26.3 / 28.0 s | 4.4 / 4.3 s | 30.7 / 32.2 s | | | 4a's harness, before (run 1 / 2) | 1 | 29 | 15.0 / 12.7 s | 2.4 / 2.2 s | 17.4 / 14.9 s | | | the harness, after (run 1 / 2) | 1 | 49 | 4.4 / 4.8 s | 4.7 / 4.7 s | 9.1 / 9.6 s | | The six files took 31.5 s of CPU on average, and the harness that now holds them and 4a's seven takes 9.4 s. 4a's harness read 7.1 / 7.6 s in 4a's A/B and 17.4 / 14.9 s in this one's before legs: its import time depends on which worker picks it up, so the honest per-file comparison is the six files plus 4a's harness, 48.1 / 47.1 s, against this harness, 9.1 / 9.6 s (−80 %). The family read 559.8 s before and 527.0 s after on average (−5.9 %), wall 293.3 s to 274.6 s; the two before runs differ by 18.7 s, so this is a reading of two runs per leg on a shared box, not a measured saving. ## Acceptance notes - **Why the fold stops here.** Amendment 2 allows two PRs per family and this is the second; each stays under 3,000 changed lines, and this one is at 2,696. The smallest remaining pin of the same cluster, `phoneOwnerLine-28909` (204 lines), would add about 410 changed lines and take it past 3,000. So the family ends with 13 of its 103 pins in the harness, and with it the card's fourth and last family. - **Every pin left unfolded** is in the table below: 90 files, 29,399 lines, grouped by shared setup, each row with the reason it stays a file of its own. Same rules as 4a's census: a file in the eight-mock cluster sits under the most restrictive check it fails. - **One harness, one package.** All `RecordDetailView` pins are in `ui/packages/app-shell/src/views/`. - `headerRefresh` is named by path in `ui/scripts/__tests__/check-vi-mock-override-shape.test.ts`, so it stays a file of its own. Names of pins in source-file comments stay as they are (claim 6694271643: source files are ⛔). - The moved docblocks keep their issue numbers in prose, as 4a's blocks do; no new citation line is added outside moved text (`pnpm check:new-line-citations`: 0 new). - `ui/scripts/test-shard-timings.json` is keyed by a hash of each file's path, so the six deleted files leave six stale keys until the timings refresh, as 4a's did. ### RecordDetailView pins left unfolded: 90 files, 29,399 lines, by shared setup Names drop the `RecordDetailView.` prefix and `.test.tsx`. "Named by" lists the other files whose text names the pin. | shared setup | files (lines) | lines | why it stays a file of its own | |---|---|--:|---| | the eight harness mocks, but another file names it, so a fold also edits that file (a test file; a name in a source-file comment stays as it is) | `feedRecordScope` (461; named by `defaults-maps-mirror-en-pack.test.tsx`), `relatedBadgeArity-8882` (453; named by `related-count-store.ts`), `discussionFallbackPipeline-8983` (439; named by `record-chatter.tsx`), `relatedListFilter-4664` (420; named by `deriveRelatedLists.relatedListFilter-4664.test.ts`, `RecordDetailView.childWriteRefreshesParent-12244.test.tsx`, `RecordDetailView.relatedBadgeArity-8882.test.tsx`, `related-count-store.declaredScope-4664.test.ts`, `related-count-store.ts`, `buildDefaultPageSchema.relatedListFilter-4664.test.ts`), `feedLoading` (394; named by `RecordDetailView.discussionFallbackPipeline-8983.test.tsx`, `RecordDetailView.harness.test.tsx`, `RecordDetailView.headerRefresh.test.tsx`), `authoredChildWriteRefreshesParent-26890` (351; named by `RecordDetailView.unregisteredObjectLists-26988.test.tsx`, `recordPageChildObjects.test.ts`), `discussionExplicitComposition-7298` (327; named by `RecordDetailView.discussionFallbackPipeline-8983.test.tsx`), `sectionHeadingsRenderPath-6190` (320; named by `CHANGELOG.md`, `CHANGELOG.md`, `DetailView.expandFls-7230.test.tsx`), `managedByBadgeAuthoring-12194` (213; named by `ObjectView.managedByBadgeAuthoring-12194.test.tsx`, `RecordFormPage.managedByBadgeAuthoring-12194.test.tsx`), `printAction-11958` (162; named by `RecordDetailView.harness.test.tsx`, `RecordDetailView.printPageHeaderActions-12906.test.tsx`) | 3540 | Same setup, so it could join the harness, but the fold also edits each file that names it. The family's two PRs are spent and this one is at 2,696 of its 3,000 lines. | | the eight harness mocks, plus `vi.spyOn` (each restored in its `afterEach`) | `recordPageTiers-26678` (431), `phoneFace-27058` (425), `panelToggles-27052` (381), `activityMapIdentity-5878` (346), `topBar-27524` (312), `relatedListInheritedSort-5795` (296), `phoneOwnerLine-28909` (204) | 2395 | Same setup, and the pattern is proven by the four `vi.spyOn` blocks this PR folds. The family's two PRs are spent; the smallest of these (`phoneOwnerLine-28909`) would take this PR past 3,000 lines. | | the eight harness mocks, plus a side-effect import of its own | `userActionPredicates` (513), `headerActionLookupPredicate` (352), `builtinActionSessionUserPredicate` (346), `reactionWriteFailure-10899` (346), `authoredActivityThreading-12249` (335), `replyCountOnRead-12144` (302), `commentWriteFailure-10899` (259), `accessibleNames-12625` (199) | 2652 | Its side-effect import would run for every block of the harness, not just its own, so each needs a check that the import changes nothing the other blocks read. Not done inside the two-PR budget. | | the eight harness mocks, but its body registers tests from a loop or `describe.each` at collection time | `hiddenAffordanceVerdicts-13045` (250), `oneProvenanceFooter-12307` (208), `appendInset-27520` (183) | 641 | Registers tests at collection time, so it cannot be counted or moved verbatim the way the other blocks are without checking each generated title. Not done inside the two-PR budget. | | the eight harness mocks, plus a `vi.hoisted` / `globalThis` slot or a global installer of its own | `unregisteredObjectLists-26988` (312), `namedRecordPage-12715` (293) | 605 | Its hoisted slot or global installer lives at module scope, where every block of the harness would share it. Needs its own isolation work, not done inside the two-PR budget. | | the eight harness mocks, but named by path in a file outside the tests (a ledger or a script test): stays a file of its own | `headerRefresh` (251; named by `check-vi-mock-override-shape.test.ts`) | 251 | A file outside the tests names its path, so it stays a file of its own (claim 6694271643). | | the same eight modules, but its `@object-ui/auth` factory answers a different user or organization | `reactionRecords-12078` (567), `childWriteRefreshesParent-12244` (433), `feedGrant-12082` (428), `withheldMentions-28218` (310), `printPageHeaderActions-12906` (287), `reactionKeepIds-11019` (271), `reactionsCommentRowsOnly-11035` (265), `activityActorId-12067` (176) | 2737 | A `vi.mock` factory applies to the whole file, and its `@object-ui/auth` answers a different user or organization from the harness's `Ada`. It needs a harness of its own. | | mocks `../hooks/useActionModal` + `../utils/consoleServerAction` + `./ActionConfirmDialog` + `./ActionParamDialog` + `./ActionResultDialog` + `./FlowRunner` + `./MetadataInspector` + `@object-ui/auth` + `@object-ui/collaboration` + `@object-ui/react` + `sonner`, not the harness set | `paramRuntimeParity-6431` (610), `approvalDeclaredActions` (543), `confirmRuntimeParity-5835` (458), `headerRecordIdLoadWindow` (404), `approvalRecallGate` (355), `approvalLock-25934` (348), `recordIdParamSeed` (339), `accessEndedAfterDecision-26589` (330), `undoLookupId-11122` (309), `paramDialogTitle` (302), `headerApiInterpolation` (296), `undoCapture-11082` (291), `apiActionDoor-27611` (280), `modalDispatch` (278), `approvalLock-12220` (273), `paramCancelText-28879` (263), `paramSubmitText-28158` (263), `undoneToast-11056` (231), `banCompanion-30205` (227), `ctxOrg-10918` (222), `apiFlowRefusal-27487` (212) | 6834 | It mocks a different set of modules, and `vi.mock` applies to the whole file, so it cannot join a harness whose mocks it does not share. A harness for its set would be new work. | | mocks `@object-ui/auth` + `@object-ui/collaboration` + `sonner`, not the harness set | `recordOpenWaves-13010` (811), `feedLoadFailure-29188` (462), `recordPagePayload-27627` (389), `timelineCount-28737` (368), `recordOpenRequests-12701` (350), `afterActionExplain-13341` (315), `recordReadFailure-11902` (303), `recordOpenOneRequest-28470` (290), `approvalRequestPage-28546` (180), `phoneGuardBar-28483` (161) | 3629 | It mocks a different set of modules, and `vi.mock` applies to the whole file, so it cannot join a harness whose mocks it does not share. A harness for its set would be new work. | | mocks `./ActionParamDialog` + `./ActionResultDialog` + `./FlowRunner` + `./MetadataInspector` + `@object-ui/auth` + `@object-ui/collaboration` + `sonner`, not the harness set | `feedCommentEditDelete-12268` (518), `updateActionRefresh-29935` (329), `deleteConfirmDialog-11001` (310), `favoritesEntry-12427` (293), `paneOpenAsPage-27545` (292), `placedHeaderActions-29951` (262), `apiNewTabUrl-26747` (257), `headerMenuIcons-12529` (239), `deleteCascade-28472` (188) | 2688 | It mocks a different set of modules, and `vi.mock` applies to the whole file, so it cannot join a harness whose mocks it does not share. A harness for its set would be new work. | | mocks `./MetadataInspector` + `@object-ui/auth` + `@object-ui/collaboration` + `@object-ui/react` + `sonner`, not the harness set | `flowActionDoor-12037` (277), `flowDoneSuccessMessage-12274` (240), `refusedLaunch-9973` (236), `flowActionSuccessMessage-12234` (219) | 972 | It mocks a different set of modules, and `vi.mock` applies to the whole file, so it cannot join a harness whose mocks it does not share. A harness for its set would be new work. | | mocks `./ActionConfirmDialog` + `./ActionParamDialog` + `./ActionResultDialog` + `./FlowRunner` + `./MetadataInspector` + `@object-ui/auth` + `@object-ui/collaboration` + `@object-ui/fields` + `sonner`, not the harness set | `lookupDependsOn-7190` (619) | 619 | It mocks a different set of modules, and `vi.mock` applies to the whole file, so it cannot join a harness whose mocks it does not share. A harness for its set would be new work. | | mocks `@object-ui/auth` + `@object-ui/collaboration` + `@object-ui/permissions` + `react` + `sonner`, not the harness set | `recordOpenRequests-11699` (505) | 505 | It mocks a different set of modules, and `vi.mock` applies to the whole file, so it cannot join a harness whose mocks it does not share. A harness for its set would be new work. | | mocks `../context/NavigationContext` + `../hooks/useActionModal` + `../utils/consoleServerAction` + `./ActionConfirmDialog` + `./ActionParamDialog` + `./ActionResultDialog` + `./FlowRunner` + `./MetadataInspector` + `@object-ui/auth` + `@object-ui/collaboration` + `@object-ui/react` + `react-router-dom` + `sonner`, not the harness set | `onSuccessNavigateHost-13396` (399) | 399 | It mocks a different set of modules, and `vi.mock` applies to the whole file, so it cannot join a harness whose mocks it does not share. A harness for its set would be new work. | | mocks `./ActionConfirmDialog` + `./ActionParamDialog` + `./ActionResultDialog` + `./FlowRunner` + `./MetadataInspector` + `@object-ui/auth` + `@object-ui/collaboration` + `@object-ui/plugin-detail` + `sonner`, not the harness set | `activityUnmappedType-5896` (380) | 380 | It mocks a different set of modules, and `vi.mock` applies to the whole file, so it cannot join a harness whose mocks it does not share. A harness for its set would be new work. | | mocks `./ActionConfirmDialog` + `./ActionParamDialog` + `./ActionResultDialog` + `./FlowRunner` + `./MetadataInspector` + `@object-ui/auth` + `@object-ui/collaboration` + `@object-ui/permissions` + `sonner`, not the harness set | `expandFls-7230` (281) | 281 | It mocks a different set of modules, and `vi.mock` applies to the whole file, so it cannot join a harness whose mocks it does not share. A harness for its set would be new work. | | no `vi.mock` | `headerActionGates` (182), `actionUser` (89) | 271 | It renders over the real modules, and the harness's eight mocks would replace them. It stays as it is. | | **total** | 90 files | 29399 | | ## Verification At head `bed3e2b3`, on `origin/main` `81deb548` (4a's merge), every run under `os-verify-lock`: - Harness: 1 file, 49 / 49 passed in declaration order and under `--sequence.shuffle.tests` with `--sequence.seed` 11, 222 and 3333 (each VERDICT command-exit 0). The seed runs and the probe read the tree one commit earlier, before a comment-only rewrap of the helper's docblock; both A/B after legs ran this head's harness, 49 / 49 passed. - Probe: a throwaway copy of the harness whose `restoreAfterBlock()` writes the state at each block's first test (the same fields as 4a's probe: registry entries, `localStorage` descriptor and both storages, `lang` / `dir`, `innerWidth` / `innerHeight`, react-i18next's `getI18n()`, `document.title`, `body`, added window keys, the `fetch` stub, `toast` call counts, `location.href`). With this head's helper, all 13 blocks start from the same state in all four orders. With 4a's helper, the three shuffled orders show `location.href` at `/app/demo/showcase_project/p-1` for every block after `recordTabRowUrl-27524`, which is why the helper now puts the address back. With the helper's `afterAll` body removed, `lang` / `dir`, `innerWidth` and `localStorage` also leak, as in 4a. The probe copies were deleted. - `pnpm run type-check` in `ui/packages/app-shell` (`tsc --noEmit && tsc -p tsconfig.test.json`): VERDICT command-exit 0, 0 `error TS`. - `eslint` on the harness from `ui/packages/app-shell`: 0 errors, 24 warnings (all `no-explicit-any`), the same as 4a's harness (12) plus the six former files at `origin/main` (12). - Derived gates (`node scripts/pm/dispatch-gates.mjs --commands`, change set 7 paths against merge base `81deb548`): 26 derived, 26 run with stdin from `/dev/null`, each exit 0 captured before any pipe, among them `pnpm --dir ui exec vitest run scripts/`, `node scripts/check-sdui-manifest.mjs` and its `--self-test`, and `pnpm check:test-source-alias`. `--ran` reconciliation: 26 derived, 26 run, 0 NOT-MEASURED, 0 UNRUN, every family with a recorded exit code. `pnpm check:new-line-citations` from `ui/`: 0 new citations. - The RecordDetailView family (91 files after, 97 before): 653 tests passed in every A/B leg, 0 failed. The rest of `@object-ui/app-shell`'s suite was not run locally; no file outside the family changed, and CI's Test UI runs it. - Size: `git diff --shortstat origin/main HEAD` is 7 files, +1,229 / −1,467, 2,696 changed lines. - `main` has moved 2 commits past `81deb548`; neither touches `ui/packages/app-shell/src/views/`, `ui/vitest.config.mts` or the `ui/vitest.setup.*` files, so the branch is not re-merged and the readings above stand for this head. - Open pull requests: none of the open PRs that touch `ui/` or a package (#31053, #31052, #31013, #31009, #31006, #31000, #31037, #31046, #31047) changes a `RecordDetailView` file (read from each PR head's diff against its merge base before the push; #31052 and #31047 have merged since, neither touching `ui/packages/app-shell/src/views/`). - No ablation of a product behaviour: none changed, and the assertions moved verbatim. ## Human Minimum - [x] 1. Schemas start as Zod; `packages/spec` holds no runtime logic. (`packages/spec` not touched.) - [x] 2. Every name I added uses the casing for its kind. - [x] 3. No formatter ran; `pnpm lint` passes. (`ui/` is linted by its own config; the lint readings are above.) - [x] 4. One issue, one branch off an up-to-date `main`, one pull request. - [x] 5. A change that publishes carries a changeset, and both declaration lines are filled in here and in the changeset. (Nothing publishes: `skip-changeset`.) - [x] 6. `packages/spec` touched: its generated artifacts are regenerated and committed. (Not touched.) - [x] 7. No hand edits to `content/docs/references/`, `packages/*/CHANGELOG.md` or `content/docs/releases/`. - [x] 8. Title, body and comments are in English (the maintainer quick-read is the allowed Chinese section). <!-- signed: domain:ui#2 · os-tesla · session_01L9qibw7DekEe3wx5f3zphf --> Co-authored-by: Claude <noreply@anthropic.com>
1 parent f120661 commit d959b0b

7 files changed

Lines changed: 1229 additions & 1467 deletions

‎ui/packages/app-shell/src/views/RecordDetailView.bodyTablePredicate-27478.test.tsx‎

Lines changed: 0 additions & 186 deletions
This file was deleted.

0 commit comments

Comments
 (0)