mirror of
https://github.com/hyperledger/fabric-samples.git
synced 2026-06-23 01:55:10 +00:00
added unit test for createuser, working on testing write and read schema to pdc functions
This commit is contained in:
parent
7f9350659e
commit
c22b54286a
2 changed files with 384 additions and 360 deletions
|
|
@ -549,7 +549,7 @@ func (s *SmartContract) CreateUserID(ctx contractapi.TransactionContextInterface
|
||||||
return fmt.Errorf("the user with APIId %s already exists", APIId)
|
return fmt.Errorf("the user with APIId %s already exists", APIId)
|
||||||
} else {
|
} else {
|
||||||
UUID, err := uuid.NewRandom()
|
UUID, err := uuid.NewRandom()
|
||||||
fmt.Printf(UUID.String())
|
fmt.Print(UUID.String())
|
||||||
//UUID, err := "Random String", "Even a more random string"
|
//UUID, err := "Random String", "Even a more random string"
|
||||||
//if err == "Random" {
|
//if err == "Random" {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -571,7 +571,7 @@ func (s *SmartContract) CreateUserID(ctx contractapi.TransactionContextInterface
|
||||||
if err3 != nil {
|
if err3 != nil {
|
||||||
return fmt.Errorf("failed to create new user. %v", err3)
|
return fmt.Errorf("failed to create new user. %v", err3)
|
||||||
} else {
|
} else {
|
||||||
fmt.Print("A new User has been created with the UUID %v", UUID)
|
fmt.Printf("A new User has been created with the UUID %v", UUID)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -689,7 +689,7 @@ func (s *SmartContract) CreateGroup(ctx contractapi.TransactionContextInterface,
|
||||||
return fmt.Errorf("failed to create new Group. %v", err)
|
return fmt.Errorf("failed to create new Group. %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Print("The Group %v has been created ", group.GroupName)
|
fmt.Printf("The Group %v has been created ", group.GroupName)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,13 +7,11 @@ package chaincode_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"os"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/hyperledger/fabric-chaincode-go/pkg/cid"
|
"github.com/hyperledger/fabric-chaincode-go/pkg/cid"
|
||||||
"github.com/hyperledger/fabric-chaincode-go/shim"
|
"github.com/hyperledger/fabric-chaincode-go/shim"
|
||||||
"github.com/hyperledger/fabric-contract-api-go/contractapi"
|
"github.com/hyperledger/fabric-contract-api-go/contractapi"
|
||||||
|
|
||||||
"github.com/hyperledger/fabric-samples/asset-transfer-private-data/chaincode-go/chaincode"
|
"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/hyperledger/fabric-samples/asset-transfer-private-data/chaincode-go/chaincode/mocks"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
@ -46,399 +44,425 @@ type clientIdentity interface {
|
||||||
cid.ClientIdentity
|
cid.ClientIdentity
|
||||||
}
|
}
|
||||||
|
|
||||||
const assetCollectionName = "assetCollection"
|
// const assetCollectionName = "assetCollection"
|
||||||
const transferAgreementObjectType = "transferAgreement"
|
// const transferAgreementObjectType = "transferAgreement"
|
||||||
const myOrg1Msp = "Org1Testmsp"
|
// const myOrg1Msp = "Org1Testmsp"
|
||||||
const myOrg1Clientid = "myOrg1Userid"
|
// const myOrg1Clientid = "myOrg1Userid"
|
||||||
const myOrg1PrivCollection = "Org1TestmspPrivateCollection"
|
// const myOrg1PrivCollection = "Org1TestmspPrivateCollection"
|
||||||
const myOrg2Msp = "Org2Testmsp"
|
// const myOrg2Msp = "Org2Testmsp"
|
||||||
const myOrg2Clientid = "myOrg2Userid"
|
// const myOrg2Clientid = "myOrg2Userid"
|
||||||
const myOrg2PrivCollection = "Org2TestmspPrivateCollection"
|
// const myOrg2PrivCollection = "Org2TestmspPrivateCollection"
|
||||||
|
|
||||||
type assetTransientInput struct {
|
// type assetTransientInput struct {
|
||||||
Type string `json:"objectType"`
|
// Type string `json:"objectType"`
|
||||||
ID string `json:"assetID"`
|
// ID string `json:"assetID"`
|
||||||
Color string `json:"color"`
|
// Color string `json:"color"`
|
||||||
Size int `json:"size"`
|
// Size int `json:"size"`
|
||||||
AppraisedValue int `json:"appraisedValue"`
|
// AppraisedValue int `json:"appraisedValue"`
|
||||||
}
|
// }
|
||||||
|
|
||||||
type assetTransferTransientInput struct {
|
// type assetTransferTransientInput struct {
|
||||||
ID string `json:"assetID"`
|
// ID string `json:"assetID"`
|
||||||
BuyerMSP string `json:"buyerMSP"`
|
// BuyerMSP string `json:"buyerMSP"`
|
||||||
}
|
// }
|
||||||
|
|
||||||
func TestCreateAssetBadInput(t *testing.T) {
|
// func TestCreateAssetBadInput(t *testing.T) {
|
||||||
transactionContext, chaincodeStub := prepMocksAsOrg1()
|
// transactionContext, chaincodeStub := prepMocksAsOrg1()
|
||||||
assetTransferCC := chaincode.SmartContract{}
|
// assetTransferCC := chaincode.SmartContract{}
|
||||||
|
|
||||||
// No transient map
|
// // No transient map
|
||||||
err := assetTransferCC.CreateAsset(transactionContext)
|
// err := assetTransferCC.CreateAsset(transactionContext)
|
||||||
require.EqualError(t, err, "asset not found in the transient map input")
|
// require.EqualError(t, err, "asset not found in the transient map input")
|
||||||
|
|
||||||
// transient map with incomplete asset data
|
// // transient map with incomplete asset data
|
||||||
assetPropMap := map[string][]byte{
|
// assetPropMap := map[string][]byte{
|
||||||
"asset_properties": []byte("ill formatted property"),
|
// "asset_properties": []byte("ill formatted property"),
|
||||||
}
|
// }
|
||||||
chaincodeStub.GetTransientReturns(assetPropMap, nil)
|
// chaincodeStub.GetTransientReturns(assetPropMap, nil)
|
||||||
err = assetTransferCC.CreateAsset(transactionContext)
|
// err = assetTransferCC.CreateAsset(transactionContext)
|
||||||
require.Error(t, err, "Expected error: transient map with incomplete asset data")
|
// require.Error(t, err, "Expected error: transient map with incomplete asset data")
|
||||||
require.Contains(t, err.Error(), "failed to unmarshal JSON")
|
// require.Contains(t, err.Error(), "failed to unmarshal JSON")
|
||||||
|
|
||||||
testAsset := &assetTransientInput{
|
// testAsset := &assetTransientInput{
|
||||||
Type: "testfulasset",
|
// Type: "testfulasset",
|
||||||
}
|
// }
|
||||||
setReturnAssetPropsInTransientMap(t, chaincodeStub, testAsset)
|
// setReturnAssetPropsInTransientMap(t, chaincodeStub, testAsset)
|
||||||
err = assetTransferCC.CreateAsset(transactionContext)
|
// err = assetTransferCC.CreateAsset(transactionContext)
|
||||||
require.EqualError(t, err, "assetID field must be a non-empty string")
|
// require.EqualError(t, err, "assetID field must be a non-empty string")
|
||||||
|
|
||||||
testAsset = &assetTransientInput{
|
// testAsset = &assetTransientInput{
|
||||||
ID: "id1",
|
// ID: "id1",
|
||||||
Color: "gray",
|
// Color: "gray",
|
||||||
}
|
// }
|
||||||
setReturnAssetPropsInTransientMap(t, chaincodeStub, testAsset)
|
// setReturnAssetPropsInTransientMap(t, chaincodeStub, testAsset)
|
||||||
err = assetTransferCC.CreateAsset(transactionContext)
|
// err = assetTransferCC.CreateAsset(transactionContext)
|
||||||
require.EqualError(t, err, "objectType field must be a non-empty string")
|
// require.EqualError(t, err, "objectType field must be a non-empty string")
|
||||||
|
|
||||||
// case when asset exists, GetPrivateData returns a valid data from ledger
|
// // case when asset exists, GetPrivateData returns a valid data from ledger
|
||||||
testAsset = &assetTransientInput{
|
// testAsset = &assetTransientInput{
|
||||||
ID: "id1",
|
// ID: "id1",
|
||||||
Type: "testfulasset",
|
// Type: "testfulasset",
|
||||||
Color: "gray",
|
// Color: "gray",
|
||||||
Size: 7,
|
// Size: 7,
|
||||||
AppraisedValue: 500,
|
// AppraisedValue: 500,
|
||||||
}
|
// }
|
||||||
setReturnAssetPropsInTransientMap(t, chaincodeStub, testAsset)
|
// setReturnAssetPropsInTransientMap(t, chaincodeStub, testAsset)
|
||||||
chaincodeStub.GetPrivateDataReturns([]byte{}, nil)
|
// chaincodeStub.GetPrivateDataReturns([]byte{}, nil)
|
||||||
err = assetTransferCC.CreateAsset(transactionContext)
|
// err = assetTransferCC.CreateAsset(transactionContext)
|
||||||
require.EqualError(t, err, "this asset already exists: id1")
|
// require.EqualError(t, err, "this asset already exists: id1")
|
||||||
}
|
// }
|
||||||
|
|
||||||
func TestCreateAssetSuccessful(t *testing.T) {
|
// func TestCreateAssetSuccessful(t *testing.T) {
|
||||||
transactionContext, chaincodeStub := prepMocksAsOrg1()
|
// transactionContext, chaincodeStub := prepMocksAsOrg1()
|
||||||
assetTransferCC := chaincode.SmartContract{}
|
// assetTransferCC := chaincode.SmartContract{}
|
||||||
testAsset := &assetTransientInput{
|
// testAsset := &assetTransientInput{
|
||||||
ID: "id1",
|
// ID: "id1",
|
||||||
Type: "testfulasset",
|
// Type: "testfulasset",
|
||||||
Color: "gray",
|
// Color: "gray",
|
||||||
Size: 7,
|
// Size: 7,
|
||||||
AppraisedValue: 500,
|
// AppraisedValue: 500,
|
||||||
}
|
// }
|
||||||
setReturnAssetPropsInTransientMap(t, chaincodeStub, testAsset)
|
// setReturnAssetPropsInTransientMap(t, chaincodeStub, testAsset)
|
||||||
err := assetTransferCC.CreateAsset(transactionContext)
|
// err := assetTransferCC.CreateAsset(transactionContext)
|
||||||
require.NoError(t, err)
|
// require.NoError(t, err)
|
||||||
//Validate PutPrivateData calls
|
// //Validate PutPrivateData calls
|
||||||
calledCollection, calledId, _ := chaincodeStub.PutPrivateDataArgsForCall(0)
|
// calledCollection, calledId, _ := chaincodeStub.PutPrivateDataArgsForCall(0)
|
||||||
require.Equal(t, assetCollectionName, calledCollection)
|
// require.Equal(t, assetCollectionName, calledCollection)
|
||||||
require.Equal(t, "id1", calledId)
|
// require.Equal(t, "id1", calledId)
|
||||||
|
|
||||||
expectedPrivateDetails := &chaincode.AssetPrivateDetails{
|
// expectedPrivateDetails := &chaincode.AssetPrivateDetails{
|
||||||
ID: "id1",
|
// ID: "id1",
|
||||||
AppraisedValue: 500,
|
// AppraisedValue: 500,
|
||||||
}
|
// }
|
||||||
assetBytes, err := json.Marshal(expectedPrivateDetails)
|
// assetBytes, err := json.Marshal(expectedPrivateDetails)
|
||||||
calledCollection, calledId, calledAssetBytes := chaincodeStub.PutPrivateDataArgsForCall(1)
|
// calledCollection, calledId, calledAssetBytes := chaincodeStub.PutPrivateDataArgsForCall(1)
|
||||||
require.Equal(t, myOrg1PrivCollection, calledCollection)
|
// require.Equal(t, myOrg1PrivCollection, calledCollection)
|
||||||
require.Equal(t, "id1", calledId)
|
// require.Equal(t, "id1", calledId)
|
||||||
require.Equal(t, assetBytes, calledAssetBytes)
|
// require.Equal(t, assetBytes, calledAssetBytes)
|
||||||
}
|
// }
|
||||||
|
|
||||||
func TestAgreeToTransferBadInput(t *testing.T) {
|
// func TestAgreeToTransferBadInput(t *testing.T) {
|
||||||
transactionContext, chaincodeStub := prepMocksAsOrg1()
|
// transactionContext, chaincodeStub := prepMocksAsOrg1()
|
||||||
assetTransferCC := chaincode.SmartContract{}
|
// assetTransferCC := chaincode.SmartContract{}
|
||||||
|
|
||||||
assetPrivDetail := &chaincode.AssetPrivateDetails{
|
// assetPrivDetail := &chaincode.AssetPrivateDetails{
|
||||||
ID: "id1",
|
// ID: "id1",
|
||||||
//no AppraisedValue
|
// //no AppraisedValue
|
||||||
}
|
// }
|
||||||
setReturnAssetPrivateDetailsInTransientMap(t, chaincodeStub, assetPrivDetail)
|
// setReturnAssetPrivateDetailsInTransientMap(t, chaincodeStub, assetPrivDetail)
|
||||||
origAsset := chaincode.Asset{
|
// origAsset := chaincode.Asset{
|
||||||
ID: "id1",
|
// ID: "id1",
|
||||||
Type: "testfulasset",
|
// Type: "testfulasset",
|
||||||
Color: "gray",
|
// Color: "gray",
|
||||||
Size: 7,
|
// Size: 7,
|
||||||
Owner: myOrg1Clientid,
|
// Owner: myOrg1Clientid,
|
||||||
}
|
// }
|
||||||
setReturnPrivateDataInStub(t, chaincodeStub, &origAsset)
|
// setReturnPrivateDataInStub(t, chaincodeStub, &origAsset)
|
||||||
|
|
||||||
err := assetTransferCC.AgreeToTransfer(transactionContext)
|
// err := assetTransferCC.AgreeToTransfer(transactionContext)
|
||||||
require.EqualError(t, err, "appraisedValue field must be a positive integer")
|
// require.EqualError(t, err, "appraisedValue field must be a positive integer")
|
||||||
|
|
||||||
assetPrivDetail = &chaincode.AssetPrivateDetails{
|
// assetPrivDetail = &chaincode.AssetPrivateDetails{
|
||||||
//no ID
|
// //no ID
|
||||||
AppraisedValue: 500,
|
// AppraisedValue: 500,
|
||||||
}
|
// }
|
||||||
setReturnAssetPrivateDetailsInTransientMap(t, chaincodeStub, assetPrivDetail)
|
// setReturnAssetPrivateDetailsInTransientMap(t, chaincodeStub, assetPrivDetail)
|
||||||
err = assetTransferCC.AgreeToTransfer(transactionContext)
|
// err = assetTransferCC.AgreeToTransfer(transactionContext)
|
||||||
require.EqualError(t, err, "assetID field must be a non-empty string")
|
// require.EqualError(t, err, "assetID field must be a non-empty string")
|
||||||
|
|
||||||
assetPrivDetail = &chaincode.AssetPrivateDetails{
|
// assetPrivDetail = &chaincode.AssetPrivateDetails{
|
||||||
ID: "id1",
|
// ID: "id1",
|
||||||
AppraisedValue: 500,
|
// AppraisedValue: 500,
|
||||||
}
|
// }
|
||||||
setReturnAssetPrivateDetailsInTransientMap(t, chaincodeStub, assetPrivDetail)
|
// setReturnAssetPrivateDetailsInTransientMap(t, chaincodeStub, assetPrivDetail)
|
||||||
//asset does not exist
|
// //asset does not exist
|
||||||
setReturnPrivateDataInStub(t, chaincodeStub, nil)
|
// setReturnPrivateDataInStub(t, chaincodeStub, nil)
|
||||||
err = assetTransferCC.AgreeToTransfer(transactionContext)
|
// err = assetTransferCC.AgreeToTransfer(transactionContext)
|
||||||
require.EqualError(t, err, "id1 does not exist")
|
// require.EqualError(t, err, "id1 does not exist")
|
||||||
}
|
// }
|
||||||
|
|
||||||
func TestAgreeToTransferSuccessful(t *testing.T) {
|
// func TestAgreeToTransferSuccessful(t *testing.T) {
|
||||||
transactionContext, chaincodeStub := prepMocksAsOrg1()
|
// transactionContext, chaincodeStub := prepMocksAsOrg1()
|
||||||
assetTransferCC := chaincode.SmartContract{}
|
// assetTransferCC := chaincode.SmartContract{}
|
||||||
assetPrivDetail := &chaincode.AssetPrivateDetails{
|
// assetPrivDetail := &chaincode.AssetPrivateDetails{
|
||||||
ID: "id1",
|
// ID: "id1",
|
||||||
AppraisedValue: 500,
|
// AppraisedValue: 500,
|
||||||
}
|
// }
|
||||||
setReturnAssetPrivateDetailsInTransientMap(t, chaincodeStub, assetPrivDetail)
|
// setReturnAssetPrivateDetailsInTransientMap(t, chaincodeStub, assetPrivDetail)
|
||||||
origAsset := chaincode.Asset{
|
// origAsset := chaincode.Asset{
|
||||||
ID: "id1",
|
// ID: "id1",
|
||||||
Type: "testfulasset",
|
// Type: "testfulasset",
|
||||||
Color: "gray",
|
// Color: "gray",
|
||||||
Size: 7,
|
// Size: 7,
|
||||||
Owner: myOrg1Clientid,
|
// Owner: myOrg1Clientid,
|
||||||
}
|
// }
|
||||||
setReturnPrivateDataInStub(t, chaincodeStub, &origAsset)
|
// setReturnPrivateDataInStub(t, chaincodeStub, &origAsset)
|
||||||
chaincodeStub.CreateCompositeKeyReturns(transferAgreementObjectType+"id1", nil)
|
// chaincodeStub.CreateCompositeKeyReturns(transferAgreementObjectType+"id1", nil)
|
||||||
err := assetTransferCC.AgreeToTransfer(transactionContext)
|
// err := assetTransferCC.AgreeToTransfer(transactionContext)
|
||||||
require.NoError(t, err)
|
// require.NoError(t, err)
|
||||||
|
|
||||||
expectedDataBytes, err := json.Marshal(assetPrivDetail)
|
// expectedDataBytes, err := json.Marshal(assetPrivDetail)
|
||||||
calledCollection, calledId, calledWithDataBytes := chaincodeStub.PutPrivateDataArgsForCall(0)
|
// calledCollection, calledId, calledWithDataBytes := chaincodeStub.PutPrivateDataArgsForCall(0)
|
||||||
require.Equal(t, myOrg1PrivCollection, calledCollection)
|
// require.Equal(t, myOrg1PrivCollection, calledCollection)
|
||||||
require.Equal(t, "id1", calledId)
|
// require.Equal(t, "id1", calledId)
|
||||||
require.Equal(t, expectedDataBytes, calledWithDataBytes)
|
// require.Equal(t, expectedDataBytes, calledWithDataBytes)
|
||||||
|
|
||||||
calledCollection, calledId, calledWithDataBytes = chaincodeStub.PutPrivateDataArgsForCall(1)
|
// calledCollection, calledId, calledWithDataBytes = chaincodeStub.PutPrivateDataArgsForCall(1)
|
||||||
require.Equal(t, assetCollectionName, calledCollection)
|
// require.Equal(t, assetCollectionName, calledCollection)
|
||||||
require.Equal(t, transferAgreementObjectType+"id1", calledId)
|
// require.Equal(t, transferAgreementObjectType+"id1", calledId)
|
||||||
require.Equal(t, []byte(myOrg1Clientid), calledWithDataBytes)
|
// require.Equal(t, []byte(myOrg1Clientid), calledWithDataBytes)
|
||||||
}
|
// }
|
||||||
func TestTransferAssetBadInput(t *testing.T) {
|
// func TestTransferAssetBadInput(t *testing.T) {
|
||||||
transactionContext, chaincodeStub := prepMocksAsOrg1()
|
// transactionContext, chaincodeStub := prepMocksAsOrg1()
|
||||||
assetTransferCC := chaincode.SmartContract{}
|
// assetTransferCC := chaincode.SmartContract{}
|
||||||
|
|
||||||
assetNewOwner := &assetTransferTransientInput{
|
// assetNewOwner := &assetTransferTransientInput{
|
||||||
ID: "id1",
|
// ID: "id1",
|
||||||
BuyerMSP: "",
|
// BuyerMSP: "",
|
||||||
}
|
// }
|
||||||
setReturnAssetOwnerInTransientMap(t, chaincodeStub, assetNewOwner)
|
// setReturnAssetOwnerInTransientMap(t, chaincodeStub, assetNewOwner)
|
||||||
setReturnPrivateDataInStub(t, chaincodeStub, &chaincode.Asset{})
|
// setReturnPrivateDataInStub(t, chaincodeStub, &chaincode.Asset{})
|
||||||
err := assetTransferCC.TransferAsset(transactionContext)
|
// err := assetTransferCC.TransferAsset(transactionContext)
|
||||||
require.EqualError(t, err, "buyerMSP field must be a non-empty string")
|
// require.EqualError(t, err, "buyerMSP field must be a non-empty string")
|
||||||
|
|
||||||
assetNewOwner = &assetTransferTransientInput{
|
// assetNewOwner = &assetTransferTransientInput{
|
||||||
ID: "id1",
|
// ID: "id1",
|
||||||
BuyerMSP: myOrg2Msp,
|
// BuyerMSP: myOrg2Msp,
|
||||||
}
|
// }
|
||||||
setReturnAssetOwnerInTransientMap(t, chaincodeStub, assetNewOwner)
|
// setReturnAssetOwnerInTransientMap(t, chaincodeStub, assetNewOwner)
|
||||||
//asset does not exist
|
// //asset does not exist
|
||||||
setReturnPrivateDataInStub(t, chaincodeStub, nil)
|
// setReturnPrivateDataInStub(t, chaincodeStub, nil)
|
||||||
err = assetTransferCC.TransferAsset(transactionContext)
|
// err = assetTransferCC.TransferAsset(transactionContext)
|
||||||
require.EqualError(t, err, "id1 does not exist")
|
// require.EqualError(t, err, "id1 does not exist")
|
||||||
}
|
// }
|
||||||
|
|
||||||
func TestTransferAssetSuccessful(t *testing.T) {
|
// func TestTransferAssetSuccessful(t *testing.T) {
|
||||||
transactionContext, chaincodeStub := prepMocksAsOrg1()
|
// transactionContext, chaincodeStub := prepMocksAsOrg1()
|
||||||
assetTransferCC := chaincode.SmartContract{}
|
// assetTransferCC := chaincode.SmartContract{}
|
||||||
assetNewOwner := &assetTransferTransientInput{
|
// assetNewOwner := &assetTransferTransientInput{
|
||||||
ID: "id1",
|
// ID: "id1",
|
||||||
BuyerMSP: myOrg2Msp,
|
// BuyerMSP: myOrg2Msp,
|
||||||
}
|
// }
|
||||||
setReturnAssetOwnerInTransientMap(t, chaincodeStub, assetNewOwner)
|
// setReturnAssetOwnerInTransientMap(t, chaincodeStub, assetNewOwner)
|
||||||
origAsset := chaincode.Asset{
|
// origAsset := chaincode.Asset{
|
||||||
ID: "id1",
|
// ID: "id1",
|
||||||
Type: "testfulasset",
|
// Type: "testfulasset",
|
||||||
Color: "gray",
|
// Color: "gray",
|
||||||
Size: 7,
|
// Size: 7,
|
||||||
Owner: myOrg1Clientid,
|
// Owner: myOrg1Clientid,
|
||||||
}
|
// }
|
||||||
setReturnPrivateDataInStub(t, chaincodeStub, &origAsset)
|
// setReturnPrivateDataInStub(t, chaincodeStub, &origAsset)
|
||||||
//to ensure we pass data hash verification
|
// //to ensure we pass data hash verification
|
||||||
chaincodeStub.GetPrivateDataHashReturns([]byte("datahash"), nil)
|
// chaincodeStub.GetPrivateDataHashReturns([]byte("datahash"), nil)
|
||||||
//to ensure that ReadTransferAgreement call returns org2 client ID
|
// //to ensure that ReadTransferAgreement call returns org2 client ID
|
||||||
chaincodeStub.GetPrivateDataReturnsOnCall(1, []byte(myOrg2Clientid), nil)
|
// chaincodeStub.GetPrivateDataReturnsOnCall(1, []byte(myOrg2Clientid), nil)
|
||||||
chaincodeStub.CreateCompositeKeyReturns(transferAgreementObjectType+"id1", nil)
|
// chaincodeStub.CreateCompositeKeyReturns(transferAgreementObjectType+"id1", nil)
|
||||||
|
|
||||||
err := assetTransferCC.TransferAsset(transactionContext)
|
// err := assetTransferCC.TransferAsset(transactionContext)
|
||||||
require.NoError(t, err)
|
// require.NoError(t, err)
|
||||||
//Validate PutPrivateData calls
|
// //Validate PutPrivateData calls
|
||||||
expectedNewAsset := origAsset
|
// expectedNewAsset := origAsset
|
||||||
expectedNewAsset.Owner = myOrg2Clientid
|
// expectedNewAsset.Owner = myOrg2Clientid
|
||||||
expectedNewAssetBytes, err := json.Marshal(expectedNewAsset)
|
// expectedNewAssetBytes, err := json.Marshal(expectedNewAsset)
|
||||||
require.NoError(t, err)
|
// require.NoError(t, err)
|
||||||
calledCollection, calledId, calledWithAssetBytes := chaincodeStub.PutPrivateDataArgsForCall(0)
|
// calledCollection, calledId, calledWithAssetBytes := chaincodeStub.PutPrivateDataArgsForCall(0)
|
||||||
require.Equal(t, assetCollectionName, calledCollection)
|
// require.Equal(t, assetCollectionName, calledCollection)
|
||||||
require.Equal(t, "id1", calledId)
|
// require.Equal(t, "id1", calledId)
|
||||||
require.Equal(t, expectedNewAssetBytes, calledWithAssetBytes)
|
// require.Equal(t, expectedNewAssetBytes, calledWithAssetBytes)
|
||||||
calledCollection, calledId = chaincodeStub.DelPrivateDataArgsForCall(0)
|
// calledCollection, calledId = chaincodeStub.DelPrivateDataArgsForCall(0)
|
||||||
require.Equal(t, myOrg1PrivCollection, calledCollection)
|
// require.Equal(t, myOrg1PrivCollection, calledCollection)
|
||||||
require.Equal(t, "id1", calledId)
|
// require.Equal(t, "id1", calledId)
|
||||||
|
|
||||||
calledCollection, calledId = chaincodeStub.DelPrivateDataArgsForCall(1)
|
// calledCollection, calledId = chaincodeStub.DelPrivateDataArgsForCall(1)
|
||||||
require.Equal(t, assetCollectionName, calledCollection)
|
// require.Equal(t, assetCollectionName, calledCollection)
|
||||||
require.Equal(t, transferAgreementObjectType+"id1", calledId)
|
// require.Equal(t, transferAgreementObjectType+"id1", calledId)
|
||||||
|
|
||||||
}
|
// }
|
||||||
|
|
||||||
func TestTransferAssetByNonOwner(t *testing.T) {
|
// func TestTransferAssetByNonOwner(t *testing.T) {
|
||||||
transactionContext, chaincodeStub := prepMocksAsOrg1()
|
// transactionContext, chaincodeStub := prepMocksAsOrg1()
|
||||||
assetTransferCC := chaincode.SmartContract{}
|
// assetTransferCC := chaincode.SmartContract{}
|
||||||
assetNewOwner := &assetTransferTransientInput{
|
// assetNewOwner := &assetTransferTransientInput{
|
||||||
ID: "id1",
|
// ID: "id1",
|
||||||
BuyerMSP: myOrg1Msp,
|
// BuyerMSP: myOrg1Msp,
|
||||||
}
|
// }
|
||||||
setReturnAssetOwnerInTransientMap(t, chaincodeStub, assetNewOwner)
|
// setReturnAssetOwnerInTransientMap(t, chaincodeStub, assetNewOwner)
|
||||||
//Try to transfer asset owned by Org2
|
// //Try to transfer asset owned by Org2
|
||||||
org2Asset := chaincode.Asset{
|
// org2Asset := chaincode.Asset{
|
||||||
ID: "id1",
|
// ID: "id1",
|
||||||
Type: "testfulasset",
|
// Type: "testfulasset",
|
||||||
Color: "gray",
|
// Color: "gray",
|
||||||
Size: 7,
|
// Size: 7,
|
||||||
Owner: myOrg2Clientid,
|
// Owner: myOrg2Clientid,
|
||||||
}
|
// }
|
||||||
setReturnPrivateDataInStub(t, chaincodeStub, &org2Asset)
|
// setReturnPrivateDataInStub(t, chaincodeStub, &org2Asset)
|
||||||
err := assetTransferCC.TransferAsset(transactionContext)
|
// err := assetTransferCC.TransferAsset(transactionContext)
|
||||||
require.EqualError(t, err, "failed transfer verification: error: submitting client identity does not own asset")
|
// require.EqualError(t, err, "failed transfer verification: error: submitting client identity does not own asset")
|
||||||
}
|
// }
|
||||||
|
|
||||||
func TestTransferAssetWithoutAnAgreement(t *testing.T) {
|
// func TestTransferAssetWithoutAnAgreement(t *testing.T) {
|
||||||
transactionContext, chaincodeStub := prepMocksAsOrg1()
|
// transactionContext, chaincodeStub := prepMocksAsOrg1()
|
||||||
assetTransferCC := chaincode.SmartContract{}
|
// assetTransferCC := chaincode.SmartContract{}
|
||||||
assetNewOwner := &assetTransferTransientInput{
|
// assetNewOwner := &assetTransferTransientInput{
|
||||||
ID: "id1",
|
// ID: "id1",
|
||||||
BuyerMSP: myOrg1Msp,
|
// BuyerMSP: myOrg1Msp,
|
||||||
}
|
// }
|
||||||
setReturnAssetOwnerInTransientMap(t, chaincodeStub, assetNewOwner)
|
// setReturnAssetOwnerInTransientMap(t, chaincodeStub, assetNewOwner)
|
||||||
orgAsset := chaincode.Asset{
|
// orgAsset := chaincode.Asset{
|
||||||
ID: "id1",
|
// ID: "id1",
|
||||||
Type: "testfulasset",
|
// Type: "testfulasset",
|
||||||
Color: "gray",
|
// Color: "gray",
|
||||||
Size: 7,
|
// Size: 7,
|
||||||
Owner: myOrg1Clientid,
|
// Owner: myOrg1Clientid,
|
||||||
}
|
// }
|
||||||
setReturnPrivateDataInStub(t, chaincodeStub, &orgAsset)
|
// setReturnPrivateDataInStub(t, chaincodeStub, &orgAsset)
|
||||||
//to ensure we pass data hash verification
|
// //to ensure we pass data hash verification
|
||||||
chaincodeStub.GetPrivateDataHashReturns([]byte("datahash"), nil)
|
// chaincodeStub.GetPrivateDataHashReturns([]byte("datahash"), nil)
|
||||||
chaincodeStub.CreateCompositeKeyReturns(transferAgreementObjectType+"id1", nil)
|
// chaincodeStub.CreateCompositeKeyReturns(transferAgreementObjectType+"id1", nil)
|
||||||
//ReadTransferAgreement call returns no buyer client ID
|
// //ReadTransferAgreement call returns no buyer client ID
|
||||||
chaincodeStub.GetPrivateDataReturnsOnCall(1, []byte{}, nil)
|
// chaincodeStub.GetPrivateDataReturnsOnCall(1, []byte{}, nil)
|
||||||
|
|
||||||
err := assetTransferCC.TransferAsset(transactionContext)
|
// err := assetTransferCC.TransferAsset(transactionContext)
|
||||||
require.EqualError(t, err, "BuyerID not found in TransferAgreement for id1")
|
// require.EqualError(t, err, "BuyerID not found in TransferAgreement for id1")
|
||||||
}
|
// }
|
||||||
|
|
||||||
func TestTransferAssetNonMatchingAppraisalValue(t *testing.T) {
|
// func TestTransferAssetNonMatchingAppraisalValue(t *testing.T) {
|
||||||
transactionContext, chaincodeStub := prepMocksAsOrg1()
|
// transactionContext, chaincodeStub := prepMocksAsOrg1()
|
||||||
assetTransferCC := chaincode.SmartContract{}
|
// assetTransferCC := chaincode.SmartContract{}
|
||||||
assetNewOwner := &assetTransferTransientInput{
|
// assetNewOwner := &assetTransferTransientInput{
|
||||||
ID: "id1",
|
// ID: "id1",
|
||||||
BuyerMSP: myOrg2Msp,
|
// BuyerMSP: myOrg2Msp,
|
||||||
}
|
// }
|
||||||
setReturnAssetOwnerInTransientMap(t, chaincodeStub, assetNewOwner)
|
// setReturnAssetOwnerInTransientMap(t, chaincodeStub, assetNewOwner)
|
||||||
|
|
||||||
orgAsset := chaincode.Asset{
|
// orgAsset := chaincode.Asset{
|
||||||
ID: "id1",
|
// ID: "id1",
|
||||||
Type: "testfulasset",
|
// Type: "testfulasset",
|
||||||
Color: "gray",
|
// Color: "gray",
|
||||||
Size: 7,
|
// Size: 7,
|
||||||
Owner: myOrg1Clientid,
|
// Owner: myOrg1Clientid,
|
||||||
}
|
// }
|
||||||
setReturnPrivateDataInStub(t, chaincodeStub, &orgAsset)
|
// setReturnPrivateDataInStub(t, chaincodeStub, &orgAsset)
|
||||||
chaincodeStub.CreateCompositeKeyReturns(transferAgreementObjectType+"id1", nil)
|
// chaincodeStub.CreateCompositeKeyReturns(transferAgreementObjectType+"id1", nil)
|
||||||
//data hash different in each collection
|
// //data hash different in each collection
|
||||||
chaincodeStub.GetPrivateDataHashReturnsOnCall(0, []byte("datahash1"), nil)
|
// chaincodeStub.GetPrivateDataHashReturnsOnCall(0, []byte("datahash1"), nil)
|
||||||
chaincodeStub.GetPrivateDataHashReturnsOnCall(1, []byte("datahash2"), nil)
|
// chaincodeStub.GetPrivateDataHashReturnsOnCall(1, []byte("datahash2"), nil)
|
||||||
|
|
||||||
err := assetTransferCC.TransferAsset(transactionContext)
|
// err := assetTransferCC.TransferAsset(transactionContext)
|
||||||
require.Error(t, err, "Expected failed hash verification")
|
// require.Error(t, err, "Expected failed hash verification")
|
||||||
require.Contains(t, err.Error(), "failed transfer verification: hash for appraised value")
|
// require.Contains(t, err.Error(), "failed transfer verification: hash for appraised value")
|
||||||
}
|
// }
|
||||||
|
|
||||||
func prepMocksAsOrg1() (*mocks.TransactionContext, *mocks.ChaincodeStub) {
|
// func prepMocksAsOrg1() (*mocks.TransactionContext, *mocks.ChaincodeStub) {
|
||||||
return prepMocks(myOrg1Msp, myOrg1Clientid)
|
// return prepMocks(myOrg1Msp, myOrg1Clientid)
|
||||||
}
|
// }
|
||||||
func prepMocksAsOrg2() (*mocks.TransactionContext, *mocks.ChaincodeStub) {
|
// func prepMocksAsOrg2() (*mocks.TransactionContext, *mocks.ChaincodeStub) {
|
||||||
return prepMocks(myOrg2Msp, myOrg2Clientid)
|
// return prepMocks(myOrg2Msp, myOrg2Clientid)
|
||||||
}
|
// }
|
||||||
func prepMocks(orgMSP, clientId string) (*mocks.TransactionContext, *mocks.ChaincodeStub) {
|
// func prepMocks(orgMSP, clientId string) (*mocks.TransactionContext, *mocks.ChaincodeStub) {
|
||||||
|
// chaincodeStub := &mocks.ChaincodeStub{}
|
||||||
|
// transactionContext := &mocks.TransactionContext{}
|
||||||
|
// transactionContext.GetStubReturns(chaincodeStub)
|
||||||
|
|
||||||
|
// clientIdentity := &mocks.ClientIdentity{}
|
||||||
|
// clientIdentity.GetMSPIDReturns(orgMSP, nil)
|
||||||
|
// clientIdentity.GetIDReturns(clientId, nil)
|
||||||
|
// //set matching msp ID using peer shim env variable
|
||||||
|
// os.Setenv("CORE_PEER_LOCALMSPID", orgMSP)
|
||||||
|
// transactionContext.GetClientIdentityReturns(clientIdentity)
|
||||||
|
// return transactionContext, chaincodeStub
|
||||||
|
// }
|
||||||
|
|
||||||
|
// func setReturnAssetPrivateDetailsInTransientMap(t *testing.T, chaincodeStub *mocks.ChaincodeStub, assetPrivDetail *chaincode.AssetPrivateDetails) []byte {
|
||||||
|
// assetOwnerBytes := []byte{}
|
||||||
|
// if assetPrivDetail != nil {
|
||||||
|
// var err error
|
||||||
|
// assetOwnerBytes, err = json.Marshal(assetPrivDetail)
|
||||||
|
// require.NoError(t, err)
|
||||||
|
// }
|
||||||
|
// assetPropMap := map[string][]byte{
|
||||||
|
// "asset_value": assetOwnerBytes,
|
||||||
|
// }
|
||||||
|
// chaincodeStub.GetTransientReturns(assetPropMap, nil)
|
||||||
|
// return assetOwnerBytes
|
||||||
|
// }
|
||||||
|
|
||||||
|
// func setReturnAssetOwnerInTransientMap(t *testing.T, chaincodeStub *mocks.ChaincodeStub, assetOwner *assetTransferTransientInput) []byte {
|
||||||
|
// assetOwnerBytes := []byte{}
|
||||||
|
// if assetOwner != nil {
|
||||||
|
// var err error
|
||||||
|
// assetOwnerBytes, err = json.Marshal(assetOwner)
|
||||||
|
// require.NoError(t, err)
|
||||||
|
// }
|
||||||
|
// assetPropMap := map[string][]byte{
|
||||||
|
// "asset_owner": assetOwnerBytes,
|
||||||
|
// }
|
||||||
|
// chaincodeStub.GetTransientReturns(assetPropMap, nil)
|
||||||
|
// return assetOwnerBytes
|
||||||
|
// }
|
||||||
|
|
||||||
|
// func setReturnAssetPropsInTransientMap(t *testing.T, chaincodeStub *mocks.ChaincodeStub, testAsset *assetTransientInput) []byte {
|
||||||
|
// assetBytes := []byte{}
|
||||||
|
// if testAsset != nil {
|
||||||
|
// var err error
|
||||||
|
// assetBytes, err = json.Marshal(testAsset)
|
||||||
|
// require.NoError(t, err)
|
||||||
|
// }
|
||||||
|
// assetPropMap := map[string][]byte{
|
||||||
|
// "asset_properties": assetBytes,
|
||||||
|
// }
|
||||||
|
// chaincodeStub.GetTransientReturns(assetPropMap, nil)
|
||||||
|
// return assetBytes
|
||||||
|
// }
|
||||||
|
|
||||||
|
// func setReturnPrivateDataInStub(t *testing.T, chaincodeStub *mocks.ChaincodeStub, testAsset *chaincode.Asset) []byte {
|
||||||
|
// if testAsset == nil {
|
||||||
|
// chaincodeStub.GetPrivateDataReturns(nil, nil)
|
||||||
|
// return nil
|
||||||
|
// } else {
|
||||||
|
// var err error
|
||||||
|
// assetBytes, err := json.Marshal(testAsset)
|
||||||
|
// require.NoError(t, err)
|
||||||
|
// chaincodeStub.GetPrivateDataReturns(assetBytes, nil)
|
||||||
|
// return assetBytes
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// func setReturnAssetPrivateDetailsInStub(t *testing.T, chaincodeStub *mocks.ChaincodeStub, testAsset *chaincode.AssetPrivateDetails) []byte {
|
||||||
|
// if testAsset == nil {
|
||||||
|
// chaincodeStub.GetPrivateDataReturns(nil, nil)
|
||||||
|
// return nil
|
||||||
|
// } else {
|
||||||
|
// var err error
|
||||||
|
// assetBytes, err := json.Marshal(testAsset)
|
||||||
|
// require.NoError(t, err)
|
||||||
|
// chaincodeStub.GetPrivateDataReturns(assetBytes, nil)
|
||||||
|
// return assetBytes
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
func TestCreateUserID(t *testing.T) {
|
||||||
chaincodeStub := &mocks.ChaincodeStub{}
|
chaincodeStub := &mocks.ChaincodeStub{}
|
||||||
transactionContext := &mocks.TransactionContext{}
|
transactionContext := &mocks.TransactionContext{}
|
||||||
transactionContext.GetStubReturns(chaincodeStub)
|
transactionContext.GetStubReturns(chaincodeStub)
|
||||||
|
|
||||||
clientIdentity := &mocks.ClientIdentity{}
|
contract := chaincode.SmartContract{}
|
||||||
clientIdentity.GetMSPIDReturns(orgMSP, nil)
|
err := contract.CreateUserID(transactionContext, "testID", "testOrg")
|
||||||
clientIdentity.GetIDReturns(clientId, nil)
|
require.NoError(t, err)
|
||||||
//set matching msp ID using peer shim env variable
|
|
||||||
os.Setenv("CORE_PEER_LOCALMSPID", orgMSP)
|
|
||||||
transactionContext.GetClientIdentityReturns(clientIdentity)
|
|
||||||
return transactionContext, chaincodeStub
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func setReturnAssetPrivateDetailsInTransientMap(t *testing.T, chaincodeStub *mocks.ChaincodeStub, assetPrivDetail *chaincode.AssetPrivateDetails) []byte {
|
func TestCreateUserIDDuplicate(t *testing.T) {
|
||||||
assetOwnerBytes := []byte{}
|
chaincodeStub := &mocks.ChaincodeStub{}
|
||||||
if assetPrivDetail != nil {
|
transactionContext := &mocks.TransactionContext{}
|
||||||
var err error
|
transactionContext.GetStubReturns(chaincodeStub)
|
||||||
assetOwnerBytes, err = json.Marshal(assetPrivDetail)
|
|
||||||
require.NoError(t, err)
|
|
||||||
}
|
|
||||||
assetPropMap := map[string][]byte{
|
|
||||||
"asset_value": assetOwnerBytes,
|
|
||||||
}
|
|
||||||
chaincodeStub.GetTransientReturns(assetPropMap, nil)
|
|
||||||
return assetOwnerBytes
|
|
||||||
}
|
|
||||||
|
|
||||||
func setReturnAssetOwnerInTransientMap(t *testing.T, chaincodeStub *mocks.ChaincodeStub, assetOwner *assetTransferTransientInput) []byte {
|
existingUser := &chaincode.User{UUID: "uuid1", APIUserId: []string{"testID"}, Org: "testOrg"}
|
||||||
assetOwnerBytes := []byte{}
|
bytes, err := json.Marshal(existingUser)
|
||||||
if assetOwner != nil {
|
require.NoError(t, err)
|
||||||
var err error
|
|
||||||
assetOwnerBytes, err = json.Marshal(assetOwner)
|
|
||||||
require.NoError(t, err)
|
|
||||||
}
|
|
||||||
assetPropMap := map[string][]byte{
|
|
||||||
"asset_owner": assetOwnerBytes,
|
|
||||||
}
|
|
||||||
chaincodeStub.GetTransientReturns(assetPropMap, nil)
|
|
||||||
return assetOwnerBytes
|
|
||||||
}
|
|
||||||
|
|
||||||
func setReturnAssetPropsInTransientMap(t *testing.T, chaincodeStub *mocks.ChaincodeStub, testAsset *assetTransientInput) []byte {
|
chaincodeStub.GetStateReturns(bytes, nil)
|
||||||
assetBytes := []byte{}
|
|
||||||
if testAsset != nil {
|
|
||||||
var err error
|
|
||||||
assetBytes, err = json.Marshal(testAsset)
|
|
||||||
require.NoError(t, err)
|
|
||||||
}
|
|
||||||
assetPropMap := map[string][]byte{
|
|
||||||
"asset_properties": assetBytes,
|
|
||||||
}
|
|
||||||
chaincodeStub.GetTransientReturns(assetPropMap, nil)
|
|
||||||
return assetBytes
|
|
||||||
}
|
|
||||||
|
|
||||||
func setReturnPrivateDataInStub(t *testing.T, chaincodeStub *mocks.ChaincodeStub, testAsset *chaincode.Asset) []byte {
|
contract := chaincode.SmartContract{}
|
||||||
if testAsset == nil {
|
err = contract.CreateUserID(transactionContext, "testID", "testOrg")
|
||||||
chaincodeStub.GetPrivateDataReturns(nil, nil)
|
require.EqualError(t, err, "the user with APIId testID already exists")
|
||||||
return nil
|
|
||||||
} else {
|
|
||||||
var err error
|
|
||||||
assetBytes, err := json.Marshal(testAsset)
|
|
||||||
require.NoError(t, err)
|
|
||||||
chaincodeStub.GetPrivateDataReturns(assetBytes, nil)
|
|
||||||
return assetBytes
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func setReturnAssetPrivateDetailsInStub(t *testing.T, chaincodeStub *mocks.ChaincodeStub, testAsset *chaincode.AssetPrivateDetails) []byte {
|
|
||||||
if testAsset == nil {
|
|
||||||
chaincodeStub.GetPrivateDataReturns(nil, nil)
|
|
||||||
return nil
|
|
||||||
} else {
|
|
||||||
var err error
|
|
||||||
assetBytes, err := json.Marshal(testAsset)
|
|
||||||
require.NoError(t, err)
|
|
||||||
chaincodeStub.GetPrivateDataReturns(assetBytes, nil)
|
|
||||||
return assetBytes
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue