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