Esempio n. 1
0
        public void Format(string template, object @event)
        {
            template = template ?? @event.GetType().Name;

            foreach (var match in new Regex(@"\{[^\}]\}+").Matches(template).OfType <Match>())
            {
            }

            var extras = new Dictionary <string, object>();
            var unused = new Dictionary <string, string>();

            var metaProperty = @event.GetType().GetProperty("Meta", typeof(Metadata));

            if (metaProperty != null)
            {
                var metadata = (Metadata)metaProperty.GetValue(@event);
                if (metadata.ContainsKey(DomainEvent.MetadataKeys.AggregateRootId))
                {
                    extras.Add("Id", metadata[DomainEvent.MetadataKeys.AggregateRootId]);
                }
            }

            var result = template;

            foreach (var property in extras
                     .Select(property => new { Name = property.Key, property.Value })
                     .Concat(@event.GetType()
                             .GetProperties(BindingFlags.Instance | BindingFlags.Public)
                             .Where(x => x.Name != "Meta")
                             .Select(property => new { property.Name, Value = property.GetValue(@event) })))
            {
                var placeholder = "{" + property.Name + "}";
                var value       = property.Value != null?property.Value.ToString() : "null";

                if (result.Contains(placeholder))
                {
                    result = result.Replace(placeholder, value);
                }
                else
                {
                    unused.Add(property.Name, value);
                }
            }

            formatter.Write(result);

            if (!unused.Any())
            {
                return;
            }

            formatter.NewLine();
            formatter.Indent();
            foreach (KeyValuePair <string, string> pair in unused)
            {
                formatter.Write(pair.Key + ": " + pair.Value);
            }
            formatter.Unindent();
        }
Esempio n. 2
0
        protected void Then(string id, params DomainEvent[] events)
        {
            if (events.Length == 0)
            {
                return;
            }

            formatter.Block("Then:");

            foreach (var expected in events)
            {
                if (results == null)
                {
                    results = Context.History.Where(x => !arrangedEvents.Contains(x.GetGlobalSequenceNumber()));
                }

                var actual = results.FirstOrDefault();

                if (actual == null)
                {
                    Assert(false,
                           () => formatter.Write(expected, new EventFormatter(formatter)).NewLine(),
                           () => formatter.Block("But we got nothing."));

                    return;
                }

                expected.Meta[DomainEvent.MetadataKeys.AggregateRootId] = id;

                var jActual   = Context.EventSerializer.Serialize(actual);
                var jExpected = Context.EventSerializer.Serialize(expected);

                Assert(
                    actual.GetAggregateRootId().Equals(id) &&
                    actual.GetType() == expected.GetType() &&
                    jActual.Data.SequenceEqual(jExpected.Data),
                    () => formatter.Write(expected, new EventFormatter(formatter)).NewLine(),
                    () =>
                {
                    formatter.Block("But we got this:")
                    .Indent().Write(actual, new EventFormatter(formatter)).Unindent()
                    .EndBlock();

                    if (!jActual.IsJson() || !jExpected.IsJson())
                    {
                        return;
                    }

                    var differ = new Differ();
                    var diffs  = differ.LineByLine(
                        Encoding.UTF8.GetString(jActual.Data),
                        Encoding.UTF8.GetString(jExpected.Data));

                    var diff = differ.PrettyLineByLine(diffs);

                    formatter
                    .NewLine().NewLine()
                    .Write("Diff:").NewLine()
                    .Write(diff).NewLine();
                });

                // consume events
                results = results.Skip(1);
            }
        }