mirror of https://github.com/Squidex/squidex.git
6 changed files with 292 additions and 12 deletions
@ -0,0 +1,137 @@ |
|||
// ==========================================================================
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex UG (haftungsbeschraenkt)
|
|||
// All rights reserved. Licensed under the MIT license.
|
|||
// ==========================================================================
|
|||
|
|||
using System; |
|||
using System.Threading.Tasks; |
|||
using FakeItEasy; |
|||
using Squidex.Domain.Apps.Events.Apps; |
|||
using Squidex.Infrastructure; |
|||
using Squidex.Infrastructure.EventSourcing; |
|||
using Squidex.Infrastructure.Log; |
|||
using Squidex.Shared.Users; |
|||
using Xunit; |
|||
|
|||
namespace Squidex.Domain.Apps.Entities.Apps.Invitation |
|||
{ |
|||
public class InvitationEmailEventConsumerTests |
|||
{ |
|||
private readonly IInvitationEmailSender emailSender = A.Fake<IInvitationEmailSender>(); |
|||
private readonly IUserResolver userResolver = A.Fake<IUserResolver>(); |
|||
private readonly IUser assigner = A.Fake<IUser>(); |
|||
private readonly IUser assignee = A.Fake<IUser>(); |
|||
private readonly ISemanticLog log = A.Fake<ISemanticLog>(); |
|||
private readonly string assignerId = Guid.NewGuid().ToString(); |
|||
private readonly string assigneeId = Guid.NewGuid().ToString(); |
|||
private readonly string appName = "my-app"; |
|||
private readonly InvitationEmailEventConsumer sut; |
|||
|
|||
public InvitationEmailEventConsumerTests() |
|||
{ |
|||
sut = new InvitationEmailEventConsumer(emailSender, userResolver, log); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_ignore_contributors_assigned_by_clients() |
|||
{ |
|||
var @event = Envelope.Create(CreateEvent(RefTokenType.Client, true)); |
|||
|
|||
await sut.On(@event); |
|||
|
|||
A.CallTo(() => userResolver.FindByIdOrEmailAsync(A<string>.Ignored)) |
|||
.MustNotHaveHappened(); |
|||
|
|||
A.CallTo(() => emailSender.SendNewUserEmailAsync(A<IUser>.Ignored, A<IUser>.Ignored, appName)) |
|||
.MustNotHaveHappened(); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_not_send_email_if_assigner_not_found() |
|||
{ |
|||
var @event = Envelope.Create(CreateEvent(RefTokenType.Subject, true)); |
|||
|
|||
A.CallTo(() => userResolver.FindByIdOrEmailAsync(assignerId)) |
|||
.Returns(Task.FromResult<IUser>(null)); |
|||
|
|||
await sut.On(@event); |
|||
|
|||
A.CallTo(() => emailSender.SendNewUserEmailAsync(A<IUser>.Ignored, A<IUser>.Ignored, appName)) |
|||
.MustNotHaveHappened(); |
|||
|
|||
MustLogWarning(); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_not_send_email_if_assignee_not_found() |
|||
{ |
|||
var @event = Envelope.Create(CreateEvent(RefTokenType.Subject, true)); |
|||
|
|||
A.CallTo(() => userResolver.FindByIdOrEmailAsync(assignerId)) |
|||
.Returns(assigner); |
|||
|
|||
A.CallTo(() => userResolver.FindByIdOrEmailAsync(assigneeId)) |
|||
.Returns(Task.FromResult<IUser>(null)); |
|||
|
|||
await sut.On(@event); |
|||
|
|||
A.CallTo(() => emailSender.SendNewUserEmailAsync(A<IUser>.Ignored, A<IUser>.Ignored, appName)) |
|||
.MustNotHaveHappened(); |
|||
|
|||
MustLogWarning(); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_send_email_for_new_user() |
|||
{ |
|||
var @event = Envelope.Create(CreateEvent(RefTokenType.Subject, false)); |
|||
|
|||
A.CallTo(() => userResolver.FindByIdOrEmailAsync(assignerId)) |
|||
.Returns(assigner); |
|||
|
|||
A.CallTo(() => userResolver.FindByIdOrEmailAsync(assigneeId)) |
|||
.Returns(assignee); |
|||
|
|||
await sut.On(@event); |
|||
|
|||
A.CallTo(() => emailSender.SendNewUserEmailAsync(assigner, assignee, appName)) |
|||
.MustNotHaveHappened(); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_send_email_for_existing_user() |
|||
{ |
|||
var @event = Envelope.Create(CreateEvent(RefTokenType.Subject, true)); |
|||
|
|||
A.CallTo(() => userResolver.FindByIdOrEmailAsync(assignerId)) |
|||
.Returns(assigner); |
|||
|
|||
A.CallTo(() => userResolver.FindByIdOrEmailAsync(assigneeId)) |
|||
.Returns(assignee); |
|||
|
|||
await sut.On(@event); |
|||
|
|||
A.CallTo(() => emailSender.SendExistingUserEmailAsync(assigner, assignee, appName)) |
|||
.MustNotHaveHappened(); |
|||
} |
|||
|
|||
private void MustLogWarning() |
|||
{ |
|||
A.CallTo(() => log.Log(SemanticLogLevel.Warning, A<None>.Ignored, A<Action<None, IObjectWriter>>.Ignored)) |
|||
.MustHaveHappened(); |
|||
} |
|||
|
|||
private IEvent CreateEvent(string assignerType, bool isNew) |
|||
{ |
|||
return new AppContributorAssigned |
|||
{ |
|||
Actor = new RefToken(assignerType, assignerId), |
|||
AppId = new NamedId<Guid>(Guid.NewGuid(), appName), |
|||
ContributorId = assigneeId, |
|||
IsCreated = isNew |
|||
}; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,140 @@ |
|||
// ==========================================================================
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex UG (haftungsbeschraenkt)
|
|||
// All rights reserved. Licensed under the MIT license.
|
|||
// ==========================================================================
|
|||
|
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Security.Claims; |
|||
using System.Threading.Tasks; |
|||
using FakeItEasy; |
|||
using Microsoft.Extensions.Options; |
|||
using Squidex.Infrastructure; |
|||
using Squidex.Infrastructure.Email; |
|||
using Squidex.Infrastructure.Log; |
|||
using Squidex.Shared.Identity; |
|||
using Squidex.Shared.Users; |
|||
using Xunit; |
|||
|
|||
namespace Squidex.Domain.Apps.Entities.Apps.Invitation |
|||
{ |
|||
public class InvitationEmailSenderTests |
|||
{ |
|||
private readonly IEmailSender emailSender = A.Fake<IEmailSender>(); |
|||
private readonly IEmailUrlGenerator emailUrlGenerator = A.Fake<IEmailUrlGenerator>(); |
|||
private readonly IUser assigner = A.Fake<IUser>(); |
|||
private readonly IUser assignee = A.Fake<IUser>(); |
|||
private readonly ISemanticLog log = A.Fake<ISemanticLog>(); |
|||
private readonly string appName = "my-app"; |
|||
private readonly string uiUrl = "my-ui"; |
|||
private readonly InvitationEmailTextOptions texts = new InvitationEmailTextOptions(); |
|||
private readonly InvitationEmailSender sut; |
|||
|
|||
public InvitationEmailSenderTests() |
|||
{ |
|||
A.CallTo(() => assigner.Email) |
|||
.Returns("sebastian@squidex.io"); |
|||
A.CallTo(() => assigner.Claims) |
|||
.Returns(new List<Claim> { new Claim(SquidexClaimTypes.DisplayName, "Sebastian Stehle") }); |
|||
|
|||
A.CallTo(() => assignee.Email) |
|||
.Returns("qaisar@squidex.io"); |
|||
A.CallTo(() => assignee.Claims) |
|||
.Returns(new List<Claim> { new Claim(SquidexClaimTypes.DisplayName, "Qaisar Ahmad") }); |
|||
|
|||
A.CallTo(() => emailUrlGenerator.GenerateUIUrl()) |
|||
.Returns(uiUrl); |
|||
|
|||
sut = new InvitationEmailSender(Options.Create(texts), emailSender, emailUrlGenerator, log); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_format_assigner_email_and_send_email() |
|||
{ |
|||
await TestFormattingAsync("Email: $ASSIGNER_EMAIL", "Email: sebastian@squidex.io"); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_format_assignee_email_and_send_email() |
|||
{ |
|||
await TestFormattingAsync("Email: $ASSIGNEE_EMAIL", "Email: qaisar@squidex.io"); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_format_assigner_name_and_send_email() |
|||
{ |
|||
await TestFormattingAsync("Name: $ASSIGNER_NAME", "Name: Sebastian Stehle"); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_format_assignee_name_and_send_email() |
|||
{ |
|||
await TestFormattingAsync("Name: $ASSIGNEE_NAME", "Name: Qaisar Ahmad"); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_format_app_name_and_send_email() |
|||
{ |
|||
await TestFormattingAsync("App: $APP_NAME", "App: my-app"); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_format_ui_url_and_send_email() |
|||
{ |
|||
await TestFormattingAsync("UI: $UI_URL", "UI: my-ui"); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_not_send_email_if_texts_for_new_user_are_empty() |
|||
{ |
|||
await sut.SendNewUserEmailAsync(assigner, assignee, appName); |
|||
|
|||
A.CallTo(() => emailSender.SendAsync(assignee.Email, A<string>.Ignored, A<string>.Ignored)) |
|||
.MustNotHaveHappened(); |
|||
|
|||
MustLogWarning(); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_not_send_email_if_texts_for_existing_user_are_empty() |
|||
{ |
|||
await sut.SendExistingUserEmailAsync(assigner, assignee, appName); |
|||
|
|||
A.CallTo(() => emailSender.SendAsync(assignee.Email, A<string>.Ignored, A<string>.Ignored)) |
|||
.MustNotHaveHappened(); |
|||
|
|||
MustLogWarning(); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_send_email_for_existing_user() |
|||
{ |
|||
texts.ExistingUserSubject = "email-subject"; |
|||
texts.ExistingUserBody = "email-body"; |
|||
|
|||
await sut.SendExistingUserEmailAsync(assigner, assignee, appName); |
|||
|
|||
A.CallTo(() => emailSender.SendAsync(assignee.Email, "email-subject", "email-body")) |
|||
.MustHaveHappened(); |
|||
} |
|||
|
|||
private async Task TestFormattingAsync(string pattern, string result) |
|||
{ |
|||
texts.NewUserSubject = pattern; |
|||
texts.NewUserBody = pattern; |
|||
|
|||
await sut.SendNewUserEmailAsync(assigner, assignee, appName); |
|||
|
|||
A.CallTo(() => emailSender.SendAsync(assignee.Email, result, result)) |
|||
.MustHaveHappened(); |
|||
} |
|||
|
|||
private void MustLogWarning() |
|||
{ |
|||
A.CallTo(() => log.Log(SemanticLogLevel.Warning, A<None>.Ignored, A<Action<None, IObjectWriter>>.Ignored)) |
|||
.MustHaveHappened(); |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue