예제 #1
0
    public void WhenInstantiated_ThenShouldBeOfCorrectType()
    {
        var handler = new CreateOrderHandler(_repositoryMoq.Object);

        Assert.NotNull(handler);
        Assert.IsType <CreateOrderHandler>(handler);
    }
예제 #2
0
        public void SaveAndLoadWithEntityRepository()
        {
            Converts.Repository
            .AddJsonKey()
            .AddJsonEnumSearchHandler()
            .AddJsonPrimitivesSearchHandler()
            .AddJsonObjectSearchHandler();

            ICompositeTypeProvider       compositeTypeProvider = new ReflectionCompositeTypeProvider(new ReflectionCompositeDelegateFactory());
            IFactory <ICompositeStorage> storageFactory        = new GetterFactory <ICompositeStorage>(() => new JsonCompositeStorage());

            EventSourcingContext context    = new EventSourcingContext(@"Data Source=.\sqlexpress; Initial Catalog=EventStore;Integrated Security=SSPI");
            EntityEventStore     eventStore = new EntityEventStore(context);

            PersistentEventDispatcher eventDispatcher = new PersistentEventDispatcher(eventStore);

            AggregateRootRepository <Order> repository = new AggregateRootRepository <Order>(
                eventStore,
                new CompositeEventFormatter(compositeTypeProvider, storageFactory),
                new ReflectionAggregateRootFactory <Order>(),
                eventDispatcher,
                new NoSnapshotProvider(),
                new EmptySnapshotStore()
                );

            PersistentCommandDispatcher commandDispatcher = new PersistentCommandDispatcher(
                new SerialCommandDistributor(),
                new EntityCommandStore(context),
                new CompositeCommandFormatter(compositeTypeProvider, storageFactory)
                );

            CreateOrderHandler  createHandler  = new CreateOrderHandler(repository);
            AddOrderItemHandler addItemHandler = new AddOrderItemHandler(repository);

            commandDispatcher.Handlers
            .Add <CreateOrder>(createHandler)
            .Add <AddOrderItem>(addItemHandler);

            CreateOrder create = new CreateOrder();

            commandDispatcher.HandleAsync(create);

            eventDispatcher.Handlers.Await <OrderPlaced>().Wait();

            IEnumerable <EventModel> serializedEvents = eventStore.Get(create.OrderKey).ToList();

            Assert.AreEqual(1, serializedEvents.Count());

            AddOrderItem addItem = new AddOrderItem(create.OrderKey, GuidKey.Create(Guid.NewGuid(), "Product"), 5);

            commandDispatcher.HandleAsync(Envelope.Create(addItem).AddDelay(TimeSpan.FromMinutes(1)));

            Task <OrderTotalRecalculated> task = eventDispatcher.Handlers.Await <OrderTotalRecalculated>();

            task.Wait();
            Console.WriteLine(task.Result);

            serializedEvents = eventStore.Get(create.OrderKey).ToList();
            Assert.AreEqual(4, serializedEvents.Count());
        }
예제 #3
0
    public async Task WhenOrderDoesNotSaveCorrectly_ThenShouldReturnInvalidCommand()
    {
        _repositoryMoq.Setup(x => x.AddAsync(It.IsAny <Order>()))
        .ReturnsAsync((Order)null !);
        var handler = new CreateOrderHandler(_repositoryMoq.Object);

        var result = await handler.Handle(new CreateOrder(_mapper.Map <Order>(Orders.Order1)), default);

        Assert.NotNull(result);
        Assert.Equal(CommandOutcome.InvalidCommand, result.Outcome);
    }
예제 #4
0
    public async Task WhenOrderIsCreated_ThenShouldReturnEntity()
    {
        var order = _mapper.Map <Order>(Orders.Order1);

        _repositoryMoq.Setup(x => x.AddAsync(It.IsAny <Order>()))
        .ReturnsAsync(order);
        var handler = new CreateOrderHandler(_repositoryMoq.Object);

        var result = await handler.Handle(new CreateOrder(order), default);

        Assert.NotNull(result);
        Assert.Equal(CommandOutcome.Accepted, result.Outcome);
        Assert.Equal(order.Id, result.Entity !.Id);
    }
        public void CreateOrderHandlerData_ShouldbeTrue_WhenCreated()
        {
            IRepository <Order>          repository = new Mock <IRepository <Order> >().Object;
            ILogger <CreateOrderHandler> logger     = new Mock <ILogger <CreateOrderHandler> >().Object;
            IMediator mediator = new Mock <IMediator>().Object;

            CreateOrderHandler campaignHandler = new CreateOrderHandler(repository, logger, mediator);

            var result = campaignHandler.Handle(new Dtos.Requests.CreateOrderRequest {
                ProductCode = "P1", Price = 10, Quantity = 5
            }, new System.Threading.CancellationToken()).Result;

            Assert.True(result.Data);
        }
