Browse Source

Better validation tests for rules.

pull/303/head
Sebastian 8 years ago
parent
commit
12d74649af
  1. 2
      src/Squidex.Domain.Apps.Entities/Rules/Guards/GuardRule.cs
  2. 18
      src/Squidex.Domain.Apps.Entities/Rules/Guards/RuleActionValidator.cs
  3. 21
      tests/Squidex.Domain.Apps.Entities.Tests/Rules/Guards/Actions/AlgoliaActionTests.cs
  4. 21
      tests/Squidex.Domain.Apps.Entities.Tests/Rules/Guards/Actions/AzureQueueActionTests.cs
  5. 27
      tests/Squidex.Domain.Apps.Entities.Tests/Rules/Guards/Actions/ElasticSearchActionTests.cs
  6. 15
      tests/Squidex.Domain.Apps.Entities.Tests/Rules/Guards/Actions/FastlyActionTests.cs
  7. 15
      tests/Squidex.Domain.Apps.Entities.Tests/Rules/Guards/Actions/SlackActionTests.cs
  8. 15
      tests/Squidex.Domain.Apps.Entities.Tests/Rules/Guards/Actions/WebhookActionTests.cs
  9. 16
      tests/Squidex.Domain.Apps.Entities.Tests/Rules/Guards/GuardRuleTests.cs

2
src/Squidex.Domain.Apps.Entities/Rules/Guards/GuardRule.cs

@ -34,7 +34,7 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards
if (command.Action == null)
{
error(new ValidationError("Trigger is required.", nameof(command.Action)));
error(new ValidationError("Action is required.", nameof(command.Action)));
}
else
{

18
src/Squidex.Domain.Apps.Entities/Rules/Guards/RuleActionValidator.cs

@ -31,12 +31,12 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards
if (string.IsNullOrWhiteSpace(action.ApiKey))
{
errors.Add(new ValidationError("Api key is required.", nameof(action.ApiKey)));
errors.Add(new ValidationError("Api Key is required.", nameof(action.ApiKey)));
}
if (string.IsNullOrWhiteSpace(action.AppId))
{
errors.Add(new ValidationError("Application ID key is required.", nameof(action.AppId)));
errors.Add(new ValidationError("Application ID is required.", nameof(action.AppId)));
}
if (string.IsNullOrWhiteSpace(action.IndexName))
@ -58,11 +58,11 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards
if (string.IsNullOrWhiteSpace(action.Queue))
{
errors.Add(new ValidationError("Queue is required.", nameof(action.Queue)));
errors.Add(new ValidationError("Queue name is required.", nameof(action.Queue)));
}
else if (!Regex.IsMatch(action.Queue, "^[a-z][a-z0-9]{2,}(\\-[a-z0-9]+)*$"))
{
errors.Add(new ValidationError("Queue must be valid azure queue name.", nameof(action.Queue)));
errors.Add(new ValidationError("Queue name must be valid azure queue name.", nameof(action.Queue)));
}
return Task.FromResult<IEnumerable<ValidationError>>(errors);
@ -79,12 +79,12 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards
if (string.IsNullOrWhiteSpace(action.IndexType))
{
errors.Add(new ValidationError("TypeName is required.", nameof(action.IndexType)));
errors.Add(new ValidationError("Type name is required.", nameof(action.IndexType)));
}
if (string.IsNullOrWhiteSpace(action.IndexName))
{
errors.Add(new ValidationError("IndexName is required.", nameof(action.IndexName)));
errors.Add(new ValidationError("Index name is required.", nameof(action.IndexName)));
}
return Task.FromResult<IEnumerable<ValidationError>>(errors);
@ -96,7 +96,7 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards
if (string.IsNullOrWhiteSpace(action.ApiKey))
{
errors.Add(new ValidationError("Api key is required.", nameof(action.ApiKey)));
errors.Add(new ValidationError("Api Key is required.", nameof(action.ApiKey)));
}
if (string.IsNullOrWhiteSpace(action.ServiceId))
@ -113,7 +113,7 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards
if (action.WebhookUrl == null || !action.WebhookUrl.IsAbsoluteUri)
{
errors.Add(new ValidationError("Webhook Url is required and must be an absolute URL.", nameof(action.WebhookUrl)));
errors.Add(new ValidationError("Webhook URL is required and must be an absolute URL.", nameof(action.WebhookUrl)));
}
return Task.FromResult<IEnumerable<ValidationError>>(errors);
@ -125,7 +125,7 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards
if (action.Url == null || !action.Url.IsAbsoluteUri)
{
errors.Add(new ValidationError("Url is required and must be an absolute URL.", nameof(action.Url)));
errors.Add(new ValidationError("URL is required and must be an absolute URL.", nameof(action.Url)));
}
return Task.FromResult<IEnumerable<ValidationError>>(errors);

21
tests/Squidex.Domain.Apps.Entities.Tests/Rules/Guards/Actions/AlgoliaActionTests.cs

@ -5,8 +5,11 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System.Collections.Generic;
using System.Threading.Tasks;
using FluentAssertions;
using Squidex.Domain.Apps.Core.Rules.Actions;
using Squidex.Infrastructure;
using Xunit;
namespace Squidex.Domain.Apps.Entities.Rules.Guards.Actions
@ -20,7 +23,11 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards.Actions
var errors = await RuleActionValidator.ValidateAsync(action);
Assert.NotEmpty(errors);
errors.ShouldBeEquivalentTo(
new List<ValidationError>
{
new ValidationError("Application ID is required.", "AppId")
});
}
[Fact]
@ -30,7 +37,11 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards.Actions
var errors = await RuleActionValidator.ValidateAsync(action);
Assert.NotEmpty(errors);
errors.ShouldBeEquivalentTo(
new List<ValidationError>
{
new ValidationError("Api Key is required.", "ApiKey")
});
}
[Fact]
@ -40,7 +51,11 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards.Actions
var errors = await RuleActionValidator.ValidateAsync(action);
Assert.NotEmpty(errors);
errors.ShouldBeEquivalentTo(
new List<ValidationError>
{
new ValidationError("Index name is required.", "IndexName")
});
}
[Fact]

