]> git.giacomolli.uk - onechat/blobdiff - tree_test.go
Prove direct cancellation during a pending sync
[onechat] / tree_test.go
index 46c17c728125f326c8ae451669b73f03fc6271c0..37ecc9489de5c99eb75edb61f7353da931d728ac 100644 (file)
@@ -61,6 +61,36 @@ func TestTreeBuildsEachNodeOnce(t *testing.T) {
        require.Equal(t, "user: a", treeReadNode(t, tree, 0, 0).Text)
 }
 
        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()
 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"),
        }
                treeTestNode(0, 0, "user: a"),
                treeTestNode(1, 0, "user: a\nreply: b"),
        }
+
        for _, node := range nodes {
                require.NoError(t, tree.Add(node))
        }
        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)
 
        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)
 
        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())
        }()
 
        require.Equal(t, len(nodes), tree.Count())
+
        for _, node := range nodes {
                require.Equal(t, node, treeReadNode(t, tree, node.Level, node.Index))
        }
        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"),
        }
                treeTestNode(0, 0, "user: a"),
                treeTestNode(1, 0, "user: a\nreply: b"),
        }
+
        for _, node := range nodes {
                require.NoError(t, tree.Add(node))
        }
        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())
        }()
 
        require.Equal(t, len(nodes), tree.Count())
+
        for _, node := range nodes {
                require.Equal(t, node, treeReadNode(t, tree, node.Level, node.Index))
        }
        for _, node := range nodes {
                require.Equal(t, node, treeReadNode(t, tree, node.Level, node.Index))
        }