github.com/s7techlab/cckit@v0.10.5/examples/cpaper_extended/chaincode_test.go (about)

     1  package cpaper_extended_test
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	. "github.com/onsi/ginkgo"
     8  	. "github.com/onsi/gomega"
     9  
    10  	"github.com/golang/protobuf/ptypes"
    11  
    12  	"github.com/s7techlab/cckit/examples/cpaper_extended"
    13  	"github.com/s7techlab/cckit/examples/cpaper_extended/schema"
    14  	"github.com/s7techlab/cckit/examples/cpaper_extended/testdata"
    15  	idtestdata "github.com/s7techlab/cckit/identity/testdata"
    16  	testcc "github.com/s7techlab/cckit/testing"
    17  	expectcc "github.com/s7techlab/cckit/testing/expect"
    18  )
    19  
    20  const (
    21  	IssuerName = "SomeIssuer"
    22  	BuyerName  = "SomeBuyer"
    23  )
    24  
    25  func TestCommercialPaper(t *testing.T) {
    26  	RegisterFailHandler(Fail)
    27  	RunSpecs(t, "Commercial Paper Suite")
    28  }
    29  
    30  var _ = Describe(`CommercialPaper`, func() {
    31  	paperChaincode := testcc.NewMockStub(
    32  		// chaincode name
    33  		`commercial_paper`,
    34  		// chaincode implementation, supports Chaincode interface with Init and Invoke methods
    35  		cpaper_extended.NewCC(),
    36  	)
    37  
    38  	BeforeSuite(func() {
    39  		// Init chaincode with admin identity
    40  		adminIdentity := testdata.Certificates[0].MustIdentity(idtestdata.DefaultMSP)
    41  		expectcc.ResponseOk(
    42  			paperChaincode.From(adminIdentity).Init())
    43  	})
    44  
    45  	Describe("Commercial Paper lifecycle", func() {
    46  		It("Allow issuer to issue new commercial paper", func(done Done) {
    47  			//input payload for chaincode method
    48  			issueTransactionData := &schema.IssueCommercialPaper{
    49  				Issuer:       IssuerName,
    50  				PaperNumber:  "0001",
    51  				IssueDate:    ptypes.TimestampNow(),
    52  				MaturityDate: testcc.MustProtoTimestamp(time.Now().AddDate(0, 2, 0)),
    53  				FaceValue:    100000,
    54  				ExternalId:   "EXT0001",
    55  			}
    56  
    57  			// we expect tha `issue` method invocation with particular input payload returns response with 200 code
    58  			// &schema.IssueCommercialPaper wil automatically converts to bytes via proto.Marshall function
    59  			expectcc.ResponseOk(
    60  				paperChaincode.Invoke(`issue`, issueTransactionData))
    61  
    62  			// Validate event has been emitted with the transaction data
    63  			expectcc.EventStringerEqual(<-paperChaincode.ChaincodeEventsChannel,
    64  				`IssueCommercialPaper`, issueTransactionData)
    65  
    66  			// Clear events channel after a test case that emits an event
    67  			paperChaincode.ClearEvents()
    68  			close(done)
    69  		}, 0.1)
    70  
    71  		It("Allow issuer to get commercial paper by composite primary key", func() {
    72  			queryResponse := paperChaincode.Query("get", &schema.CommercialPaperId{
    73  				Issuer:      IssuerName,
    74  				PaperNumber: "0001",
    75  			})
    76  
    77  			// we expect that returned []byte payload can be unmarshalled to *schema.CommercialPaper entity
    78  			paper := expectcc.PayloadIs(queryResponse, &schema.CommercialPaper{}).(*schema.CommercialPaper)
    79  
    80  			Expect(paper.Issuer).To(Equal(IssuerName))
    81  			Expect(paper.Owner).To(Equal(IssuerName))
    82  			Expect(paper.State).To(Equal(schema.CommercialPaper_STATE_ISSUED))
    83  			Expect(paper.PaperNumber).To(Equal("0001"))
    84  			Expect(paper.FaceValue).To(BeNumerically("==", 100000))
    85  		})
    86  
    87  		It("Allow issuer to get commercial paper by unique key", func() {
    88  			queryResponse := paperChaincode.Query("getByExternalId", "EXT0001")
    89  
    90  			paper := expectcc.PayloadIs(queryResponse, &schema.CommercialPaper{}).(*schema.CommercialPaper)
    91  
    92  			Expect(paper.Issuer).To(Equal(IssuerName))
    93  			Expect(paper.Owner).To(Equal(IssuerName))
    94  			Expect(paper.State).To(Equal(schema.CommercialPaper_STATE_ISSUED))
    95  			Expect(paper.PaperNumber).To(Equal("0001"))
    96  			Expect(paper.FaceValue).To(BeNumerically("==", 100000))
    97  		})
    98  
    99  		It("Allow issuer to get a list of commercial papers", func() {
   100  			queryResponse := paperChaincode.Query("list")
   101  
   102  			papers := expectcc.PayloadIs(queryResponse, &schema.CommercialPaperList{}).(*schema.CommercialPaperList)
   103  
   104  			Expect(len(papers.Items)).To(BeNumerically("==", 1))
   105  			Expect(papers.Items[0].Issuer).To(Equal(IssuerName))
   106  			Expect(papers.Items[0].Owner).To(Equal(IssuerName))
   107  			Expect(papers.Items[0].State).To(Equal(schema.CommercialPaper_STATE_ISSUED))
   108  			Expect(papers.Items[0].PaperNumber).To(Equal("0001"))
   109  			Expect(papers.Items[0].FaceValue).To(BeNumerically("==", 100000))
   110  		})
   111  
   112  		It("Allow buyer to buy commercial paper", func() {
   113  			buyTransactionData := &schema.BuyCommercialPaper{
   114  				Issuer:       IssuerName,
   115  				PaperNumber:  "0001",
   116  				CurrentOwner: IssuerName,
   117  				NewOwner:     BuyerName,
   118  				Price:        95000,
   119  				PurchaseDate: ptypes.TimestampNow(),
   120  			}
   121  
   122  			expectcc.ResponseOk(paperChaincode.Invoke(`buy`, buyTransactionData))
   123  
   124  			queryResponse := paperChaincode.Query("get", &schema.CommercialPaperId{
   125  				Issuer:      IssuerName,
   126  				PaperNumber: "0001",
   127  			})
   128  
   129  			paper := expectcc.PayloadIs(queryResponse, &schema.CommercialPaper{}).(*schema.CommercialPaper)
   130  
   131  			Expect(paper.Owner).To(Equal(BuyerName))
   132  			Expect(paper.State).To(Equal(schema.CommercialPaper_STATE_TRADING))
   133  
   134  			expectcc.EventStringerEqual(<-paperChaincode.ChaincodeEventsChannel,
   135  				`BuyCommercialPaper`, buyTransactionData)
   136  
   137  			paperChaincode.ClearEvents()
   138  		})
   139  
   140  		It("Allow buyer to redeem commercial paper", func() {
   141  			redeemTransactionData := &schema.RedeemCommercialPaper{
   142  				Issuer:         IssuerName,
   143  				PaperNumber:    "0001",
   144  				RedeemingOwner: BuyerName,
   145  				RedeemDate:     ptypes.TimestampNow(),
   146  			}
   147  
   148  			expectcc.ResponseOk(paperChaincode.Invoke(`redeem`, redeemTransactionData))
   149  
   150  			queryResponse := paperChaincode.Query("get", &schema.CommercialPaperId{
   151  				Issuer:      IssuerName,
   152  				PaperNumber: "0001",
   153  			})
   154  
   155  			paper := expectcc.PayloadIs(queryResponse, &schema.CommercialPaper{}).(*schema.CommercialPaper)
   156  			Expect(paper.Owner).To(Equal(IssuerName))
   157  			Expect(paper.State).To(Equal(schema.CommercialPaper_STATE_REDEEMED))
   158  
   159  			expectcc.EventStringerEqual(<-paperChaincode.ChaincodeEventsChannel,
   160  				`RedeemCommercialPaper`, redeemTransactionData)
   161  
   162  			paperChaincode.ClearEvents()
   163  		})
   164  
   165  		It("Allow issuer to delete commercial paper", func() {
   166  			expectcc.ResponseOk(paperChaincode.Invoke(`delete`, &schema.CommercialPaperId{
   167  				Issuer:      IssuerName,
   168  				PaperNumber: "0001",
   169  			}))
   170  
   171  			// Validate there are 0 Commercial Papers in the world state
   172  			queryResponse := paperChaincode.Query("list")
   173  			papers := expectcc.PayloadIs(queryResponse, &schema.CommercialPaperList{}).(*schema.CommercialPaperList)
   174  
   175  			Expect(len(papers.Items)).To(BeNumerically("==", 0))
   176  		})
   177  	})
   178  })