github.com/s7techlab/cckit@v0.10.5/extensions/owner/chaincode_owner_test.go (about)

     1  package owner_test
     2  
     3  import (
     4  	. "github.com/onsi/ginkgo"
     5  	. "github.com/onsi/gomega"
     6  
     7  	"google.golang.org/protobuf/types/known/emptypb"
     8  	"google.golang.org/protobuf/types/known/timestamppb"
     9  
    10  	"github.com/s7techlab/cckit/extensions/owner"
    11  	"github.com/s7techlab/cckit/identity/testdata"
    12  	testcc "github.com/s7techlab/cckit/testing"
    13  )
    14  
    15  var _ = Describe(`Chaincode owner`, func() {
    16  
    17  	var (
    18  		ownerIdentity1   = testdata.Certificates[0].MustIdentity(`SOME_MSP`)
    19  		ownerIdentity2   = testdata.Certificates[1].MustIdentity(`SOME_MSP`) // same msp
    20  		nonOwnerIdentity = testdata.Certificates[2].MustIdentity(`SOME_MSP`)
    21  
    22  		ownerSvc = owner.NewService()
    23  		cc, ctx  = testcc.NewTxHandler(`Chaincode owner`)
    24  	)
    25  
    26  	Context(`Register`, func() {
    27  
    28  		It("Allow to register self as owner on empty state", func() {
    29  			cc.From(ownerIdentity1).Tx(func() {
    30  				owner, err := ownerSvc.CreateOwnerTxCreator(ctx, &emptypb.Empty{})
    31  				Expect(err).NotTo(HaveOccurred())
    32  
    33  				Expect(owner.MspId).To(Equal(ownerIdentity1.GetMSPIdentifier()))
    34  				Expect(owner.Cert).To(Equal(ownerIdentity1.GetPEM()))
    35  				Expect(owner.Subject).To(Equal(ownerIdentity1.GetSubject()))
    36  				Expect(owner.Issuer).To(Equal(ownerIdentity1.GetIssuer()))
    37  				Expect(owner.ExpiresAt.String()).To(Equal(timestamppb.New(ownerIdentity1.ExpiresAt()).String()))
    38  				Expect(owner.UpdatedByMspId).To(Equal(ownerIdentity1.GetMSPIdentifier()))
    39  				Expect(owner.UpdatedByCert).To(Equal(ownerIdentity1.GetPEM()))
    40  				Expect(owner.UpdatedAt.String()).To(Equal(cc.TxTimestamp().String()))
    41  			})
    42  		})
    43  
    44  		It("Disallow to register same owner once more", func() {
    45  			cc.From(ownerIdentity1).Tx(func() {
    46  				cc.Expect(ownerSvc.CreateOwner(ctx, &owner.CreateOwnerRequest{
    47  					MspId: ownerIdentity1.GetMSPIdentifier(),
    48  					Cert:  ownerIdentity1.GetPEM(),
    49  				})).HasError(`state key already exists: ChaincodeOwner`)
    50  			})
    51  		})
    52  
    53  		It("Disallow to register new owner from non registered identity", func() {
    54  			cc.From(ownerIdentity2).Tx(func() {
    55  				cc.Expect(ownerSvc.CreateOwner(ctx, &owner.CreateOwnerRequest{
    56  					MspId: ownerIdentity2.GetMSPIdentifier(),
    57  					Cert:  ownerIdentity2.GetPEM(),
    58  				})).HasError(`tx invoker is not owner`)
    59  			})
    60  		})
    61  
    62  		It("Allow to register new owner by current owner", func() {
    63  			cc.From(ownerIdentity1).Tx(func() {
    64  				owner, err := ownerSvc.CreateOwner(ctx, &owner.CreateOwnerRequest{
    65  					MspId: ownerIdentity2.GetMSPIdentifier(),
    66  					Cert:  ownerIdentity2.GetPEM(),
    67  				})
    68  				Expect(err).NotTo(HaveOccurred())
    69  
    70  				Expect(owner.MspId).To(Equal(ownerIdentity2.GetMSPIdentifier()))
    71  				Expect(owner.Cert).To(Equal(ownerIdentity2.GetPEM()))
    72  			})
    73  		})
    74  
    75  		It("Allow to get owner list", func() {
    76  			cc.From(nonOwnerIdentity).Tx(func() {
    77  				owners, err := ownerSvc.ListOwners(ctx, &emptypb.Empty{})
    78  
    79  				Expect(err).NotTo(HaveOccurred())
    80  				Expect(owners.Items).To(HaveLen(2))
    81  			})
    82  		})
    83  	})
    84  
    85  	Context(`Check`, func() {
    86  
    87  		It("Non owner receives error", func() {
    88  			cc.From(nonOwnerIdentity).Tx(func() {
    89  				cc.Expect(ownerSvc.GetOwnerByTxCreator(ctx, &emptypb.Empty{})).
    90  					HasError(`find owner by tx creator's msp_id and cert subject: state entry not found: ChaincodeOwner`)
    91  			})
    92  		})
    93  
    94  		It("Owner receives owner info", func() {
    95  			cc.From(ownerIdentity1).Tx(func() {
    96  				owner, err := ownerSvc.GetOwnerByTxCreator(ctx, &emptypb.Empty{})
    97  
    98  				Expect(err).NotTo(HaveOccurred())
    99  				Expect(owner.MspId).To(Equal(ownerIdentity1.GetMSPIdentifier()))
   100  				Expect(owner.Cert).To(Equal(ownerIdentity1.GetPEM()))
   101  			})
   102  		})
   103  	})
   104  
   105  	Context(`Update`, func() {
   106  
   107  		It("Disallow non owner to update owner", func() {
   108  			cc.From(nonOwnerIdentity).Tx(func() {
   109  				cc.Expect(ownerSvc.UpdateOwner(ctx, &owner.UpdateOwnerRequest{
   110  					MspId: ownerIdentity2.GetMSPIdentifier(),
   111  					Cert:  ownerIdentity2.GetPEM(),
   112  				})).HasError(`tx invoker is not owner`)
   113  			})
   114  		})
   115  
   116  		It("Disallow to update owner with same cert", func() {
   117  			cc.From(ownerIdentity2).Tx(func() {
   118  				cc.Expect(ownerSvc.UpdateOwner(ctx, &owner.UpdateOwnerRequest{
   119  					MspId: ownerIdentity2.GetMSPIdentifier(),
   120  					Cert:  ownerIdentity2.GetPEM(),
   121  				})).HasError(`new cert same as old cert`)
   122  			})
   123  		})
   124  	})
   125  
   126  	Context(`Delete`, func() {
   127  
   128  		It("Disallow non owner to delete owner", func() {
   129  			cc.From(nonOwnerIdentity).Tx(func() {
   130  				cc.Expect(ownerSvc.DeleteOwner(ctx, &owner.OwnerId{
   131  					MspId:   ownerIdentity2.GetMSPIdentifier(),
   132  					Subject: ownerIdentity2.GetSubject(),
   133  				})).HasError(`tx invoker is not owner`)
   134  			})
   135  		})
   136  
   137  		It("Allow owner to delete owner, including self", func() {
   138  			cc.From(ownerIdentity1).Tx(func() {
   139  				deletedOwner, err := ownerSvc.DeleteOwner(ctx, &owner.OwnerId{
   140  					MspId:   ownerIdentity1.GetMSPIdentifier(),
   141  					Subject: ownerIdentity1.GetSubject(),
   142  				})
   143  				Expect(err).NotTo(HaveOccurred())
   144  				Expect(deletedOwner.MspId).To(Equal(ownerIdentity1.GetMSPIdentifier()))
   145  				Expect(deletedOwner.Cert).To(Equal(ownerIdentity1.GetPEM()))
   146  			})
   147  
   148  			cc.From(nonOwnerIdentity).Tx(func() {
   149  				owners, err := ownerSvc.ListOwners(ctx, &emptypb.Empty{})
   150  
   151  				Expect(err).NotTo(HaveOccurred())
   152  				Expect(owners.Items).To(HaveLen(1))
   153  			})
   154  		})
   155  
   156  		It("Disallow to delete last owner", func() {
   157  
   158  			cc.From(ownerIdentity2).Tx(func() {
   159  				cc.Expect(ownerSvc.DeleteOwner(ctx, &owner.OwnerId{
   160  					MspId:   ownerIdentity2.GetMSPIdentifier(),
   161  					Subject: ownerIdentity2.GetSubject(),
   162  				})).HasError(`delete last owner is not allowed`)
   163  			})
   164  
   165  		})
   166  	})
   167  
   168  })