예제 #1
0
        public void succesful_reservation()
        {
            var rendition = new ReservationRendition
            {
                Quantity = 3,
                Date     = "02-07-2020"
            };
            var response = reservationController
                           .Post(rendition)
                           .ExecuteAsync(new CancellationToken())
                           .Result;

            Assert.AreEqual(response.StatusCode,
                            HttpStatusCode.OK);
        }
예제 #2
0
        public void Post_ValidIntervalRatePlanData_Returns200Ok()
        {
            var reservation = new ReservationModel
            {
                AmountOfAdults   = 1,
                AmountOfChildren = 0,
                RatePlanId       = -3,
                ReservationStart = new DateTime(2020, 08, 01),
                ReservationEnd   = new DateTime(2020, 08, 03),
                RoomId           = -1
            };

            var connection = new SqliteConnection("Data Source=:memory:");

            connection.Open();

            var dbContextOptions = new DbContextOptionsBuilder <InventoryContext>()
                                   .UseSqlite(connection)
                                   .Options;

            var context = new InventoryContext(dbContextOptions);

            context.Database.EnsureCreated();

            var controller = new ReservationsController(context);

            var response = controller.Post(reservation);

            Assert.IsType <OkObjectResult>(response);
        }
        public async Task Post_WithRoomAndProfiles_AddsReservation()
        {
            var newReservation = new NewReservation
            {
                From     = DateTime.Today.AddDays(3),
                To       = DateTime.Today.AddDays(7),
                RoomId   = 3,
                GuestIds = new List <int> {
                    2
                }
            };

            using var context = new PrimeDbContext(dbContextOptions);
            var result = await controller.Post(newReservation);

            var okResult         = result.As <OkObjectResult>();
            var reservationId    = okResult.Value.As <int>();
            var addedReservation = await context.Reservations
                                   .Include(p => p.Profiles)
                                   .Include(r => r.Room)
                                   .FirstOrDefaultAsync(r => r.Id == reservationId);

            addedReservation.Should().NotBeNull();
            addedReservation.Profiles.Should().NotBeNull();
            addedReservation.Profiles.Count.Should().Be(1);
            addedReservation.Profiles[0].Id.Should().Be(2);
            addedReservation.Room.Should().NotBeNull();
            addedReservation.Room.Id.Should().Be(3);
        }
        public void Post_With_Book_Calls_Repo_Borrow()
        {
            // Arrange
            var mockRepo = new Mock <IReservationRepository <Reservation, Book, User> >();

            mockRepo.Setup(mock => mock.Borrow(It.IsAny <Book>(), It.IsAny <User>()));

            Mock <IPrincipal> mockPrincipal = new Mock <IPrincipal>();

            mockPrincipal.SetupGet(p => p.Identity.Name).Returns("Alice");

            var requestContext = new Mock <HttpRequestContext>();

            requestContext.Setup(x => x.Principal).Returns(mockPrincipal.Object);

            ReservationsController controller = new ReservationsController(mockRepo.Object)
            {
                RequestContext = requestContext.Object
            };

            Book newBook = new Book()
            {
                Id = 0
            };

            // Act
            controller.Post(newBook);

            // Assert
            mockRepo.Verify(mock => mock.Borrow(It.Is <Book>(b => b == newBook), It.Is <User>(u => u.Name == "Alice")), Times.Once);
        }
예제 #5
0
        public void PostWithValidDataSavesReservation(string mobileNumber, string destination)
        {
            try
            {
                // Arrange
                var sut = new ReservationsController();
                this.makeReservation.MobileNumber = mobileNumber;
                this.makeReservation.Destination  = destination;

                // Act
                sut.Post(this.makeReservation);

                // Assert
                var json   = File.ReadAllText(this.JsonFilePath);
                var actual = JsonConvert.DeserializeObject <MakeReservation>(json);
                Assert.Equal(this.makeReservation.Name, actual.Name);
                Assert.Equal(this.makeReservation.NumberOfPeople, actual.NumberOfPeople);
                Assert.Equal(this.makeReservation.Destination, actual.Destination);
                Assert.Equal(this.makeReservation.MobileNumber, actual.MobileNumber);
                Assert.Equal(this.makeReservation.StartDate, actual.StartDate);
                Assert.Equal(this.makeReservation.EndDate, actual.EndDate);
            }
            finally
            {
                // Teardown
                File.Delete(this.JsonFilePath);
            }
        }
