Browse Source

All tests green for core.

pull/335/head
Sebastian Stehle 8 years ago
parent
commit
c8e77194b7
  1. 2
      src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleService.cs
  2. 1
      src/Squidex.Infrastructure/Json/Newtonsoft/JsonValueConverter.cs
  3. 2
      src/Squidex.Infrastructure/Json/Objects/JsonObject.cs
  4. 4
      tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/FieldConvertersTests.cs
  5. 14
      tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/ValueConvertersTests.cs
  6. 41
      tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterTests.cs
  7. 91
      tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleServiceTests.cs
  8. 9
      tests/Squidex.Domain.Apps.Core.Tests/TestData.cs
  9. 2
      tests/Squidex.Infrastructure.Tests/EventSourcing/DefaultEventDataFormatterTests.cs
  10. 2
      tests/Squidex.Infrastructure.Tests/Orleans/JsonExternalSerializerTests.cs
  11. 16
      tests/Squidex.Infrastructure.Tests/TestHelpers/JsonHelper.cs

2
src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleService.cs

@ -109,7 +109,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules
var actionName = typeNameRegistry.GetName(actionType);
var actionData = await actionHandler.CreateJobAsync(enrichedEvent, rule.Action);
var json = jsonSerializer.Serialize(actionData);
var json = jsonSerializer.Serialize(actionData.Data);
var job = new RuleJob
{

1
src/Squidex.Infrastructure/Json/Newtonsoft/JsonValueConverter.cs

@ -7,7 +7,6 @@
using System;
using System.Globalization;
using System.Linq;
using Newtonsoft.Json;
using Squidex.Infrastructure.Json.Objects;

2
src/Squidex.Infrastructure/Json/Objects/JsonObject.cs

@ -123,7 +123,7 @@ namespace Squidex.Infrastructure.Json.Objects
public override string ToString()
{
return $"{{{string.Join(", ", this.Select(x => $"\"{x.Key}\"={x.Value}\""))}}}";
return $"{{{string.Join(", ", this.Select(x => $"\"{x.Key}\":{x.Value.ToJsonString()}"))}}}";
}
}
}

4
tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/FieldConvertersTests.cs

