public void Delete_WhenStudentIsValid_ShouldDeleteTheStudent()
        {
            bool isItemDeleted = false;
            var repository = Mock.Create<IRepository<Student>>();

            Mock.Arrange(() => repository.Delete(Arg.AnyInt))
                .DoInstead(() => { isItemDeleted = true; });

            var controller = new StudentController(repository);
            controller.SetupControllerForTest(HttpMethod.Delete, BaseUrl, ControllerName);

            //act
            var httpResponse = controller.Delete(0);

            var actual = httpResponse.StatusCode;
            var expected = HttpStatusCode.Accepted;

            Assert.IsTrue(isItemDeleted);
            Assert.AreEqual(expected, actual);
        }
        public void Add_WhenStudentIsInValid_ShouldAddTheStudent()
        {
            bool isItemAdded = false;
            var repository = Mock.Create<IRepository<Student>>();

            var studentModel = new Student()
            {
                Age = 10,
                Grade = 4,
                FirstName = "Nikolay",
                LastName = "Kostadinov",
            };

            var studentEntity = new Student()
            {
                StudentId = 1,
                Grade = 4,
                FirstName = "Nikolay",
                LastName = "Kostadinov",
            };

            Mock.Arrange(() => repository.Add(Arg.IsAny<Student>()))
                .Throws<ArgumentException>("Grade");

            var controller = new StudentController(repository);
            controller.SetupControllerForTest(HttpMethod.Post, BaseUrl, ControllerName);
            
            var expected = HttpStatusCode.BadRequest;

            //act
            var httpResponse = controller.Post(studentModel);
            var actual = httpResponse.StatusCode;

            ///assert
            Assert.AreEqual(expected, actual);
        }
        public void Update_WhenStudentIsValid_ShouldUpdateTheStudent()
        {
            bool isItemUpdated = false;
            var repository = Mock.Create<IRepository<Student>>();

            var studentModel = new Student()
            {
                Age = 10,
                Grade = 4,
                FirstName = "Nikolay",
                LastName = "Kostadinov",
            };

            Mock.Arrange(() => repository.Update(Arg.AnyInt, Arg.IsAny<Student>()))
                .DoInstead(() => { isItemUpdated = true; });

            var controller = new StudentController(repository);
            controller.SetupControllerForTest(HttpMethod.Put, BaseUrl, ControllerName);

            //act
            var httpResponse = controller.Put(1, studentModel);

            var actual = httpResponse.StatusCode;
            var expected = HttpStatusCode.Accepted;

            Assert.IsTrue(isItemUpdated);
            Assert.AreEqual(expected, actual);
        }
        public void Add_WhenStudentIsValid_ShouldAddTheStudent()
        {
            bool isItemAdded = false;
            var repository = Mock.Create<IRepository<Student>>();

            var studentModel = new Student()
            {
                Age = 10,
                Grade = 4,
                FirstName = "Nikolay",
                LastName = "Kostadinov",
            };

            var studentEntity = new Student()
            {
                StudentId = 1,
                Age = 10,
                Grade = 4,
                FirstName = "Nikolay",
                LastName = "Kostadinov",
            };

            Mock.Arrange(() => repository.Add(Arg.IsAny<Student>()))
                .DoInstead(() => { isItemAdded = true; })
                .Returns(studentEntity);

            var controller = new StudentController(repository);
            controller.SetupControllerForTest(HttpMethod.Post, BaseUrl, ControllerName);

            //act
            var httpResponse = controller.Post(studentModel);

            var header = httpResponse.Headers.Location.AbsoluteUri;
            var expected = BaseUrl + ControllerName + "/1";
            Assert.IsTrue(isItemAdded);
            Assert.AreEqual(expected, header);
        }