public void ShouldGetEventTypeFromAttribute()
        {
            // Act
            var eventType = EventTypeAttribute.GetEventTypeFrom(typeof(EventTypeGivenEventType));

            // Assert
            eventType.ShouldBe("TestEventType");
        }
        public static NewStreamMessage ToMessageData <TEvent>(this TEvent @event,
                                                              IDictionary <string, object>?headers = null) where TEvent : EventSourceEvent
        {
            var eventClrType = (@event ?? throw new ArgumentNullException(nameof(@event))).GetType();
            var typeName     = EventTypeAttribute.GetEventTypeFrom(eventClrType);

            if (typeName == default)
            {
                throw new ArgumentException("Event Type Name could not be determined", nameof(@event));
            }

            var version = Attributes.GetCustomAttributeValue <EventTypeAttribute, int>(eventClrType,
                                                                                       eventTypeAttribute => eventTypeAttribute.Version);

            headers ??= new Dictionary <string, object>();
            headers.Add(Constants.VersionKey, version);
            headers.TryAdd(Constants.TimestampKey, new DateTimeOffset(DateTime.UtcNow));

            var data     = Serializer.Serialize(@event, eventClrType);
            var metadata = Serializer.Serialize(headers);

            return(new NewStreamMessage(Guid.NewGuid(), typeName, data, metadata));
        }