added unit test for createuser, working on testing write and read schema to pdc functions

This commit is contained in:
Steven Yeu 2023-03-01 09:42:37 -08:00
parent 7f9350659e
commit c22b54286a
2 changed files with 384 additions and 360 deletions

View file

@ -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
} }

View file

@ -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
}
} }