Files
upstream-watermill/components/cqrs/marshaler_protobuf_test.go
2026-09-15 21:27:46 +05:00

115 lines
2.5 KiB
Go

package cqrs_test
import (
"encoding/json"
"fmt"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"google.golang.org/protobuf/types/known/timestamppb"
"github.com/ThreeDotsLabs/watermill"
"github.com/ThreeDotsLabs/watermill/components/cqrs"
)
func TestProtoMarshaler(t *testing.T) {
assertProtoMarshalUnmarshal(
t,
cqrs.ProtoMarshaler{},
cqrs.ProtoMarshaler{},
newProtoTestComplexEvent(),
&TestComplexProtobufEvent{},
"cqrs_test.TestComplexProtobufEvent",
)
}
func TestProtoMarshaler_Marshal_generated_name(t *testing.T) {
marshaler := cqrs.ProtoMarshaler{
NewUUID: func() string {
return "foo"
},
}
msg, err := marshaler.Marshal(newProtoTestComplexEvent())
require.NoError(t, err)
assert.Equal(t, msg.UUID, "foo")
}
// newProtoLegacyTestEvent returns the same event in two different protobuf versions
func newProtoLegacyTestEvent() (*TestProtobufEvent, *TestProtobufLegacyEvent) {
when := timestamppb.New(time.Now())
id := watermill.NewULID()
legacy := &TestProtobufEvent{
Id: id,
When: when,
}
regenerated := &TestProtobufLegacyEvent{
Id: id,
When: when,
}
return legacy, regenerated
}
func newProtoTestComplexEvent() *TestComplexProtobufEvent {
when := timestamppb.New(time.Now())
eventToMarshal := &TestComplexProtobufEvent{
Id: watermill.NewULID(),
Data: []byte("data"),
When: when,
NestedMap: map[string]*SubEvent{
"foo": {
Tags: []string{"tag1", "tag2"},
Flags: map[string]bool{"flag1": true, "flag2": false},
},
},
Events: []*SubEvent{
{
Tags: []string{"tag1", "tag2"},
},
{
Tags: []string{"tag3", "tag4"},
},
},
Result: &TestComplexProtobufEvent_Success{
Success: &SubEvent{
Tags: []string{"tag10"},
Flags: map[string]bool{"flag10": true},
},
},
}
return eventToMarshal
}
func assertProtoMarshalUnmarshal[T1, T2 fmt.Stringer](
t *testing.T,
marshaler cqrs.CommandEventMarshaler,
unmarshaler cqrs.CommandEventMarshaler,
eventToMarshal T1,
eventToUnmarshal T2,
expectedEventName string,
) {
t.Helper()
msg, err := marshaler.Marshal(eventToMarshal)
require.NoError(t, err)
err = unmarshaler.Unmarshal(msg, eventToUnmarshal)
require.NoError(t, err)
eventToMarshalJson, err := json.Marshal(eventToMarshal)
require.NoError(t, err)
eventToUnmarshalJson, err := json.Marshal(eventToUnmarshal)
require.NoError(t, err)
assert.JSONEq(t, string(eventToMarshalJson), string(eventToUnmarshalJson))
assert.Equal(t, expectedEventName, msg.Metadata.Get("name"))
}