...

Source file src/edge-infra.dev/pkg/edge/datasync/cushion/replication_test.go

Documentation: edge-infra.dev/pkg/edge/datasync/cushion

     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  	// with provider
    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  	// no update should occur
    64  	updatedReplDoc := replDoc
    65  	updateReplicationSetDoc(&updatedReplDoc, createDataset(&req))
    66  
    67  	assert.Equal(t, replDoc, updatedReplDoc)
    68  
    69  	// with provider
    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  	// update should occur for different db
   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  	// with provider
   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  	// update should occur for different db
   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  	// only provider should update for existing db
   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  	// Confirm that update did not happen
   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