X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/baf7a940be8927278e3b4b87e7366cebfc16532f..4a42f7f208cbfead335eba9ebe615b35b1742130:/tree_test.go?ds=sidebyside diff --git a/tree_test.go b/tree_test.go index 146ab07..37ecc94 100644 --- a/tree_test.go +++ b/tree_test.go @@ -61,6 +61,36 @@ func TestTreeBuildsEachNodeOnce(t *testing.T) { require.Equal(t, "user: a", treeReadNode(t, tree, 0, 0).Text) } +func TestTreeMissingNodeHasNoErrorAfterWrapping(t *testing.T) { + tree, err := openTree(t.Context(), t.TempDir(), 0, newTestClock().Now) + require.NoError(t, err) + + t.Cleanup(func() { + require.NoError(t, tree.Close()) + }) + + _, built, err := tree.Node(0, 0) + require.NoError(t, err) + require.False(t, built) +} + +func TestTreeReadFailureKeepsItsCause(t *testing.T) { + tree, err := openTree(t.Context(), t.TempDir(), 1, newTestClock().Now) + require.NoError(t, err) + t.Cleanup(func() { + require.NoError(t, tree.Close()) + }) + + require.NoError(t, tree.Add(treeTestNode(0, 0, "user: a"))) + require.NoError(t, tree.levels[0].Close()) + + _, built, err := tree.Node(0, 0) + delete(tree.levels, 0) + require.ErrorIs(t, err, os.ErrClosed) + require.False(t, built) + require.ErrorContains(t, err, "find node position") +} + func TestTreeReopenLoadsTheSameNodes(t *testing.T) { root := t.TempDir() clock := newTestClock() @@ -72,6 +102,7 @@ func TestTreeReopenLoadsTheSameNodes(t *testing.T) { treeTestNode(0, 0, "user: a"), treeTestNode(1, 0, "user: a\nreply: b"), } + for _, node := range nodes { require.NoError(t, tree.Add(node)) } @@ -80,7 +111,7 @@ func TestTreeReopenLoadsTheSameNodes(t *testing.T) { data, err := os.ReadFile(filepath.Join(root, "tree", "2026-01-01.jsonl")) require.NoError(t, err) - require.Equal(t, `{"l":0,"i":1,"text":"reply: b","size":8}`+"\n", strings.SplitAfter(string(data), "\n")[0]) + require.JSONEq(t, `{"l":0,"i":1,"text":"reply: b","size":8}`+"\n", strings.SplitAfter(string(data), "\n")[0]) tree, err = openTree(t.Context(), root, 2, clock.Now) require.NoError(t, err) @@ -90,6 +121,7 @@ func TestTreeReopenLoadsTheSameNodes(t *testing.T) { }() require.Equal(t, len(nodes), tree.Count()) + for _, node := range nodes { require.Equal(t, node, treeReadNode(t, tree, node.Level, node.Index)) } @@ -106,6 +138,7 @@ func TestTreeBuildsAMissingIndexAgain(t *testing.T) { treeTestNode(0, 0, "user: a"), treeTestNode(1, 0, "user: a\nreply: b"), } + for _, node := range nodes { require.NoError(t, tree.Add(node)) } @@ -125,6 +158,7 @@ func TestTreeBuildsAMissingIndexAgain(t *testing.T) { }() require.Equal(t, len(nodes), tree.Count()) + for _, node := range nodes { require.Equal(t, node, treeReadNode(t, tree, node.Level, node.Index)) } @@ -156,33 +190,3 @@ func TestTreeIndexesTheNodesAfterACrash(t *testing.T) { require.Equal(t, "reply: b", treeReadNode(t, tree, 0, 1).Text) require.NoError(t, tree.Add(treeTestNode(1, 0, "user: a\nreply: b"))) } - -func treeTestNode(level, index int, text string) Node { - return Node{ - Level: level, - Index: index, - Text: text, - Size: len(text), - } -} - -// treeReadNode reads the node (l, i) of tree, which must be built. -func treeReadNode(t *testing.T, tree *Tree, level, index int) Node { - t.Helper() - - node, built, err := tree.Node(level, index) - require.NoError(t, err) - require.True(t, built, "node (%d, %d)", level, index) - - return node -} - -// treeIsBuilt tells if the node (l, i) of tree is built. -func treeIsBuilt(t *testing.T, tree *Tree, level, index int) bool { - t.Helper() - - built, err := tree.Built(level, index) - require.NoError(t, err) - - return built -}