private DurableOrchestrationContextBase CreateFakeContextForEmployeeNoParkingSpaceAvailable()
        {
            var          context            = A.Fake <DurableOrchestrationContextBase>();
            const string licensePlateNumber = "ABC-123";
            const string parkingGarageName  = "Parking Garage 1";

            // Configure input
            A.CallTo(() => context.GetInput <ParkingOrchestrationRequest>())
            .Returns(new ParkingOrchestrationRequest
            {
                ParkingGarageName  = parkingGarageName,
                LicensePlateNumber = licensePlateNumber
            });

            // Configure GetLicensePlateRegistration activity
            A.CallTo(() => context.CallActivityAsync <LicensePlateRegistration>(
                         nameof(GetLicensePlateRegistration),
                         A <string> ._))
            .Returns(Task.FromResult(new LicensePlateRegistration
            {
                Number = licensePlateNumber,
                Name   = "E.M. Ployee",
                Type   = LicensePlateType.Employee
            }));

            // Configure ConfirmParkingForEmployee activity
            A.CallTo(() => context.CallActivityAsync <ConfirmParkingResponse>(
                         nameof(ConfirmParkingForEmployee),
                         A <ConfirmParkingRequest> ._))
            .Returns(Task.FromResult(
                         ConfirmParkingResponseBuilder.BuildWithFailedNoParkingSpaceAvailable(parkingGarageName)));

            return(context);
        }
        private static Task <ConfirmParkingResponse> ConfirmParking(
            ConfirmParkingRequest request,
            LicensePlateRegistration licensePlateRegistration,
            DurableOrchestrationContextBase context)
        {
            Task <ConfirmParkingResponse> confirmTask;

            switch (licensePlateRegistration.Type)
            {
            case LicensePlateType.Appointment:
                confirmTask = context.CallActivityAsync <ConfirmParkingResponse>(
                    nameof(ConfirmParkingForAppointment),
                    request);
                break;

            case LicensePlateType.Employee:
                confirmTask = context.CallActivityAsync <ConfirmParkingResponse>(
                    nameof(ConfirmParkingForEmployee),
                    request);
                break;

            default:
                var unknownLicencePlateResponse = ConfirmParkingResponseBuilder.BuildWithFailedUnknownLicensePlate(request.ParkingGarageName);
                confirmTask = Task.FromResult(unknownLicencePlateResponse);
                break;
            }

            return(confirmTask);
        }
        public async Task <ConfirmParkingResponse> ConfirmParkingAsync(
            ConfirmParkingRequest request,
            bool hasReservation)
        {
            var parkingGarage = await _repository.GetByNameAsync(request.ParkingGarageName);

            var occupySpaceResult = parkingGarage.OccupyParkingSpace(hasReservation);

            return(ConfirmParkingResponseBuilder.Build(parkingGarage.Name, occupySpaceResult));
        }
        private DurableOrchestrationContextBase CreateFakeContextForAppointment()
        {
            var          context            = A.Fake <DurableOrchestrationContextBase>();
            const string licensePlateNumber = "ABC-123";
            const string parkingGarageName  = "Parking Garage 1";

            // Configure input
            A.CallTo(() => context.GetInput <ParkingOrchestrationRequest>())
            .Returns(new ParkingOrchestrationRequest
            {
                ParkingGarageName  = parkingGarageName,
                LicensePlateNumber = licensePlateNumber
            });

            // Configure GetLicensePlateRegistration activity
            A.CallTo(() => context.CallActivityAsync <LicensePlateRegistration>(
                         nameof(GetLicensePlateRegistration),
                         A <string> ._))
            .Returns(Task.FromResult(new LicensePlateRegistration
            {
                ContactPerson = "C.O. NTact",
                Number        = licensePlateNumber,
                Name          = "A.P. Pointment",
                Type          = LicensePlateType.Appointment
            }));

            // Configure ConfirmParkingForAppointment activity
            A.CallTo(() => context.CallActivityAsync <ConfirmParkingResponse>(
                         nameof(ConfirmParkingForAppointment),
                         A <ConfirmParkingRequest> ._))
            .Returns(Task.FromResult(
                         ConfirmParkingResponseBuilder.BuildWithSuccess(parkingGarageName)));

            // Configure ConfirmParkingForAppointment activity
            A.CallTo(() => context.CallActivityAsync(
                         nameof(OpenGate),
                         A <string> ._))
            .Returns(Task.CompletedTask);

            return(context);
        }