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 }