@ -13,7 +13,6 @@ using Squidex.Domain.Apps.Core.Contents;
using Squidex.Domain.Apps.Core.ConvertContent;
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Json;
using Squidex.Infrastructure.Json.Objects;
using Xunit;
@ -22,7 +21,6 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent
public class FieldConvertersTests
{
private readonly IAssetUrlGenerator assetUrlGenerator = A.Fake<IAssetUrlGenerator>();
private readonly IJsonSerializer serializer = TestData.DefaultSerializer();
private readonly LanguagesConfig languagesConfig = LanguagesConfig.Build(Language.EN, Language.DE);
private readonly RootField<JsonFieldProperties> jsonField = Fields.Json(1, "1", Partitioning.Invariant);
private readonly RootField<StringFieldProperties> stringLanguageField = Fields.String(1, "1", Partitioning.Language);
@ -60,7 +58,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent
new ContentFieldData()
.AddValue("iv", JsonValue.Object());
var actual = FieldConverters.ForValues(ValueConverters.EncodeJson(serializer))(input, jsonField);
var actual = FieldConverters.ForValues(ValueConverters.EncodeJson(TestData.DefaultSerializer))(input, jsonField);
var expected =
new ContentFieldData()

14
tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/ValueConvertersTests.cs

@ -7,7 +7,6 @@
using Squidex.Domain.Apps.Core.ConvertContent;
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Infrastructure.Json;
using Squidex.Infrastructure.Json.Objects;
using Xunit;
@ -18,14 +17,13 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent
private readonly RootField<StringFieldProperties> stringField = Fields.String(1, "1", Partitioning.Invariant);
private readonly RootField<JsonFieldProperties> jsonField = Fields.Json(1, "1", Partitioning.Invariant);
private readonly RootField<NumberFieldProperties> numberField = Fields.Number(1, "1", Partitioning.Invariant);
private readonly IJsonSerializer jsonSerializer = TestData.DefaultSerializer();
[Fact]
public void Should_encode_json_value()
{
var source = JsonValue.Object();
var result = ValueConverters.EncodeJson(jsonSerializer)(source, jsonField);
var result = ValueConverters.EncodeJson(TestData.DefaultSerializer)(source, jsonField);
Assert.Equal(JsonValue.Create("e30="), result);
}
@ -35,7 +33,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent
{
var source = JsonValue.Null;
var result = ValueConverters.EncodeJson(jsonSerializer)(source, jsonField);
var result = ValueConverters.EncodeJson(TestData.DefaultSerializer)(source, jsonField);
Assert.Same(source, result);
}
@ -45,7 +43,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent
{
var source = JsonValue.Create("NO-JSON");
var result = ValueConverters.EncodeJson(jsonSerializer)(source, stringField);
var result = ValueConverters.EncodeJson(TestData.DefaultSerializer)(source, stringField);
Assert.Same(source, result);
}
@ -55,7 +53,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent
{
var source = JsonValue.Create("e30=");
var result = ValueConverters.DecodeJson(jsonSerializer)(source, jsonField);
var result = ValueConverters.DecodeJson(TestData.DefaultSerializer)(source, jsonField);
Assert.Equal(JsonValue.Object(), result);
}
@ -65,7 +63,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent
{
var source = JsonValue.Null;
var result = ValueConverters.DecodeJson(jsonSerializer)(source, jsonField);
var result = ValueConverters.DecodeJson(TestData.DefaultSerializer)(source, jsonField);
Assert.Same(source, result);
}
@ -75,7 +73,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent
{
var source = JsonValue.Null;
var result = ValueConverters.EncodeJson(jsonSerializer)(source, stringField);
var result = ValueConverters.EncodeJson(TestData.DefaultSerializer)(source, stringField);
Assert.Same(source, result);
}

41
tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterTests.cs

@ -9,14 +9,12 @@ using System;
using System.Collections.Generic;
using System.Security.Claims;
using FakeItEasy;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NodaTime;
using Squidex.Domain.Apps.Core.Contents;
using Squidex.Domain.Apps.Core.HandleRules;
using Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Json;
using Squidex.Infrastructure.Json.Objects;
using Squidex.Shared.Identity;
using Squidex.Shared.Users;
using Xunit;
@ -25,7 +23,6 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules
{
public class RuleEventFormatterTests
{
private readonly IJsonSerializer serializer = TestData.DefaultSerializer();
private readonly IUser user = A.Fake<IUser>();
private readonly IRuleUrlGenerator urlGenerator = A.Fake<IRuleUrlGenerator>();
private readonly NamedId<Guid> appId = NamedId.Of(Guid.NewGuid(), "my-app");
@ -41,7 +38,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules
A.CallTo(() => user.Claims)
.Returns(new List<Claim> { new Claim(SquidexClaimTypes.DisplayName, "me") });
sut = new RuleEventFormatter(serializer, urlGenerator);
sut = new RuleEventFormatter(TestData.DefaultSerializer, urlGenerator);
}
[Fact]
@ -198,7 +195,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules
new NamedContentData()
.AddField("city",
new ContentFieldData()
.AddValue("iv", new JArray()))
.AddValue("iv", JsonValue.Array()))
};
var result = sut.Format("$CONTENT_DATA.city.de.10", @event);
@ -215,8 +212,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules
new NamedContentData()
.AddField("city",
new ContentFieldData()
.AddValue("iv", new JObject(
new JProperty("name", "Berlin"))))
.AddValue("iv", JsonValue.Object().Add("name", "Berlin")))
};
var result = sut.Format("$CONTENT_DATA.city.de.Name", @event);
@ -267,24 +263,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules
new NamedContentData()
.AddField("city",
new ContentFieldData()
.AddValue("iv", JValue.CreateNull()))
};
var result = sut.Format("$CONTENT_DATA.city.iv", @event);
Assert.Equal("UNDEFINED", result);
}
[Fact]
public void Should_return_undefined_when_undefined()
{
var @event = new EnrichedContentEvent
{
Data =
new NamedContentData()
.AddField("city",
new ContentFieldData()
.AddValue("iv", JValue.CreateUndefined()))
.AddValue("iv", JsonValue.Null))
};
var result = sut.Format("$CONTENT_DATA.city.iv", @event);
@ -301,13 +280,12 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules
new NamedContentData()
.AddField("city",
new ContentFieldData()
.AddValue("iv", new JObject(
new JProperty("name", "Berlin"))))
.AddValue("iv", JsonValue.Object().Add("name", "Berlin")))
};
var result = sut.Format("$CONTENT_DATA.city.iv", @event);
Assert.Equal(JObject.FromObject(new { name = "Berlin" }).ToString(Formatting.Indented), result);
Assert.Equal("{\"name\":\"Berlin\"}", result);
}
[Fact]
@ -319,7 +297,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules
new NamedContentData()
.AddField("city",
new ContentFieldData()
.AddValue("iv", new JArray(
.AddValue("iv", JsonValue.Array(
"Berlin")))
};
@ -337,8 +315,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules
new NamedContentData()
.AddField("city",
new ContentFieldData()
.AddValue("iv", new JObject(
new JProperty("name", "Berlin"))))
.AddValue("iv", JsonValue.Object().Add("name", "Berlin")))
};
var result = sut.Format("$CONTENT_DATA.city.iv.name", @event);

