1 package cushion
2
3 import (
4 "context"
5 "errors"
6 "net/http"
7 "testing"
8
9 "github.com/go-kivik/kivik/v4"
10 internal "github.com/go-kivik/kivik/v4/int/errors"
11 "github.com/stretchr/testify/assert"
12 "github.com/stretchr/testify/require"
13
14 dsv1alpha1 "edge-infra.dev/pkg/edge/datasync/apis/v1alpha1"
15 )
16
17 func TestCreateReplicationSetDoc(t *testing.T) {
18 req := Request{
19 TenantID: "bsl-id",
20 DBName: "my-db",
21 Provider: "",
22 EntityID: "doc-id",
23 EntityType: "json",
24 EnterpriseUnitID: "my-enterprise-unit-id",
25 }
26 expectedReplDoc := dsv1alpha1.ReplicationSet{
27 Datasets: []dsv1alpha1.Dataset{
28 {
29 Name: "my-db",
30 Config: defaultReplConfig(),
31 Stores: []string{},
32 Touchpoints: []string{},
33 EnterpriseUnitID: "my-enterprise-unit-id",
34 },
35 },
36 }
37
38 replDoc := createReplicationSetDoc(createDataset(&req))
39 assert.Equal(t, &expectedReplDoc, replDoc)
40
41
42 req2 := req
43 req2.Provider = "provider"
44
45 expectedReplDoc2 := expectedReplDoc
46 expectedReplDoc2.Providers = []dsv1alpha1.Provider{{Name: "provider"}}
47 expectedReplDoc2.Datasets[0].Provider = &dsv1alpha1.Provider{Name: "provider"}
48
49 rsd2 := createReplicationSetDoc(createDataset(&req2))
50 assert.Equal(t, &expectedReplDoc2, rsd2)
51 }
52
53 func TestUpdateReplicationSetDocNone(t *testing.T) {
54 req := Request{
55 TenantID: "bsl-id",
56 DBName: "my-db",
57 Provider: "",
58 EntityID: "doc-id",
59 EntityType: "json",
60 }
61 replDoc := dsv1alpha1.ReplicationSet{Datasets: []dsv1alpha1.Dataset{createDataset(&req)}}
62
63
64 updatedReplDoc := replDoc
65 updateReplicationSetDoc(&updatedReplDoc, createDataset(&req))
66
67 assert.Equal(t, replDoc, updatedReplDoc)
68
69
70 req2 := req
71 req2.Provider = "provider"
72 expectedReplDoc2 := updatedReplDoc
73 expectedReplDoc2.Providers = []dsv1alpha1.Provider{{Name: "provider"}}
74 expectedReplDoc2.Datasets[0].Provider = &dsv1alpha1.Provider{Name: "provider"}
75
76 rsd2 := createReplicationSetDoc(createDataset(&req2))
77 assert.Equal(t, &expectedReplDoc2, rsd2)
78 }
79
80 func TestBuildReplicationDocCache_Error(t *testing.T) {
81 ctx := context.Background()
82 dbname := "test-db"
83 storer := NewCouchDBStorage(&kivik.Client{}, nil)
84 dbGetter := func(_ string) (*MessageBuffer, error) {
85 return nil, errors.New("database error")
86 }
87
88 cache, err := BuildReplicationDocCache(ctx, dbname, storer, dbGetter)
89
90 require.Error(t, err)
91 require.Nil(t, cache)
92 }
93
94 func TestBuildReplicationDocCache_NotFound(t *testing.T) {
95 ctx := context.Background()
96 dbname := "test-db"
97 storer := NewCouchDBStorage(&kivik.Client{}, nil)
98 dbGetter := func(_ string) (*MessageBuffer, error) {
99 return nil, &internal.Error{Status: http.StatusNotFound, Err: errors.New("not found")}
100 }
101
102 cache, err := BuildReplicationDocCache(ctx, dbname, storer, dbGetter)
103
104 require.NoError(t, err)
105 require.NotNil(t, cache)
106 require.Equal(t, dbname, cache.replDB)
107 require.NotNil(t, cache.datasets)
108 require.Equal(t, storer, cache.storer)
109 require.NotNil(t, cache.dbGetter)
110 }
111 func TestUpdateReplicationSetDoc(t *testing.T) {
112 req := Request{
113 TenantID: "bsl-id",
114 DBName: "my-db",
115 Provider: "",
116 EntityID: "doc-id",
117 EntityType: "json",
118 EnterpriseUnitID: "my-enterprise-unit-id",
119 }
120
121 replDoc := dsv1alpha1.ReplicationSet{Datasets: []dsv1alpha1.Dataset{createDataset(&req)}}
122
123
124 updatedReplDoc := replDoc
125 updatedRequest := req
126 updatedRequest.DBName = "my-db2"
127 updatedRequest.DBName = "my-enterprise-unit-2"
128 updateReplicationSetDoc(&updatedReplDoc, createDataset(&updatedRequest))
129
130 assert.NotEqual(t, replDoc, updatedReplDoc)
131
132 assert.Len(t, updatedReplDoc.Providers, 0)
133 assert.Len(t, updatedReplDoc.Datasets, 2)
134
135 assert.Equal(t, replDoc.Datasets[0], updatedReplDoc.Datasets[0])
136 assert.Equal(t, createDataset(&updatedRequest), updatedReplDoc.Datasets[1])
137
138
139 req3 := Request{
140 TenantID: "bsl-id",
141 DBName: "my-db3",
142 Provider: "provider3",
143 EntityID: "doc-id",
144 EntityType: "json",
145 }
146
147 updatedReplDoc2 := updatedReplDoc
148
149
150 updateReplicationSetDoc(&updatedReplDoc2, createDataset(&req3))
151
152 assert.NotEqual(t, updatedReplDoc, updatedReplDoc2)
153
154 assert.Len(t, updatedReplDoc2.Providers, 1)
155 assert.Len(t, updatedReplDoc2.Datasets, 3)
156
157 assert.Equal(t, updatedReplDoc2.Providers[0].Name, req3.Provider)
158
159 assert.Equal(t, updatedReplDoc.Datasets[0], updatedReplDoc2.Datasets[0])
160 assert.Equal(t, updatedReplDoc.Datasets[1], updatedReplDoc2.Datasets[1])
161 assert.Equal(t, createDataset(&req3), updatedReplDoc2.Datasets[2])
162 }
163
164 func TestUpdateSameReplicationSetDoc(t *testing.T) {
165 req := Request{
166 TenantID: "bsl-id",
167 DBName: "my-db",
168 Provider: "no-change-provider",
169 EntityID: "doc-id",
170 EntityType: "json",
171 EnterpriseUnitID: "no-change-euid",
172 }
173 replDoc := dsv1alpha1.ReplicationSet{Datasets: []dsv1alpha1.Dataset{createDataset(&req)}}
174
175 updatedRequest := req
176 updatedRequest.Provider = "change-provider"
177 updatedRequest.EnterpriseUnitID = "change-euid"
178
179
180 updatedReplDoc := replDoc
181 updateReplicationSetDoc(&updatedReplDoc, createDataset(&updatedRequest))
182
183 assert.NotEqual(t, replDoc, updatedReplDoc)
184
185 assert.Len(t, updatedReplDoc.Providers, 1)
186 assert.Len(t, updatedReplDoc.Datasets, 1)
187
188
189 assert.Equal(t, "no-change-provider", updatedReplDoc.Datasets[0].Provider.Name)
190 assert.Equal(t, "no-change-euid", updatedReplDoc.Datasets[0].EnterpriseUnitID)
191 }
192
View as plain text