예제 #6
0
        public void PostReturnsConflictResultWhenDuplicateReservationIsSaved()
        {
            try
            {
                // Arrange
                var sut = new ReservationsController();
                sut.Post(this.makeReservation);

                // Act
                var actual = sut.Post(this.makeReservation);

                // Assert
                Assert.IsType <ConflictResult>(actual);
            }
            finally
            {
                // Teardown
                File.Delete(this.JsonFilePath);
            }
        }
예제 #7
0
        public void PostInvalidDto(PositiveInt capacity)
        {
            var sut = new ReservationsController(
                new FakeReservationsRepository(),
                capacity.Item);

            var dto    = new ReservationDto {
            };
            var actual = sut.Post(dto);

            var br  = Assert.IsAssignableFrom <BadRequestObjectResult>(actual);
            var msg = Assert.IsAssignableFrom <string>(br.Value);

            Assert.NotEmpty(msg);
        }
        public async Task ReservationFails()
        {
            var repo = new FakeReservationsRepository();
            var sut  = new ReservationsController(10, repo);

            var reservation = new Reservation(
                date: new DateTimeOffset(2018, 8, 13, 16, 53, 0, TimeSpan.FromHours(2)),
                email: "*****@*****.**",
                name: "Mark Seemann",
                quantity: 11);
            var actual = await sut.Post(reservation);

            Assert.False(reservation.IsAccepted);
            Assert.False(repo.Contains(reservation));
            Assert.IsAssignableFrom <InternalServerErrorActionResult>(actual);
        }
        public void PostInvalidDto(int capacity)
        {
            var sut = new ReservationsController(
                TimeSpan.FromHours(2.5),
                new[] { new Table(capacity) },
                new FakeReservationsRepository(),
                new SystemClock());

            var dto    = new ReservationDto {
            };
            var actual = sut.Post(dto);

            var br  = Assert.IsAssignableFrom <BadRequestObjectResult>(actual);
            var msg = Assert.IsAssignableFrom <string>(br.Value);

            Assert.NotEmpty(msg);
        }
        public async Task ReservationSucceeds()
        {
            var repo = new FakeReservationsRepository();
            var sut  = new ReservationsController(10, repo);

            var reservation = new Reservation(
                date: new DateTimeOffset(2018, 8, 13, 16, 53, 0, TimeSpan.FromHours(2)),
                email: "*****@*****.**",
                name: "Mark Seemann",
                quantity: 4);
            var actual = await sut.Post(reservation);

            Assert.True(repo.Contains(reservation.Accept()));
            var expectedId = repo.GetId(reservation.Accept());
            var ok         = Assert.IsAssignableFrom <OkActionResult>(actual);

            Assert.Equal(expectedId, ok.Value);
        }
예제 #11
0
        public void PostValidDtoWhenNoPriorReservationsExist(
            NonNegativeInt capacitySurplus,
            PositiveInt quantity)
        {
            var repository = new FakeReservationsRepository();
            var capacity   = capacitySurplus.Item + quantity.Item;
            var sut        = new ReservationsController(repository, capacity);

            var dto = new ReservationDto
            {
                Date     = "2019-08-20",
                Quantity = quantity.Item
            };
            var actual = sut.Post(dto);

            Assert.IsAssignableFrom <OkObjectResult>(actual);
            Assert.NotEmpty(repository);
        }
예제 #12
0
        public void PostWithValidDataReturnsOkResult()
        {
            try
            {
                // Arrange
                var sut = new ReservationsController();

                // Act
                ActionResult actual = sut.Post(this.makeReservation);

                // Assert
                Assert.IsType <OkResult>(actual);
            }
            finally
            {
                // Teardown
                File.Delete(this.JsonFilePath);
            }
        }