91
tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleServiceTests.cs

@ -17,7 +17,6 @@ using Squidex.Domain.Apps.Events;
using Squidex.Domain.Apps.Events.Contents;
using Squidex.Infrastructure;
using Squidex.Infrastructure.EventSourcing;
using Squidex.Infrastructure.Json;
using Xunit;
#pragma warning disable xUnit2009 // Do not use boolean check to check for string equality
@ -28,9 +27,12 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules
{
private readonly IRuleTriggerHandler ruleTriggerHandler = A.Fake<IRuleTriggerHandler>();
private readonly IRuleActionHandler ruleActionHandler = A.Fake<IRuleActionHandler>();
private readonly IJsonSerializer serializer = TestData.DefaultSerializer();
private readonly IEventEnricher eventEnricher = A.Fake<IEventEnricher>();
private readonly IClock clock = A.Fake<IClock>();
private readonly string actionData = "{\"value\":10}";
private readonly string actionDump = "MyDump";
private readonly string actionName = "ValidAction";
private readonly string actionDescription = "MyDescription";
private readonly TypeNameRegistry typeNameRegistry = new TypeNameRegistry();
private readonly RuleService sut;
@ -38,12 +40,18 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules
{
}
public sealed class InvalidAction : RuleAction
{
}
public sealed class ValidAction : RuleAction
{
public int Value { get; set; }
}
public sealed class InvalidAction : RuleAction
public sealed class ValidData
{
public int Value { get; set; }
}
public sealed class InvalidTrigger : RuleTrigger
@ -57,7 +65,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules
public RuleServiceTests()
{
typeNameRegistry.Map(typeof(ContentCreated));
typeNameRegistry.Map(typeof(ValidAction), "ValidAction");
typeNameRegistry.Map(typeof(ValidAction), actionName);
A.CallTo(() => eventEnricher.EnrichAsync(A<Envelope<AppEvent>>.Ignored))
.Returns(new EnrichedContentEvent());
@ -65,16 +73,30 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules
A.CallTo(() => ruleActionHandler.ActionType)
.Returns(typeof(ValidAction));
A.CallTo(() => ruleActionHandler.DataType)
.Returns(typeof(ValidData));
A.CallTo(() => ruleTriggerHandler.TriggerType)
.Returns(typeof(ContentChangedTrigger));
sut = new RuleService(new[] { ruleTriggerHandler }, new[] { ruleActionHandler }, eventEnricher, serializer, clock, typeNameRegistry);
sut = new RuleService(new[] { ruleTriggerHandler }, new[] { ruleActionHandler }, eventEnricher, TestData.DefaultSerializer, clock, typeNameRegistry);
}
[Fact]
public async Task Should_not_create_if_rule_disabled()
{
var ruleConfig = ValidRule().Disable();
var ruleEnvelope = Envelope.Create(new ContentCreated());
var job = await sut.CreateJobAsync(ruleConfig, ruleEnvelope);
Assert.Null(job);
}
[Fact]
public async Task Should_not_create_job_for_invalid_event()
{
var ruleConfig = new Rule(new ContentChangedTrigger(), new ValidAction());
var ruleConfig = ValidRule();
var ruleEnvelope = Envelope.Create(new InvalidEvent());
var job = await sut.CreateJobAsync(ruleConfig, ruleEnvelope);
@ -107,7 +129,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules
[Fact]
public async Task Should_not_create_if_not_triggered()
{
var ruleConfig = new Rule(new ContentChangedTrigger(), new ValidAction());
var ruleConfig = ValidRule();
var ruleEnvelope = Envelope.Create(new ContentCreated());
A.CallTo(() => ruleTriggerHandler.Triggers(A<Envelope<AppEvent>>.Ignored, ruleConfig.Trigger))
@ -125,14 +147,11 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules
var now = SystemClock.Instance.GetCurrentInstant();
var ruleConfig = new Rule(new ContentChangedTrigger(), new ValidAction());
var ruleConfig = ValidRule();
var ruleEnvelope = Envelope.Create(@event);
ruleEnvelope.SetTimestamp(now.Minus(Duration.FromDays(3)));
var actionData = "{}";
var actionDescription = "MyDescription";
A.CallTo(() => clock.GetCurrentInstant())
.Returns(now);
@ -154,15 +173,11 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules
var now = SystemClock.Instance.GetCurrentInstant();
var ruleConfig = new Rule(new ContentChangedTrigger(), new ValidAction());
var ruleConfig = ValidRule();
var ruleEnvelope = Envelope.Create(@event);
ruleEnvelope.SetTimestamp(now);
var actionName = "ValidAction";
var actionData = "{}";
var actionDescription = "MyDescription";
A.CallTo(() => clock.GetCurrentInstant())
.Returns(now);
@ -170,7 +185,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules
.Returns(true);
A.CallTo(() => ruleActionHandler.CreateJobAsync(A<EnrichedEvent>.Ignored, ruleConfig.Action))
.Returns((actionDescription, actionData));
.Returns((actionDescription, new ValidData { Value = 10 }));
var job = await sut.CreateJobAsync(ruleConfig, ruleEnvelope);
@ -189,14 +204,10 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules
[Fact]
public async Task Should_return_succeeded_job_with_full_dump_when_handler_returns_no_exception()
{
var ruleJob = "{}";
var actionDump = "MyDump";
A.CallTo(() => ruleActionHandler.ExecuteJobAsync(ruleJob))
A.CallTo(() => ruleActionHandler.ExecuteJobAsync(A<ValidData>.That.Matches(x => x.Value == 10)))
.Returns((actionDump, null));
var result = await sut.InvokeAsync("ValidAction", ruleJob);
var result = await sut.InvokeAsync(actionName, actionData);
Assert.Equal(RuleResult.Success, result.Result);
@ -207,14 +218,10 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules
[Fact]
public async Task Should_return_failed_job_with_full_dump_when_handler_returns_exception()
{
var ruleJob = "{}";
var actionDump = "MyDump";
A.CallTo(() => ruleActionHandler.ExecuteJobAsync(ruleJob))
A.CallTo(() => ruleActionHandler.ExecuteJobAsync(A<ValidData>.That.Matches(x => x.Value == 10)))
.Returns((actionDump, new InvalidOperationException()));
var result = await sut.InvokeAsync("ValidAction", ruleJob);
var result = await sut.InvokeAsync(actionName, actionData);
Assert.Equal(RuleResult.Failed, result.Result);
@ -225,47 +232,35 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules
[Fact]
public async Task Should_return_timedout_job_with_full_dump_when_exception_from_handler_indicates_timeout()
{
var ruleJob = "{}";
var actionDump = "MyDump";
A.CallTo(() => ruleActionHandler.ExecuteJobAsync(ruleJob))
A.CallTo(() => ruleActionHandler.ExecuteJobAsync(A<ValidData>.That.Matches(x => x.Value == 10)))
.Returns((actionDump, new TimeoutException()));
var result = await sut.InvokeAsync("ValidAction", ruleJob);
var result = await sut.InvokeAsync(actionName, actionData);
Assert.Equal(RuleResult.Timeout, result.Result);
Assert.True(result.Elapsed >= TimeSpan.Zero);
Assert.True(result.Dump.StartsWith(actionDump, StringComparison.OrdinalIgnoreCase));
Assert.True(result.Dump.IndexOf("Action timed out.", StringComparison.OrdinalIgnoreCase) >= 0);
}
[Fact]
public async Task Should_create_exception_details_when_job_to_execute_failed()
{
var ruleJob = "{}";
var ruleError = new InvalidOperationException();
A.CallTo(() => ruleActionHandler.ExecuteJobAsync(ruleJob))
A.CallTo(() => ruleActionHandler.ExecuteJobAsync(A<ValidData>.That.Matches(x => x.Value == 10)))
.Throws(ruleError);
var result = await sut.InvokeAsync("ValidAction", ruleJob);
var result = await sut.InvokeAsync(actionName, actionData);
Assert.Equal((ruleError.ToString(), RuleResult.Failed, TimeSpan.Zero), result);
}
[Fact]
public async Task Should_not_create_if_rule_disabled()
private static Rule ValidRule()
{
var ruleConfig = new Rule(new ContentChangedTrigger(), new ValidAction());
var ruleEnvelope = Envelope.Create(new ContentCreated());
ruleConfig = ruleConfig.Disable();
var job = await sut.CreateJobAsync(ruleConfig, ruleEnvelope);
Assert.Null(job);
return new Rule(new ContentChangedTrigger(), new ValidAction());
}
}
}

9
tests/Squidex.Domain.Apps.Core.Tests/TestData.cs

@ -24,7 +24,9 @@ namespace Squidex.Domain.Apps.Core
{
public static class TestData
{
public static IJsonSerializer DefaultSerializer()
public static readonly IJsonSerializer DefaultSerializer = CreateSerializer();
private static IJsonSerializer CreateSerializer()
{
var typeNameRegistry = new TypeNameRegistry();
@ -38,6 +40,7 @@ namespace Squidex.Domain.Apps.Core
new AppPatternsConverter(),
new ClaimsPrincipalConverter(),
new InstantConverter(),
new JsonValueConverter(),
new LanguageConverter(),
new LanguagesConfigConverter(),
new NamedGuidIdConverter(),
@ -104,9 +107,7 @@ namespace Squidex.Domain.Apps.Core
public static T SerializeAndDeserialize<T>(this T value)
{
var serializer = DefaultSerializer();
return serializer.Deserialize<T>(serializer.Serialize(value));
return DefaultSerializer.Deserialize<T>(DefaultSerializer.Serialize(value));
}
public static void TestFreeze(IFreezable freezable)

2
tests/Squidex.Infrastructure.Tests/EventSourcing/DefaultEventDataFormatterTests.cs

@ -34,7 +34,7 @@ namespace Squidex.Infrastructure.EventSourcing
.Map(typeof(MyEvent), "Event")
.Map(typeof(MyOldEvent), "OldEvent");
sut = new DefaultEventDataFormatter(typeNameRegistry, JsonHelper.DefaultSerializer(typeNameRegistry));
sut = new DefaultEventDataFormatter(typeNameRegistry, JsonHelper.CreateSerializer(typeNameRegistry));
}
[Fact]

2
tests/Squidex.Infrastructure.Tests/Orleans/JsonExternalSerializerTests.cs

@ -20,7 +20,7 @@ namespace Squidex.Infrastructure.Orleans
{
public JsonExternalSerializerTests()
{
J.DefaultSerializer = JsonHelper.DefaultSerializer();
J.DefaultSerializer = JsonHelper.DefaultSerializer;
}
[Fact]

16
tests/Squidex.Infrastructure.Tests/TestHelpers/JsonHelper.cs

@ -16,7 +16,9 @@ namespace Squidex.Infrastructure.TestHelpers
{
public static class JsonHelper
{
public static IJsonSerializer DefaultSerializer(TypeNameRegistry typeNameRegistry = null)
public static readonly IJsonSerializer DefaultSerializer = CreateSerializer();
public static IJsonSerializer CreateSerializer(TypeNameRegistry typeNameRegistry = null)
{
var serializerSettings = new JsonSerializerSettings
{
@ -43,23 +45,17 @@ namespace Squidex.Infrastructure.TestHelpers
public static T SerializeAndDeserialize<T>(this T value)
{
var serializer = DefaultSerializer();
return serializer.Deserialize<Tuple<T>>(serializer.Serialize(Tuple.Create(value))).Item1;
return DefaultSerializer.Deserialize<Tuple<T>>(DefaultSerializer.Serialize(Tuple.Create(value))).Item1;
}
public static T Deserialize<T>(string value)
{
var serializer = DefaultSerializer();
return serializer.Deserialize<Tuple<T>>($"{{ \"Item1\": \"{value}\" }}").Item1;
return DefaultSerializer.Deserialize<Tuple<T>>($"{{ \"Item1\": \"{value}\" }}").Item1;
}
public static T Deserialize<T>(object value)
{
var serializer = DefaultSerializer();
return serializer.Deserialize<Tuple<T>>($"{{ \"Item1\": {value} }}").Item1;
return DefaultSerializer.Deserialize<Tuple<T>>($"{{ \"Item1\": {value} }}").Item1;
}
}
}

Loading…
Cancel
Save