|
1 | 1 | /** |
2 | 2 | * @vitest-environment node |
3 | 3 | */ |
| 4 | +import { |
| 5 | + generateLoopBlocks, |
| 6 | + generateParallelBlocks, |
| 7 | +} from '@sim/workflow-persistence/subflow-helpers' |
4 | 8 | import { beforeEach, describe, expect, it, vi } from 'vitest' |
5 | | -import type { WorkflowDiffSummary } from '@/lib/workflows/comparison' |
| 9 | +import { generateWorkflowDiffSummary, type WorkflowDiffSummary } from '@/lib/workflows/comparison' |
6 | 10 | import { |
7 | 11 | classifyChange, |
8 | 12 | listBlockChanges, |
@@ -238,6 +242,61 @@ describe('listOneSidedFields', () => { |
238 | 242 | }) |
239 | 243 |
|
240 | 244 | describe('listBlockChanges', () => { |
| 245 | + it("uses each version's names for moved members and added or removed containers", () => { |
| 246 | + const baseBlocks = { |
| 247 | + source: block('source', { type: 'loop', name: 'Original source' }), |
| 248 | + destination: block('destination', { type: 'parallel', name: 'Original destination' }), |
| 249 | + mover: block('mover', { name: 'Original member', data: { parentId: 'source' } }), |
| 250 | + removedWrapper: block('removedWrapper', { type: 'loop', name: 'Removed wrapper' }), |
| 251 | + survivor: block('survivor', { |
| 252 | + name: 'Original survivor', |
| 253 | + data: { parentId: 'removedWrapper' }, |
| 254 | + }), |
| 255 | + } |
| 256 | + const targetBlocks = { |
| 257 | + source: block('source', { type: 'loop', name: 'Renamed source' }), |
| 258 | + destination: block('destination', { type: 'parallel', name: 'Renamed destination' }), |
| 259 | + mover: block('mover', { name: 'Renamed member', data: { parentId: 'destination' } }), |
| 260 | + addedWrapper: block('addedWrapper', { type: 'parallel', name: 'Added wrapper' }), |
| 261 | + survivor: block('survivor', { name: 'Renamed survivor', data: { parentId: 'addedWrapper' } }), |
| 262 | + } |
| 263 | + const base: WorkflowState = { |
| 264 | + blocks: baseBlocks, |
| 265 | + edges: [], |
| 266 | + loops: generateLoopBlocks(baseBlocks), |
| 267 | + parallels: generateParallelBlocks(baseBlocks), |
| 268 | + } |
| 269 | + const target: WorkflowState = { |
| 270 | + blocks: targetBlocks, |
| 271 | + edges: [], |
| 272 | + loops: generateLoopBlocks(targetBlocks), |
| 273 | + parallels: generateParallelBlocks(targetBlocks), |
| 274 | + } |
| 275 | + const entries = listBlockChanges( |
| 276 | + generateWorkflowDiffSummary(target, base), |
| 277 | + baseBlocks, |
| 278 | + targetBlocks, |
| 279 | + { base, target } |
| 280 | + ) |
| 281 | + const byId = new Map(entries.map((entry) => [entry.id, entry])) |
| 282 | + expect(byId.get('mover')?.moved).toEqual({ |
| 283 | + outOf: 'Original source', |
| 284 | + into: 'Renamed destination', |
| 285 | + }) |
| 286 | + expect(byId.get('source')?.membership?.removed).toEqual([ |
| 287 | + { name: 'Original member', moved: true }, |
| 288 | + ]) |
| 289 | + expect(byId.get('destination')?.membership?.added).toEqual([ |
| 290 | + { name: 'Renamed member', moved: true }, |
| 291 | + ]) |
| 292 | + expect(byId.get('removedWrapper')?.membership?.removed).toEqual([ |
| 293 | + { name: 'Original survivor', moved: true }, |
| 294 | + ]) |
| 295 | + expect(byId.get('addedWrapper')?.membership?.added).toEqual([ |
| 296 | + { name: 'Renamed survivor', moved: true }, |
| 297 | + ]) |
| 298 | + }) |
| 299 | + |
241 | 300 | it('orders modified, added, removed and nests children under an added or removed container', () => { |
242 | 301 | const baseBlocks = { |
243 | 302 | keep: block('keep', { subBlocks: { code: { id: 'code', type: 'code', value: 'a' } } }), |
|
0 commit comments