mirror of
https://github.com/sonr-io/sonr.git
synced 2026-08-02 17:31:39 +00:00
220 lines
6.2 KiB
Go
220 lines
6.2 KiB
Go
package keeper_test
|
|||
|
|
|
||
|
|
import (
|
||
|
|
"testing"
|
||
|
|
|
||
|
|
"github.com/stretchr/testify/suite"
|
||
|
|
|
||
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||
|
|
"github.com/sonr-io/sonr/x/dwn/types"
|
||
|
|
)
|
||
|
|
|
||
|
|
type EventsTestSuite struct {
|
||
|
|
suite.Suite
|
||
|
|
f *testFixture
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestEventsTestSuite(t *testing.T) {
|
||
|
|
suite.Run(t, new(EventsTestSuite))
|
||
|
|
}
|
||
|
|
|
||
|
|
func (suite *EventsTestSuite) SetupTest() {
|
||
|
|
suite.f = SetupTest(suite.T())
|
||
|
|
}
|
||
|
|
|
||
|
|
// TestRecordsWriteEventEmission tests that EventRecordWritten is properly emitted
|
||
|
|
func (suite *EventsTestSuite) TestRecordsWriteEventEmission() {
|
||
|
|
target := "did:sonr:testuser123"
|
||
|
|
author := suite.f.addrs[0].String()
|
||
|
|
|
||
|
|
msg := &types.MsgRecordsWrite{
|
||
|
|
Target: target,
|
||
|
|
Author: author,
|
||
|
|
Descriptor_: &types.DWNMessageDescriptor{
|
||
|
|
InterfaceName: "Records",
|
||
|
|
Method: "Write",
|
||
|
|
MessageTimestamp: "2024-01-01T00:00:00Z",
|
||
|
|
DataFormat: "application/json",
|
||
|
|
},
|
||
|
|
Data: []byte(`{"test": "data"}`),
|
||
|
|
Protocol: "test-protocol",
|
||
|
|
Schema: "test-schema",
|
||
|
|
}
|
||
|
|
|
||
|
|
// Execute RecordsWrite
|
||
|
|
resp, err := suite.f.msgServer.RecordsWrite(suite.f.ctx, msg)
|
||
|
|
suite.Require().NoError(err)
|
||
|
|
suite.Require().NotNil(resp)
|
||
|
|
|
||
|
|
// Check for emitted events
|
||
|
|
events := suite.f.ctx.EventManager().Events()
|
||
|
|
suite.Require().NotEmpty(events, "Expected events to be emitted")
|
||
|
|
|
||
|
|
// Find the typed event - simplified check
|
||
|
|
var foundEvent bool
|
||
|
|
for _, event := range events {
|
||
|
|
if event.Type == "dwn.v1.EventRecordWritten" {
|
||
|
|
foundEvent = true
|
||
|
|
break
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
suite.Require().True(foundEvent, "EventRecordWritten not found in emitted events")
|
||
|
|
}
|
||
|
|
|
||
|
|
// TestRecordsDeleteEventEmission tests that EventRecordDeleted is properly emitted
|
||
|
|
func (suite *EventsTestSuite) TestRecordsDeleteEventEmission() {
|
||
|
|
target := "did:sonr:testuser456"
|
||
|
|
author := suite.f.addrs[0].String()
|
||
|
|
|
||
|
|
// First create a record
|
||
|
|
writeMsg := &types.MsgRecordsWrite{
|
||
|
|
Target: target,
|
||
|
|
Author: author,
|
||
|
|
Descriptor_: &types.DWNMessageDescriptor{
|
||
|
|
InterfaceName: "Records",
|
||
|
|
Method: "Write",
|
||
|
|
MessageTimestamp: "2024-01-01T00:00:00Z",
|
||
|
|
DataFormat: "application/json",
|
||
|
|
},
|
||
|
|
Data: []byte(`{"test": "data"}`),
|
||
|
|
Protocol: "test-protocol",
|
||
|
|
Schema: "test-schema",
|
||
|
|
}
|
||
|
|
|
||
|
|
writeResp, err := suite.f.msgServer.RecordsWrite(suite.f.ctx, writeMsg)
|
||
|
|
suite.Require().NoError(err)
|
||
|
|
suite.Require().NotNil(writeResp)
|
||
|
|
|
||
|
|
// Clear events from creation
|
||
|
|
suite.f.ctx = suite.f.ctx.WithEventManager(sdk.NewEventManager())
|
||
|
|
|
||
|
|
// Now delete the record
|
||
|
|
deleteMsg := &types.MsgRecordsDelete{
|
||
|
|
Target: target,
|
||
|
|
Author: author,
|
||
|
|
RecordId: writeResp.RecordId,
|
||
|
|
Descriptor_: &types.DWNMessageDescriptor{
|
||
|
|
InterfaceName: "Records",
|
||
|
|
Method: "Delete",
|
||
|
|
MessageTimestamp: "2024-01-01T00:00:01Z",
|
||
|
|
},
|
||
|
|
}
|
||
|
|
|
||
|
|
_, err = suite.f.msgServer.RecordsDelete(suite.f.ctx, deleteMsg)
|
||
|
|
suite.Require().NoError(err)
|
||
|
|
|
||
|
|
// Check for emitted events
|
||
|
|
events := suite.f.ctx.EventManager().Events()
|
||
|
|
suite.Require().NotEmpty(events, "Expected events to be emitted")
|
||
|
|
|
||
|
|
// Verify EventRecordDeleted was emitted - simplified check
|
||
|
|
var foundEvent bool
|
||
|
|
for _, event := range events {
|
||
|
|
if event.Type == "dwn.v1.EventRecordDeleted" {
|
||
|
|
foundEvent = true
|
||
|
|
break
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
suite.Require().True(foundEvent, "EventRecordDeleted not found in emitted events")
|
||
|
|
}
|
||
|
|
|
||
|
|
// TestRecordsUpdateEventEmission tests that EventRecordWritten is emitted for updates
|
||
|
|
func (suite *EventsTestSuite) TestRecordsUpdateEventEmission() {
|
||
|
|
target := "did:sonr:testuser789"
|
||
|
|
author := suite.f.addrs[0].String()
|
||
|
|
|
||
|
|
// Create initial record
|
||
|
|
msg1 := &types.MsgRecordsWrite{
|
||
|
|
Target: target,
|
||
|
|
Author: author,
|
||
|
|
Descriptor_: &types.DWNMessageDescriptor{
|
||
|
|
InterfaceName: "Records",
|
||
|
|
Method: "Write",
|
||
|
|
MessageTimestamp: "2024-01-01T00:00:00Z",
|
||
|
|
DataFormat: "application/json",
|
||
|
|
},
|
||
|
|
Data: []byte(`{"version": "1"}`),
|
||
|
|
Protocol: "test-protocol",
|
||
|
|
Schema: "test-schema",
|
||
|
|
}
|
||
|
|
|
||
|
|
resp1, err := suite.f.msgServer.RecordsWrite(suite.f.ctx, msg1)
|
||
|
|
suite.Require().NoError(err)
|
||
|
|
|
||
|
|
// Clear events
|
||
|
|
suite.f.ctx = suite.f.ctx.WithEventManager(sdk.NewEventManager())
|
||
|
|
|
||
|
|
// Update the record (same target, protocol, schema, timestamp = update)
|
||
|
|
msg2 := &types.MsgRecordsWrite{
|
||
|
|
Target: target,
|
||
|
|
Author: author,
|
||
|
|
Descriptor_: &types.DWNMessageDescriptor{
|
||
|
|
InterfaceName: "Records",
|
||
|
|
Method: "Write",
|
||
|
|
MessageTimestamp: "2024-01-01T00:00:00Z", // Same timestamp triggers update
|
||
|
|
DataFormat: "application/json",
|
||
|
|
},
|
||
|
|
Data: []byte(`{"version": "2"}`),
|
||
|
|
Protocol: "test-protocol",
|
||
|
|
Schema: "test-schema",
|
||
|
|
}
|
||
|
|
|
||
|
|
resp2, err := suite.f.msgServer.RecordsWrite(suite.f.ctx, msg2)
|
||
|
|
suite.Require().NoError(err)
|
||
|
|
// Note: Different data creates a different record ID, not an update
|
||
|
|
suite.Require().
|
||
|
|
NotEqual(resp1.RecordId, resp2.RecordId, "Different data should create different record ID")
|
||
|
|
|
||
|
|
// Check for emitted events
|
||
|
|
events := suite.f.ctx.EventManager().Events()
|
||
|
|
suite.Require().NotEmpty(events, "Expected events to be emitted")
|
||
|
|
|
||
|
|
// Verify EventRecordWritten was emitted for the update - simplified check
|
||
|
|
var foundEvent bool
|
||
|
|
for _, event := range events {
|
||
|
|
if event.Type == "dwn.v1.EventRecordWritten" {
|
||
|
|
foundEvent = true
|
||
|
|
break
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
suite.Require().True(foundEvent, "EventRecordWritten not found for update")
|
||
|
|
}
|
||
|
|
|
||
|
|
// TestErrorCaseNoEventEmission tests that events are not emitted on errors
|
||
|
|
func (suite *EventsTestSuite) TestErrorCaseNoEventEmission() {
|
||
|
|
// Try to delete a non-existent record
|
||
|
|
msg := &types.MsgRecordsDelete{
|
||
|
|
Target: "did:sonr:testuser999",
|
||
|
|
Author: suite.f.addrs[0].String(),
|
||
|
|
RecordId: "non-existent-record",
|
||
|
|
Descriptor_: &types.DWNMessageDescriptor{
|
||
|
|
InterfaceName: "Records",
|
||
|
|
Method: "Delete",
|
||
|
|
MessageTimestamp: "2024-01-01T00:00:00Z",
|
||
|
|
},
|
||
|
|
}
|
||
|
|
|
||
|
|
// Clear any previous events
|
||
|
|
suite.f.ctx = suite.f.ctx.WithEventManager(sdk.NewEventManager())
|
||
|
|
|
||
|
|
// Execute RecordsDelete - should fail
|
||
|
|
_, err := suite.f.msgServer.RecordsDelete(suite.f.ctx, msg)
|
||
|
|
suite.Require().Error(err)
|
||
|
|
|
||
|
|
// Check that no events were emitted (except potentially message events)
|
||
|
|
events := suite.f.ctx.EventManager().Events()
|
||
|
|
|
||
|
|
// Filter out message events
|
||
|
|
var nonMessageEvents []sdk.Event
|
||
|
|
for _, event := range events {
|
||
|
|
if event.Type != sdk.EventTypeMessage {
|
||
|
|
nonMessageEvents = append(nonMessageEvents, event)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
suite.Require().Empty(nonMessageEvents, "Expected no events to be emitted on error")
|
||
|
|
}
|