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