Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
c9caf84
[Core][Message][Test failed] When Delete By Someone Else Than Author …
Apr 8, 2015
c92ddec
[Core][Message][Test failed] Given Deleted Message When Delete Then N…
Apr 8, 2015
ce2a60b
[Core][Message][Test failed] Given A Deleted Message When Reply Then …
Apr 8, 2015
2920759
[Core][Message][Test failed] Given Deleted Message When Republish The…
Apr 8, 2015
8db7776
[Core][Message][Test failed] Final version of message tests with test…
Apr 11, 2015
34b08ec
[Core][UpdateTimeline][Test failed] Update author timeline when autho…
Apr 11, 2015
d1a21ad
[Core][UpdateTimeline][Test failed] Update replier timeline when repl…
Apr 11, 2015
4488039
[Core][Subscription] Allow subscription to follow user
Apr 11, 2015
6b2c132
Haviv&Einat fix test 1.1
havivha Jun 19, 2015
f356855
Merge tag 'csharp-tests-1.2' into csharp-workshop
havivha Jun 19, 2015
590ec63
Haviv&Einat fix test 1.2
havivha Jun 19, 2015
3ee200d
Merge tag 'csharp-tests-1.3' into csharp-workshop
havivha Jun 19, 2015
823e5b6
Haviv&Einat fix test 1.3
havivha Jun 19, 2015
740422e
Merge tag 'csharp-tests-1.4' into csharp-workshop
havivha Jun 19, 2015
b8563a4
Haviv&Einat fix test 1.4
havivha Jun 19, 2015
23d01e8
Merge tag 'csharp-tests-1.5' into csharp-workshop
havivha Jun 19, 2015
a854c61
Haviv&Einat fix test 1.5
havivha Jun 19, 2015
0fbb676
Merge tag 'csharp-tests-1.6' into csharp-workshop
havivha Jun 19, 2015
3fce075
Haviv&Einat fix test 1.6
havivha Jun 19, 2015
d22d755
Merge tag 'csharp-tests-2.1' into csharp-workshop
havivha Jun 19, 2015
cf69209
Merge tag 'csharp-tests-3.1' into csharp-workshop
havivha Jun 19, 2015
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions Mixter.Domain.Tests/Core/Messages/Handlers/UpdateTimelineTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Mixter.Domain.Core.Messages;
using Mixter.Domain.Core.Messages.Events;
using Mixter.Domain.Core.Messages.Handlers;
using Mixter.Domain.Identity;
using Mixter.Infrastructure;
using NFluent;

namespace Mixter.Domain.Tests.Core.Messages.Handlers
{
[TestClass]
public class UpdateTimelineTest
{
private const string Content = "Hello";

private static readonly UserId Author = new UserId("author@mixit.fr");
private static readonly MessageId MessageId = MessageId.Generate();

private TimelineMessagesRepository _repository;
private UpdateTimeline _handler;

[TestInitialize]
public void Initialize()
{
_repository = new TimelineMessagesRepository();
_handler = new UpdateTimeline(_repository);
}

[TestMethod]
public void WhenHandleMessagePublishedThenSaveTimelineMessageProjectionForAuthor()
{
_handler.Handle(new MessagePublished(MessageId, Author, Content));

Check.That(_repository.GetMessagesOfUser(Author))
.ContainsExactly(new TimelineMessageProjection(Author, Author, Content, MessageId));
}

[TestMethod]
public void WhenHandleMessageRepliedThenSaveTimelineMessageProjectionForReplier()
{
var parentMessageId = MessageId.Generate();
var replier = new UserId("author@mixit.fr");
_handler.Handle(new ReplyMessagePublished(MessageId, replier, Content, parentMessageId));

Check.That(_repository.GetMessagesOfUser(replier))
.ContainsExactly(new TimelineMessageProjection(replier, replier, Content, MessageId));
}
}
}
173 changes: 149 additions & 24 deletions Mixter.Domain.Tests/Core/Messages/MessageTest.cs
Original file line number Diff line number Diff line change
@@ -1,22 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Mixter.Domain.Core.Messages;
using Mixter.Domain.Core.Messages.Events;
using Mixter.Domain.Identity;
using Mixter.Infrastructure;
using Mixter.Infrastructure.Tests.Infrastructure;
using Mixter.Infrastructure.Tests;
using NFluent;

