Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/tough-starfishes-punch.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"chainlink-deployments-framework": patch
---

fix(catalog): updates errors in remote implementation
13 changes: 11 additions & 2 deletions datastore/catalog/remote/address_ref_store.go
Original file line number Diff line number Diff line change
Expand Up @@ -156,8 +156,17 @@ func (s *catalogAddressRefStore) Fetch(_ context.Context) ([]datastore.AddressRe
}

// Check for errors in the response
if err := parseResponseStatus(response.Status); err != nil {
return nil, fmt.Errorf("fetch address refs failed: %w", err)
if statusErr := parseResponseStatus(response.Status); statusErr != nil {
st, sterr := parseStatusError(statusErr)
if sterr != nil {
return nil, sterr
}

if st.Code() == codes.NotFound {
return nil, datastore.ErrAddressRefNotFound
}

return nil, fmt.Errorf("fetch address refs failed: %w", statusErr)
}

// Extract the address find response
Expand Down
80 changes: 57 additions & 23 deletions datastore/catalog/remote/address_ref_store_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ func TestCatalogAddressRefStore_Get(t *testing.T) {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
// Create a fresh store for each test case to avoid concurrency issues
store := setupTestStore(t)
store := setupTestStore(t, "test-domain", "catalog_testing")

key := tt.setup(store)

Expand Down Expand Up @@ -116,7 +116,7 @@ func TestCatalogAddressRefStore_Add(t *testing.T) {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
// Create a fresh store for each test case to avoid concurrency issues
store := setupTestStore(t)
store := setupTestStore(t, "test-domain", "catalog_testing")

addressRef := tt.setup(store)

Expand Down Expand Up @@ -197,7 +197,7 @@ func TestCatalogAddressRefStore_Update(t *testing.T) {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
// Create a fresh store for each test case to avoid concurrency issues
store := setupTestStore(t)
store := setupTestStore(t, "test-domain", "catalog_testing")

addressRef := tt.setup(store)

Expand Down Expand Up @@ -272,7 +272,7 @@ func TestCatalogAddressRefStore_Upsert(t *testing.T) {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
// Create a fresh store for each test case to avoid concurrency issues
store := setupTestStore(t)
store := setupTestStore(t, "test-domain", "catalog_testing")

addressRef := tt.setup(store)

Expand All @@ -288,7 +288,7 @@ func TestCatalogAddressRefStore_Upsert(t *testing.T) {

func TestCatalogAddressRefStore_Delete(t *testing.T) {
t.Parallel()
store := setupTestStore(t)
store := setupTestStore(t, "", "")

version := semver.MustParse("1.0.0")
key := datastore.NewAddressRefKey(12345, "LinkToken", version, "test")
Expand All @@ -309,11 +309,17 @@ func TestCatalogAddressRefStore_FetchAndFilter(t *testing.T) {
setup func(store *catalogAddressRefStore) (datastore.AddressRef, datastore.AddressRef)
createFilter func(addressRef1, addressRef2 datastore.AddressRef) datastore.FilterFunc[datastore.AddressRefKey, datastore.AddressRef]
minExpected int
expectError bool
errorType error
domain string
environment string
verify func(t *testing.T, results []datastore.AddressRef, addressRef1, addressRef2 datastore.AddressRef)
}{
{
name: "fetch_all",
operation: "fetch",
name: "fetch_all",
operation: "fetch",
domain: "test-domain",
environment: "catalog_testing",
setup: func(store *catalogAddressRefStore) (datastore.AddressRef, datastore.AddressRef) {
// Setup test data with unique chain selectors
addressRef1 := newRandomAddressRef()
Expand Down Expand Up @@ -354,8 +360,10 @@ func TestCatalogAddressRefStore_FetchAndFilter(t *testing.T) {
},
},
{
name: "filter_by_chain_selector",
operation: "filter",
name: "filter_by_chain_selector",
operation: "filter",
domain: "test-domain",
environment: "catalog_testing",
setup: func(store *catalogAddressRefStore) (datastore.AddressRef, datastore.AddressRef) {
// Setup test data with unique chain selectors
addressRef1 := newRandomAddressRef()
Expand Down Expand Up @@ -390,8 +398,10 @@ func TestCatalogAddressRefStore_FetchAndFilter(t *testing.T) {
},
},
{
name: "filter_by_address",
operation: "filter",
name: "filter_by_address",
operation: "filter",
domain: "test-domain",
environment: "catalog_testing",
setup: func(store *catalogAddressRefStore) (datastore.AddressRef, datastore.AddressRef) {
// Setup test data with unique addresses
addressRef1 := newRandomAddressRef()
Expand All @@ -418,8 +428,10 @@ func TestCatalogAddressRefStore_FetchAndFilter(t *testing.T) {
},
},
{
name: "filter_by_contract_type",
operation: "filter",
name: "filter_by_contract_type",
operation: "filter",
domain: "test-domain",
environment: "catalog_testing",
setup: func(store *catalogAddressRefStore) (datastore.AddressRef, datastore.AddressRef) {
// Setup test data with different contract types
addressRef1 := newRandomAddressRef()
Expand Down Expand Up @@ -447,14 +459,27 @@ func TestCatalogAddressRefStore_FetchAndFilter(t *testing.T) {
}
},
},
{
name: "fetch_not_found",
operation: "fetch",
setup: func(store *catalogAddressRefStore) (datastore.AddressRef, datastore.AddressRef) {
return datastore.AddressRef{}, datastore.AddressRef{}
},
createFilter: nil,
minExpected: 0,
expectError: true,
errorType: datastore.ErrAddressRefNotFound,
domain: "empty-domain-for-testing",
environment: "empty-env-for-testing",
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
// Create a fresh store for each test case to avoid concurrency issues
store := setupTestStore(t)

// Create a fresh store for each test case to avoid concurrency issues
store := setupTestStore(t, tt.domain, tt.environment)
addressRef1, addressRef2 := tt.setup(store)

var results []datastore.AddressRef
Expand All @@ -473,10 +498,18 @@ func TestCatalogAddressRefStore_FetchAndFilter(t *testing.T) {
}

// Verify
require.NoError(t, err)
require.GreaterOrEqual(t, len(results), tt.minExpected)
if tt.verify != nil {
tt.verify(t, results, addressRef1, addressRef2)
if tt.expectError {
require.Error(t, err)
if tt.errorType != nil {
require.ErrorIs(t, err, tt.errorType)
}
require.Nil(t, results)
} else {
require.NoError(t, err)
require.GreaterOrEqual(t, len(results), tt.minExpected)
if tt.verify != nil {
tt.verify(t, results, addressRef1, addressRef2)
}
}
})
}
Expand Down Expand Up @@ -576,16 +609,17 @@ func TestCatalogAddressRefStore_ConversionHelpers(t *testing.T) {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
// Create a fresh store for each test case to avoid concurrency issues
store := setupTestStore(t)
store := setupTestStore(t, "test-domain", "catalog_testing")

tt.test(t, store)
})
}
}

// setupTestStore creates a real gRPC client connection to a local service
func setupTestStore(t *testing.T) *catalogAddressRefStore {
func setupTestStore(t *testing.T, domain, environment string) *catalogAddressRefStore {
t.Helper()

// Get gRPC address from environment or use default
address := os.Getenv("CATALOG_GRPC_ADDRESS")
if address == "" {
Expand Down Expand Up @@ -614,8 +648,8 @@ func setupTestStore(t *testing.T) *catalogAddressRefStore {

// Create store
store := newCatalogAddressRefStore(catalogAddressRefStoreConfig{
Domain: "test-domain",
Environment: "catalog_testing",
Domain: domain,
Environment: environment,
Client: catalogClient,
})

Expand Down
13 changes: 11 additions & 2 deletions datastore/catalog/remote/chain_metadata_store.go
Original file line number Diff line number Diff line change
Expand Up @@ -209,8 +209,17 @@ func (s *catalogChainMetadataStore) Fetch(_ context.Context) ([]datastore.ChainM
}

// Check for errors in the response
if err := parseResponseStatus(resp.Status); err != nil {
return nil, fmt.Errorf("fetch chain metadata failed: %w", err)
if statusErr := parseResponseStatus(resp.Status); statusErr != nil {
st, sterr := parseStatusError(statusErr)
if sterr != nil {
return nil, sterr
}

if st.Code() == codes.NotFound {
return nil, fmt.Errorf("%w: %s", datastore.ErrChainMetadataNotFound, statusErr.Error())
}

return nil, fmt.Errorf("fetch chain metadata failed: %w", statusErr)
}

findResp := resp.GetChainMetadataFindResponse()
Expand Down
Loading
Loading