From 749f497f17162919ef32d8bc99f777d8b0e520eb Mon Sep 17 00:00:00 2001 From: Conduction Release Bot Date: Mon, 31 Aug 2026 23:31:40 +0200 Subject: [PATCH 1/6] chore(register): rename the assessment slug to software-review Learniq also ships a schema slugged `assessment`: a toets, tentamen or examen composed of items from an ItemBank. This one rates applications and services. The two share NO properties at all, and slugs are global on a shared OpenRegister. The schema's own description says it "wordt niet daadwerkelijk in de applicatie gebruikt", which is not true: src/manifest.json carries three live bindings, including the rating stat on the application detail page. Renaming rather than deleting keeps that surface working. Three manifest bindings follow the slug; the schema KEY stays `assessment`, so any register.d fragment extending it by key is unaffected. --- lib/Settings/softwarecatalogus_register.json | 8 ++++---- lib/Settings/stackiq_mock_register.json | 18 +++++++++--------- src/manifest.json | 6 +++--- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/lib/Settings/softwarecatalogus_register.json b/lib/Settings/softwarecatalogus_register.json index a119c23c..c8f1de9f 100644 --- a/lib/Settings/softwarecatalogus_register.json +++ b/lib/Settings/softwarecatalogus_register.json @@ -3,7 +3,7 @@ "info": { "title": "Software Catalog Register", "description": "Register containing AMEF and Voorzieningen schemas for the VNG Software Catalog application. This configuration includes schemas for applications, services, organizations, and compliance tracking.", - "version": "2.4.4", + "version": "2.5.0", "changelog": "2.4.4: organization.status was left behind by #520's enum translation — its `default` was still 'Concept' and its whole x-openregister-lifecycle block still named Concept/Actief/Deactief, while the enum and the migrated rows are Draft/Active/Inactive/merged. A default outside its own enum makes every newly created organisation fall out of the Organisations index filter, and a lifecycle whose from/to values match no row offers no transition at all — neither raises an error. The schema version is bumped with it because a deployed version >= the declared one makes the import SKIP, and OpenRegister's schemaContentDiffers() escape hatch compares only properties/required/authorization — never `configuration` — so a lifecycle-only edit would never have deployed. 2.4.3: Re-authored Dutch schema-level titles to English (dienst, kwetsbaarheid, contactpersoon, organisatie, gebruik, koppeling, beoordeeling, module, bioMaatregel, moduleVersie, sbomComponent); schema keys unchanged, Dutch labels now come from the app's l10n translation files. 2.4.2: Moved SBOM provenance properties (sbomLastImportedAt, sbomFormat, sbomFileName, sbomComponents) from the organisatie schema to moduleVersie, where SBOM imports actually record them; without this the moduleVersie magic table lacked the columns so recordProvenance() writes were silently dropped and the import-status endpoint always reported 'never imported'. 2.4.1: Re-authored Dutch schema property titles to English (property keys unchanged); Dutch labels now come from the app's l10n translation files." }, "x-openregister": { @@ -831,7 +831,7 @@ "usage", "contract", "connection", - "assessment", + "software-review", "compliancy", "moduleVersion", "sbomComponent", @@ -3943,7 +3943,7 @@ }, "assessment": { "uri": null, - "slug": "assessment", + "slug": "software-review", "x-openregister-notifications": { "review-submitted": { "trigger": {"type": "created"}, @@ -4020,7 +4020,7 @@ "handling": "related-object" }, "$ref": "#/components/schemas/module", - "inversedBy": "assessment" + "inversedBy": "software-review" } }, "diensten": { diff --git a/lib/Settings/stackiq_mock_register.json b/lib/Settings/stackiq_mock_register.json index 03cc09ae..84b091ac 100644 --- a/lib/Settings/stackiq_mock_register.json +++ b/lib/Settings/stackiq_mock_register.json @@ -2,7 +2,7 @@ "openapi": "3.0.0", "info": { "title": "stackiq demo data", - "version": "1.0.0", + "version": "1.1.0", "description": "Demo data covering every schema this app supplies, offered as the first step of the app's setup walkthrough. Generated from the schemas themselves, so every object satisfies the schema that will validate it." }, "x-openregister": { @@ -104,7 +104,7 @@ "handling": "related-object" }, "$ref": "#/components/schemas/module", - "inversedBy": "assessment" + "inversedBy": "software-review" } }, "diensten": { @@ -211,7 +211,7 @@ "rating" ], "uri": null, - "slug": "assessment", + "slug": "software-review", "x-openregister-notifications": { "review-submitted": { "trigger": { @@ -7303,7 +7303,7 @@ { "@self": { "register": "stackiq", - "schema": "assessment", + "schema": "software-review", "slug": "assessment-voorbeeld-name-1-1" }, "name": "Voorbeeld Name 1", @@ -7326,7 +7326,7 @@ { "@self": { "register": "stackiq", - "schema": "assessment", + "schema": "software-review", "slug": "assessment-voorbeeld-name-2-2" }, "name": "Voorbeeld Name 2", @@ -7349,7 +7349,7 @@ { "@self": { "register": "stackiq", - "schema": "assessment", + "schema": "software-review", "slug": "assessment-voorbeeld-name-3-3" }, "name": "Voorbeeld Name 3", @@ -8872,7 +8872,7 @@ { "@self": { "register": "vng-gemma", - "schema": "assessment", + "schema": "software-review", "slug": "assessment-voorbeeld-name-1-1" }, "name": "Voorbeeld Name 1", @@ -8895,7 +8895,7 @@ { "@self": { "register": "vng-gemma", - "schema": "assessment", + "schema": "software-review", "slug": "assessment-voorbeeld-name-2-2" }, "name": "Voorbeeld Name 2", @@ -8918,7 +8918,7 @@ { "@self": { "register": "vng-gemma", - "schema": "assessment", + "schema": "software-review", "slug": "assessment-voorbeeld-name-3-3" }, "name": "Voorbeeld Name 3", diff --git a/src/manifest.json b/src/manifest.json index 727c1f12..26395fa9 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -769,7 +769,7 @@ "title": "Reviews", "config": { "register": "@resolve:voorzieningen_register", - "schema": "assessment", + "schema": "software-review", "columns": [ "name", "auteur", @@ -790,10 +790,10 @@ "title": "Review", "config": { "register": "@resolve:voorzieningen_register", - "schema": "assessment", + "schema": "software-review", "_note": "Review / assessment archetype (beoordeeling). A review is read for its verdict then its subject: body leads with the review data (name, short + long markdown description, score) 8-wide left, a prominent score stat (waardering) top-right, and a Related panel + supporting-evidence Files panel stacked beneath it surfacing the reviewed subjects — the beoordeeling links modules[], diensten[] and koppelingen[] (the things assessed) plus its gebruik context. A review does not communicate, so per the comms hard-rule NO Emails/Meetings widgets appear. Audit trail stays a sidebar tab. FIX (softwarecatalog audit): rv-data (Review) now anchors gridX0/gridY0 so the left column starts flush with the right column instead of a whitespace hole opening up beside the score stat; rv-score/rv-related/rv-files were re-stacked in the right column to match rv-data's height. rv-related's title shortened from 'Reviewed modules & services' (truncated to 'Reviewed modules & s…' in the widget header) to 'Reviewed modules'.", "widgets": [ - { "id": "rv-score", "type": "stat", "title": "Rating", "icon": "Star", "content": { "label": "Rating", "icon": "Star", "source": { "register": "@resolve:voorzieningen_register", "schema": "assessment", "metric": "avg", "field": "rating", "filter": { "id": "@objectId" } } } }, + { "id": "rv-score", "type": "stat", "title": "Rating", "icon": "Star", "content": { "label": "Rating", "icon": "Star", "source": { "register": "@resolve:voorzieningen_register", "schema": "software-review", "metric": "avg", "field": "rating", "filter": { "id": "@objectId" } } } }, { "id": "rv-data", "type": "data", "title": "Review", "icon": "NoteTextOutline", "content": { "columns": 2 } }, { "id": "rv-related", "type": "related", "title": "Reviewed modules", "icon": "LinkVariant" }, { "id": "rv-files", "type": "integration", "integrationId": "files", "title": "Supporting evidence", "icon": "FolderOutline" } From 058c25ba40b2768e11de65595942c7ef6cde98d9 Mon Sep 17 00:00:00 2001 From: Conduction Release Bot Date: Mon, 31 Aug 2026 23:36:46 +0200 Subject: [PATCH 2/6] fix(register): follow the software-review slug through the object-type maps In this app the object type IS the schema slug: SettingsService says so in its own comment, and records that an unmapped type once silently killed this very ratings feature, with ReviewService and ReviewAggregateService reading "not configured" forever. So the slug moves through all of it: - ReviewService::REVIEW_TYPE and ReviewAggregateService::REVIEW_TYPE - ModerationService::MODERATED_TYPE_REVIEW - the objectType -> config-key map, which appears THREE times in SettingsService (LEGACY_SCHEMA_KEY and two inline copies) - RenameDutchSchemaSlugs' target for 'beoordeeling' The config KEY stays `beoordeeling_schema`. It is stored app-config and renaming it is a data migration the same comment scopes as its own change. --- lib/Repair/RenameDutchSchemaSlugs.php | 2 +- lib/Service/ModerationService.php | 2 +- lib/Service/ReviewAggregateService.php | 2 +- lib/Service/ReviewService.php | 2 +- lib/Service/SettingsService.php | 6 +++--- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/Repair/RenameDutchSchemaSlugs.php b/lib/Repair/RenameDutchSchemaSlugs.php index f66d4b62..d8f4b844 100644 --- a/lib/Repair/RenameDutchSchemaSlugs.php +++ b/lib/Repair/RenameDutchSchemaSlugs.php @@ -69,7 +69,7 @@ class RenameDutchSchemaSlugs implements IRepairStep { * @var array */ public const SLUG_MAP = [ - 'beoordeeling' => 'assessment', + 'beoordeeling' => 'software-review', 'bioMaatregel' => 'bioMeasure', 'contactpersoon' => 'contactPerson', 'dienst' => 'service', diff --git a/lib/Service/ModerationService.php b/lib/Service/ModerationService.php index 62dfac8a..1d0b6f79 100644 --- a/lib/Service/ModerationService.php +++ b/lib/Service/ModerationService.php @@ -63,7 +63,7 @@ class ModerationService { /** * The review moderated catalog object type. */ - public const MODERATED_TYPE_REVIEW = 'assessment'; + public const MODERATED_TYPE_REVIEW = 'software-review'; /** * Pending (awaiting moderation) state — shared field value across types. diff --git a/lib/Service/ReviewAggregateService.php b/lib/Service/ReviewAggregateService.php index 8e13a1d7..510cb47a 100644 --- a/lib/Service/ReviewAggregateService.php +++ b/lib/Service/ReviewAggregateService.php @@ -43,7 +43,7 @@ class ReviewAggregateService { /** * The catalog object type reviews live on. */ - public const REVIEW_TYPE = 'assessment'; + public const REVIEW_TYPE = 'software-review'; /** * Public-visible moderation state. diff --git a/lib/Service/ReviewService.php b/lib/Service/ReviewService.php index 3bc2e1c8..640a5ee9 100644 --- a/lib/Service/ReviewService.php +++ b/lib/Service/ReviewService.php @@ -47,7 +47,7 @@ class ReviewService { /** * The catalog object type reviews live on. */ - public const REVIEW_TYPE = 'assessment'; + public const REVIEW_TYPE = 'software-review'; /** * Moderation state of a freshly-submitted review — mirrors diff --git a/lib/Service/SettingsService.php b/lib/Service/SettingsService.php index 280c852a..7099a8a3 100644 --- a/lib/Service/SettingsService.php +++ b/lib/Service/SettingsService.php @@ -119,7 +119,7 @@ class SettingsService { * @var array */ public const LEGACY_SCHEMA_KEY = [ - 'assessment' => 'beoordeeling_schema', + 'software-review' => 'beoordeeling_schema', 'bioMeasure' => 'bioMaatregel_schema', 'connection' => 'koppeling_schema', 'contactPerson' => 'contactpersoon_schema', @@ -907,7 +907,7 @@ public function getSchemaIdForObjectType(string $objectType): ?int { // (`koppeling_gebruik_schema`). Renaming a subset would resolve some // types and silently leave others reporting "not configured", which is // how the ratings feature died once already. Tracked as its own change. - 'assessment' => 'beoordeeling_schema', + 'software-review' => 'beoordeeling_schema', 'service' => 'dienst_schema', 'usage' => 'gebruik_schema', 'contract' => 'contract_schema', @@ -4143,7 +4143,7 @@ private function configureVoorzieningen(): array { 'usage' => 'gebruik_schema', 'contract' => 'contract_schema', 'connection' => 'koppeling_schema', - 'assessment' => 'beoordeeling_schema', + 'software-review' => 'beoordeeling_schema', 'module' => 'module_schema', 'compliancy' => 'compliancy_schema', 'moduleversie' => 'moduleVersie_schema', From 77e156aabcf7f9f7e50380b9684493f32d35af43 Mon Sep 17 00:00:00 2001 From: Conduction Release Bot Date: Mon, 31 Aug 2026 23:41:09 +0200 Subject: [PATCH 3/6] fix(register): move the schema KEY with the slug, this register keys by slug Measured on the descriptor: key equals slug for every other schema here. Renaming only the slug made this one the single exception, and a reference that names a schema by bare string then has no way to stay right. The key is anchored to the schema-entry indent, so a nested property with the same name cannot be caught by it: dossiq has four `location` PROPERTIES, and an unanchored rename reshaped all four. --- lib/Settings/softwarecatalogus_register.json | 4 ++-- lib/Settings/stackiq_mock_register.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/Settings/softwarecatalogus_register.json b/lib/Settings/softwarecatalogus_register.json index c8f1de9f..2d51350a 100644 --- a/lib/Settings/softwarecatalogus_register.json +++ b/lib/Settings/softwarecatalogus_register.json @@ -890,7 +890,7 @@ "magicMapping": true, "autoCreateTable": true }, - "assessment": { + "software-review": { "magicMapping": true, "autoCreateTable": true }, @@ -3941,7 +3941,7 @@ } } }, - "assessment": { + "software-review": { "uri": null, "slug": "software-review", "x-openregister-notifications": { diff --git a/lib/Settings/stackiq_mock_register.json b/lib/Settings/stackiq_mock_register.json index 84b091ac..dbca6987 100644 --- a/lib/Settings/stackiq_mock_register.json +++ b/lib/Settings/stackiq_mock_register.json @@ -27,7 +27,7 @@ } }, "schemas": { - "assessment": { + "software-review": { "properties": { "auteur": { "type": "string", From bd4d2f4d471e8960564217cdd1afc21e04dceb99 Mon Sep 17 00:00:00 2001 From: Conduction Release Bot Date: Tue, 1 Sep 2026 06:58:34 +0200 Subject: [PATCH 4/6] test(settings): resolve the catalog type by its new slug The object type IS the schema slug here, so software-review is what getSchemaIdForObjectType resolves now. The config key beoordeeling_schema is unchanged, which is the whole point of the split the test pins. --- .../SettingsServiceCatalogTypeResolutionTest.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/Unit/Service/SettingsServiceCatalogTypeResolutionTest.php b/tests/Unit/Service/SettingsServiceCatalogTypeResolutionTest.php index ea4dea83..e7b2945e 100644 --- a/tests/Unit/Service/SettingsServiceCatalogTypeResolutionTest.php +++ b/tests/Unit/Service/SettingsServiceCatalogTypeResolutionTest.php @@ -98,16 +98,17 @@ function (string $app, string $key, string $default = '') use ($voorzieningenCon }//end makeService() /** - * `beoordeeling` — the type the ratings feature resolves — must map to - * schema 43 and register 11. + * `beoordeeling` — the config key the ratings feature resolves through — + * must map to schema 43 and register 11 for the `software-review` type. + * The object TYPE moved with the schema slug; the config KEY did not. * * @return void */ public function testBeoordeelingResolvesRegisterAndSchema(): void { $service = $this->makeService(); - $this->assertSame(43, $service->getSchemaIdForObjectType('assessment'), 'schema id'); - $this->assertSame(11, $service->getRegisterIdForObjectType('assessment'), 'register id'); + $this->assertSame(43, $service->getSchemaIdForObjectType('software-review'), 'schema id'); + $this->assertSame(11, $service->getRegisterIdForObjectType('software-review'), 'register id'); }//end testBeoordeelingResolvesRegisterAndSchema() @@ -131,7 +132,7 @@ public function testEveryCatalogTypeResolves(): void { 'sector' => 34, 'compliancy' => 51, 'moduleVersion' => 52, - 'assessment' => 43, + 'software-review' => 43, ]; foreach ($types as $type => $schemaId) { From 2de5c28bf2d21a39cddedf2fd3061287dbd1db8b Mon Sep 17 00:00:00 2001 From: Conduction Release Bot Date: Tue, 1 Sep 2026 08:01:16 +0200 Subject: [PATCH 5/6] fix(quality): clear the pre-existing format, icon and l10n debt Three checks were already red on development before this branch, and the goal is to leave none behind. Frontend Check (format): CatalogPanels.vue was not prettier-clean. gate-60 icon-vocabulary: src/icons.js registered neither FileDocument nor Web, both named by the manifests. An unregistered name renders NO icon at all, not a fallback glyph, so two surfaces shipped blank. gate-102 manifest-l10n-coverage: three manifest strings had no nl.json key. Two of them were authored in Dutch inside an English-source manifest ("Diensten", "Object statistieken"), so the fix is to write them in English and carry the Dutch in l10n/nl.json, which is where it belongs. "Modules" reads the same in both and gets an explicit key rather than falling through. Verified locally: check:manifest, test:l10n, format, check:schema-l10n and check:l10n-js all pass, and both gates report 0 failures. --- l10n/nl.js | 4 +++- l10n/nl.json | 4 +++- src/components/CatalogPanels.vue | 7 +++---- src/icons.js | 4 ++++ src/manifest.json | 6 +++--- 5 files changed, 16 insertions(+), 9 deletions(-) diff --git a/l10n/nl.js b/l10n/nl.js index 106951d9..b98ef066 100644 --- a/l10n/nl.js +++ b/l10n/nl.js @@ -758,7 +758,9 @@ OC.L10N.register( "Flow": "Flow", "Where the automation lives": "Waar de automatisering zit", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows zijn wat er gebeurt zonder dat iemand klikt: een herinnering voordat een termijn verstrijkt, een bevestiging bij indiening. Hier lees en bewerk je ze. Je hoeft nu niets te bouwen.", - "Open Flows in the menu": "Open Flows in het menu" + "Open Flows in the menu": "Open Flows in het menu", + "Modules": "Modules", + "Object statistics": "Object statistieken" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/nl.json b/l10n/nl.json index 00ea2be2..0cf317d6 100644 --- a/l10n/nl.json +++ b/l10n/nl.json @@ -757,6 +757,8 @@ "Flow": "Flow", "Where the automation lives": "Waar de automatisering zit", "Flows are what happens without anyone clicking: a reminder before a deadline passes, a confirmation sent on submission. This is where you read and edit them. Nothing to build now.": "Flows zijn wat er gebeurt zonder dat iemand klikt: een herinnering voordat een termijn verstrijkt, een bevestiging bij indiening. Hier lees en bewerk je ze. Je hoeft nu niets te bouwen.", - "Open Flows in the menu": "Open Flows in het menu" + "Open Flows in the menu": "Open Flows in het menu", + "Modules": "Modules", + "Object statistics": "Object statistieken" } } diff --git a/src/components/CatalogPanels.vue b/src/components/CatalogPanels.vue index 3b8c0095..457040c2 100644 --- a/src/components/CatalogPanels.vue +++ b/src/components/CatalogPanels.vue @@ -5,9 +5,9 @@