namespace Mixter.Domain.Tests.Core.Messages
{
[TestClass]
public class MessageTest
{
private const string MessageContent = "Hello";
private const string MessageContent = "Hello miixit";
private const string ReplyContent = "ReplyContent";

private static readonly UserId Author = new UserId("pierre@mixit.fr");
private static readonly UserId Republisher = new UserId("alfred@mixit.fr");
private static readonly MessageId MessageId = MessageId.Generate();
private static readonly UserId Replier = new UserId("jean@mixit.fr");

private EventPublisherFake _eventPublisher;
Expand All @@ -39,46 +41,169 @@ public void WhenPublishMessageThenRaiseUserMessagePublished()
[TestMethod]
public void WhenRepublishMessageThenRaiseMessageRepublished()
{
var message = Message.Publish(new EventPublisher(), Author, MessageContent);
message.Republish(_eventPublisher, Republisher);
Check.That(_eventPublisher.Events).ContainsExactly(new MessageRepublished(message.GetId(), Republisher));
Given(new MessagePublished(MessageId, Author, MessageContent))
.When(o => o.Republish(_eventPublisher, Republisher))
.ThenHas(new MessageRepublished(MessageId, Republisher));
}

[TestMethod]
public void WhenRepublishMyOwnMessageThenDoNotRaiseMessageRepublished()
{
var message = Message.Publish(new EventPublisher(), Author, MessageContent);
message.Republish(_eventPublisher, Author);
Check.That(_eventPublisher.Events).IsEmpty();
Given(new MessagePublished(MessageId, Author, MessageContent))
.When(o => o.Republish(_eventPublisher, Author))
.ThenNothing();
}

[TestMethod]
public void WhenRepublishTwoTimesSameMessageThenDoNotRaiseMessageRepublished()
{
var message = Message.Publish(new EventPublisher(), Author, MessageContent);
message.Republish(_eventPublisher, Republisher);
message.Republish(_eventPublisher, Republisher);
Check.That(_eventPublisher.Events).ContainsExactly(new MessageRepublished(message.GetId(), Republisher));
Given(new MessagePublished(MessageId, Author, MessageContent))
.And(new MessageRepublished(MessageId, Republisher))
.When(o => o.Republish(_eventPublisher, Republisher))
.ThenNothing();
}

[TestMethod]
public void WhenReplyThenRaiseReplyMessagePublished()
{
var message = Message.Publish(_eventPublisher, Author, MessageContent);
message.Reply(_eventPublisher, Replier, ReplyContent);
var replyEvent = _eventPublisher.Events.OfType<ReplyMessagePublished>().First();
Check.That(replyEvent.ParentId).IsEqualTo(message.GetId());
Check.That(replyEvent.ReplyContent).IsEqualTo(ReplyContent);
Check.That(replyEvent.Replier).IsEqualTo(Replier);
Check.That(replyEvent.ReplyId).IsNotEqualTo(message.GetId());
Given(new MessagePublished(MessageId, Author, MessageContent))
.When(o => o.Reply(_eventPublisher, Replier, ReplyContent))
.ThenHasEvent<ReplyMessagePublished>(evt =>
{
Check.That(evt.ParentId).IsEqualTo(MessageId);
Check.That(evt.ReplyContent).IsEqualTo(ReplyContent);
Check.That(evt.Replier).IsEqualTo(Replier);
Check.That(evt.ReplyId).IsNotEqualTo(MessageId);
});
}

[TestMethod]
public void WhenDeleteThenRaiseMessageDeleted()
{
var message = Message.Publish(new EventPublisher(), Author, MessageContent);
message.Delete(_eventPublisher, Author);
Check.That(_eventPublisher.Events).ContainsExactly(new MessageDeleted(message.GetId()));
Given(new MessagePublished(MessageId, Author, MessageContent))
.When(o => o.Delete(_eventPublisher, Author))
.ThenHasOnly(new MessageDeleted(MessageId));
}

[TestMethod]
public void WhenDeleteBySomeoneElseThanAuthorThenDoNotRaiseMessageDeleted()
{
Given(new MessagePublished(MessageId, Author, MessageContent))
.When(o => o.Delete(_eventPublisher, new UserId("clement@mix-it.fr")))
.ThenNothing();
}

[TestMethod]
public void GivenIsRepublishedWhenDeleteByRepublisherThenDoNotRaiseMessageDeleted()
{
Given(new MessagePublished(MessageId, Author, MessageContent))
.And(new MessageRepublished(MessageId, Republisher))
.When(o => o.Delete(_eventPublisher, Republisher))
.ThenNothing();
}

[TestMethod]
public void GiveDeletedMessageWhenDeleteThenNothing()
{
Given(new MessagePublished(MessageId, Author, MessageContent))
.And(new MessageDeleted(MessageId))
.When(o => o.Delete(_eventPublisher, Author))
.ThenNothing();
}

[TestMethod]
public void GivenReplyMessageWhenGetIdHasReplayMessageId()
{
var replyMessageId = MessageId.Generate();
var message = CreateMessage(new ReplyMessagePublished(replyMessageId, Replier, ReplyContent, MessageId));

Check.That(message.GetId()).IsEqualTo(replyMessageId);
}

[TestMethod]
public void GivenADeletedMessageWhenReplyThenDoNotRaiseMessageDeleted()
{
Given(new MessagePublished(MessageId, Author, MessageContent))
.And(new MessageDeleted(MessageId))
.When(o => o.Reply(_eventPublisher, Replier, ReplyContent))
.ThenNothing();
}

[TestMethod]
public void GivenDeletedMessageWhenRepublishThenDoNotRaiseMessageRepublished()
{
Given(new MessagePublished(MessageId, Author, MessageContent))
.And(new MessageDeleted(MessageId))
.When(o => o.Republish(_eventPublisher, Republisher))
.ThenNothing();
}

private Message CreateMessage(params IDomainEvent[] events)
{
return new Message(events);
}

private GivenFactory Given(IDomainEvent evt)
{
return new GivenFactory(evt, _eventPublisher);
}

private class GivenFactory
{
private readonly IList<IDomainEvent> _events = new List<IDomainEvent>();
private readonly EventPublisherFake _eventPublisherFake;

public GivenFactory(IDomainEvent evt, EventPublisherFake eventPublisherFake)
{
_events.Add(evt);
_eventPublisherFake = eventPublisherFake;
}

public GivenFactory And(IDomainEvent evt)
{
_events.Add(evt);

return this;
}

public ThenFactory When(Action<Message> when)
{
var message = new Message(_events);
when(message);

return new ThenFactory(_eventPublisherFake);
}

public class ThenFactory
{
private readonly EventPublisherFake _eventPublisherFake;

public ThenFactory(EventPublisherFake eventPublisherFake)
{
_eventPublisherFake = eventPublisherFake;
}

public void ThenHas(IDomainEvent domainEvent)
{
Check.That(_eventPublisherFake.Events).Contains(domainEvent);
}

public void ThenNothing()
{
Check.That(_eventPublisherFake.Events).IsEmpty();
}

public void ThenHasEvent<TEvent>(Action<TEvent> then)
{
var evt = _eventPublisherFake.Events.OfType<TEvent>().First();
then(evt);
}

public void ThenHasOnly(IDomainEvent domainEvent)
{
Check.That(_eventPublisherFake.Events).ContainsExactly(domainEvent);
}
}
}
}
}
34 changes: 34 additions & 0 deletions Mixter.Domain.Tests/Core/Subscriptions/SubscriptionTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Mixter.Domain.Core.Messages;
using Mixter.Domain.Core.Subscriptions;
using Mixter.Domain.Core.Subscriptions.Events;
using Mixter.Domain.Identity;
using Mixter.Infrastructure.Tests;
using NFluent;

