...

Source file src/edge-infra.dev/pkg/edge/datasync/controllers/couchctl/design_doc_controller_test.go

Documentation: edge-infra.dev/pkg/edge/datasync/controllers/couchctl

     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) { //nolint:dupl
    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