public void PostBug_WhenBugTextIsValid_ShouldBeAddedToRepoWithDateCreatedAndStatusNew()
        {
            // Arrange
            var repo = new RepositoryMock<Bug>();
            repo.IsSaveCalled = false;
            repo.Entities = new List<Bug>();
            var newBug = new Bug()
            {
                Text = "Test bug"
            };
            var controller = new BugsController(repo);
            this.SetupController(controller, "bugs");

            // Act
            var httpResponse = controller.PostBug(newBug).ExecuteAsync(new CancellationToken()).Result;

            // Assert
            Assert.AreEqual(HttpStatusCode.Created, httpResponse.StatusCode);
            Assert.IsNotNull(httpResponse.Headers.Location);

            var bugFromService = httpResponse.Content.ReadAsAsync<Bug>().Result;
            Assert.AreEqual(bugFromService.Text, newBug.Text);
            Assert.AreEqual(bugFromService.Status, BugStatus.New);
            Assert.IsNotNull(bugFromService.DateCreated);

            // Assert the repository values are correct
            Assert.AreEqual(repo.Entities.Count, 1);
            var bugInRepo = repo.Entities.First();
            Assert.AreEqual(newBug.Text, bugInRepo.Text);
            Assert.IsNotNull(bugInRepo.DateCreated);
            Assert.AreEqual(BugStatus.New, bugInRepo.Status);
            Assert.IsTrue(repo.IsSaveCalled);
        }
        public void PostBug_WhenBugTextIsInvalid_ShouldReturnBadRequest()
        {
            // Arrange
            var repo = new RepositoryMock<Bug>();
            var controller = new BugsController(repo);
            this.SetupController(controller, "bugs");

            // Act
            var newBug = new Bug() { Text = null };
            var result = controller.PostBug(newBug).ExecuteAsync(new CancellationToken()).Result;

            // Assert
            Assert.AreEqual(HttpStatusCode.BadRequest, result.StatusCode);
        }
        public void PostBug_WhenValid_ShouldAddBugToDb_WithMoq()
        {
            // Arrange
            var repoMock = new Mock<IRepository<Bug>>();

            List<Bug> bugs = new List<Bug>()
            {
                new Bug() { Text = "Test bug #1" },
                new Bug() { Text = "Test bug #2" }
            };

            repoMock.Setup(repo => repo.Add(It.IsAny<Bug>()))
                .Callback((Bug b) => bugs.Add(b));

            var controller = new BugsController(repoMock.Object);
            this.SetupController(controller, "bugs");

            // Act
            var newBug = new Bug() { Text = "new bug" };
            var result = controller.PostBug(newBug).ExecuteAsync(new CancellationToken()).Result;

            // Assert
            Assert.AreEqual(HttpStatusCode.Created, result.StatusCode);
            Assert.AreEqual(newBug.Text, bugs.Last().Text);
            Assert.AreEqual(BugStatus.New, bugs.Last().Status);
            Assert.IsNotNull(bugs.Last().DateCreated);
        }