1package gocb
2
3import (
4	"encoding/json"
5	"strings"
6
7	gocbcore "github.com/couchbase/gocbcore/v9"
8)
9
10func (suite *UnitTestSuite) TestMutationState_Add() {
11	fakeBucket := &Bucket{}
12	fakeBucket.bucketName = "frank"
13
14	fakeToken1 := MutationToken{
15		token: gocbcore.MutationToken{
16			VbID:   1,
17			VbUUID: gocbcore.VbUUID(9),
18			SeqNo:  gocbcore.SeqNo(12),
19		},
20		bucketName: fakeBucket.Name(),
21	}
22	fakeToken2 := MutationToken{
23		token: gocbcore.MutationToken{
24			VbID:   2,
25			VbUUID: gocbcore.VbUUID(1),
26			SeqNo:  gocbcore.SeqNo(22),
27		},
28		bucketName: fakeBucket.Name(),
29	}
30	fakeToken3 := MutationToken{
31		token: gocbcore.MutationToken{
32			VbID:   2,
33			VbUUID: gocbcore.VbUUID(4),
34			SeqNo:  gocbcore.SeqNo(99),
35		},
36		bucketName: fakeBucket.Name(),
37	}
38
39	state := NewMutationState(fakeToken1, fakeToken2)
40	state.Add(fakeToken3)
41
42	bytes, err := json.Marshal(&state)
43	if err != nil {
44		suite.T().Fatalf("Failed to marshal %v", err)
45	}
46
47	if strings.Compare(string(bytes), "{\"frank\":{\"1\":[12,\"9\"],\"2\":[99,\"4\"]}}") != 0 {
48		suite.T().Fatalf("Failed to generate correct JSON output %s", bytes)
49	}
50
51	// So as to avoid testing on private properties we'll check if unmarshal works by marshaling the result.
52	var afterState MutationState
53	err = json.Unmarshal(bytes, &afterState)
54	if err != nil {
55		suite.T().Fatalf("Failed to unmarshal %v", err)
56	}
57
58	bytes, err = json.Marshal(&state)
59	if err != nil {
60		suite.T().Fatalf("Failed to marshal %v", err)
61	}
62
63	if strings.Compare(string(bytes), "{\"frank\":{\"1\":[12,\"9\"],\"2\":[99,\"4\"]}}") != 0 {
64		suite.T().Fatalf("Failed to generate correct JSON output %s", bytes)
65	}
66}
67
68func (suite *UnitTestSuite) TestMutationState_toSeachMutationState() {
69	fakeBucket := &Bucket{}
70	fakeBucket.bucketName = "frank"
71
72	fakeToken1 := MutationToken{
73		token: gocbcore.MutationToken{
74			VbID:   1,
75			VbUUID: gocbcore.VbUUID(9),
76			SeqNo:  gocbcore.SeqNo(12),
77		},
78		bucketName: fakeBucket.Name(),
79	}
80	fakeToken2 := MutationToken{
81		token: gocbcore.MutationToken{
82			VbID:   2,
83			VbUUID: gocbcore.VbUUID(1),
84			SeqNo:  gocbcore.SeqNo(22),
85		},
86		bucketName: fakeBucket.Name(),
87	}
88
89	state := NewMutationState(fakeToken1, fakeToken2)
90
91	searchToken := state.toSearchMutationState()
92
93	// What we actually care about is the format once marshaled.
94	bytes, err := json.Marshal(&searchToken)
95	if err != nil {
96		suite.T().Fatalf("Failed to marshal %v", err)
97	}
98
99	if strings.Compare(string(bytes), "{\"frank\":{\"1/9\":12,\"2/1\":22}}") != 0 {
100		suite.T().Fatalf("Failed to generate correct JSON output %s", bytes)
101	}
102}
103