// ========================================================================== // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex UG (haftungsbeschraenkt) // All rights reserved. Licensed under the MIT license. // ========================================================================== using System; using System.Collections.Generic; using Squidex.Domain.Apps.Entities.Comments.Commands; using Squidex.Domain.Apps.Entities.TestHelpers; using Squidex.Domain.Apps.Events.Comments; using Squidex.Infrastructure; using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Validation; using Xunit; namespace Squidex.Domain.Apps.Entities.Comments.Guards { public class GuardCommentsTests { private readonly string commentsId = Guid.NewGuid().ToString(); private readonly RefToken user1 = new RefToken(RefTokenType.Subject, "1"); private readonly RefToken user2 = new RefToken(RefTokenType.Subject, "2"); [Fact] public void CanCreate_should_throw_exception_if_text_not_defined() { var command = new CreateComment(); ValidationAssert.Throws(() => GuardComments.CanCreate(command), new ValidationError("Text is required.", "Text")); } [Fact] public void CanCreate_should_not_throw_exception_if_text_defined() { var command = new CreateComment { Text = "text" }; GuardComments.CanCreate(command); } [Fact] public void CanUpdate_should_throw_exception_if_text_not_defined() { var commentId = Guid.NewGuid(); var command = new UpdateComment { CommentId = commentId, Actor = user1 }; var events = new List> { Envelope.Create(new CommentCreated { CommentId = commentId, Actor = user1 }).To() }; ValidationAssert.Throws(() => GuardComments.CanUpdate(commentsId, events, command), new ValidationError("Text is required.", "Text")); } [Fact] public void CanUpdate_should_throw_exception_if_comment_from_another_user() { var commentId = Guid.NewGuid(); var command = new UpdateComment { CommentId = commentId, Actor = user2, Text = "text2" }; var events = new List> { Envelope.Create(new CommentCreated { CommentId = commentId, Actor = user1 }).To() }; Assert.Throws(() => GuardComments.CanUpdate(commentsId, events, command)); } [Fact] public void CanUpdate_should_throw_exception_if_comment_not_found() { var commentId = Guid.NewGuid(); var command = new UpdateComment { CommentId = commentId, Actor = user1 }; var events = new List>(); Assert.Throws(() => GuardComments.CanUpdate(commentsId, events, command)); } [Fact] public void CanUpdate_should_throw_exception_if_comment_deleted_found() { var commentId = Guid.NewGuid(); var command = new UpdateComment { CommentId = commentId, Actor = user1 }; var events = new List> { Envelope.Create(new CommentCreated { CommentId = commentId, Actor = user1 }).To(), Envelope.Create(new CommentDeleted { CommentId = commentId }).To() }; Assert.Throws(() => GuardComments.CanUpdate(commentsId, events, command)); } [Fact] public void CanUpdate_should_not_throw_exception_if_comment_is_own_notification() { var commentId = Guid.NewGuid(); var command = new UpdateComment { CommentId = commentId, Actor = user1, Text = "text2" }; var events = new List> { Envelope.Create(new CommentCreated { CommentId = commentId, Actor = user1 }).To() }; GuardComments.CanUpdate(user1.Identifier, events, command); } [Fact] public void CanUpdate_should_not_throw_exception_if_comment_from_same_user() { var commentId = Guid.NewGuid(); var command = new UpdateComment { CommentId = commentId, Actor = user1, Text = "text2" }; var events = new List> { Envelope.Create(new CommentCreated { CommentId = commentId, Actor = user1 }).To() }; GuardComments.CanUpdate(commentsId, events, command); } [Fact] public void CanDelete_should_throw_exception_if_comment_from_another_user() { var commentId = Guid.NewGuid(); var command = new DeleteComment { CommentId = commentId, Actor = user2 }; var events = new List> { Envelope.Create(new CommentCreated { CommentId = commentId, Actor = user1 }).To() }; Assert.Throws(() => GuardComments.CanDelete(commentsId, events, command)); } [Fact] public void CanDelete_should_throw_exception_if_comment_not_found() { var commentId = Guid.NewGuid(); var command = new DeleteComment { CommentId = commentId, Actor = user1 }; var events = new List>(); Assert.Throws(() => GuardComments.CanDelete(commentsId, events, command)); } [Fact] public void CanDelete_should_throw_exception_if_comment_deleted() { var commentId = Guid.NewGuid(); var command = new DeleteComment { CommentId = commentId, Actor = user1 }; var events = new List> { Envelope.Create(new CommentCreated { CommentId = commentId, Actor = user1 }), Envelope.Create(new CommentDeleted { CommentId = commentId }) }; Assert.Throws(() => GuardComments.CanDelete(commentsId, events, command)); } [Fact] public void CanDelete_should_not_throw_exception_if_comment_is_own_notification() { var commentId = Guid.NewGuid(); var command = new DeleteComment { CommentId = commentId, Actor = user1 }; var events = new List> { Envelope.Create(new CommentCreated { CommentId = commentId, Actor = user1 }).To() }; GuardComments.CanDelete(user1.Identifier, events, command); } [Fact] public void CanDelete_should_not_throw_exception_if_comment_from_same_user() { var commentId = Guid.NewGuid(); var command = new DeleteComment { CommentId = commentId, Actor = user1 }; var events = new List> { Envelope.Create(new CommentCreated { CommentId = commentId, Actor = user1 }).To() }; GuardComments.CanDelete(commentsId, events, command); } } }