Beheer van Organisaties

Organisaties kunnen worden geaccepteerd en beheerd via de - organisaties pagina. Het aanmaken en bewerken van gebruikers - gaat ook via de organisatie pagina, omdat deze onderdeel zijn - van organisaties. + organisaties pagina. Het aanmaken en bewerken van gebruikers gaat + ook via de organisatie pagina, omdat deze onderdeel zijn van + organisaties.

@@ -171,7 +171,6 @@ export default { }, computed: { - /** * Get object statistics for the table display * diff --git a/src/icons.js b/src/icons.js index 27f3f7d6..443feb1c 100644 --- a/src/icons.js +++ b/src/icons.js @@ -33,6 +33,7 @@ import CurrencyEur from 'vue-material-design-icons/CurrencyEur.vue' import Database from 'vue-material-design-icons/Database.vue' import Domain from 'vue-material-design-icons/Domain.vue' import Eye from 'vue-material-design-icons/Eye.vue' +import FileDocument from 'vue-material-design-icons/FileDocument.vue' import FileDocumentEdit from 'vue-material-design-icons/FileDocumentEdit.vue' import FileSign from 'vue-material-design-icons/FileSign.vue' import FolderOutline from 'vue-material-design-icons/FolderOutline.vue' @@ -63,6 +64,7 @@ import Star from 'vue-material-design-icons/Star.vue' import ViewDashboardOutline from 'vue-material-design-icons/ViewDashboardOutline.vue' import ViewGridOutline from 'vue-material-design-icons/ViewGridOutline.vue' import ViewModule from 'vue-material-design-icons/ViewModule.vue' +import Web from 'vue-material-design-icons/Web.vue' export default { AccountBoxOutline, @@ -86,6 +88,7 @@ export default { Database, Domain, Eye, + FileDocument, FileDocumentEdit, FileSign, FolderOutline, @@ -116,4 +119,5 @@ export default { ViewDashboardOutline, ViewGridOutline, ViewModule, + Web, } diff --git a/src/manifest.json b/src/manifest.json index 26395fa9..13267417 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -246,9 +246,9 @@ { "id": "kpi-services", "type": "stat", - "title": "Diensten", + "title": "Services", "content": { - "label": "Diensten", + "label": "Services", "icon": "Web", "route": { "name": "Diensten" @@ -288,7 +288,7 @@ { "id": "catalog-panels", "type": "catalog-panels", - "title": "Object statistieken", + "title": "Object statistics", "_note": "The management info-box and the two per-object-type statistics tables, moved out of the former hand-written Dashboard view into src/components/CatalogPanels.vue. Registered as a widget TYPE via registerDashboardWidget() in main.js: CnDashboardPage resolves a widget's type against the LIBRARY catalog, not the app registry, and an unregistered type renders 'Widget not available' silently." } ], From f6e38001c950758a8ffc0ba7dd785116b1f39b96 Mon Sep 17 00:00:00 2001 From: Conduction Release Bot Date: Tue, 1 Sep 2026 08:59:26 +0200 Subject: [PATCH 6/6] test(e2e): point the catalog-ratings spec at software-review The spec landed on development while this branch was open and addresses the reviews collection by slug: the afterAll cleanup, the anonymous-review lookup and the persisted-review lookup all named `assessment`. Against the renamed schema the cleanup would have swept nothing and both lookups would have returned empty, which reads as "the review was not persisted at all". Also reformats the file, which was not prettier-clean as merged. --- tests/e2e/spec-coverage/catalog-ratings.spec.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/e2e/spec-coverage/catalog-ratings.spec.ts b/tests/e2e/spec-coverage/catalog-ratings.spec.ts index 64d86a62..4aca5eb9 100644 --- a/tests/e2e/spec-coverage/catalog-ratings.spec.ts +++ b/tests/e2e/spec-coverage/catalog-ratings.spec.ts @@ -8,7 +8,7 @@ * ModuleDetail (/modules/:id) * src/modals/SubmitReviewModal.vue "Write a review" * src/views/settings/sections/ModerationQueue.vue - * reused for type="assessment" + * reused for type="software-review" * at /settings/admin/stackiq * manifest page `Reviews` (/reviews) the reviews index * @@ -79,7 +79,7 @@ test.beforeAll(async () => { test.afterAll(async () => { if (!ctx || !config) return - for (const schema of ['assessment', 'module']) { + for (const schema of ['software-review', 'module']) { const rows = await findAll(ctx, config.register, schema) for (const row of rows) { if (JSON.stringify(row).includes(RUN_ID)) { @@ -136,7 +136,7 @@ async function newAnonymousContext(): Promise { /** Open the seeded module's detail page and wait for the reviews panel. */ async function openModuleReviews(page: Page): Promise { - await page.goto(`${APP_BASE.replace(/\/$/, "")}/modules/${moduleUuid}`, { + await page.goto(`${APP_BASE.replace(/\/$/, '')}/modules/${moduleUuid}`, { waitUntil: 'domcontentloaded', }) await page @@ -379,7 +379,7 @@ test('reviews: a module with no approved reviews shows the empty aggregate, not }) expect(uuid, 'isolated module fixture has no uuid').not.toBe('') - await page.goto(`${APP_BASE.replace(/\/$/, "")}/modules/${uuid}`, { + await page.goto(`${APP_BASE.replace(/\/$/, '')}/modules/${uuid}`, { waitUntil: 'domcontentloaded', }) await page @@ -538,7 +538,7 @@ test('reviews: an anonymous POST cannot create a review', async () => { const rows = await findAll( ctx, config.register, - 'assessment', + 'software-review', `Anon review ${RUN_ID}`, ) expect( @@ -570,7 +570,7 @@ test('reviews: a client-supplied auteur/status is stripped, not stored', async ( `POST /api/reviews returned ${res.status()}: ${await res.text()}`, ).toBeLessThan(300) - const rows = await findAll(ctx, config.register, 'assessment', reviewTitle) + const rows = await findAll(ctx, config.register, 'software-review', reviewTitle) const stored = rows.find((r) => String(r.name ?? '') === reviewTitle) expect(stored, 'the review was not persisted at all').toBeTruthy() // The client-supplied author was IGNORED — the session identity won.