21
tests/Squidex.Domain.Apps.Entities.Tests/Rules/Guards/Actions/AzureQueueActionTests.cs

@ -5,8 +5,11 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System.Collections.Generic;
using System.Threading.Tasks;
using FluentAssertions;
using Squidex.Domain.Apps.Core.Rules.Actions;
using Squidex.Infrastructure;
using Xunit;
namespace Squidex.Domain.Apps.Entities.Rules.Guards.Actions
@ -20,7 +23,11 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards.Actions
var errors = await RuleActionValidator.ValidateAsync(action);
Assert.NotEmpty(errors);
errors.ShouldBeEquivalentTo(
new List<ValidationError>
{
new ValidationError("Connection string is required.", "ConnectionString")
});
}
[Fact]
@ -30,7 +37,11 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards.Actions
var errors = await RuleActionValidator.ValidateAsync(action);
Assert.NotEmpty(errors);
errors.ShouldBeEquivalentTo(
new List<ValidationError>
{
new ValidationError("Queue name is required.", "Queue")
});
}
[Fact]
@ -40,7 +51,11 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards.Actions
var errors = await RuleActionValidator.ValidateAsync(action);
Assert.NotEmpty(errors);
errors.ShouldBeEquivalentTo(
new List<ValidationError>
{
new ValidationError("Queue name must be valid azure queue name.", "Queue")
});
}
[Fact]

27
tests/Squidex.Domain.Apps.Entities.Tests/Rules/Guards/Actions/ElasticSearchActionTests.cs

@ -6,8 +6,11 @@
// ==========================================================================
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using FluentAssertions;
using Squidex.Domain.Apps.Core.Rules.Actions;
using Squidex.Infrastructure;
using Xunit;
namespace Squidex.Domain.Apps.Entities.Rules.Guards.Actions
@ -21,7 +24,11 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards.Actions
var errors = await RuleActionValidator.ValidateAsync(action);
Assert.NotEmpty(errors);
errors.ShouldBeEquivalentTo(
new List<ValidationError>
{
new ValidationError("Host is required and must be an absolute URL.", "Host")
});
}
[Fact]
@ -31,7 +38,11 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards.Actions
var errors = await RuleActionValidator.ValidateAsync(action);
Assert.NotEmpty(errors);
errors.ShouldBeEquivalentTo(
new List<ValidationError>
{
new ValidationError("Host is required and must be an absolute URL.", "Host")
});
}
[Fact]
@ -41,7 +52,11 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards.Actions
var errors = await RuleActionValidator.ValidateAsync(action);
Assert.NotEmpty(errors);
errors.ShouldBeEquivalentTo(
new List<ValidationError>
{
new ValidationError("Index name is required.", "IndexName")
});
}
[Fact]
@ -51,7 +66,11 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards.Actions
var errors = await RuleActionValidator.ValidateAsync(action);
Assert.NotEmpty(errors);
errors.ShouldBeEquivalentTo(
new List<ValidationError>
{
new ValidationError("Type name is required.", "IndexType")
});
}
[Fact]

15
tests/Squidex.Domain.Apps.Entities.Tests/Rules/Guards/Actions/FastlyActionTests.cs

@ -5,8 +5,11 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System.Collections.Generic;
using System.Threading.Tasks;
using FluentAssertions;
using Squidex.Domain.Apps.Core.Rules.Actions;
using Squidex.Infrastructure;
using Xunit;
namespace Squidex.Domain.Apps.Entities.Rules.Guards.Actions
@ -20,7 +23,11 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards.Actions
var errors = await RuleActionValidator.ValidateAsync(action);
Assert.NotEmpty(errors);
errors.ShouldBeEquivalentTo(
new List<ValidationError>
{
new ValidationError("Service ID is required.", "ServiceId")
});
}
[Fact]
@ -30,7 +37,11 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards.Actions
var errors = await RuleActionValidator.ValidateAsync(action);
Assert.NotEmpty(errors);
errors.ShouldBeEquivalentTo(
new List<ValidationError>
{
new ValidationError("Api Key is required.", "ApiKey")
});
}
[Fact]

