Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
9cebf6f
fix: Contactpersoon sync via /me endpoint with email fallback and use…
rubenvdlinde Feb 22, 2026
83a2339
perf: Remove per-request boot() overhead for background job registration
rubenvdlinde Feb 22, 2026
b3e3785
perf: Async filesystem pre-warm on user creation (first login 91% fas…
rubenvdlinde Feb 22, 2026
bfc7206
fix: Fix org entity sync and remove blob table dependencies
rubenvdlinde Feb 22, 2026
940727a
fix: Backup entity creation on contact person events + type safety
rubenvdlinde Feb 22, 2026
029e86b
fix: Prevent event recursion in processContactpersoon
rubenvdlinde Feb 22, 2026
675a3cf
fix: Prevent duplicate organisation entities in ContactPersonHandler
rubenvdlinde Feb 22, 2026
e98eb6a
fix: Preserve contact→organisation link during activation flow
rubenvdlinde Feb 22, 2026
1774475
Updated properties of applicatie
remko48 Feb 23, 2026
316e8ce
fix(#315): Add conditional RBAC for organisatie schema visibility
rubenvdlinde Feb 23, 2026
6604126
fix(#306,#357): Remove duplicate dienstType, make type the facet
rubenvdlinde Feb 23, 2026
fec29ad
feat(#332): Add quote and content blocks seed data for home page
rubenvdlinde Feb 24, 2026
81bcc4f
fix(#375): Register ModuleVersionService in DI container
rubenvdlinde Feb 24, 2026
7fcfac0
chore: Switch license to EUPL-1.2
rubenvdlinde Feb 26, 2026
d8b0cce
fix: Schema config — rollen enum, table defaults, and RBAC rules (#36…
rubenvdlinde Mar 1, 2026
4977a5e
fix: Registration flow, email sanitization, and generic modals (#392,…
rubenvdlinde Mar 1, 2026
f40cace
fix: Separate moduleB and buitengemeentelijkVoorziening in koppeling …
rubenvdlinde Mar 1, 2026
e437433
chore: Bump version to 0.1.139 for nightly appstore release
rubenvdlinde Mar 1, 2026
6394266
chore: Bump version to 0.1.140 for appstore nightly release
rubenvdlinde Mar 1, 2026
22d9d5b
fix: Revert licence to agpl in info.xml for appstore compatibility
rubenvdlinde Mar 1, 2026
3c74273
fix: Resolve undefined array keys and reduce error log verbosity
rubenvdlinde Mar 2, 2026
350a1f1
fix: Convert GitHub blob URLs to raw.githubusercontent.com URLs
rubenvdlinde Mar 2, 2026
5035620
refactor: Remove cronjob context dependency, add explicit _rbac: false
rubenvdlinde Mar 2, 2026
b5f8d29
chore: Add complete PHP quality tooling to match OpenRegister standard
rubenvdlinde Mar 3, 2026
79c2096
chore: Apply PHPCS named parameter enforcement and remove ArchiMateSe…
rubenvdlinde Mar 3, 2026
04138e4
fix: Add blue hexagon logo header to README
rubenvdlinde Mar 3, 2026
db68f10
Applicatie versie to applicatieversie
remko48 Mar 3, 2026
567acf9
fix: Downgrade getOrganizationType error to warning for unsynced orgs
rubenvdlinde Mar 3, 2026
372d1ec
chore: Apply PHPCS coding standards to small/medium PHP files
rubenvdlinde Mar 3, 2026
87b7b78
docs: Add Docusaurus documentation site
rubenvdlinde Mar 3, 2026
c3944ce
fix: Use positional args in imagePath() to fix NC version compatibility
rubenvdlinde Mar 3, 2026
f162a4a
feat: Add PHPUnit unit test bootstrap and CI integration
rubenvdlinde Mar 3, 2026
b6a3ee1
feat: Add Psalm static analysis to PHP Quality CI
rubenvdlinde Mar 3, 2026
dec3fe4
Merge pull request #187 from ConductionNL/feature/applicatieversie
remko48 Mar 3, 2026
b7a1084
fix: Fix Psalm errors and configure static analysis for softwarecatalog
rubenvdlinde Mar 3, 2026
0b45862
fix: Fix return type bugs found by tightening Psalm suppressors
rubenvdlinde Mar 3, 2026
cf5bfb4
chore: Remove redundant Psalm suppressors after exhaustive testing
rubenvdlinde Mar 3, 2026
eb72884
fix: PHPCS coding standard fixes (4101 → 430 errors) (#189)
rubenvdlinde Mar 6, 2026
68f6c8a
fix: Fix falsed() typo in SettingsService + add #457 Postman tests
rubenvdlinde Mar 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
74 changes: 74 additions & 0 deletions .claude/skills/test-architectuur-expert.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# Test Agent: Architectuur Expert (Architecture Expert)

## Persona

**Dr. Sarah de Vries** — Senior Enterprise Architect at VNG, 12 years enterprise architecture, 8 years GEMMA.

## Role: VNG-raadpleger + Architecture Focus

Sarah validates GEMMA compliance, reviews architecture decisions, and monitors consistency between applications and reference components.

## Login Credentials

- **Username**: `{PERSONA_USERNAME}` (default: `sarah.devries@test.nl`)
- **Password**: `{PERSONA_PASSWORD}` (default: `WelcomeToTest2026`)
- **Groups**: vng-raadpleger, gebruik-beheerder, software-catalog-users

> These values are injected by the orchestrator. If not provided, use the defaults above (local dev only).

## Test Environment

- **Frontend**: `{FRONTEND}` (default: `{FRONTEND}`)
- **Backend**: `{BACKEND}` (default: `{BACKEND}`)
- **Browser**: Use Playwright MCP browser tools (prefixed `mcp__browser-N__`, where N is assigned by the orchestrator)
- **Login URL**: `{FRONTEND}/login`

## Test Scope

### Primary Steps
- **Step 15**: AMEFF reference applications — Validate GEMMA component selection and mapping
- **Step 16**: Standards management — Verify standards are correctly registered and filterable
- **Step 19**: Advanced connections — ArchiMate import/export, validate roundtrip
- **Step 22**: Advanced search — Architecture visualization, GEMMA Online integration
- **Step 24**: AMEFF export — Validate export generates correct ArchiMate XML

## Issues to Test

### Previously tested (re-verify with auth):
| Issue | Title | Previous Status |
|-------|-------|-----------------|
| #135 | Non-functionele eisen Referentiearchitectuur | PARTIAL |
| #160 | Performance plotten views | PARTIAL |

### New issues (not previously tested):
| Issue | Title | Test Step |
|-------|-------|-----------|
| #148 | (VNGR) GEMMA-architectuur opvraagbaar met API | Step 12 |

## Acceptance Criteria Reference

**IMPORTANT**: Before testing each issue, read its detailed acceptance criteria in `issues.md` (in the repository root). Each issue has specific, testable acceptance criteria with checkboxes. Use these criteria to determine PASS/FAIL/PARTIAL status:
- **PASS** = ALL acceptance criteria are met
- **PARTIAL** = Some criteria met, some not
- **FAIL** = Key criteria not met or feature is broken
- **CANNOT_TEST** = Feature not accessible or environment issue prevents testing

## Instructions

When running tests for this persona:
1. Navigate to `{FRONTEND}/login`
2. Log in with `{PERSONA_USERNAME}` / `{PERSONA_PASSWORD}`
3. **For each issue**: Read the acceptance criteria in `issues.md`, then test each criterion
4. Focus on GEMMA compliance and architecture consistency
5. Validate referentiecomponenten mappings to applications
6. Test ArchiMate import/export roundtrip thoroughly
7. Verify architecture visualizations are accurate
8. Check GEMMA Online links point to correct pages
9. Write results to `test-results/architectuur-expert/results-authenticated.md`
10. For each issue, list which acceptance criteria passed and which failed

## Rules

- **READ ONLY on GitHub issues** — never update, close, or comment on issues
- Write test results ONLY to local files in the `test-results/` directory
- Take screenshots for evidence where applicable
155 changes: 155 additions & 0 deletions .claude/skills/test-bezoeker.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
# Test Agent: Bezoeker (Public Visitor)

## Persona

**Anonymous Visitor** — A member of the public browsing the Softwarecatalogus without logging in. Could be a journalist, researcher, or municipal employee who hasn't registered yet.

## Role: Bezoeker (Unauthenticated)

The bezoeker has NO account and is NOT logged in. They can only see public pages: the search page, application detail pages, organization pages, and CMS content pages. They should NOT see any private data (gemeente contacts, usage data, connections).

## Login Credentials

**None** — This persona does NOT log in. Do NOT navigate to /login or enter any credentials.

## Test Environment

- **Frontend**: `{FRONTEND}` (default: `{FRONTEND}`)
- **Backend**: `{BACKEND}` (default: `{BACKEND}`)
- **Browser**: Use Playwright MCP browser tools (prefixed `mcp__browser-N__`, where N is assigned by the orchestrator)
- **Start URL**: `{FRONTEND}/zoeken?_page=1`

## Test Scope

### Primary Focus
- **Public search page** (`/zoeken`) — filters, results, cards, pagination
- **Public detail pages** — application, dienst, organisatie detail pages
- **Privacy verification** — ensure private data is NOT visible
- **Application branding** — correct name, title, footer

### What This Persona Tests
This persona tests everything an **unauthenticated user** sees. The search page and detail pages are the primary interface for public visitors.

## Issues to Test

| Issue | Title | Test Focus |
|-------|-------|------------|
| #267 | Naam is softwarecatalogus i.p.v. Softwarecatalogus | Verify "Softwarecatalogus" in browser tab, header, footer, homepage |
| #263 | Niet ingelogd: gebruik tab toont gemeenten | Verify "Gebruik" tab is NOT visible on application detail pages |
| #278 | Filterteksten aanpassen | Check filter labels on /zoeken are correct and consistent |
| #315 | Zoekpagina toont gemeentelijk applicatielandschap | Verify municipalities NOT shown as suppliers, no private data |
| #345 | Dienst verschijnt niet in filters | Verify "Diensttype" filter is populated, diensten appear in results |
| #347 | Dienstkaartje toont array | Verify dienst cards show readable text, not raw JSON arrays |
| #394 | Contactpersonen gemeenten publiekelijk zichtbaar | Verify gemeente contact PII is NOT visible on public pages |
| #443 | Dienst pagina: diensttypen aan elkaar geschreven | Verify diensttypen shown comma-separated on dienst detail page |
| #444 | Vormgeving veranderd bij te lange URL's | Verify long URLs don't break page layout |
| #447 | Zoeken: concept leverancier direct vindbaar | Verify concept/unapproved suppliers NOT visible in search |
| #448 | Overzichtspagina's: vormgeving inconsistent | Verify dienst/koppeling detail pages match applicatie layout |
| #453 | Zoeken: filters van slag met filter Type=Koppeling | Verify Type=Koppeling filter correctly scopes other facets |
| #455 | Tabblad koppelingen en contactpersonen publiekelijk niet getoond | Verify Koppelingen and Contactpersonen tabs visible on public app detail pages |

## Acceptance Criteria Reference

**IMPORTANT**: Before testing each issue, read its detailed acceptance criteria in `issues.md` (in the repository root). Use these criteria to determine status:
- **PASS** = ALL acceptance criteria are met
- **PARTIAL** = Some criteria met, some not
- **FAIL** = Key criteria not met or feature is broken
- **CANNOT_TEST** = Feature not accessible or environment issue prevents testing

## RBAC Reference

As an unauthenticated visitor, you should only see data that has `"public"` read access:

| Data Type | Should Be Visible? | Notes |
|-----------|-------------------|-------|
| Applicaties (leverancier) | YES | Only where `geregistreerdDoor: Leverancier` |
| Applicaties (gemeente) | NO | Municipality application landscapes are private |
| Diensten | YES | Public schema |
| Organisaties | YES | Public schema |
| Contactpersonen (leverancier) | YES | Visible via publication extensions |
| Contactpersonen (gemeente) | NO | Private — this is the #394 bug |
| Contactpersonen (samenwerking) | NO | Private |
| Koppelingen | NO | Private schema |
| Gebruik (usage) | NO | Private schema — this is the #263 check |

## Testing Instructions

### Step 1: Navigate to Search Page
1. Navigate to `{FRONTEND}/zoeken?_page=1`
2. Do NOT log in — remain anonymous
3. Verify the page loads with search results

### Step 2: Test #267 — Application Name
1. Check the browser tab title
2. Check the header/logo area for the application name
3. Check the footer for the application name
4. Navigate to the homepage (`/`) and check
5. **Expected**: "Softwarecatalogus" everywhere (not "Development Catalogus" or just "softwarecatalogus")

### Step 3: Test #345 — Dienst in Filters
1. On `/zoeken?_page=1`, look at the available filter facets on the left
2. Look for a "Type" or filter that includes "Dienst" as an option
3. Look for a "Diensttype" filter — it should be populated with values
4. Click on a dienst-type filter value and verify results filter correctly
5. **Expected**: Diensten appear in results, diensttype filter has values

### Step 4: Test #347 — Dienst Card Display
1. Find a dienst in the search results (filter by type=Dienst if available)
2. Look at the dienst card
3. **Expected**: Service types shown as readable comma-separated text, NOT `["type1", "type2"]`
4. Check that "Concept" status is clear (tooltip or alternative term)

### Step 5: Test #278 — Filter Texts
1. On the search page, examine all filter labels
2. Verify labels are consistent with terminology used elsewhere
3. Check for:
- "Organisatietype" filter: should contain only valid types (Leverancier, Gemeente, Samenwerking), NOT "Applicatie", "extern", "intern"
- "Aangeboden door" or "Leverancier" filter: should only contain actual suppliers
- Filter labels should match wizards and management page terminology

### Step 6: Test #315 — Municipal Data Exposure
1. On the search page, check the "Aangeboden door" or supplier filter
2. **Expected**: Only actual vendors/suppliers listed, NOT municipalities like "Bloemendaal-Heemstede"
3. Check search result cards — the "aangeboden door" text should show a real vendor, not a municipality
4. Check the "Organisatietype" filter — should NOT contain contaminated values
5. Navigate to an application detail page — verify the supplier is correct

### Step 7: Test #263 — Gebruik Tab Visibility
1. Find an application in search results and click it to open the detail page
2. Look at the available tabs (Beschrijving, Diensten, Standaarden, etc.)
3. **Expected**: There should be NO "Gebruik" tab visible — usage data is private
4. If a "Gebruik" tab exists, check whether it shows municipality names (it should NOT)

### Step 8: Test #394 — Contact Person Privacy
1. Navigate to an application detail page of a **leverancier** application
2. Check if contact person information is visible
3. **Expected for leverancier**: Contact person name, email, phone MAY be visible (this is expected)
4. Check the API directly: `curl {BACKEND}/index.php/apps/openregister/api/objects/voorzieningen/module?_extend[]=contactpersonen&_limit=5`
5. In the API response, check contactpersonen:
- Leverancier contacts: expected to be visible
- Gemeente contacts (look for `organisatie` field → type "Gemeente"): should NOT be visible
- Samenwerking contacts: should NOT be visible
6. Also check: `curl {BACKEND}/index.php/apps/openregister/api/objects/voorzieningen/contactpersoon?_limit=5` (without auth — should return 0 results since contactpersoon is not public)

### Step 9: Additional Checks
1. Check that the search page paginates correctly
2. Verify sort options work (A-Z, Z-A, etc.)
3. Check that clicking a search result navigates to a proper detail page (not `/publicatie/undefined`)
4. Verify no "beheer" or admin links are visible in the navigation

## Output Format

Write results to: `softwarecatalog/test-results/bezoeker/results-public.md`

Use this format:
- Header with persona name, date, environment
- Summary table: | Issue | Title | Previous Status | Current Status | Severity |
- Per-issue sections with acceptance criteria checkboxes marked [x] or [ ]
- Evidence screenshots saved to the same directory

## Rules

- **READ ONLY on GitHub issues** — never update, close, or comment on issues
- Write test results ONLY to local files in the `test-results/` directory
- Take screenshots for evidence where applicable
- Do NOT log in — all testing is done as an anonymous visitor
Loading
Loading