public async Task ShouldContainsNewBetInFollowersFeed() { //arrange var memberId = Guid.NewGuid(); var betId = Guid.NewGuid(); var member = new Member(new(memberId), "toto", 0); var subscriptionId = Guid.NewGuid(); var subscriptionId2 = Guid.NewGuid(); member.Subscribe(new Subscription(new(subscriptionId))); member.Subscribe(new Subscription(new(subscriptionId2))); var bet = Bet.Create(new BetId(betId), new DateTime(2022, 2, 3), "desc1", 10, new(new(memberId), "toto", 300), new DateTime(2021, 3, 2)); var feed = new FeedDto(subscriptionId.ToString(), new List <BetDto>()); var feed2 = new FeedDto(subscriptionId2.ToString(), new List <BetDto>()); var betRepository = new InMemoryBetRepository(null, bet.State); var memberRepository = new InMemoryMemberRepository(new() { member }); var feedRepository = new InMemoryFeedRepository(new List <FeedDto>() { feed, feed2 }); var handler = new UpdateFeedMemberNotificationHandler(betRepository, memberRepository, feedRepository); var notification = new InsertBetQuerySideNotification(betId, memberId); //act await handler.Handle(notification, default); //assert AssertFeedSubscription(betId, subscriptionId, bet, feedRepository); AssertFeedSubscription(betId, subscriptionId2, bet, feedRepository); }
public async Task ShouldCloseBet() { var betId = Guid.NewGuid(); var memberId = new MemberId(Guid.Parse("1311e8c9-d993-4346-94c1-1907e3ce65d3")); var creator = new Member(memberId, "name", 300); BetState betState = GenerateBet(betId, creator); var domainEventsListener = new DomainEventsAccessor(); var repository = new InMemoryBetRepository(domainEventsListener, betState); var command = new CloseBetCommand(betId, true); var dateTimeClosed = new DateTime(2021, 4, 1); var dateTimeProvider = new FakeDateTimeProvider(dateTimeClosed); var handler = new CloseBetCommandHandler(repository, dateTimeProvider, new InMemoryAuthenticationGateway(true, memberId.Value)); await handler.Handle(command, default); var bet = await repository.GetByIdAsync(new(betId)); Assert.True(bet.State.IsSuccess); Assert.Equal(dateTimeClosed, bet.State.CloseDate); var betClosedEvent = domainEventsListener.GetDomainEvents() .SingleOrDefault(x => x.GetType() == typeof(BetClosed)) as BetClosed; var betUpdatedEvent = domainEventsListener.GetDomainEvents() .SingleOrDefault(x => x.GetType() == typeof(BetUpdated)) as BetUpdated; Assert.NotNull(betClosedEvent); Assert.NotNull(betUpdatedEvent); Assert.Equal(betId, betClosedEvent.BetId); Assert.True(betClosedEvent.IsSuccess); Assert.Equal(betId, betUpdatedEvent.BetId); }
public async Task ShouldAddBetIfBetExists() { //arrange var memberId = Guid.NewGuid(); var betId = Guid.NewGuid(); var member = new Member(new(memberId), "toto", 0); var bet = Bet.Domain.Bets.Bet.Create(new BetId(betId), new DateTime(2022, 2, 3), "desc1", 10, member, new DateTime(2021, 3, 2)); var betRepository = new InMemoryBetRepository(null, bet.State); var queryBetRepository = new InMemoryBetQueryRepository(new List <BetDto>()); var command = new InsertBetQuerySideNotification(betId, memberId); var handler = new InsertBetQuerySideNotificationHandler(betRepository, queryBetRepository); //act await handler.Handle(command, default); //assert BetDto betInserted = await queryBetRepository.GetByIdAsync(betId); Assert.NotNull(betInserted); Assert.Equal(bet.State.Coins, betInserted.Coins); Assert.Equal(bet.State.Description, betInserted.Description); Assert.Equal(bet.State.EndDate, betInserted.EndDate); Assert.Equal(bet.State.BetId, betInserted.Id); Assert.Equal(bet.State.Creator.Id.Value, betInserted.Creator.Id); }
public async Task ShouldDecreaseWalletCreatorAndIncreaseParticipants() { var betId = Guid.NewGuid(); var creator = new Member(new(Guid.NewGuid()), "creator", 200); var participant = new Member(new(Guid.NewGuid()), "participant", 100); var participant2 = new Member(new(Guid.NewGuid()), "participant2", 500); var betState = new BetState(betId, creator, new DateTime(2021, 12, 3), "description", 50, new DateTime(2020, 3, 3), new List <AnswerState>() { new AnswerState(participant, true, new DateTime(2021, 3, 4)), new AnswerState(participant2, true, new DateTime(2021, 3, 4)) }, new DateTime(2021, 3, 3), false); var domainEventListener = new DomainEventsAccessor(); IBetRepository betRepository = new InMemoryBetRepository(domainEventListener, betState); IMemberRepository memberRepository = new InMemoryMemberRepository(new() { creator, participant, participant2 }); var command = new UpdateWalletMembersCommand(betId); var handler = new UpdateWalletMembersCommandHandler(betRepository, memberRepository); await handler.Handle(command, default); var creatorUpdated = await memberRepository.GetByIdAsync(creator.Id); var participantUpdated = await memberRepository.GetByIdAsync(participant.Id); var participantUpdated2 = await memberRepository.GetByIdAsync(participant2.Id); Assert.Equal(150, creatorUpdated.Wallet); Assert.Equal(125, participantUpdated.Wallet); Assert.Equal(525, participantUpdated2.Wallet); }
public async Task ShouldThrowBetUnknownExceptionIfBetIdUnknown() { var betRepository = new InMemoryBetRepository(); var betId = Guid.NewGuid(); var memberRepository = new InMemoryMemberRepository(); var command = new UpdateWalletMembersCommand(betId); var handler = new UpdateWalletMembersCommandHandler(betRepository, memberRepository); var record = await Record.ExceptionAsync(() => handler.Handle(command, default)); Assert.IsType <BetUnknownException>(record); Assert.Equal($"This bet with id {betId} is unknown", record.Message); }
public async Task ShouldGenerateFeed() { var bet = new BetState(Guid.Parse("adc5776b-3596-4dfb-ad0c-691812bfebbd"), new Member(new(Guid.Parse("ddc5776b-3596-4dfb-ad0c-691812bfebbf")), "toto", 300), new DateTime(2022, 9, 24), "description", 30, new DateTime(2021, 9, 24), new List <AnswerState>(), null, null); var betRepo = new InMemoryBetRepository(null, bet); var memberRepo = new InMemoryMemberRepository(new List <Member>() { new Member(new(Guid.Parse("ddc5776b-3596-4dfb-ad0c-691812bfebbf")), "toto", 300) });
public async Task ShouldThrowBetUnknownExceptionIfBetIdUnknown() { //arrange var betId = Guid.NewGuid(); var memberId = Guid.NewGuid(); var member = new Member(new(memberId), "toto", 0); var bet = Bet.Domain.Bets.Bet.Create(new BetId(Guid.NewGuid()), new DateTime(2022, 2, 3), "desc1", 10, member, new DateTime(2021, 3, 2)); var betRepository = new InMemoryBetRepository(null, bet.State); var queryBetRepository = new InMemoryBetQueryRepository(new List <BetDto>()); var command = new InsertBetQuerySideNotification(betId, memberId); var handler = new InsertBetQuerySideNotificationHandler(betRepository, queryBetRepository); //act var record = await Record.ExceptionAsync(() => handler.Handle(command, default)); //assert Assert.IsType <BetUnknownException>(record); }
public async Task ShouldCreateBet() { //arrange IDateTimeProvider dtNow = new FakeDateTimeProvider(new DateTime(2021, 5, 6, 0, 0, 0)); var endDate = new DateTime(2021, 5, 7, 0, 0, 0); var command = new LaunchBetCommand(_betId, endDate, coins, description); var domainEventsListener = new DomainEventsAccessor(); var betRepository = new InMemoryBetRepository(domainEventsListener); var member = new Member(new MemberId(_creatorId), "name", 25); var memberRepository = new InMemoryMemberRepository(new List <Member>() { member }); var handler = new LaunchBetCommandHandler(betRepository, memberRepository, new InMemoryAuthenticationGateway(true, _creatorId), dtNow); BetState expectedBet = new(_betId, member, endDate, description, coins, dtNow.Now, new List <AnswerState>(), null, null); //act await handler.Handle(command, default); //assert Bet actualBet = await betRepository.GetByIdAsync(new(_betId)); IDomainEvent domainEvent = domainEventsListener.GetDomainEvents() .SingleOrDefault(x => x.GetType() == typeof(BetCreated)); Assert.Equal(expectedBet.BetId, actualBet.State.BetId); Assert.Equal(expectedBet.Description, actualBet.State.Description); Assert.Equal(expectedBet.EndDate, actualBet.State.EndDate); Assert.Equal(expectedBet.Creator.Id, actualBet.State.Creator.Id); Assert.Equal(expectedBet.Creator.Name, actualBet.State.Creator.Name); Assert.Equal(expectedBet.Creator.Wallet, actualBet.State.Creator.Wallet); Assert.Equal(expectedBet.Coins, actualBet.State.Coins); Assert.Equal(expectedBet.CreationDate, actualBet.State.CreationDate); Assert.False(actualBet.IsClosed()); Assert.True(expectedBet.EndDate > actualBet.State.CreationDate); Assert.True(actualBet.GetEndDateToAnswer().CompareTo(new DateTime(2021, 5, 6, 6, 0, 0)) == 0); Assert.NotNull(domainEvent); Assert.Equal(_betId, ((BetCreated)domainEvent).BetId.Value); Assert.Equal(_creatorId, ((BetCreated)domainEvent).CreatorId.Value); }
public async Task ShouldNotModifyWalletCreatorWhenThereAreNoParticipants() { var betId = Guid.NewGuid(); var creator = new Member(new(Guid.NewGuid()), "creator", 200); var betState = new BetState(betId, creator, new DateTime(2021, 12, 3), "description", 50, new DateTime(2020, 3, 3), new List <AnswerState>(), new DateTime(2021, 3, 3), true); var domainEventListener = new DomainEventsAccessor(); var betRepository = new InMemoryBetRepository(domainEventListener, betState); var memberRepository = new InMemoryMemberRepository(new() { creator }); var command = new UpdateWalletMembersCommand(betId); var handler = new UpdateWalletMembersCommandHandler(betRepository, memberRepository); await handler.Handle(command, default); Assert.Equal(200, creator.Wallet); }