go.charczuk.com@v0.0.0-20240327042549-bc490516bd1a/projects/nodes/pkg/dbmodel/store_test.go (about) 1 /* 2 3 Copyright (c) 2023 - Present. Will Charczuk. All rights reserved. 4 Use of this source code is governed by a MIT license that can be found in the LICENSE file at the root of the repository. 5 6 */ 7 8 package dbmodel 9 10 import ( 11 "context" 12 "testing" 13 14 "github.com/wcharczuk/go-incr" 15 "go.charczuk.com/projects/nodes/pkg/types" 16 "go.charczuk.com/sdk/apputil" 17 "go.charczuk.com/sdk/assert" 18 ) 19 20 func Test_Store_Stabilize(t *testing.T) { 21 ctx := context.Background() 22 appMgr, done := apputil.NewTest(t) 23 defer done() 24 25 u0 := apputil.CreateTestUser(t, appMgr) 26 27 g, _ := CreateTestGraph(t, &appMgr.BaseManager, u0) 28 29 mgr := Manager{ 30 BaseManager: appMgr.BaseManager, 31 } 32 33 store := Store{ 34 GraphID: g.ID, 35 UserID: u0.ID, 36 Model: &mgr, 37 } 38 39 stabilizationNum, err := store.Stabilize(ctx, false) 40 assert.ItsNil(t, err) 41 assert.ItsEqual(t, 2, stabilizationNum) 42 43 values, err := mgr.NodeValues(ctx, g.ID) 44 assert.ItsNil(t, err) 45 assert.ItsEqual(t, 2, len(values)) 46 47 stabilizationNum, err = store.Stabilize(ctx, false) 48 assert.ItsNil(t, err) 49 assert.ItsEqual(t, 3, stabilizationNum) 50 51 verifyNodes, err := mgr.Nodes(ctx, g.ID) 52 assert.ItsNil(t, err) 53 54 assert.ItsAll(t, verifyNodes, func(n Node) bool { 55 return n.ChangedAt < 3 56 }) 57 } 58 59 func Test_Store_Regression_heights(t *testing.T) { 60 ctx := context.Background() 61 ctx = incr.WithTracing(ctx) 62 appMgr, done := apputil.NewTest(t) 63 defer done() 64 65 u0 := apputil.CreateTestUser(t, appMgr) 66 g, nodes := CreateTestGraph(t, &appMgr.BaseManager, u0) 67 mgr := Manager{ 68 BaseManager: appMgr.BaseManager, 69 } 70 store := Store{ 71 GraphID: g.ID, 72 UserID: u0.ID, 73 Model: &mgr, 74 } 75 76 // delete the link between v0 and m0 77 err := store.UnlinkInput(ctx, types.Edge{ 78 ParentID: incr.Identifier(nodes[TestNodeV0Label].ID), 79 ChildID: incr.Identifier(nodes[TestNodeM0Label].ID), 80 }) 81 assert.ItsNil(t, err) 82 83 // add an always node 84 alwaysID, err := store.AddNode(ctx, &types.Node{ 85 Label: "always", 86 Metadata: types.NodeMetadata{ 87 NodeType: "always", 88 InputType: "string", 89 OutputType: "string", 90 }, 91 }) 92 assert.ItsNil(t, err) 93 94 // link v0 to always 95 err = store.LinkInput(ctx, types.Edge{ 96 ParentID: incr.Identifier(nodes[TestNodeV0Label].ID), 97 ChildID: alwaysID, 98 }) 99 assert.ItsNil(t, err) 100 101 // link always to m0 102 err = store.LinkInput(ctx, types.Edge{ 103 ParentID: alwaysID, 104 ChildID: incr.Identifier(nodes[TestNodeM0Label].ID), 105 }) 106 assert.ItsNil(t, err) 107 108 // assert heights are correct 109 v0verify, found, err := store.Node(ctx, incr.Identifier(nodes[TestNodeV0Label].ID)) 110 assert.ItsNil(t, err) 111 assert.ItsEqual(t, true, found) 112 assert.ItsEqual(t, 0, v0verify.Height) 113 114 alwaysVerify, found, err := store.Node(ctx, incr.Identifier(alwaysID)) 115 assert.ItsNil(t, err) 116 assert.ItsEqual(t, true, found) 117 assert.ItsEqual(t, 1, alwaysVerify.Height) 118 119 m0verify, found, err := store.Node(ctx, incr.Identifier(nodes[TestNodeM0Label].ID)) 120 assert.ItsNil(t, err) 121 assert.ItsEqual(t, true, found) 122 assert.ItsEqual(t, 2, m0verify.Height) 123 } 124 125 func Test_Store_SetNodeValue(t *testing.T) { 126 ctx := context.Background() 127 appMgr, done := apputil.NewTest(t) 128 defer done() 129 130 u0 := apputil.CreateTestUser(t, appMgr) 131 132 g, nodes := CreateTestGraph(t, &appMgr.BaseManager, u0) 133 134 mgr := Manager{ 135 BaseManager: appMgr.BaseManager, 136 } 137 138 store := Store{ 139 GraphID: g.ID, 140 UserID: u0.ID, 141 Model: &mgr, 142 } 143 144 stabilizationNum, err := store.Stabilize(ctx, false) 145 assert.ItsNil(t, err) 146 assert.ItsEqual(t, 2, stabilizationNum) 147 148 _ = mgr.SetRecomputeHeap(ctx, g.ID, u0.ID) 149 150 found, err := store.SetNodeValue(ctx, incr.Identifier(nodes[TestNodeV1Label].ID), "test-set-value") 151 assert.ItsNil(t, err) 152 assert.ItsEqual(t, true, found) 153 154 verifyNode, found, err := store.Node(ctx, incr.Identifier(nodes[TestNodeV1Label].ID)) 155 assert.ItsNil(t, err) 156 assert.ItsEqual(t, true, found) 157 assert.ItsEqual(t, 2, verifyNode.SetAt) 158 159 rh, err := mgr.RecomputeHeap(ctx, g.ID) 160 assert.ItsNil(t, err) 161 162 assert.ItsAny(t, rh, func(rh GraphRecomputeHeap) bool { 163 return rh.NodeID == nodes[TestNodeV1Label].ID 164 }) 165 }