public async Task WhenCreatingPackage_ThenInvokesDroneSchedulerAPI()
        {
            string     actualPackageId = null;
            PackageGen actualPackage   = null;

            _handleHttpRequest = ctx =>
            {
                if (ctx.Request.Host.Host == PackageHost)
                {
                    actualPackageId = ctx.Request.Path;
                    actualPackage   =
                        new JsonSerializer().Deserialize <PackageGen>(new JsonTextReader(new StreamReader(ctx.Request.Body, Encoding.UTF8)));
                    ctx.Response.StatusCode = StatusCodes.Status201Created;
                }
                else
                {
                    ctx.Response.StatusCode = StatusCodes.Status500InternalServerError;
                }

                return(Task.CompletedTask);
            };

            var packageInfo = new PackageInfo {
                PackageId = "somePackageId", Size = ContainerSize.Medium, Tag = "sometag", Weight = 100d
            };
            await _caller.UpsertPackageAsync(packageInfo);

            Assert.NotNull(actualPackageId);
            Assert.Equal($"/api/packages/{packageInfo.PackageId}", actualPackageId);

            Assert.NotNull(actualPackage);
            Assert.Equal((int)packageInfo.Size, (int)actualPackage.Size);
            Assert.Equal(packageInfo.Tag, actualPackage.Tag);
            Assert.Equal(packageInfo.Weight, actualPackage.Weight);
        }
        public async Task ProcessingDelivery_InvokesPackageServiceAndDroneSchedulerService()
        {
            PackageGen       actualPackage          = null;
            DroneDelivery    actualDelivery         = null;
            DeliverySchedule actualDeliverySchedule = null;

            _handleHttpRequest = async ctx =>
            {
                var serializer = new JsonSerializer();

                if (ctx.Request.Path.Value.StartsWith(PackagePath))
                {
                    actualPackage = serializer.Deserialize <PackageGen>(new JsonTextReader(new StreamReader(ctx.Request.Body, Encoding.UTF8)));

                    await ctx.WriteResultAsync(
                        new ObjectResult(
                            new PackageGen {
                        Id = "somePackageId", Size = ContainerSize.Medium, Tag = "sometag", Weight = 100d
                    })
                    {
                        StatusCode = StatusCodes.Status201Created
                    });
                }
                else if (ctx.Request.Path.Value.StartsWith(DroneSchedulerPath))
                {
                    actualDelivery = serializer.Deserialize <DroneDelivery>(new JsonTextReader(new StreamReader(ctx.Request.Body, Encoding.UTF8)));

                    await ctx.WriteResultAsync(new ContentResult { Content = "someDroneId", StatusCode = StatusCodes.Status201Created });
                }
                else if (ctx.Request.Path.Value.StartsWith(DeliveryPath))
                {
                    actualDeliverySchedule = serializer.Deserialize <DeliverySchedule>(new JsonTextReader(new StreamReader(ctx.Request.Body, Encoding.UTF8)));

                    await ctx.WriteResultAsync(
                        new ObjectResult(new DeliverySchedule {
                        Id = "someDeliveryId"
                    })
                    {
                        StatusCode = StatusCodes.Status201Created
                    });
                }
                else
                {
                    ctx.Response.StatusCode = StatusCodes.Status500InternalServerError;
                }
            };

            var delivery =
                new Delivery
            {
                DeliveryId  = "someDeliveryId",
                PackageInfo = new PackageInfo {
                    PackageId = "somePackageId", Size = ContainerSize.Medium, Tag = "sometag", Weight = 100d
                }
            };
            await _requestProcessor.ProcessDeliveryRequestAsync(delivery, new Dictionary <string, object>());

            Assert.NotNull(actualPackage);
            Assert.Equal((int)delivery.PackageInfo.Size, (int)actualPackage.Size);
            Assert.Equal(delivery.PackageInfo.Tag, actualPackage.Tag);
            Assert.Equal(delivery.PackageInfo.Weight, actualPackage.Weight);

            Assert.NotNull(actualDelivery);
            Assert.Equal(delivery.DeliveryId, actualDelivery.DeliveryId);
            Assert.Equal(delivery.PackageInfo.PackageId, actualDelivery.PackageDetail.Id);
            Assert.Equal((int)delivery.PackageInfo.Size, (int)actualDelivery.PackageDetail.Size);

            Assert.NotNull(actualDeliverySchedule);
            Assert.Equal(delivery.DeliveryId, actualDeliverySchedule.Id);
            Assert.Equal("someDroneId", actualDeliverySchedule.DroneId);
        }