예제 #6
0
        public async Task Test_Create_Order_OrderIsCorrect_Returns_OrderId()
        {
            var productId    = Guid.NewGuid();
            var defaultOrder = CreateDefaultOrder(productId);
            var orderid      = Guid.NewGuid();

            MockSetUp(orderid, productId);
            var handler = new CreateOrderHandler(Dependencies.Object);
            var result  = await handler.Handle(defaultOrder);

            Assert.True(result.Success);
            Assert.Equal(orderid, result.Value.OrderId);
            VerifyDependencies();
        }
예제 #7
0
        public async Task Test_Create_Order_ProductIsInvalid_ReturnsFailure()
        {
            var productId    = Guid.NewGuid();
            var defaultOrder = CreateDefaultOrder(productId);
            var orderid      = Guid.NewGuid();

            MockSetUp(orderid, productId);

            Dependencies
            .Setup(a => a.GetProductByIds(It.IsAny <List <Guid> >()))
            .Returns(Task.FromResult(new List <ProductEntity>().AsEnumerable()));

            var handler = new CreateOrderHandler(Dependencies.Object);
            var result  = await handler.Handle(defaultOrder);

            Assert.False(result.Success);
            Assert.Single(result.Errors);
        }
예제 #8
0
        public async Task CreateOrder_Success()
        {
            //arrange
            const decimal amount  = 5;
            var           command = new CreateOrder()
            {
                Name       = "New order for product 1",
                CustomerId = CustomerDoorsBuyer.Id,
                Items      = new List <(Guid, decimal)> {
                    (Product1InteriorDoor.Id, amount)
                },
                ShipmentDeadline = DateTimeOffset.Parse("2022-01-01"),
                InitiatorId      = GlobalAdmin.Id
            };
            var handler = new CreateOrderHandler(EntityRepository, InventoryService, EventTransmitter);

            //act
            await handler.HandleAsync(command);

            //assert
            Assert.That(CallsTo(EntityRepository, nameof(EntityRepository.AddAsync)), Is.EqualTo(1));
            var entity = GetRecordedEntities <Order>(EntityRepository, nameof(EntityRepository.AddAsync)).Single();

            Assert.That(entity.Name, Is.EqualTo(command.Name));
            Assert.That(entity.ItemsOrdered.Count, Is.EqualTo(1));
            Assert.That(entity.ItemsProduced.Count, Is.EqualTo(1));
            Assert.That(entity.ItemsOrdered.Of(Product1InteriorDoor).Amount, Is.EqualTo(amount));
            Assert.That(entity.ItemsProduced.Of(Product1InteriorDoor).Amount, Is.Zero);
            Assert.That(entity.Customer, Is.EqualTo(CustomerDoorsBuyer));
            Assert.That(entity.ParentOrder, Is.Null);
            Assert.That(entity.ShipmentDeadline, Is.EqualTo(command.ShipmentDeadline));
            Assert.That(entity.ShippedAt, Is.Null);
            Assert.That(entity.Status, Is.EqualTo(OrderStatus.New));
            Assert.That(entity.Type, Is.EqualTo(command.OrderType));
            Assert.That(entity.Shop, Is.Null);
            Assert.That(entity.WorkStartedAt, Is.Null);
            Assert.That(entity.SubOrders, Is.Empty);
            Assert.That(CustomerDoorsBuyer.Orders.Contains(entity), Is.True);
            Assert.That(GetRecordedEvents <DomainEvent <Order> >().Count, Is.EqualTo(1));

            //annul
            CustomerDoorsBuyer.Orders.Remove(entity);
        }
