github.com/s7techlab/cckit@v0.10.5/examples/fabcar/fabcar_test.go (about) 1 package fabcar_test 2 3 import ( 4 "testing" 5 6 "github.com/golang/protobuf/ptypes/empty" 7 . "github.com/onsi/ginkgo" 8 . "github.com/onsi/gomega" 9 10 "github.com/s7techlab/cckit/examples/fabcar" 11 "github.com/s7techlab/cckit/examples/fabcar/testdata" 12 identitytestdata "github.com/s7techlab/cckit/identity/testdata" 13 testcc "github.com/s7techlab/cckit/testing" 14 ) 15 16 func TestFabCarService(t *testing.T) { 17 RegisterFailHandler(Fail) 18 RunSpecs(t, "Flight service suite") 19 } 20 21 func ExpectErrorContain(str string) func(interface{}, error) { 22 return func(_ interface{}, err error) { 23 Expect(err).To(HaveOccurred()) 24 Expect(err.Error()).To(ContainSubstring(str)) 25 } 26 } 27 28 var _ = Describe(`FabCar service`, func() { 29 30 var ( 31 fabCarCC = &fabcar.FabCarService{} 32 33 // same ctx for all related services - like all services in one chaincode 34 cc, ctx = testcc.NewTxHandler(fabcar.ChaincodeName) 35 ) 36 37 It("Allow to init related", func() { 38 cc.From(identitytestdata.Certificates[0].MustIdentity(`SOME_MSP`)).Init(fabcar.ChaincodeInitFunc()) 39 }) 40 41 Context("Maker", func() { 42 It("disallow to create maker", func() { 43 cc.Tx(func() { 44 ExpectErrorContain(`invalid field FoundationYear: value '1884' must be greater than '1885'`)( 45 fabCarCC.CreateMaker(ctx, testdata.MakerNonexistent.Create)) 46 }) 47 }) 48 49 It("allow to create makers", func() { 50 cc.Tx(func() { 51 reqCreate := testdata.MakerNonexistent.CreateClone() 52 reqCreate.FoundationYear = 1886 53 54 maker, err := fabCarCC.CreateMaker(ctx, reqCreate) 55 Expect(err).NotTo(HaveOccurred()) 56 Expect(maker.Name).To(Equal(reqCreate.Name)) 57 Expect(maker.Country).To(Equal(reqCreate.Country)) 58 Expect(maker.FoundationYear).To(Equal(reqCreate.FoundationYear)) 59 60 req := testdata.MakerToyota 61 maker, err = fabCarCC.CreateMaker(ctx, req.Create) 62 Expect(err).NotTo(HaveOccurred()) 63 req.ExpectEqual(maker) 64 65 req = testdata.MakerAudi 66 maker, err = fabCarCC.CreateMaker(ctx, req.Create) 67 Expect(err).NotTo(HaveOccurred()) 68 req.ExpectEqual(maker) 69 70 req = testdata.MakerPeugeot 71 maker, err = fabCarCC.CreateMaker(ctx, req.Create) 72 Expect(err).NotTo(HaveOccurred()) 73 req.ExpectEqual(maker) 74 75 req = testdata.MakerFord 76 maker, err = fabCarCC.CreateMaker(ctx, req.Create) 77 Expect(err).NotTo(HaveOccurred()) 78 req.ExpectEqual(maker) 79 }) 80 }) 81 82 It("allow to get maker", func() { 83 cc.Tx(func() { 84 maker, err := fabCarCC.GetMaker(ctx, &fabcar.MakerName{Name: testdata.MakerPeugeot.Create.Name}) 85 Expect(err).NotTo(HaveOccurred()) 86 testdata.MakerPeugeot.ExpectEqual(maker) 87 }) 88 }) 89 90 It("allow to get list makers", func() { 91 cc.Tx(func() { 92 makers, err := fabCarCC.ListMakers(ctx, &empty.Empty{}) 93 Expect(err).NotTo(HaveOccurred()) 94 Expect(makers.Items).To(HaveLen(5)) 95 }) 96 }) 97 98 It("allow to delete maker", func() { 99 cc.Tx(func() { 100 _, err := fabCarCC.DeleteMaker(ctx, &fabcar.MakerName{Name: testdata.MakerNonexistent.Create.Name}) 101 Expect(err).NotTo(HaveOccurred()) 102 }) 103 104 cc.Tx(func() { 105 makers, err := fabCarCC.ListMakers(ctx, &empty.Empty{}) 106 Expect(err).NotTo(HaveOccurred()) 107 Expect(makers.Items).To(HaveLen(4)) 108 }) 109 }) 110 111 It("disallow to delete maker", func() { 112 cc.Tx(func() { 113 ExpectErrorContain(`state entry not found: Maker | Nonexistent`)(fabCarCC.DeleteMaker(ctx, &fabcar.MakerName{Name: testdata.MakerNonexistent.Create.Name})) 114 }) 115 }) 116 }) 117 118 Context(`Car`, func() { 119 var ( 120 car1IdString = testdata.Car1.IdStrings() 121 carNonexistentIdString = append(car1IdString, testdata.MakerNonexistent.Create.Name) 122 ) 123 124 It("disallow to create car", func() { 125 cc.Tx(func() { 126 carReq := testdata.Car1.CreateClone() 127 128 carReq.Make = testdata.MakerNonexistent.Create.Name 129 ExpectErrorContain(`maker is not created: state entry not found: Maker | Nonexistent`)(fabCarCC.CreateCar(ctx, carReq)) 130 }) 131 }) 132 133 It("allow to create cars", func() { 134 cc.Tx(func() { 135 req := testdata.Car1 136 carView, err := fabCarCC.CreateCar(ctx, req.Create) 137 Expect(err).NotTo(HaveOccurred()) 138 req.ExpectCreateEqualCarView(carView) 139 140 req = testdata.Car2 141 carView, err = fabCarCC.CreateCar(ctx, req.Create) 142 Expect(err).NotTo(HaveOccurred()) 143 req.ExpectCreateEqualCarView(carView) 144 145 reqCreate := testdata.Car1.CreateClone() 146 reqCreate.Make = testdata.MakerAudi.Create.Name 147 _, err = fabCarCC.CreateCar(ctx, reqCreate) 148 Expect(err).NotTo(HaveOccurred()) 149 }) 150 }) 151 152 It("allow to get car", func() { 153 cc.Tx(func() { 154 car, err := fabCarCC.GetCar(ctx, &fabcar.CarId{Id: testdata.Car2.IdStrings()}) 155 Expect(err).NotTo(HaveOccurred()) 156 testdata.Car2.ExpectCreateEqualCar(car) 157 }) 158 159 cc.Tx(func() { 160 carOwners, err := fabCarCC.ListCarOwners(ctx, &fabcar.CarId{Id: car1IdString}) 161 Expect(err).NotTo(HaveOccurred()) 162 Expect(carOwners.Items).To(HaveLen(1)) 163 }) 164 165 cc.Tx(func() { 166 carDetails, err := fabCarCC.ListCarDetails(ctx, &fabcar.CarId{Id: car1IdString}) 167 Expect(err).NotTo(HaveOccurred()) 168 Expect(carDetails.Items).To(HaveLen(2)) 169 }) 170 }) 171 172 It("allow to get car view", func() { 173 cc.Tx(func() { 174 carView, err := fabCarCC.GetCarView(ctx, &fabcar.CarId{Id: testdata.Car2.IdStrings()}) 175 Expect(err).NotTo(HaveOccurred()) 176 testdata.Car2.ExpectCreateEqualCarView(carView) 177 }) 178 }) 179 180 It("allow to get list cars", func() { 181 cc.Tx(func() { 182 cars, err := fabCarCC.ListCars(ctx, &empty.Empty{}) 183 Expect(err).NotTo(HaveOccurred()) 184 Expect(cars.Items).To(HaveLen(3)) 185 }) 186 }) 187 188 It("allow to get car owner", func() { 189 cc.Tx(func() { 190 carOwner, err := fabCarCC.GetCarOwner(ctx, &fabcar.CarOwnerId{ 191 CarId: car1IdString, 192 FirstName: testdata.Car1.Create.Owners[0].FirstName, 193 SecondName: testdata.Car1.Create.Owners[0].SecondName, 194 }) 195 Expect(err).NotTo(HaveOccurred()) 196 Expect(carOwner.CarId).To(Equal(car1IdString)) 197 Expect(carOwner.FirstName).To(Equal(testdata.Car1.Create.Owners[0].FirstName)) 198 Expect(carOwner.SecondName).To(Equal(testdata.Car1.Create.Owners[0].SecondName)) 199 }) 200 }) 201 202 It("allow to get list car owners", func() { 203 cc.Tx(func() { 204 carOwners, err := fabCarCC.ListCarOwners(ctx, &fabcar.CarId{Id: car1IdString}) 205 Expect(err).NotTo(HaveOccurred()) 206 Expect(carOwners.Items).To(HaveLen(1)) 207 }) 208 }) 209 210 It("allow to get car detail", func() { 211 cc.Tx(func() { 212 carDetail, err := fabCarCC.GetCarDetail(ctx, &fabcar.CarDetailId{ 213 CarId: car1IdString, 214 Type: testdata.Car1.Create.Details[0].Type, 215 }) 216 Expect(err).NotTo(HaveOccurred()) 217 Expect(carDetail.CarId).To(Equal(car1IdString)) 218 Expect(carDetail.Type).To(Equal(testdata.Car1.Create.Details[0].Type)) 219 Expect(carDetail.Make).To(Equal(testdata.Car1.Create.Details[0].Make)) 220 }) 221 }) 222 223 It("allow to get list car details", func() { 224 cc.Tx(func() { 225 carDetails, err := fabCarCC.ListCarDetails(ctx, &fabcar.CarId{Id: car1IdString}) 226 Expect(err).NotTo(HaveOccurred()) 227 Expect(carDetails.Items).To(HaveLen(2)) 228 }) 229 }) 230 231 It("allow to delete car", func() { 232 cc.Tx(func() { 233 req := testdata.Car1.Clone() 234 req.Create.Make = testdata.MakerAudi.Create.Name 235 236 carView, err := fabCarCC.DeleteCar(ctx, &fabcar.CarId{Id: req.IdStrings()}) 237 Expect(err).NotTo(HaveOccurred()) 238 req.ExpectCreateEqualCarView(carView) 239 }) 240 }) 241 242 It("disallow to delete car", func() { 243 cc.Tx(func() { 244 req := testdata.Car1.Clone() 245 req.Create.Make = testdata.MakerNonexistent.Create.Name 246 247 ExpectErrorContain(`state entry not found: Car | Nonexistent | Prius | 85322`)(fabCarCC.DeleteCar(ctx, &fabcar.CarId{Id: req.IdStrings()})) 248 }) 249 }) 250 251 It("allow to update car", func() { 252 cc.Tx(func() { 253 carView, err := fabCarCC.UpdateCar(ctx, testdata.Car1.Updates[0]) 254 Expect(err).NotTo(HaveOccurred()) 255 Expect(carView.Car.Id).To(Equal(car1IdString)) 256 Expect(carView.Car.Colour).To(Equal(testdata.Car1.Updates[0].Color)) 257 258 Expect(carView.Owners.Items[0].CarId).To(Equal(car1IdString)) 259 Expect(carView.Owners.Items[0].FirstName).To(Equal(testdata.Car1.Updates[0].Owners[0].FirstName)) 260 Expect(carView.Owners.Items[0].SecondName).To(Equal(testdata.Car1.Updates[0].Owners[0].SecondName)) 261 Expect(carView.Owners.Items[0].VehiclePassport).To(Equal(testdata.Car1.Updates[0].Owners[0].VehiclePassport)) 262 263 Expect(carView.Owners.Items[1].CarId).To(Equal(car1IdString)) 264 Expect(carView.Owners.Items[1].FirstName).To(Equal(testdata.Car1.Updates[0].Owners[1].FirstName)) 265 Expect(carView.Owners.Items[1].SecondName).To(Equal(testdata.Car1.Updates[0].Owners[1].SecondName)) 266 Expect(carView.Owners.Items[1].VehiclePassport).To(Equal(testdata.Car1.Updates[0].Owners[1].VehiclePassport)) 267 268 Expect(carView.Details.Items[0].CarId).To(Equal(car1IdString)) 269 Expect(carView.Details.Items[0].Type).To(Equal(testdata.Car1.Create.Details[1].Type)) 270 Expect(carView.Details.Items[0].Make).To(Equal(testdata.Car1.Create.Details[1].Make)) 271 272 Expect(carView.Details.Items[1].CarId).To(Equal(car1IdString)) 273 Expect(carView.Details.Items[1].Type).To(Equal(testdata.Car1.Updates[0].Details[0].Type)) 274 Expect(carView.Details.Items[1].Make).To(Equal(testdata.Car1.Updates[0].Details[0].Make)) 275 }) 276 }) 277 278 It("disallow to update car", func() { 279 cc.Tx(func() { 280 req := testdata.Car1.Clone() 281 req.Updates[0].Id = carNonexistentIdString 282 ExpectErrorContain(`state entry not found: Car | Toyota | Prius | 85322 | Nonexistent`)(fabCarCC.UpdateCar(ctx, req.Updates[0])) 283 }) 284 }) 285 286 It("allow to update car owners", func() { 287 cc.Tx(func() { 288 carOwners, err := fabCarCC.UpdateCarOwners(ctx, testdata.Car1.UpdateOwners[0]) 289 Expect(err).NotTo(HaveOccurred()) 290 Expect(carOwners.Items[0].CarId).To(Equal(car1IdString)) 291 Expect(carOwners.Items[0].FirstName).To(Equal(testdata.Car1.Updates[0].Owners[1].FirstName)) 292 Expect(carOwners.Items[0].SecondName).To(Equal(testdata.Car1.Updates[0].Owners[1].SecondName)) 293 Expect(carOwners.Items[0].VehiclePassport).To(Equal(testdata.Car1.Updates[0].Owners[1].VehiclePassport)) 294 295 Expect(carOwners.Items[1].CarId).To(Equal(car1IdString)) 296 Expect(carOwners.Items[1].FirstName).To(Equal(testdata.Car1.UpdateOwners[0].Owners[0].FirstName)) 297 Expect(carOwners.Items[1].SecondName).To(Equal(testdata.Car1.UpdateOwners[0].Owners[0].SecondName)) 298 Expect(carOwners.Items[1].VehiclePassport).To(Equal(testdata.Car1.UpdateOwners[0].Owners[0].VehiclePassport)) 299 300 Expect(carOwners.Items[2].CarId).To(Equal(car1IdString)) 301 Expect(carOwners.Items[2].FirstName).To(Equal(testdata.Car1.UpdateOwners[0].Owners[1].FirstName)) 302 Expect(carOwners.Items[2].SecondName).To(Equal(testdata.Car1.UpdateOwners[0].Owners[1].SecondName)) 303 Expect(carOwners.Items[2].VehiclePassport).To(Equal(testdata.Car1.UpdateOwners[0].Owners[1].VehiclePassport)) 304 }) 305 306 cc.Tx(func() { 307 carOwner, err := fabCarCC.GetCarOwner(ctx, &fabcar.CarOwnerId{ 308 CarId: car1IdString, 309 FirstName: testdata.Car1.UpdateOwners[0].Owners[1].FirstName, 310 SecondName: testdata.Car1.UpdateOwners[0].Owners[1].SecondName, 311 }) 312 Expect(err).NotTo(HaveOccurred()) 313 Expect(carOwner.CarId).To(Equal(car1IdString)) 314 Expect(carOwner.FirstName).To(Equal(testdata.Car1.UpdateOwners[0].Owners[1].FirstName)) 315 Expect(carOwner.SecondName).To(Equal(testdata.Car1.UpdateOwners[0].Owners[1].SecondName)) 316 Expect(carOwner.VehiclePassport).To(Equal(testdata.Car1.UpdateOwners[0].Owners[1].VehiclePassport)) 317 }) 318 319 cc.Tx(func() { 320 carOwners, err := fabCarCC.ListCarOwners(ctx, &fabcar.CarId{Id: car1IdString}) 321 Expect(err).NotTo(HaveOccurred()) 322 Expect(carOwners.Items).To(HaveLen(3)) 323 }) 324 }) 325 326 It("disallow to update car owners", func() { 327 cc.Tx(func() { 328 req := testdata.Car1.Clone() 329 330 req.UpdateOwners[0].CarId = carNonexistentIdString 331 ExpectErrorContain(`state entry not found: Car | Toyota | Prius | 85322 | Nonexistent`)(fabCarCC.UpdateCarOwners(ctx, req.UpdateOwners[0])) 332 }) 333 }) 334 335 It("allow to delete car owner", func() { 336 cc.Tx(func() { 337 carOwner, err := fabCarCC.DeleteCarOwner(ctx, &fabcar.CarOwnerId{ 338 CarId: car1IdString, 339 FirstName: testdata.Car1.Updates[0].Owners[1].FirstName, 340 SecondName: testdata.Car1.Updates[0].Owners[1].SecondName, 341 }) 342 343 Expect(err).NotTo(HaveOccurred()) 344 Expect(carOwner.FirstName).To(Equal(testdata.Car1.Updates[0].Owners[1].FirstName)) 345 Expect(carOwner.SecondName).To(Equal(testdata.Car1.Updates[0].Owners[1].SecondName)) 346 Expect(carOwner.VehiclePassport).To(Equal(testdata.Car1.Updates[0].Owners[1].VehiclePassport)) 347 }) 348 349 cc.Tx(func() { 350 carOwners, err := fabCarCC.ListCarOwners(ctx, &fabcar.CarId{Id: car1IdString}) 351 Expect(err).NotTo(HaveOccurred()) 352 Expect(carOwners.Items).To(HaveLen(2)) 353 }) 354 }) 355 356 It("disallow to delete car owner", func() { 357 cc.Tx(func() { 358 carOwnerId := &fabcar.CarOwnerId{ 359 CarId: carNonexistentIdString, 360 FirstName: testdata.Car1.Updates[0].Owners[1].FirstName, 361 SecondName: testdata.Car1.Updates[0].Owners[1].SecondName, 362 } 363 ExpectErrorContain(`state entry not found: CarOwner | Toyota | Prius | 85322 | Nonexistent | Michel | Tailor`)(fabCarCC.DeleteCarOwner(ctx, carOwnerId)) 364 }) 365 }) 366 367 It("allow to update car details", func() { 368 cc.Tx(func() { 369 carDetails, err := fabCarCC.UpdateCarDetails(ctx, testdata.Car1.UpdateDetails[0]) 370 Expect(err).NotTo(HaveOccurred()) 371 Expect(carDetails.Items[0].CarId).To(Equal(car1IdString)) 372 Expect(carDetails.Items[0].Type).To(Equal(testdata.Car1.UpdateDetails[0].Details[1].Type)) 373 Expect(carDetails.Items[0].Make).To(Equal(testdata.Car1.UpdateDetails[0].Details[1].Make)) 374 375 Expect(carDetails.Items[1].CarId).To(Equal(car1IdString)) 376 Expect(carDetails.Items[1].Type).To(Equal(testdata.Car1.UpdateDetails[0].Details[0].Type)) 377 Expect(carDetails.Items[1].Make).To(Equal(testdata.Car1.UpdateDetails[0].Details[0].Make)) 378 }) 379 380 cc.Tx(func() { 381 carDetail, err := fabCarCC.GetCarDetail(ctx, &fabcar.CarDetailId{CarId: car1IdString, Type: fabcar.DetailType_WHEELS}) 382 Expect(err).NotTo(HaveOccurred()) 383 Expect(carDetail.CarId).To(Equal(car1IdString)) 384 Expect(carDetail.Type).To(Equal(testdata.Car1.UpdateDetails[0].Details[0].Type)) 385 Expect(carDetail.Make).To(Equal(testdata.Car1.UpdateDetails[0].Details[0].Make)) 386 }) 387 388 cc.Tx(func() { 389 carOwners, err := fabCarCC.ListCarOwners(ctx, &fabcar.CarId{Id: car1IdString}) 390 Expect(err).NotTo(HaveOccurred()) 391 Expect(carOwners.Items).To(HaveLen(2)) 392 }) 393 }) 394 395 It("disallow to update car details", func() { 396 cc.Tx(func() { 397 req := testdata.Car1.Clone() 398 req.UpdateDetails[0].CarId = carNonexistentIdString 399 ExpectErrorContain(`state entry not found: Car | Toyota | Prius | 85322 | Nonexistent`)(fabCarCC.UpdateCarDetails(ctx, req.UpdateDetails[0])) 400 }) 401 }) 402 403 It("allow to delete car details", func() { 404 cc.Tx(func() { 405 carDetail, err := fabCarCC.DeleteCarDetail(ctx, &fabcar.CarDetailId{ 406 CarId: car1IdString, 407 Type: testdata.Car1.UpdateDetails[0].Details[0].Type, 408 }) 409 Expect(err).NotTo(HaveOccurred()) 410 Expect(carDetail.CarId).To(Equal(car1IdString)) 411 Expect(carDetail.Type).To(Equal(testdata.Car1.UpdateDetails[0].Details[0].Type)) 412 Expect(carDetail.Make).To(Equal(testdata.Car1.UpdateDetails[0].Details[0].Make)) 413 }) 414 415 cc.Tx(func() { 416 carDetails, err := fabCarCC.ListCarDetails(ctx, &fabcar.CarId{Id: car1IdString}) 417 Expect(err).NotTo(HaveOccurred()) 418 Expect(carDetails.Items).To(HaveLen(1)) 419 }) 420 }) 421 422 It("disallow to delete car details", func() { 423 cc.Tx(func() { 424 carDetailId := &fabcar.CarDetailId{ 425 CarId: carNonexistentIdString, 426 Type: fabcar.DetailType_WHEELS, 427 } 428 ExpectErrorContain(`state entry not found: CarDetail | Toyota | Prius | 85322 | Nonexistent | WHEELS`)(fabCarCC.DeleteCarDetail(ctx, carDetailId)) 429 }) 430 }) 431 }) 432 })