15
tests/Squidex.Domain.Apps.Entities.Tests/Rules/Guards/Actions/SlackActionTests.cs

@ -6,8 +6,11 @@
// ==========================================================================
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using FluentAssertions;
using Squidex.Domain.Apps.Core.Rules.Actions;
using Squidex.Infrastructure;
using Xunit;
namespace Squidex.Domain.Apps.Entities.Rules.Guards.Actions
@ -21,7 +24,11 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards.Actions
var errors = await RuleActionValidator.ValidateAsync(action);
Assert.NotEmpty(errors);
errors.ShouldBeEquivalentTo(
new List<ValidationError>
{
new ValidationError("Webhook URL is required and must be an absolute URL.", "WebhookUrl")
});
}
[Fact]
@ -31,7 +38,11 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards.Actions
var errors = await RuleActionValidator.ValidateAsync(action);
Assert.NotEmpty(errors);
errors.ShouldBeEquivalentTo(
new List<ValidationError>
{
new ValidationError("Webhook URL is required and must be an absolute URL.", "WebhookUrl")
});
}
[Fact]

15
tests/Squidex.Domain.Apps.Entities.Tests/Rules/Guards/Actions/WebhookActionTests.cs

@ -6,8 +6,11 @@
// ==========================================================================
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using FluentAssertions;
using Squidex.Domain.Apps.Core.Rules.Actions;
using Squidex.Infrastructure;
using Xunit;
namespace Squidex.Domain.Apps.Entities.Rules.Guards.Actions
@ -21,7 +24,11 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards.Actions
var errors = await RuleActionValidator.ValidateAsync(action);
Assert.NotEmpty(errors);
errors.ShouldBeEquivalentTo(
new List<ValidationError>
{
new ValidationError("URL is required and must be an absolute URL.", "Url")
});
}
[Fact]
@ -31,7 +38,11 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards.Actions
var errors = await RuleActionValidator.ValidateAsync(action);
Assert.NotEmpty(errors);
errors.ShouldBeEquivalentTo(
new List<ValidationError>
{
new ValidationError("URL is required and must be an absolute URL.", "Url")
});
}
[Fact]

16
tests/Squidex.Domain.Apps.Entities.Tests/Rules/Guards/GuardRuleTests.cs

@ -14,6 +14,7 @@ using Squidex.Domain.Apps.Core.Rules.Actions;
using Squidex.Domain.Apps.Core.Rules.Triggers;
using Squidex.Domain.Apps.Entities.Rules.Commands;
using Squidex.Domain.Apps.Entities.Schemas;
using Squidex.Domain.Apps.Entities.TestHelpers;
using Squidex.Infrastructure;
using Xunit;
@ -46,7 +47,8 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards
}
});
await Assert.ThrowsAsync<ValidationException>(() => GuardRule.CanCreate(command, appProvider));
await ValidationAssert.ThrowsAsync(() => GuardRule.CanCreate(command, appProvider),
new ValidationError("Trigger is required.", "Trigger"));
}
[Fact]
@ -61,7 +63,8 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards
Action = null
});
await Assert.ThrowsAsync<ValidationException>(() => GuardRule.CanCreate(command, appProvider));
await ValidationAssert.ThrowsAsync(() => GuardRule.CanCreate(command, appProvider),
new ValidationError("Action is required.", "Action"));
}
[Fact]
@ -87,7 +90,8 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards
{
var command = new UpdateRule();
await Assert.ThrowsAsync<ValidationException>(() => GuardRule.CanUpdate(command, appId.Id, appProvider));
await ValidationAssert.ThrowsAsync(() => GuardRule.CanUpdate(command, appId.Id, appProvider),
new ValidationError("Either trigger or action is required.", "Trigger", "Action"));
}
[Fact]
@ -115,7 +119,8 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards
var rule_1 = rule_0.Enable();
Assert.Throws<ValidationException>(() => GuardRule.CanEnable(command, rule_1));
ValidationAssert.Throws(() => GuardRule.CanEnable(command, rule_1),
new ValidationError("Rule is already enabled.")); ;
}
[Fact]
@ -135,7 +140,8 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards
var rule_1 = rule_0.Disable();
Assert.Throws<ValidationException>(() => GuardRule.CanDisable(command, rule_1));
ValidationAssert.Throws(() => GuardRule.CanDisable(command, rule_1),
new ValidationError("Rule is already disabled."));
}
[Fact]

Loading…
Cancel
Save