namespace Mixter.Domain.Tests.Core.Subscriptions
{
[TestClass]
public class SubscriptionTest
{
private static readonly UserId Follower = new UserId("emilien@mixit.fr");
private static readonly UserId Followee = new UserId("florent@mixit.fr");
private static readonly SubscriptionId SubscriptionId = new SubscriptionId(Follower, Followee);

private EventPublisherFake _eventPublisher;

[TestInitialize]
public void Initialize()
{
_eventPublisher = new EventPublisherFake();
}

[TestMethod]
public void WhenFollowThenUserFollowedIsRaised()
{
Subscription.FollowUser(_eventPublisher, Follower, Followee);

Check.That(_eventPublisher.Events).Contains(new UserFollowed(SubscriptionId));
}
}
}
22 changes: 22 additions & 0 deletions Mixter.Domain/Core/Messages/Handlers/UpdateTimeline.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using Mixter.Domain.Core.Messages.Events;

namespace Mixter.Domain.Core.Messages.Handlers
{
public class UpdateTimeline : IEventHandler<MessagePublished>, IEventHandler<ReplyMessagePublished>
{
private readonly ITimelineMessagesRepository _timelineMessagesRepository;

public UpdateTimeline(ITimelineMessagesRepository timelineMessagesRepository)
{
_timelineMessagesRepository = timelineMessagesRepository;
}

public void Handle(MessagePublished evt)
{
}

public void Handle(ReplyMessagePublished evt)
{
}
}
}
9 changes: 8 additions & 1 deletion Mixter.Domain/Core/Messages/Message.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,12 +48,16 @@ public void Reply(IEventPublisher eventPublisher, UserId replier, string replyCo
if (!_projection.IsDeleted)
{
var evt = new ReplyMessagePublished(MessageId.Generate(), replier, replyContent, _projection.Id);
eventPublisher.Publish(evt);
eventPublisher.Publish(evt);
}
}

public void Delete(IEventPublisher eventPublisher, UserId deleter)
{
if (_projection.Author.Equals(deleter) && !_projection.IsDeleted)
{
PublishEvent(eventPublisher, new MessageDeleted(_projection.Id));
}
}

public MessageId GetId()
Expand All @@ -74,6 +78,8 @@ public IEnumerable<UserId> Publishers

public bool IsDeleted { get; private set; }

public UserId Author { get; private set; }

public DecisionProjection()
{
AddHandler<MessagePublished>(When);
Expand All @@ -95,6 +101,7 @@ private void When(ReplyMessagePublished evt)
private void When(MessagePublished evt)
{
Id = evt.Id;
Author = evt.Author;
_publishers.Add(evt.Author);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using Mixter.Domain.Core.Messages;

namespace Mixter.Domain.Core.Subscriptions.Events
{
public struct FolloweeMessagePublished : IDomainEvent
{
public SubscriptionId SubscriptionId { get; private set; }

public MessageId MessageId { get; private set; }

public FolloweeMessagePublished(SubscriptionId subscriptionId, MessageId messageId)
: this()
{
SubscriptionId = subscriptionId;
MessageId = messageId;
}

public object GetAggregateId()
{
return SubscriptionId;
}
}
}
Loading