예제 #9
0
        public CreateOrderCommandTests()
        {
            _campaignRepositoryMock = new Mock <IRepository <CampaignEntity> >();
            _productRepositoryMock  = new Mock <IRepository <ProductEntity> >();
            _orderRepositoryMock    = new Mock <IRepository <OrderEntity> >();
            var timeServiceMock = new Mock <ITimeService>();

            _createOrderServiceMock = new Mock <ICreateOrderService>();

            _createOrderFaker = new Faker <CreateOrderCommand>()
                                .RuleFor(x => x.ProductCode, f => f.Random.AlphaNumeric(3))
                                .RuleFor(x => x.Quantity, f => f.Random.Int(1, 10));

            _handler = new(
                _orderRepositoryMock.Object,
                _productRepositoryMock.Object,
                _campaignRepositoryMock.Object,
                _createOrderServiceMock.Object,
                timeServiceMock.Object);
        }
예제 #10
0
        public void CreateOrder_FailFor_LackOfMaterials()
        {
            //arrange
            var command = new CreateOrder
            {
                CustomerId = CustomerDoorsBuyer.Id,
                Items      = new List <(Guid, decimal)> {
                    (Product1InteriorDoor.Id, 100)
                },
                ShipmentDeadline = DateTimeOffset.Parse("2022-01-01"),
                InitiatorId      = GlobalAdmin.Id
            };
            var handler = new CreateOrderHandler(EntityRepository, InventoryService, EventTransmitter);

            //assert () => act
            var ex = Assert.ThrowsAsync <DomainException>(async() => await handler.HandleAsync(command));

            Assert.That(ex.Message.StartsWith($"Required {100} {Product1InteriorDoor.UoM} of {Product1InteriorDoor}"),
                        Is.True);
            Assert.That(GetRecordedEvents <DomainEvent <Order> >(), Is.Empty);
        }
예제 #11
0
        public void CreateOrder_FailFor_LackOfTime()
        {
            //arrange
            var now     = DateTimeOffset.Now; //ToDo:4 get rid  of real time dependency
            var command = new CreateOrder()
            {
                Name       = "New order",
                CustomerId = CustomerDoorsBuyer.Id,
                Items      = new List <(Guid, decimal)> {
                    (Product1InteriorDoor.Id, 5)
                },
                ShipmentDeadline = now,
                InitiatorId      = GlobalAdmin.Id
            };
            var handler = new CreateOrderHandler(EntityRepository, InventoryService, EventTransmitter);

            //assert () => act
            var ex = Assert.ThrowsAsync <DomainException>(async() => await handler.HandleAsync(command));

            Assert.That(ex.Message.StartsWith("Not enough time to fulfill the order"), Is.True);
            Assert.That(GetRecordedEvents <DomainEvent <Order> >(), Is.Empty);
        }
예제 #12
0
        public string[] parseInput(String input)
        {
            CommandHandler commandHandler;
            List <string>  list = input.Split(' ').ToList();

            if (list.Contains(createProduct))
            {
                commandHandler = new CreateProductHandler();
            }
            else if (list.Contains(getProduct))
            {
                commandHandler = new GetProductHandler();
            }
            else if (list.Contains(createOrder))
            {
                commandHandler = new CreateOrderHandler();
            }
            else if (list.Contains(createCampaign))
            {
                commandHandler = new CreateCampaignHandler();
            }
            else if (list.Contains(getCampaign))
            {
                commandHandler = new GetCampaignHandler();
            }
            else if (list.Contains(increaseTime))
            {
                commandHandler = new IncreaseTimeHandler();
            }
            else
            {
                return(null);
            }
            Console.WriteLine(commandHandler.Execute(list));
            return(null);
        }
 public void SetUp()
 {
     _orderService       = new Mock <IOrderService>();
     _createOrderHandler = new CreateOrderHandler(_orderService.Object);
 }
예제 #14
0
 public CreateOrderTest()
 {
     _createOrderHandler   = new CreateOrderHandler();
     _createProductHandler = new CreateProductHandler();
 }
예제 #15
0
 public OrderCreationConsumer(RabbitMQSettings settings, ISerializer serializer, CreateOrderHandler handler)
     : base(settings, serializer, QueueName.CreateOrder)
 {
     _handler = handler;
 }