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}