github.com/Finschia/finschia-sdk@v0.48.1/types/events_test.go (about)

     1  package types_test
     2  
     3  import (
     4  	"encoding/json"
     5  	"reflect"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/suite"
     9  	abci "github.com/tendermint/tendermint/abci/types"
    10  
    11  	codectypes "github.com/Finschia/finschia-sdk/codec/types"
    12  	testdata "github.com/Finschia/finschia-sdk/testutil/testdata"
    13  	sdk "github.com/Finschia/finschia-sdk/types"
    14  )
    15  
    16  type eventsTestSuite struct {
    17  	suite.Suite
    18  }
    19  
    20  func TestEventsTestSuite(t *testing.T) {
    21  	suite.Run(t, new(eventsTestSuite))
    22  }
    23  
    24  func (s *eventsTestSuite) SetupSuite() {
    25  	s.T().Parallel()
    26  }
    27  
    28  func (s *eventsTestSuite) TestAppendEvents() {
    29  	e1 := sdk.NewEvent("transfer", sdk.NewAttribute("sender", "foo"))
    30  	e2 := sdk.NewEvent("transfer", sdk.NewAttribute("sender", "bar"))
    31  	a := sdk.Events{e1}
    32  	b := sdk.Events{e2}
    33  	c := a.AppendEvents(b)
    34  	s.Require().Equal(c, sdk.Events{e1, e2})
    35  	s.Require().Equal(c, sdk.Events{e1}.AppendEvent(sdk.NewEvent("transfer", sdk.NewAttribute("sender", "bar"))))
    36  	s.Require().Equal(c, sdk.Events{e1}.AppendEvents(sdk.Events{e2}))
    37  }
    38  
    39  func (s *eventsTestSuite) TestAppendAttributes() {
    40  	e := sdk.NewEvent("transfer", sdk.NewAttribute("sender", "foo"))
    41  	e = e.AppendAttributes(sdk.NewAttribute("recipient", "bar"))
    42  	s.Require().Len(e.Attributes, 2)
    43  	s.Require().Equal(e, sdk.NewEvent("transfer", sdk.NewAttribute("sender", "foo"), sdk.NewAttribute("recipient", "bar")))
    44  }
    45  
    46  func (s *eventsTestSuite) TestGetAttributes() {
    47  	e := sdk.NewEvent("transfer", sdk.NewAttribute("sender", "foo"))
    48  	e = e.AppendAttributes(sdk.NewAttribute("recipient", "bar"))
    49  	attr, found := e.GetAttribute("recipient")
    50  	s.Require().True(found)
    51  	s.Require().Equal(attr, sdk.NewAttribute("recipient", "bar"))
    52  	_, found = e.GetAttribute("foo")
    53  	s.Require().False(found)
    54  
    55  	events := sdk.Events{e}.AppendEvent(sdk.NewEvent("message", sdk.NewAttribute("sender", "bar")))
    56  	attrs, found := events.GetAttributes("sender")
    57  	s.Require().True(found)
    58  	s.Require().Len(attrs, 2)
    59  	s.Require().Equal(attrs[0], sdk.NewAttribute("sender", "foo"))
    60  	s.Require().Equal(attrs[1], sdk.NewAttribute("sender", "bar"))
    61  	_, found = events.GetAttributes("foo")
    62  	s.Require().False(found)
    63  }
    64  
    65  func (s *eventsTestSuite) TestEmptyEvents() {
    66  	s.Require().Equal(sdk.EmptyEvents(), sdk.Events{})
    67  }
    68  
    69  func (s *eventsTestSuite) TestAttributeString() {
    70  	s.Require().Equal("foo: bar", sdk.NewAttribute("foo", "bar").String())
    71  }
    72  
    73  func (s *eventsTestSuite) TestToABCIEvents() {
    74  	e := sdk.Events{sdk.NewEvent("transfer", sdk.NewAttribute("sender", "foo"))}
    75  	abciEvents := e.ToABCIEvents()
    76  	s.Require().Len(abciEvents, 1)
    77  	s.Require().Equal(abciEvents[0].Type, e[0].Type)
    78  	s.Require().Equal(abciEvents[0].Attributes, e[0].Attributes)
    79  }
    80  
    81  func (s *eventsTestSuite) TestEventManager() {
    82  	em := sdk.NewEventManager()
    83  	event := sdk.NewEvent("reward", sdk.NewAttribute("x", "y"))
    84  	events := sdk.Events{sdk.NewEvent("transfer", sdk.NewAttribute("sender", "foo"))}
    85  
    86  	em.EmitEvents(events)
    87  	em.EmitEvent(event)
    88  
    89  	s.Require().Len(em.Events(), 2)
    90  	s.Require().Equal(em.Events(), events.AppendEvent(event))
    91  }
    92  
    93  func (s *eventsTestSuite) TestEmitTypedEvent() {
    94  	s.Run("deterministic key-value order", func() {
    95  		for i := 0; i < 10; i++ {
    96  			em := sdk.NewEventManager()
    97  			coin := sdk.NewCoin("fakedenom", sdk.NewInt(1999999))
    98  			s.Require().NoError(em.EmitTypedEvent(&coin))
    99  			s.Require().Len(em.Events(), 1)
   100  			attrs := em.Events()[0].Attributes
   101  			s.Require().Len(attrs, 2)
   102  			s.Require().Equal(string(attrs[0].Key), "amount")
   103  			s.Require().Equal(string(attrs[1].Key), "denom")
   104  		}
   105  	})
   106  }
   107  
   108  func (s *eventsTestSuite) TestEventManagerTypedEvents() {
   109  	em := sdk.NewEventManager()
   110  
   111  	coin := sdk.NewCoin("fakedenom", sdk.NewInt(1999999))
   112  	cat := testdata.Cat{
   113  		Moniker: "Garfield",
   114  		Lives:   6,
   115  	}
   116  	animal, err := codectypes.NewAnyWithValue(&cat)
   117  	s.Require().NoError(err)
   118  	hasAnimal := testdata.HasAnimal{
   119  		X:      1000,
   120  		Animal: animal,
   121  	}
   122  
   123  	s.Require().NoError(em.EmitTypedEvents(&coin))
   124  	s.Require().NoError(em.EmitTypedEvent(&hasAnimal))
   125  	s.Require().Len(em.Events(), 2)
   126  
   127  	msg1, err := sdk.ParseTypedEvent(em.Events().ToABCIEvents()[0])
   128  	s.Require().NoError(err)
   129  	s.Require().Equal(coin.String(), msg1.String())
   130  	s.Require().Equal(reflect.TypeOf(&coin), reflect.TypeOf(msg1))
   131  
   132  	msg2, err := sdk.ParseTypedEvent(em.Events().ToABCIEvents()[1])
   133  	s.Require().NoError(err)
   134  	s.Require().Equal(reflect.TypeOf(&hasAnimal), reflect.TypeOf(msg2))
   135  	response := msg2.(*testdata.HasAnimal)
   136  	s.Require().Equal(hasAnimal.Animal.String(), response.Animal.String())
   137  }
   138  
   139  func (s *eventsTestSuite) TestStringifyEvents() {
   140  	e := sdk.Events{
   141  		sdk.NewEvent("message", sdk.NewAttribute("sender", "foo")),
   142  		sdk.NewEvent("message", sdk.NewAttribute("module", "bank")),
   143  	}
   144  	se := sdk.StringifyEvents(e.ToABCIEvents())
   145  
   146  	expectedTxtStr := "\t\t- message\n\t\t\t- sender: foo\n\t\t\t- module: bank"
   147  	s.Require().Equal(expectedTxtStr, se.String())
   148  
   149  	bz, err := json.Marshal(se)
   150  	s.Require().NoError(err)
   151  
   152  	expectedJSONStr := "[{\"type\":\"message\",\"attributes\":[{\"key\":\"sender\",\"value\":\"foo\"},{\"key\":\"module\",\"value\":\"bank\"}]}]"
   153  	s.Require().Equal(expectedJSONStr, string(bz))
   154  }
   155  
   156  func (s *eventsTestSuite) TestMarkEventsToIndex() {
   157  	events := []abci.Event{
   158  		{
   159  			Type: "message",
   160  			Attributes: []abci.EventAttribute{
   161  				{Key: []byte("sender"), Value: []byte("foo")},
   162  				{Key: []byte("recipient"), Value: []byte("bar")},
   163  			},
   164  		},
   165  		{
   166  			Type: "staking",
   167  			Attributes: []abci.EventAttribute{
   168  				{Key: []byte("deposit"), Value: []byte("5")},
   169  				{Key: []byte("unbond"), Value: []byte("10")},
   170  			},
   171  		},
   172  	}
   173  
   174  	testCases := map[string]struct {
   175  		events   []abci.Event
   176  		indexSet map[string]struct{}
   177  		expected []abci.Event
   178  	}{
   179  		"empty index set": {
   180  			events: events,
   181  			expected: []abci.Event{
   182  				{
   183  					Type: "message",
   184  					Attributes: []abci.EventAttribute{
   185  						{Key: []byte("sender"), Value: []byte("foo"), Index: true},
   186  						{Key: []byte("recipient"), Value: []byte("bar"), Index: true},
   187  					},
   188  				},
   189  				{
   190  					Type: "staking",
   191  					Attributes: []abci.EventAttribute{
   192  						{Key: []byte("deposit"), Value: []byte("5"), Index: true},
   193  						{Key: []byte("unbond"), Value: []byte("10"), Index: true},
   194  					},
   195  				},
   196  			},
   197  			indexSet: map[string]struct{}{},
   198  		},
   199  		"index some events": {
   200  			events: events,
   201  			expected: []abci.Event{
   202  				{
   203  					Type: "message",
   204  					Attributes: []abci.EventAttribute{
   205  						{Key: []byte("sender"), Value: []byte("foo"), Index: true},
   206  						{Key: []byte("recipient"), Value: []byte("bar")},
   207  					},
   208  				},
   209  				{
   210  					Type: "staking",
   211  					Attributes: []abci.EventAttribute{
   212  						{Key: []byte("deposit"), Value: []byte("5"), Index: true},
   213  						{Key: []byte("unbond"), Value: []byte("10")},
   214  					},
   215  				},
   216  			},
   217  			indexSet: map[string]struct{}{
   218  				"message.sender":  {},
   219  				"staking.deposit": {},
   220  			},
   221  		},
   222  		"index all events": {
   223  			events: events,
   224  			expected: []abci.Event{
   225  				{
   226  					Type: "message",
   227  					Attributes: []abci.EventAttribute{
   228  						{Key: []byte("sender"), Value: []byte("foo"), Index: true},
   229  						{Key: []byte("recipient"), Value: []byte("bar"), Index: true},
   230  					},
   231  				},
   232  				{
   233  					Type: "staking",
   234  					Attributes: []abci.EventAttribute{
   235  						{Key: []byte("deposit"), Value: []byte("5"), Index: true},
   236  						{Key: []byte("unbond"), Value: []byte("10"), Index: true},
   237  					},
   238  				},
   239  			},
   240  			indexSet: map[string]struct{}{
   241  				"message.sender":    {},
   242  				"message.recipient": {},
   243  				"staking.deposit":   {},
   244  				"staking.unbond":    {},
   245  			},
   246  		},
   247  	}
   248  
   249  	for name, tc := range testCases {
   250  		tc := tc
   251  		s.T().Run(name, func(_ *testing.T) {
   252  			s.Require().Equal(tc.expected, sdk.MarkEventsToIndex(tc.events, tc.indexSet))
   253  		})
   254  	}
   255  }