transaction_test.go

 1package ygo_test
 2
 3import (
 4	"git.kilimanjaro.io/ygo"
 5	"testing"
 6)
 7
 8func TestReadTransaction(t *testing.T) {
 9	doc, err := ygo.NewDoc()
10	if err != nil {
11		t.Fatalf("failed to create doc: %v", err)
12	}
13	defer doc.Destroy()
14
15	err = doc.WithReadTransaction(func(txn *ygo.Transaction) error {
16		if txn.IsWriteable() {
17			t.Error("read transaction should not be writeable")
18		}
19		return nil
20	})
21	if err != nil {
22		t.Fatalf("transaction failed: %v", err)
23	}
24}
25
26func TestWriteTransaction(t *testing.T) {
27	doc, err := ygo.NewDoc()
28	if err != nil {
29		t.Fatalf("failed to create doc: %v", err)
30	}
31	defer doc.Destroy()
32
33	err = doc.WithWriteTransaction(func(txn *ygo.Transaction) error {
34		if !txn.IsWriteable() {
35			t.Error("write transaction should be writeable")
36		}
37		return nil
38	})
39	if err != nil {
40		t.Fatalf("transaction failed: %v", err)
41	}
42}
43
44func TestTransactionConflict(t *testing.T) {
45	doc, err := ygo.NewDoc()
46	if err != nil {
47		t.Fatalf("failed to create doc: %v", err)
48	}
49	defer doc.Destroy()
50
51	// First transaction uses callback pattern
52	err = doc.WithWriteTransaction(func(txn1 *ygo.Transaction) error {
53		if !txn1.IsWriteable() {
54			t.Error("write transaction should be writeable")
55		}
56
57		// Try to create second concurrent transaction (should fail)
58		err := doc.WithWriteTransaction(func(txn2 *ygo.Transaction) error {
59			// This should not execute
60			t.Error("expected second write transaction to fail while first is open")
61			return nil
62		})
63		if err == nil {
64			t.Error("expected second write transaction to fail while first is open")
65		}
66
67		return nil
68	})
69	if err != nil {
70		t.Fatalf("first transaction failed: %v", err)
71	}
72}
73
74func TestTransactionWithOrigin(t *testing.T) {
75	doc, err := ygo.NewDoc()
76	if err != nil {
77		t.Fatalf("failed to create doc: %v", err)
78	}
79	defer doc.Destroy()
80
81	origin := []byte("test-origin")
82	err = doc.WithWriteTransactionWithOrigin(origin, func(txn *ygo.Transaction) error {
83		if !txn.IsWriteable() {
84			t.Error("write transaction with origin should be writeable")
85		}
86		return nil
87	})
88	if err != nil {
89		t.Fatalf("transaction with origin failed: %v", err)
90	}
91}