// ========================================================================== // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex UG (haftungsbeschränkt) // All rights reserved. Licensed under the MIT license. // ========================================================================== using System; using System.Linq; using Newtonsoft.Json; using NodaTime; using Squidex.Infrastructure.Json; using Squidex.Infrastructure.TestHelpers; using Xunit; namespace Squidex.Infrastructure.EventSourcing { public class EventDataFormatterTests { public sealed class MyOldEvent : IEvent, IMigratedEvent { public string MyProperty { get; set; } public IEvent Migrate() { return new MyEvent { MyProperty = MyProperty }; } } private readonly JsonSerializerSettings serializerSettings = new JsonSerializerSettings(); private readonly TypeNameRegistry typeNameRegistry = new TypeNameRegistry(); private readonly JsonEventDataFormatter sut; public EventDataFormatterTests() { serializerSettings.Converters.Add(new PropertiesBagConverter()); typeNameRegistry.Map(typeof(MyEvent), "Event"); typeNameRegistry.Map(typeof(MyOldEvent), "OldEvent"); sut = new JsonEventDataFormatter(typeNameRegistry, serializerSettings); } [Fact] public void Should_serialize_and_deserialize_envelope() { var commitId = Guid.NewGuid(); var inputEvent = new Envelope(new MyEvent { MyProperty = "My-Property" }); inputEvent.SetAggregateId(Guid.NewGuid()); inputEvent.SetCommitId(commitId); inputEvent.SetEventId(Guid.NewGuid()); inputEvent.SetEventPosition("1"); inputEvent.SetEventStreamNumber(1); inputEvent.SetTimestamp(SystemClock.Instance.GetCurrentInstant()); var eventData = sut.ToEventData(inputEvent.To(), commitId); var outputEvent = sut.Parse(eventData).To(); AssertHeaders(inputEvent.Headers, outputEvent.Headers); AssertPayload(inputEvent, outputEvent); } [Fact] public void Should_migrate_event_serializing() { var inputEvent = new Envelope(new MyOldEvent { MyProperty = "My-Property" }); var eventData = sut.ToEventData(inputEvent.To(), Guid.NewGuid()); var outputEvent = sut.Parse(eventData).To(); Assert.Equal(inputEvent.Payload.MyProperty, outputEvent.Payload.MyProperty); } [Fact] public void Should_migrate_event_deserializing() { var inputEvent = new Envelope(new MyOldEvent { MyProperty = "My-Property" }); var eventData = sut.ToEventData(inputEvent.To(), Guid.NewGuid(), false); var outputEvent = sut.Parse(eventData).To(); Assert.Equal(inputEvent.Payload.MyProperty, outputEvent.Payload.MyProperty); } private static void AssertPayload(Envelope inputEvent, Envelope outputEvent) { Assert.Equal(inputEvent.Payload.MyProperty, outputEvent.Payload.MyProperty); } private static void AssertHeaders(PropertiesBag lhs, PropertiesBag rhs) { foreach (var key in lhs.PropertyNames.Concat(rhs.PropertyNames).Distinct()) { Assert.Equal(lhs[key].ToString(), rhs[key].ToString()); } } } }