예제 #13
0
        public void PostValidDtoWhenSoldOut(
            PositiveInt capacity,
            PositiveInt excessQuantity)
        {
            var repository = new FakeReservationsRepository();
            var quantity   = capacity.Item + excessQuantity.Item;
            var sut        = new ReservationsController(repository, capacity.Item);

            var dto = new ReservationDto
            {
                Date     = "2019-08-20",
                Quantity = quantity
            };
            var actual = sut.Post(dto);

            var c = Assert.IsAssignableFrom <ObjectResult>(actual);

            Assert.Equal(StatusCodes.Status500InternalServerError, c.StatusCode);
        }
예제 #14
0
        public void PostReturnsCorrectResultWhenDateisInvalid()
        {
            var sut = new ReservationsController(
                new Mock <IReservationsRepository>().Object);

            var actual =
                sut.Post(
                    new ReservationDto
            {
                Date     = "Not a date",
                Name     = "Mark Seemann",
                Email    = "*****@*****.**",
                Quantity = 4
            });

            var badReq =
                Assert.IsAssignableFrom <BadRequestErrorMessageResult>(actual);

            Assert.Equal("Invalid date.", badReq.Message);
        }
예제 #15
0
        public void PostWithInvalidMobileNumberReturnsBadRquest(string invalidMobilNumber)
        {
            try
            {
                // Arrange
                var sut = new ReservationsController();
                this.makeReservation.MobileNumber = invalidMobilNumber;

                // Act
                var actual = sut.Post(this.makeReservation);

                // Assert
                Assert.IsType <BadRequestResult>(actual);
            }
            finally
            {
                // Teardown
                File.Delete(this.JsonFilePath);
            }
        }
        public void PostValidDtoWhenSoldOut(int capacity, int quantity)
        {
            var repository = new FakeReservationsRepository();
            var now        = new DateTime(2019, 9, 27);
            var sut        = new ReservationsController(
                TimeSpan.FromHours(2.5),
                new[] { new Table(capacity) },
                repository,
                new ConstantClock(now));

            var dto = new ReservationDto
            {
                Date     = now.AddDays(2).ToString(),
                Quantity = quantity
            };
            var actual = sut.Post(dto);

            var c = Assert.IsAssignableFrom <ObjectResult>(actual);

            Assert.Equal(StatusCodes.Status500InternalServerError, c.StatusCode);
        }
예제 #17
0
        public void Post_With_Reservation_Calls_Repo_Add()
        {
            // Arrange
            var mockRepo = new Mock <IRepository <Reservation> >();

            mockRepo.Setup(mock => mock.Add(It.IsAny <Reservation>()));
            ReservationsController controller = new ReservationsController(mockRepo.Object);

            Reservation newReservation = new Reservation()
            {
                bookId    = 1,
                startDate = new System.DateTime(2016, 1, 1, 1, 0, 0),
                endDate   = new System.DateTime(2016, 1, 1, 2, 0, 0),
            };

            // Act
            controller.Post(newReservation);

            // Assert
            mockRepo.Verify(mock => mock.Add(It.Is <Reservation>(b => b == newReservation)), Times.Once);
        }
        public void PostValidDtoWhenNoPriorReservationsExist(
            int capacity,
            int quantity)
        {
            var repository = new FakeReservationsRepository();
            var now        = new DateTime(2019, 9, 24);
            var sut        = new ReservationsController(
                TimeSpan.FromHours(2.5),
                new[] { new Table(capacity) },
                repository,
                new ConstantClock(now));

            var dto = new ReservationDto
            {
                Date     = now.AddDays(1).ToString(),
                Quantity = quantity
            };
            var actual = sut.Post(dto);

            Assert.IsAssignableFrom <OkResult>(actual);
            Assert.NotEmpty(repository);
        }
예제 #19
0
        public void PostReturnsCorrectResultWhenCapacityIsInsufficient()
        {
            var repo = new Mock <IReservationsRepository>();
            var sut  = new ReservationsController(repo.Object);

            repo
            .Setup(r => r.ReadReservedSeats(It.IsAny <DateTime>()))
            .Returns(sut.Capacity);

            var actual =
                sut.Post(
                    new ReservationDto
            {
                Date     = "2016-05-31",
                Name     = "Mark Seemann",
                Email    = "*****@*****.**",
                Quantity = 1
            });

            var statusCode = Assert.IsAssignableFrom <StatusCodeResult>(actual);

            Assert.Equal(HttpStatusCode.Forbidden, statusCode.StatusCode);
        }
