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  }