#49 feat: grafico unificado de provenance con filtro por niveles y re-estabilizacion

This commit is contained in:
2026-08-16 03:10:57 -05:00
parent 5c91e66429
commit ad0bbb579d
14 changed files with 508 additions and 747 deletions

View File

@@ -10,6 +10,8 @@ const vis = vi.hoisted(() => {
setOptions: vi.fn(),
fit: vi.fn(),
destroy: vi.fn(),
getPositions: vi.fn(() => ({})),
moveNode: vi.fn(),
}
const dataSetInstance = {
get: vi.fn(),
@@ -96,12 +98,46 @@ describe('VisChart', () => {
expect(vis.networkInstance.fit).toHaveBeenCalled()
})
it('actualiza la red cuando cambian los nodos o aristas', async () => {
it('separa verticalmente los nodos de una misma columna tras estabilizar', () => {
vis.networkInstance.getPositions.mockReturnValue({
'supplier:5': { x: 0, y: 100 },
'supplier:6': { x: 0, y: 112 },
'municipality:7': { x: 240, y: 100 },
'product:1': { x: -240, y: 60 },
})
mount(VisChart, { props: { nodes: [], edges: [], minVerticalSpacing: 70 } })
const onStabilized = handlerFor(vis.networkInstance.once, 'stabilizationIterationsDone')
onStabilized()
expect(vis.networkInstance.moveNode).toHaveBeenCalledWith('supplier:6', 0, 170)
expect(vis.networkInstance.moveNode).not.toHaveBeenCalledWith('supplier:5', 0, expect.anything())
expect(vis.networkInstance.moveNode).not.toHaveBeenCalledWith('municipality:7', 240, expect.anything())
expect(vis.networkInstance.moveNode).not.toHaveBeenCalledWith('product:1', -240, expect.anything())
})
it('no separa nodos cuando no se indica espaciado vertical mínimo', () => {
vis.networkInstance.getPositions.mockReturnValue({
'supplier:5': { x: 0, y: 100 },
'supplier:6': { x: 0, y: 112 },
})
mount(VisChart, { props: { nodes: [], edges: [] } })
const onStabilized = handlerFor(vis.networkInstance.once, 'stabilizationIterationsDone')
onStabilized()
expect(vis.networkInstance.moveNode).not.toHaveBeenCalled()
})
it('vuelve a estabilizar el grafo cuando cambian los nodos o aristas', async () => {
const wrapper = mount(VisChart, { props: { nodes: [{ id: 'product:1' }], edges: [] } })
expect(vis.networkInstance.setData).toHaveBeenCalledTimes(1)
expect(vis.Network).toHaveBeenCalledTimes(1)
expect(vis.networkInstance.destroy).not.toHaveBeenCalled()
await wrapper.setProps({ nodes: [{ id: 'product:2' }], edges: [{ from: 'product:2', to: 'supplier:5' }] })
expect(vis.networkInstance.destroy).toHaveBeenCalled()
expect(vis.Network).toHaveBeenCalledTimes(2)
expect(vis.networkInstance.setData).toHaveBeenCalledTimes(2)
})