github.com/s7techlab/cckit@v0.10.5/extensions/debug/debug_state_test.go (about)

     1  package debug_test
     2  
     3  import (
     4  	. "github.com/onsi/ginkgo"
     5  	. "github.com/onsi/gomega"
     6  
     7  	. "github.com/s7techlab/cckit/testing/gomega"
     8  
     9  	"strconv"
    10  
    11  	"github.com/s7techlab/cckit/extensions/debug"
    12  	testcc "github.com/s7techlab/cckit/testing"
    13  )
    14  
    15  var _ = Describe(`State`, func() {
    16  
    17  	var (
    18  		dbg = debug.NewStateService()
    19  
    20  		cc, ctx = testcc.NewTxHandler(`Debug`)
    21  	)
    22  
    23  	Context(`Empty`, func() {
    24  
    25  		It("Allow to get empty key list", func() {
    26  			cc.From(Owner).Tx(func() {
    27  				keys, err := dbg.ListKeys(ctx, nil) // get all keys
    28  				Expect(err).NotTo(HaveOccurred())
    29  
    30  				Expect(keys.Keys).To(HaveLen(0))
    31  			})
    32  		})
    33  
    34  		It("Allow to clean", func() {
    35  			cc.From(Owner).Tx(func() {
    36  				deleted, err := dbg.DeleteStates(ctx, &debug.Prefixes{Prefixes: []*debug.Prefix{{
    37  					Key: []string{`some`},
    38  				}, {
    39  					Key: []string{`not exists prefix`},
    40  				}}}) // get all keys
    41  				Expect(err).NotTo(HaveOccurred())
    42  
    43  				Expect(len(deleted.Matches)).To(Equal(2))
    44  				Expect(deleted.Matches[`some`]).To(Equal(uint32(0)))
    45  				Expect(deleted.Matches[`not exists prefix`]).To(Equal(uint32(0)))
    46  			})
    47  
    48  		})
    49  
    50  	})
    51  
    52  	Context(`Non Empty`, func() {
    53  
    54  		It("Allow put value in state", func() {
    55  			for i := 0; i < 5; i++ {
    56  				cc.From(Owner).Tx(func() {
    57  					val := &debug.Value{
    58  						Key:   []string{`prefixA`, `key` + strconv.Itoa(i)},
    59  						Value: []byte(`value` + strconv.Itoa(i)),
    60  					}
    61  					valReceived, err := dbg.PutState(ctx, val)
    62  					Expect(err).NotTo(HaveOccurred())
    63  					Expect(valReceived).To(StringerEqual(val))
    64  				})
    65  
    66  			}
    67  
    68  			for i := 0; i < 7; i++ {
    69  				cc.From(Owner).Tx(func() {
    70  					_, err := dbg.PutState(ctx, &debug.Value{
    71  						Key:   []string{`prefixB`, `subprefixA`, `key` + strconv.Itoa(i)},
    72  						Value: []byte(`value` + strconv.Itoa(i)),
    73  					})
    74  					Expect(err).NotTo(HaveOccurred())
    75  				})
    76  
    77  				cc.From(Owner).Tx(func() {
    78  					_, err := dbg.PutState(ctx, &debug.Value{
    79  						Key:   []string{`prefixB`, `subprefixB`, `key` + strconv.Itoa(i)},
    80  						Value: []byte(`value` + strconv.Itoa(i)),
    81  					})
    82  					Expect(err).NotTo(HaveOccurred())
    83  				})
    84  			}
    85  
    86  			// put proto message
    87  			cc.From(Owner).Tx(func() {
    88  				_, err := dbg.PutState(ctx, &debug.Value{
    89  					Key:   []string{`keyA`},
    90  					Value: testcc.MustProtoMarshal(&debug.Prefix{Key: []string{`keyA`}}),
    91  				})
    92  				Expect(err).NotTo(HaveOccurred())
    93  			})
    94  			//cc.From(Owner).Invoke(`debugStatePut`, []string{`keyB`}, []byte(`valueKeyB`))
    95  			//cc.From(Owner).Invoke(`debugStatePut`, []string{`keyC`}, []byte(`valueKeyC`))
    96  		})
    97  
    98  		It("Allow to get value from state", func() {
    99  			cc.From(Owner).Tx(func() {
   100  				val, err := dbg.GetState(ctx, &debug.CompositeKey{
   101  					Key: []string{`prefixB`, `subprefixA`, `key` + strconv.Itoa(1)},
   102  				})
   103  				Expect(err).NotTo(HaveOccurred())
   104  				Expect(val.Value).To(Equal([]byte(`value1`)))
   105  			})
   106  
   107  			cc.From(Owner).Tx(func() {
   108  				val, err := dbg.GetState(ctx, &debug.CompositeKey{
   109  					Key: []string{`keyA`},
   110  				})
   111  				Expect(err).NotTo(HaveOccurred())
   112  				Expect(val.Value).To(Equal(testcc.MustProtoMarshal(&debug.Prefix{Key: []string{`keyA`}})))
   113  				Expect(val.Json).To(Equal(``)) // we have no mapping in state for this entry
   114  			})
   115  		})
   116  
   117  		It("Allow to get keys", func() {
   118  			cc.From(Owner).Tx(func() {
   119  				keys, err := dbg.ListKeys(ctx, &debug.Prefix{
   120  					Key: []string{`prefixA`},
   121  				})
   122  				Expect(err).NotTo(HaveOccurred())
   123  				Expect(keys.Keys).To(HaveLen(5))
   124  
   125  				for i := range keys.Keys {
   126  					Expect(keys.Keys[i].Key[0]).To(Equal(`prefixA`))
   127  				}
   128  			})
   129  
   130  			cc.From(Owner).Tx(func() {
   131  				keys, err := dbg.ListKeys(ctx, &debug.Prefix{
   132  					Key: []string{`prefixB`, `subprefixB`},
   133  				})
   134  				Expect(err).NotTo(HaveOccurred())
   135  				Expect(keys.Keys).To(HaveLen(7))
   136  
   137  				for i := range keys.Keys {
   138  					Expect(keys.Keys[i].Key[0]).To(Equal(`prefixB`))
   139  					Expect(keys.Keys[i].Key[1]).To(Equal(`subprefixB`))
   140  				}
   141  			})
   142  		})
   143  
   144  		It("Allow to get ALL keys", func() {
   145  			cc.From(Owner).Tx(func() {
   146  				keys, err := dbg.ListKeys(ctx, nil)
   147  				Expect(err).NotTo(HaveOccurred())
   148  				Expect(keys.Keys).To(HaveLen(20)) //total state entries inserted
   149  			})
   150  		})
   151  
   152  		It("Allow to delete state entry", func() {
   153  			cc.From(Owner).Tx(func() {
   154  				value, err := dbg.DeleteState(ctx, &debug.CompositeKey{
   155  					Key: []string{`prefixA`, `key0`},
   156  				})
   157  				Expect(err).NotTo(HaveOccurred())
   158  				Expect(value).To(StringerEqual(&debug.Value{
   159  					Key:   []string{`prefixA`, `key0`},
   160  					Value: []byte(`value0`),
   161  				}))
   162  			})
   163  
   164  			cc.From(Owner).Tx(func() {
   165  				keys, _ := dbg.ListKeys(ctx, &debug.Prefix{
   166  					Key: []string{`prefixA`},
   167  				})
   168  				Expect(keys.Keys).To(HaveLen(4))
   169  			})
   170  
   171  			cc.From(Owner).Tx(func() {
   172  				_, _ = dbg.DeleteState(ctx, &debug.CompositeKey{
   173  					Key: []string{`prefixA`, `key4`},
   174  				})
   175  			})
   176  
   177  			cc.From(Owner).Tx(func() {
   178  				keys, _ := dbg.ListKeys(ctx, &debug.Prefix{
   179  					Key: []string{`prefixA`},
   180  				})
   181  				Expect(keys.Keys).To(HaveLen(3))
   182  			})
   183  		})
   184  
   185  		It("Allow to clean state entries with key prefix", func() {
   186  			cc.From(Owner).Tx(func() {
   187  				deleted, err := dbg.DeleteStates(ctx, &debug.Prefixes{Prefixes: []*debug.Prefix{{
   188  					Key: []string{`prefixA`},
   189  				}}})
   190  				Expect(err).NotTo(HaveOccurred())
   191  
   192  				Expect(len(deleted.Matches)).To(Equal(1))
   193  				Expect(deleted.Matches[`prefixA`]).To(Equal(uint32(3)))
   194  			})
   195  
   196  			cc.From(Owner).Tx(func() {
   197  				keys, _ := dbg.ListKeys(ctx, nil)
   198  				Expect(keys.Keys).To(HaveLen(15)) //total state after last clean and delete in previous test
   199  			})
   200  		})
   201  
   202  		It("Allow to clean ALL state", func() {
   203  			cc.From(Owner).Tx(func() {
   204  				deleted, err := dbg.DeleteStates(ctx, &debug.Prefixes{Prefixes: []*debug.Prefix{{
   205  					Key: nil,
   206  				}}})
   207  				Expect(err).NotTo(HaveOccurred())
   208  
   209  				Expect(len(deleted.Matches)).To(Equal(1))
   210  				Expect(deleted.Matches[``]).To(Equal(uint32(15)))
   211  			})
   212  
   213  			cc.From(Owner).Tx(func() {
   214  				keys, _ := dbg.ListKeys(ctx, nil)
   215  				Expect(keys.Keys).To(HaveLen(0)) //total state after last clean and delete in previous test
   216  			})
   217  		})
   218  	})
   219  
   220  })