예제 #20
0
        public void PostReturnsCorrectResultAndHasCorrectStateOnAcceptableRequest()
        {
            var json =
                new ReservationDto
            {
                Date     = "2016-05-31",
                Name     = "Mark Seemann",
                Email    = "*****@*****.**",
                Quantity = 1
            };
            var repo = new Mock <IReservationsRepository>();

            repo
            .Setup(r => r.ReadReservedSeats(new DateTime(2016, 5, 31)))
            .Returns(0);
            var sut = new ReservationsController(repo.Object);

            var actual = sut.Post(json);

            Assert.IsAssignableFrom <OkResult>(actual);
            repo.Verify(
                r => r.SaveReservation(new DateTime(2016, 5, 31), json));
        }
        public void PostValidDtoWhenEnoughCapacityExists()
        {
            //Arrange
            var expected = 1;
            var dto      = new ReservationDto {
                Quantity = 10
            };

            Mock <IValidator> validator = GetValidator(dto);
            Mock <IMapper>    mapper    = GetMapper(dto);

            var md = new Mock <IMaîtreD>();

            md.Setup(m => m.TryAccept(It.IsAny <Reservation>())).Returns(expected);
            ReservationsController sut = new ReservationsController(validator.Object, mapper.Object, md.Object);

            //Act
            var actual = sut.Post(dto);

            //Assert
            var ok = Assert.IsAssignableFrom <OkObjectResult>(actual);

            Assert.Equal(expected, ok.Value);
        }
        public void PostInvalidDto()
        {
            //Arrange
            ReservationDto dto       = new ReservationDto();
            var            validator = new Mock <IValidator>();

            validator.Setup(v => v.Validate(dto)).Returns(It.IsAny <string>());

            Mock <IMapper> mapper = GetMapper(dto);

            var maîtreD = new Mock <IMaîtreD>();

            maîtreD.Setup(maî => maî.TryAccept(It.IsAny <Reservation>()));
            ReservationsController sut = new ReservationsController(validator.Object, mapper.Object, maîtreD.Object);

            //Act
            var actual = sut.Post(dto);

            //Assert
            var br       = Assert.IsAssignableFrom <BadRequestObjectResult>(actual);
            var expected = sut.Response;

            Assert.Equal(expected, br.Value);
        }
        public void PostPastReservationWhenNoPriorReservationsExist(
            int capacity,
            int quantity)
        {
            var repository = new FakeReservationsRepository();
            var now        = new DateTime(2019, 8, 21);
            var sut        = new ReservationsController(
                TimeSpan.FromHours(2.5),
                new[] { new Table(capacity) },
                repository,
                new ConstantClock(now));

            var dto = new ReservationDto
            {
                Date     = now.Subtract(TimeSpan.FromDays(1)).ToString(),
                Quantity = quantity
            };
            var actual = sut.Post(dto);

            var br  = Assert.IsAssignableFrom <BadRequestObjectResult>(actual);
            var msg = Assert.IsAssignableFrom <string>(br.Value);

            Assert.NotEmpty(msg);
        }
        public void PostValidDtoWhenSoldOut()
        {
            //Arrange
            var dto = new ReservationDto {
                Date = "01/01/1970"
            };

            Mock <IValidator> validator = GetValidator(dto);
            Mock <IMapper>    mapper    = GetMapper(dto);

            var md = new Mock <IMaîtreD>();

            md.Setup(m => m.TryAccept(It.IsAny <Reservation>())).Returns((int?)null);
            ReservationsController sut = new ReservationsController(validator.Object, mapper.Object, md.Object);

            //Act
            var actual = sut.Post(dto);

            //Assert
            var c        = Assert.IsAssignableFrom <ObjectResult>(actual);
            var expected = 500;

            Assert.Equal(expected, c.StatusCode);
        }