...
1 package couchctl
2
3 import (
4 "fmt"
5 "reflect"
6 "testing"
7
8 "edge-infra.dev/pkg/edge/constants/api/cluster"
9 "edge-infra.dev/pkg/edge/constants/api/fleet"
10 dsapi "edge-infra.dev/pkg/edge/datasync/apis/v1alpha1"
11 "edge-infra.dev/test/f2"
12 "edge-infra.dev/test/f2/x/ktest"
13
14 "github.com/go-kivik/kivik/v4"
15 "github.com/stretchr/testify/require"
16 "gotest.tools/v3/assert"
17
18 "sigs.k8s.io/controller-runtime/pkg/client"
19 )
20
21 func TestDesignDocReconciler(t *testing.T) {
22 fin := f2.NewFeature("CouchDesignDocReconciler").
23 WithLabel(_fleetType, fleet.Store, fleet.CouchDB).
24 WithLabel(_clusterType, cluster.Generic, cluster.DSDS).
25 Setup("CouchDBDesignDoc Created", func(ctx f2.Context, t *testing.T) f2.Context {
26 k := ktest.FromContextT(ctx, t)
27 k.WaitOn(t, k.ObjExists(couchDBDatabase))
28 assert.NilError(t, client.IgnoreAlreadyExists(k.Client.Create(ctx, couchDBDesignDoc)))
29 return ctx
30 }).
31 Test("CouchDBDatabase Ready", testReady(couchDBDatabase)).
32 Test("CouchDBDesignDoc Ready", testReady(couchDBDesignDoc)).
33 Test("CouchDBDesignDoc Exist", func(ctx f2.Context, t *testing.T) f2.Context {
34 k := ktest.FromContextT(ctx, t)
35 cc, err := couchdbServerClient(ctx, k.Client, couchDBServer)
36 require.NoError(t, err)
37
38 row := cc.Client.DB(couchDBDatabase.Name).
39 Get(ctx, fmt.Sprintf("_design/%s", couchDBDesignDoc.Spec.ID))
40 require.NoError(t, err)
41 require.True(t, viewExists(row, couchDBDesignDoc, t))
42 return ctx
43 }).
44 Feature()
45
46 f.Test(t, fin)
47 }
48
49 func viewExists(row *kivik.Document, ddoc *dsapi.CouchDBDesignDoc, t *testing.T) bool {
50 data := map[string]interface{}{}
51 err := row.ScanDoc(&data)
52 if err != nil || len(data) == 0 {
53 t.Error("Scan View Error", err)
54 return false
55 }
56
57 if data["_id"] != fmt.Sprintf("_design/%s", ddoc.Spec.ID) {
58 return false
59 }
60
61 expectedViews := ddoc.Spec.DesignDoc.Views
62 actualViews := data["views"].(map[string]interface{})
63
64 if len(expectedViews) != len(actualViews) {
65 t.Log("Expected views length not equal to actual views length")
66 return false
67 }
68
69 for expectedKey, expectedValue := range expectedViews {
70 actualValue, ok := actualViews[expectedKey]
71 if !ok {
72 t.Error("Expected key not found in actual views", expectedKey)
73 return false
74 }
75 actualKeyValues, ok := actualValue.(map[string]interface{})
76 if !ok {
77 t.Error("cannot convert actual value to map[string]interface{}", actualValue)
78 return false
79 }
80 for expectedInnerKey, expectedInnerValue := range expectedValue {
81 actualInnerValue, ok := actualKeyValues[expectedInnerKey]
82 if !ok {
83 t.Error("Expected key not found in actual views", expectedInnerKey)
84 return false
85 }
86 if !reflect.DeepEqual(expectedInnerValue, actualInnerValue) {
87 t.Error("Expected value not equal to actual value", expectedInnerValue, actualInnerValue)
88 return false
89 }
90 }
91 }
92 return true
93 }
94
View as plain text