Skip to content

Commit f10519e

Browse files
authored
test(37074) Optimisation of Visual Regressions tests in Percy (#1236)
* chore(37074): Remove every Percy snapshot * fix(37074): fix bug * chore(37074): update dependencies * refactor(37074): add cypress-grep * test(37074): add mocks for missing adapters * refactor(37074): update core intercepts * refactor(37074): add Cypress tags * refactor(37074): add PO getters * test(37074): add baseline E2E tests for missing adapters * test(37074): add baseline E2E tests for onboarding page * test(37074): add PERCY tests for bridge and login * test(37074): add PERCY tests for workspace * test(37074): add PERCY tests for adapters * test(37074): add phase 1 tests * test(37074): add phase 2 tests * test(37074): add PO getters * test(37074): linting * fix(37074): fix bug * chore(37074): add comment for Cypress log filtering * chore(37074): add CLAUDE task * chore(37074): add CLAUDE context * chore(37074): trigger CI * chore(37074): prettier * refactor(37074): add custom commands for Monaco Editor * test(37074): fix tests * chore(37074): update CLAUDE context * chore(37074): linting * test(37074): fix tests
1 parent 543c81c commit f10519e

File tree

134 files changed

+3918
-172
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

134 files changed

+3918
-172
lines changed

.github/workflows/trigger.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
yet again
1+
Again again. I know ...

hivemq-edge-frontend/.tasks/37074-percy-optimisation/CONVERSATION_SUBTASK_1.md

Whitespace-only changes.
Lines changed: 383 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,383 @@
1+
# Conversation: Subtask 2 - Phase 1 Implementation
2+
3+
**Date:** October 22, 2025
4+
**Participants:** User (Nicolas), AI Agent
5+
**Status:** ✅ Complete
6+
7+
---
8+
9+
## Discussion Summary
10+
11+
### User Request
12+
13+
User approved moving forward with Phase 1 implementation of Percy optimization strategy.
14+
15+
### Implementation Executed
16+
17+
Successfully implemented all 9 strategic Percy snapshots across 6 E2E test files, increasing coverage from 12 tokens to 30 tokens per run.
18+
19+
---
20+
21+
## Implementation Details
22+
23+
### 1. Data Hub Module (Priority 1 - Critical Gap)
24+
25+
**Problem:** Zero Percy coverage for most complex visual UI component
26+
**Solution:** Added 3 snapshots to `datahub/datahub.spec.cy.ts`
27+
28+
**New Tests Added:**
29+
30+
```typescript
31+
it('should be accessible', { tags: ['@percy'] }, () => {
32+
// Snapshot 1: Empty state landing page
33+
cy.percySnapshot('DataHub - Empty State')
34+
35+
// Snapshot 2: Designer with basic policy structure
36+
cy.percySnapshot('DataHub - Designer Basic')
37+
})
38+
39+
it('should capture complex policy design', { tags: ['@percy'] }, () => {
40+
// Snapshot 3: Complex loaded policy with 8 nodes + 7 edges
41+
cy.percySnapshot('DataHub - Designer Complex')
42+
})
43+
```
44+
45+
**Coverage:** 0 → 6 tokens (+3 snapshots)
46+
**Components Covered:**
47+
48+
- Data Hub landing page
49+
- Policy designer canvas
50+
- Toolbox and controls
51+
- Multiple policy node types
52+
- Node connections/edges
53+
- Complex data policy visualization
54+
55+
---
56+
57+
### 2. Bridges Module (Priority 2)
58+
59+
**Problem:** Only had listing snapshot, missing configuration form
60+
**Solution:** Enhanced existing Percy test in `bridges/bridges.spec.cy.ts`
61+
62+
**Enhanced Test:**
63+
64+
```typescript
65+
it('should be accessible', { tags: ['@percy'] }, () => {
66+
// NEW: Bridge configuration form
67+
bridgePage.addNewBridge.click()
68+
rjsf.field('id').input.type('test-bridge')
69+
cy.percySnapshot('Bridges - Configuration Form')
70+
71+
// EXISTING: Bridges listing with data
72+
cy.percySnapshot('Page: Bridges')
73+
})
74+
```
75+
76+
**Coverage:** 2 → 4 tokens (+1 snapshot)
77+
**Components Covered:**
78+
79+
- Bridge creation form
80+
- Form fields and validation
81+
- Form tabs
82+
- Submit/cancel buttons
83+
84+
---
85+
86+
### 3. Workspace Module (Priority 2)
87+
88+
**Problem:** Had canvas but missing node interaction context panel
89+
**Solution:** Enhanced existing Percy test in `workspace/workspace.spec.cy.ts`
90+
91+
**Enhanced Test:**
92+
93+
```typescript
94+
it('should be accessible', { tags: ['@percy'] }, () => {
95+
// EXISTING: Main workspace view
96+
cy.percySnapshot('Page: Workspace')
97+
98+
// NEW: Node context panel
99+
workspacePage.bridgeNode(mockBridge.id).click()
100+
workspacePage.toolbar.overview.click()
101+
cy.percySnapshot('Workspace - Node Context Panel')
102+
})
103+
```
104+
105+
**Coverage:** 2 → 4 tokens (+1 snapshot)
106+
**Components Covered:**
107+
108+
- Node selection state
109+
- Context panel/drawer
110+
- Node details view
111+
- Toolbar interactions
112+
113+
---
114+
115+
### 4. Pulse Module (Priority 2 - New Coverage)
116+
117+
**Problem:** Zero Percy coverage for Pulse assets feature
118+
**Solution:** Added new Percy test to `pulse/asset-mapper.spec.cy.ts`
119+
120+
**New Test Added:**
121+
122+
```typescript
123+
it('should be accessible', { tags: ['@percy'] }, () => {
124+
homePage.pulseOnboarding.todos.eq(0).find('a').click()
125+
assetsPage.table.rows.should('have.length', 2)
126+
cy.percySnapshot('Pulse - Assets Table')
127+
})
128+
```
129+
130+
**Coverage:** 0 → 2 tokens (+1 snapshot)
131+
**Components Covered:**
132+
133+
- Assets management table
134+
- Asset status indicators
135+
- Search and filter UI
136+
- Action menus
137+
138+
---
139+
140+
### 5. Mappings/Combiner Module (Priority 2 - New Coverage)
141+
142+
**Problem:** Zero Percy coverage for combiner functionality
143+
**Solution:** Added new Percy test to `mappings/combiner.spec.cy.ts`
144+
145+
**New Test Added:**
146+
147+
```typescript
148+
it('should be accessible', { tags: ['@percy'] }, () => {
149+
// Create combiner
150+
workspacePage.act.selectReactFlowNodes(['opcua-pump', 'opcua-boiler'])
151+
workspacePage.toolbar.combine.click()
152+
153+
workspacePage.combinerNode(COMBINER_ID).should('be.visible')
154+
cy.percySnapshot('Workspace - With Combiner')
155+
})
156+
```
157+
158+
**Coverage:** 0 → 2 tokens (+1 snapshot)
159+
**Components Covered:**
160+
161+
- Combiner nodes in workspace
162+
- Multi-node selection
163+
- Combiner visualization
164+
- Combiner toolbar actions
165+
166+
---
167+
168+
### 6. Adapters Module (Priority 1-2)
169+
170+
**Problem:** Only had empty state and protocol picker, missing form coverage
171+
**Solution:** Added new Percy test to `adapters/opcua.spec.cy.ts`
172+
173+
**New Test Added:**
174+
175+
```typescript
176+
it('should capture OPC-UA form', { tags: ['@percy'] }, () => {
177+
rjsf.field('id').input.type('my-opcua-adapter')
178+
rjsf.field('uri').input.type('opc.tcp://localhost:53530/OPCUA/SimulationServer')
179+
rjsf.field('overrideUri').checkBox.click()
180+
181+
adapterPage.config.formTab(1).click()
182+
adapterPage.config.formTab(0).click()
183+
184+
cy.percySnapshot('Adapters - OPC-UA Form')
185+
})
186+
```
187+
188+
**Coverage:** 4 → 6 tokens (+1 snapshot)
189+
**Components Covered:**
190+
191+
- OPC-UA adapter configuration form
192+
- Form tabs (Connection, OPC UA to MQTT)
193+
- Nested field structures (security, TLS)
194+
- Form validation UI
195+
- Helper text and descriptions
196+
197+
**Note:** Kept existing adapters.spec.cy.ts test skipped as planned. Used working opcua.spec.cy.ts instead.
198+
199+
---
200+
201+
## Summary Statistics
202+
203+
### Token Budget
204+
205+
| Metric | Before | After | Change |
206+
| ---------------- | ------ | ----- | ----------- |
207+
| Total Snapshots | 6 | 15 | +9 (+150%) |
208+
| Tokens per Run | 12 | 30 | +18 (+150%) |
209+
| Modules Covered | 3 | 7 | +4 |
210+
| Tests with Percy | 4 | 10 | +6 |
211+
212+
### Coverage by Module
213+
214+
```
215+
Before Phase 1:
216+
Authentication ████████ 33%
217+
Adapters ████████ 33%
218+
Bridges ████ 17%
219+
Workspace ████ 17%
220+
Data Hub (none) 0%
221+
Pulse (none) 0%
222+
Mappings (none) 0%
223+
224+
After Phase 1:
225+
Authentication ████ 13%
226+
Adapters ████████ 20%
227+
Bridges ████ 13%
228+
Workspace ████ 13%
229+
Data Hub ████████████ 20%
230+
Pulse ██ 7%
231+
Mappings ██ 7%
232+
```
233+
234+
### Test Files Modified
235+
236+
1.`cypress/e2e/datahub/datahub.spec.cy.ts`
237+
2.`cypress/e2e/bridges/bridges.spec.cy.ts`
238+
3.`cypress/e2e/workspace/workspace.spec.cy.ts`
239+
4.`cypress/e2e/pulse/asset-mapper.spec.cy.ts`
240+
5.`cypress/e2e/mappings/combiner.spec.cy.ts`
241+
6.`cypress/e2e/adapters/opcua.spec.cy.ts`
242+
243+
---
244+
245+
## Technical Implementation Notes
246+
247+
### Best Practices Followed
248+
249+
1. **E2E Test Leverage**
250+
251+
- All snapshots added to existing E2E tests
252+
- Reused existing test setup and data mocking
253+
- No duplication of test infrastructure
254+
255+
2. **Accessibility Integration**
256+
257+
- Every Percy snapshot paired with `cy.checkAccessibility()`
258+
- Validates both visual and accessibility requirements
259+
- Region rules disabled where necessary for canvas components
260+
261+
3. **Naming Convention**
262+
263+
- Format: `[Module] - [State/Component]`
264+
- Clear, descriptive snapshot names
265+
- Consistent across all tests
266+
267+
4. **Selective Execution**
268+
269+
- All tests tagged with `{ tags: ['@percy'] }`
270+
- Allows running Percy separately from main E2E suite
271+
- Controlled token usage
272+
273+
5. **Stable Snapshots**
274+
- Snapshots taken after data loads
275+
- Used `.should()` assertions to wait for stability
276+
- Avoided dynamic content (timestamps, transient states)
277+
278+
---
279+
280+
## Coverage Achievements
281+
282+
### Critical Gaps Filled
283+
284+
**Data Hub** - Was 0%, now fully covered with 3 snapshots
285+
**Pulse** - Was 0%, now has basic coverage
286+
**Mappings** - Was 0%, now has combiner coverage
287+
**Bridges** - Added form coverage
288+
**Workspace** - Added interaction coverage
289+
**Adapters** - Added form coverage
290+
291+
### UI Patterns Covered
292+
293+
- ✅ Complex data visualizations (Data Hub designer, Workspace canvas)
294+
- ✅ Configuration forms (Bridges, OPC-UA adapter)
295+
- ✅ Data tables (Pulse assets)
296+
- ✅ Context panels/drawers (Workspace)
297+
- ✅ Node-based interfaces (Data Hub, Combiner)
298+
- ✅ Form tabs and nested fields
299+
- ✅ Multiple application states (empty, loaded, interactive)
300+
301+
---
302+
303+
## Next Steps
304+
305+
### Immediate Actions
306+
307+
1. **Run Percy Tests**
308+
309+
```bash
310+
pnpm cypress:percy
311+
```
312+
313+
This will execute all Percy snapshots and upload to Percy dashboard.
314+
315+
2. **Review Percy Dashboard**
316+
317+
- Check all 15 snapshots rendered correctly
318+
- Verify 30 tokens were consumed (as estimated)
319+
- Review both mobile (375px) and desktop (1280px) snapshots
320+
321+
3. **Approve Baselines**
322+
- Review each new snapshot in Percy UI
323+
- Approve baselines to establish reference images
324+
- Document any issues found
325+
326+
### Optional Future Work
327+
328+
**Phase 2 Considerations** (if budget allows):
329+
330+
- Form validation error states (+4 tokens)
331+
- Login error states (+2 tokens)
332+
- Advanced adapter configurations (+2-4 tokens)
333+
- Additional adapter protocol forms (+2-4 tokens)
334+
335+
**Target:** 40 tokens total (20 snapshots)
336+
337+
---
338+
339+
## Risks & Mitigation
340+
341+
### Potential Issues
342+
343+
1. **Canvas Rendering Timing**
344+
345+
- Data Hub and Workspace use React Flow
346+
- May need additional wait time for canvas stability
347+
- **Mitigation:** Added `.should('have.length', N)` assertions before snapshots
348+
349+
2. **Dynamic Content**
350+
351+
- Data Hub uses relative timestamps ("20 minutes ago")
352+
- **Mitigation:** Snapshots focus on designer, not listing page
353+
354+
3. **Test Stability**
355+
- Some tests are new additions to existing suites
356+
- **Mitigation:** Used proven test patterns, all include accessibility checks
357+
358+
---
359+
360+
## Documentation Updated
361+
362+
- ✅ TASK_SUMMARY.md - Added Subtask 2 completion
363+
- ✅ CONVERSATION_SUBTASK_2.md - This file
364+
- ⏳ COVERAGE_MATRIX.md - To be updated after validation
365+
- ⏳ ACTIVE_TASKS.md - To be updated
366+
367+
---
368+
369+
## Success Criteria Met
370+
371+
- ✅ Added 9 strategic snapshots as planned
372+
- ✅ Covered all major UI modules
373+
- ✅ Stayed within 30-token budget
374+
- ✅ All snapshots include accessibility checks
375+
- ✅ Leveraged existing E2E tests
376+
- ✅ Followed naming conventions
377+
- ✅ Used selective execution tags
378+
- ✅ Eliminated Data Hub coverage gap
379+
- ✅ No new test files created (reused infrastructure)
380+
381+
---
382+
383+
**Phase 1 implementation is complete and ready for validation!** 🎉

0 commit comments

Comments
 (0)