fabric-samples/asset-transfer-private-data/chaincode-go/chaincode/asset_queries_test.go
Mark S. Lewis 110e732259 Update Go chaincode to fabric-contract-api-go/v2
Signed-off-by: Mark S. Lewis <Mark.S.Lewis@outlook.com>
2024-06-21 15:18:12 -04:00

185 lines
6.6 KiB
Go

/*
Copyright IBM Corp. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package chaincode_test
import (
"encoding/json"
"fmt"
"testing"
"github.com/hyperledger/fabric-protos-go-apiv2/ledger/queryresult"
"github.com/hyperledger/fabric-samples/asset-transfer-private-data/chaincode-go/chaincode"
"github.com/hyperledger/fabric-samples/asset-transfer-private-data/chaincode-go/chaincode/mocks"
"github.com/stretchr/testify/require"
)
/*
For details on generating the mocks, see comments in the file asset_transfer_test.go
*/
func TestReadAsset(t *testing.T) {
transactionContext, chaincodeStub := prepMocksAsOrg1()
assetTransferCC := chaincode.SmartContract{}
assetBytes, err := assetTransferCC.ReadAsset(transactionContext, "id1")
require.NoError(t, err)
require.Nil(t, assetBytes)
chaincodeStub.GetPrivateDataReturns(nil, fmt.Errorf("unable to retrieve asset"))
assetBytes, err = assetTransferCC.ReadAsset(transactionContext, "id1")
require.EqualError(t, err, "failed to read asset: unable to retrieve asset")
testAsset := &chaincode.Asset{
ID: "id1",
Type: "testfulasset",
Color: "gray",
Size: 7,
Owner: myOrg1Clientid,
}
setReturnPrivateDataInStub(t, chaincodeStub, testAsset)
assetRead, err := assetTransferCC.ReadAsset(transactionContext, "id1")
require.NoError(t, err)
require.Equal(t, testAsset, assetRead)
}
func TestReadAssetPrivateDetails(t *testing.T) {
transactionContext, chaincodeStub := prepMocksAsOrg1()
assetTransferCC := chaincode.SmartContract{}
assetBytes, err := assetTransferCC.ReadAssetPrivateDetails(transactionContext, myOrg1PrivCollection, "id1")
require.NoError(t, err)
require.Nil(t, assetBytes)
// read from the collection with no access
chaincodeStub.GetPrivateDataReturns(nil, fmt.Errorf("collection not found"))
assetBytes, err = assetTransferCC.ReadAssetPrivateDetails(transactionContext, myOrg2PrivCollection, "id1")
require.EqualError(t, err, "failed to read asset details: collection not found")
returnPrivData := &chaincode.AssetPrivateDetails{
ID: "id1",
AppraisedValue: 5,
}
setReturnAssetPrivateDetailsInStub(t, chaincodeStub, returnPrivData)
assetRead, err := assetTransferCC.ReadAssetPrivateDetails(transactionContext, myOrg1PrivCollection, "id1")
require.NoError(t, err)
require.Equal(t, returnPrivData, assetRead)
}
func TestReadTransferAgreement(t *testing.T) {
transactionContext, chaincodeStub := prepMocksAsOrg1()
assetTransferCC := chaincode.SmartContract{}
// TransferAgreement does not exist
assetBytes, err := assetTransferCC.ReadTransferAgreement(transactionContext, "id1")
require.NoError(t, err)
require.Nil(t, assetBytes)
chaincodeStub.GetPrivateDataReturns([]byte(myOrg2Clientid), nil)
expectedData := &chaincode.TransferAgreement{
ID: "id1",
BuyerID: myOrg2Clientid,
}
dataRead, err := assetTransferCC.ReadTransferAgreement(transactionContext, "id1")
require.NoError(t, err)
require.Equal(t, expectedData, dataRead)
}
func TestQueryAssetByOwner(t *testing.T) {
transactionContext, chaincodeStub := prepMocksAsOrg1()
asset := &chaincode.Asset{Type: "valuableasset", ID: "asset1", Owner: "user1"}
asset1Bytes, err := json.Marshal(asset)
require.NoError(t, err)
iterator := &mocks.StateQueryIterator{}
iterator.HasNextReturnsOnCall(0, true)
iterator.HasNextReturnsOnCall(1, false)
iterator.NextReturns(&queryresult.KV{Value: asset1Bytes}, nil)
chaincodeStub.GetPrivateDataQueryResultReturns(iterator, nil)
assetTransferCC := &chaincode.SmartContract{}
assets, err := assetTransferCC.QueryAssetByOwner(transactionContext, "valuableasset", "user1")
require.NoError(t, err)
require.Equal(t, []*chaincode.Asset{asset}, assets)
iterator.HasNextReturns(true)
iterator.NextReturns(nil, fmt.Errorf("failed retrieving next item"))
assets, err = assetTransferCC.QueryAssetByOwner(transactionContext, "valuableasset", "user1")
require.EqualError(t, err, "failed retrieving next item")
require.Nil(t, assets)
}
func TestQueryAssets(t *testing.T) {
transactionContext, chaincodeStub := prepMocksAsOrg1()
// Iterator with no records
iterator := &mocks.StateQueryIterator{}
iterator.HasNextReturns(false)
chaincodeStub.GetPrivateDataQueryResultReturns(iterator, nil)
assetTransferCC := &chaincode.SmartContract{}
assets, err := assetTransferCC.QueryAssets(transactionContext, "querystr")
require.NoError(t, err)
require.Equal(t, []*chaincode.Asset{}, assets)
iterator = &mocks.StateQueryIterator{}
chaincodeStub.GetPrivateDataQueryResultReturns(iterator, nil)
iterator.HasNextReturns(true)
iterator.NextReturns(nil, fmt.Errorf("failed retrieving next item"))
assets, err = assetTransferCC.QueryAssets(transactionContext, "querystr")
require.EqualError(t, err, "failed retrieving next item")
require.Nil(t, assets)
asset := &chaincode.Asset{Type: "valuableasset", ID: "asset1", Owner: "user1"}
asset1Bytes, err := json.Marshal(asset)
require.NoError(t, err)
iterator = &mocks.StateQueryIterator{}
chaincodeStub.GetPrivateDataQueryResultReturns(iterator, nil)
iterator.HasNextReturnsOnCall(0, true)
iterator.HasNextReturnsOnCall(1, false)
iterator.NextReturns(&queryresult.KV{Value: asset1Bytes}, nil)
assets, err = assetTransferCC.QueryAssets(transactionContext, "querystr")
require.NoError(t, err)
require.Equal(t, []*chaincode.Asset{asset}, assets)
}
func TestGetAssetByRange(t *testing.T) {
transactionContext, chaincodeStub := prepMocksAsOrg1()
// Iterator with no records
iterator := &mocks.StateQueryIterator{}
iterator.HasNextReturns(false)
chaincodeStub.GetPrivateDataByRangeReturns(iterator, nil)
assetTransferCC := &chaincode.SmartContract{}
assets, err := assetTransferCC.GetAssetByRange(transactionContext, "st", "end")
require.NoError(t, err)
require.Equal(t, []*chaincode.Asset{}, assets)
iterator = &mocks.StateQueryIterator{}
chaincodeStub.GetPrivateDataByRangeReturns(iterator, nil)
iterator.HasNextReturns(true)
iterator.NextReturns(nil, fmt.Errorf("failed retrieving next item"))
assets, err = assetTransferCC.GetAssetByRange(transactionContext, "st", "end")
require.EqualError(t, err, "failed retrieving next item")
require.Nil(t, assets)
asset := &chaincode.Asset{Type: "valuableasset", ID: "asset1", Owner: "user1"}
asset1Bytes, err := json.Marshal(asset)
require.NoError(t, err)
iterator = &mocks.StateQueryIterator{}
chaincodeStub.GetPrivateDataByRangeReturns(iterator, nil)
iterator.HasNextReturnsOnCall(0, true)
iterator.HasNextReturnsOnCall(1, false)
iterator.NextReturns(&queryresult.KV{Value: asset1Bytes}, nil)
assets, err = assetTransferCC.GetAssetByRange(transactionContext, "st", "end")
require.NoError(t, err)
require.Equal(t, []*chaincode.Asset{asset}, assets)
}