public void Add_Valid_ShouldReturnStatusCode200AndNotNullContent()
        {
            var mockUnitOfWork = Mock.Create<IUnitOfWork>();

            School school = new School() { Location = "Location", Name = "Name" };

            Student studentEntity = new Student()
            {
                FirstName = "Pesho",
                LastName = "Peshov",
                Age = 16,
                Grade = 10,
                School = school,
                Marks = new List<Mark>() { new Mark() { Subject = "math", Value = 6 } }
            };

            bool isItemAdded = false;
            Mock.Arrange(() => mockUnitOfWork.SchoolsRepository.Get(Arg.IsAny<int>()))
                .Returns(school);

            Mock.Arrange(() => mockUnitOfWork.StudentsRepository.Add(Arg.IsAny<Student>()))
                .DoInstead(() => isItemAdded = true)
                .Returns(studentEntity);

            var server = new InMemoryHttpServer<Student>("http://localhost/", mockUnitOfWork);

            var response = server.CreatePostRequest("api/students", studentEntity);

            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
            Assert.IsTrue(isItemAdded);
            Assert.IsNotNull(response.Content);
        }
        public static School ToSchoolEntity(SchoolModel schoolModel, IUnitOfWork unitOfWork)
        {
            School school = new School()
                {
                    Name = schoolModel.Name,
                    Location = schoolModel.Location
                };

            foreach (StudentModel student in schoolModel.Students)
            {
                school.Students.Add(Extensions.CreateOrLoadStudent(student, unitOfWork));
            }

            return school;
        }
        public static SchoolModel ToSchoolModel(School schoolEntity)
        {
            SchoolModel school = new SchoolModel()
                {
                    ID = schoolEntity.ID,
                    Name = schoolEntity.Name,
                    Location = schoolEntity.Location
                };

            foreach (Student student in schoolEntity.Students)
            {
                school.Students.Add(StudentsMapper.ToStudentModel(student));
            }

            return school;
        }
        public static School CreateOrLoadSchool(SchoolDetails schoolDetails, IUnitOfWork unitOfWork)
        {
            School school = unitOfWork.SchoolsRepository.Get(schoolDetails.ID);
            if (school != null)
            {
                return school;
            }

            School newSchool = new School()
                {
                    Name = schoolDetails.Name,
                    Location = schoolDetails.Location
                };

            unitOfWork.SchoolsRepository.Add(newSchool);
            unitOfWork.Save();

            return newSchool;
        }
        public void GetAll_WhenOneStudent_ShouldReturnStatusCode200AndCorrectStudent()
        {
            var mockUnitOfWork = Mock.Create<IUnitOfWork>();

            School school = new School() { Location = "Location", Name = "Name" };

            Student studentEntity = new Student()
            {
                FirstName = "Pesho",
                LastName = "Peshov",
                Age = 16,
                Grade = 10,
                School = school,
                Marks = new List<Mark>() { new Mark() { Subject = "math", Value = 6 } }
            };

            var studentEntities = new List<Student>();
            studentEntities.Add(studentEntity);

            Mock.Arrange(() => mockUnitOfWork.StudentsRepository.GetAll())
                .Returns(() => studentEntities.AsQueryable<Student>());

            var server = new InMemoryHttpServer<Student>("http://localhost/", mockUnitOfWork);

            var response = server.CreateGetRequest("api/students");

            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);

            // Check personal information
            Assert.AreEqual(studentEntity.FirstName, studentEntity.FirstName);
            Assert.AreEqual(studentEntity.LastName, studentEntity.LastName);
            Assert.AreEqual(studentEntity.Age, studentEntity.Age);
            Assert.AreEqual(studentEntity.Grade, studentEntity.Grade);

            Assert.AreEqual(school.Name, studentEntity.School.Name);
            Assert.AreEqual(school.Location, studentEntity.School.Location);

            // Check marks
            Assert.AreEqual(studentEntity.Marks.First().Subject, studentEntity.Marks.First().Subject);
            Assert.AreEqual(studentEntity.Marks.First().Value, studentEntity.Marks.First().Value);
        }
        public void AddValidStudent_ShouldBeAddedCorrectly()
        {
            var unitOfWork = Mock.Create<IUnitOfWork>();

            School school = new School() { Location = "Location", Name = "Name" };

            Student studentEntity = new Student()
            {
                FirstName = "Pesho",
                LastName = "Peshov",
                Age = 16,
                Grade = 10,
                School = school,
                Marks = new List<Mark>() { new Mark() { Subject = "math", Value = 6 } }
            };

            bool isItemAdded = false;
            Mock.Arrange(() => unitOfWork.SchoolsRepository.Get(Arg.IsAny<int>()))
                .Returns(school);

            Mock.Arrange(() => unitOfWork.StudentsRepository.Add(Arg.IsAny<Student>()))
                .DoInstead(() => isItemAdded = true)
                .Returns(studentEntity);

            var studentsController = new StudentsController(unitOfWork);
            SetupController(studentsController);

            StudentModel studentModel = new StudentModel()
            {
                FirstName = "Pesho",
                LastName = "Peshov",
                Age = 16,
                Grade = 10,
                School = new SchoolDetails() { Location = school.Location, Name = school.Name },
                Marks = new List<MarkModel>() { new MarkModel() { Subject = "math", Value = 6 } }
            };
            studentsController.Add(studentModel);

            Assert.IsTrue(isItemAdded);
        }
        public void GetBySubjectAndMark_WithMarkValueAboveExisting_ShoulReturn200()
        {
            var mockUnitOfWork = Mock.Create<IUnitOfWork>();

            School school = new School() { Location = "Location", Name = "Name" };

            Student studentEntity = new Student()
            {
                FirstName = "Pesho",
                LastName = "Peshov",
                Age = 16,
                Grade = 10,
                School = school,
                Marks = new List<Mark>() { new Mark() { Subject = "math", Value = 6 } }
            };

            var studentEntities = new List<Student>();
            studentEntities.Add(studentEntity);

            string subject = "math";
            double mark = 6.2;
            Mock.Arrange(() => mockUnitOfWork.StudentsRepository.GetBySubjectAndMark(subject, mark))
                .Returns(() => studentEntities
                    .Where(st => st.Marks.Any(m => m.Subject == subject && m.Value > mark))
                    .AsQueryable<Student>());

            var server = new InMemoryHttpServer<Student>("http://localhost/", mockUnitOfWork);

            var response = server.CreateGetRequest("api/students?subject=" + subject + "&value=" + mark);
            var studentModels = response.Content
                .ReadAsAsync<IQueryable<StudentModel>>().Result;

            Assert.AreEqual(response.StatusCode, HttpStatusCode.OK);
            Assert.AreEqual(0, studentModels.Count());
        }
        public void GetByID_WithValidID_ShouldReturnStatusCode200AndCorrectStudent()
        {
            var mockUnitOfWork = Mock.Create<IUnitOfWork>();

            School school = new School() { Location = "Location", Name = "Name" };

            Student studentEntity = new Student()
            {
                FirstName = "Pesho",
                LastName = "Peshov",
                Age = 16,
                Grade = 10,
                School = school,
                Marks = new List<Mark>() { new Mark() { Subject = "math", Value = 6 } }
            };

            var studentEntities = new List<Student>();
            studentEntities.Add(studentEntity);

            int id = 1;
            id--; // Database IDs starts with 1
            Mock.Arrange(() => mockUnitOfWork.StudentsRepository.Get(id))
                .Returns(() => id >= 0 ? studentEntities[id] : null);

            var server = new InMemoryHttpServer<Student>("http://localhost/", mockUnitOfWork);

            var response = server.CreateGetRequest("api/students/" + id);

            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);

            // Check personal information
            Assert.AreEqual(studentEntity.FirstName, studentEntity.FirstName);
            Assert.AreEqual(studentEntity.LastName, studentEntity.LastName);
            Assert.AreEqual(studentEntity.Age, studentEntity.Age);
            Assert.AreEqual(studentEntity.Grade, studentEntity.Grade);

            Assert.AreEqual(school.Name, studentEntity.School.Name);
            Assert.AreEqual(school.Location, studentEntity.School.Location);

            // Check marks
            Assert.AreEqual(studentEntity.Marks.First().Subject, studentEntity.Marks.First().Subject);
            Assert.AreEqual(studentEntity.Marks.First().Value, studentEntity.Marks.First().Value);
        }
        public void GetByID_WithInvalidID_ShouldReturnStatusCode500()
        {
            var mockUnitOfWork = Mock.Create<IUnitOfWork>();

            School school = new School() { Location = "Location", Name = "Name" };

            Student studentEntity = new Student()
            {
                FirstName = "Pesho",
                LastName = "Peshov",
                Age = 16,
                Grade = 10,
                School = school,
                Marks = new List<Mark>() { new Mark() { Subject = "math", Value = 6 } }
            };

            var studentEntities = new List<Student>();
            studentEntities.Add(studentEntity);

            int id = -1;
            id--; // Database IDs starts with 1
            Mock.Arrange(() => mockUnitOfWork.StudentsRepository.Get(id))
                .Returns(() => id >= 0 ? studentEntities[id] : null);

            var server = new InMemoryHttpServer<Student>("http://localhost/", mockUnitOfWork);

            var response = server.CreateGetRequest("api/students/" + id);

            Assert.AreEqual(HttpStatusCode.InternalServerError, response.StatusCode);
        }
        public void GetAll_WhenMultipleStudents_ShouldReturnStatusCode200AndNotNullContent()
        {
            var mockUnitOfWork = Mock.Create<IUnitOfWork>();

            School school = new School() { Location = "Location", Name = "Name" };

            Student studentEntity = new Student()
            {
                FirstName = "Pesho",
                LastName = "Peshov",
                Age = 16,
                Grade = 10,
                School = school,
                Marks = new List<Mark>() { new Mark() { Subject = "math", Value = 6 } }
            };

            var studentEntities = new List<Student>();
            studentEntities.Add(studentEntity);

            Mock.Arrange(() => mockUnitOfWork.StudentsRepository.GetAll())
                .Returns(() => studentEntities.AsQueryable<Student>());

            var server = new InMemoryHttpServer<Student>("http://localhost/", mockUnitOfWork);

            var response = server.CreateGetRequest("api/students");

            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
            Assert.IsNotNull(response.Content);
        }
        public void GetBySubjectAndMark_WithMarkValueAboveThanExisting_ShouldReturnEmptyCollection()
        {
            var unitOfWork = Mock.Create<IUnitOfWork>();

            School school = new School() { Location = "Location", Name = "Name" };

            Student studentEntity = new Student()
            {
                FirstName = "Pesho",
                LastName = "Peshov",
                Age = 16,
                Grade = 10,
                School = school,
                Marks = new List<Mark>() { new Mark() { Subject = "math", Value = 6 } }
            };

            IList<Student> studentEntities = new List<Student>();
            studentEntities.Add(studentEntity);

            string subject = "math";
            double mark = 6.2;
            Mock.Arrange(() => unitOfWork.StudentsRepository.GetBySubjectAndMark(subject, mark))
                .Returns(() => studentEntities
                    .Where(st => st.Marks.Any(m => m.Subject == subject && m.Value > mark))
                    .AsQueryable<Student>());

            var studentsController = new StudentsController(unitOfWork);
            SetupController(studentsController);

            var httpResponseWithStudentModels = studentsController.Get(subject, mark);
            var studentModels = httpResponseWithStudentModels.Content
                .ReadAsAsync<IQueryable<StudentModel>>().Result;

            Assert.AreEqual(httpResponseWithStudentModels.StatusCode, HttpStatusCode.OK);
            Assert.AreEqual(0, studentModels.Count());
        }
        public void GetBySubjectAndMark_WithSingleStudent_ShouldReturnCorrectStudent()
        {
            var unitOfWork = Mock.Create<IUnitOfWork>();

            School school = new School() { Location = "Location", Name = "Name" };

            Student studentEntity = new Student()
            {
                FirstName = "Pesho",
                LastName = "Peshov",
                Age = 16,
                Grade = 10,
                School = school,
                Marks = new List<Mark>() { new Mark() { Subject = "math", Value = 6 } }
            };

            IList<Student> studentEntities = new List<Student>();
            studentEntities.Add(studentEntity);

            string subject = "math";
            double mark = 5.9;
            Mock.Arrange(() => unitOfWork.StudentsRepository.GetBySubjectAndMark(subject, mark))
                .Returns(() => studentEntities
                    .Where(st => st.Marks.Any(m => m.Subject == subject && m.Value > mark))
                    .AsQueryable<Student>());

            var studentsController = new StudentsController(unitOfWork);
            SetupController(studentsController);

            var httpResponseWithStudentModels = studentsController.Get(subject, mark);
            var studentModel = httpResponseWithStudentModels.Content
                .ReadAsAsync<IQueryable<StudentModel>>().Result.First();

            Assert.AreEqual(httpResponseWithStudentModels.StatusCode, HttpStatusCode.OK);
            // Check personal information
            Assert.AreEqual(studentEntity.FirstName, studentModel.FirstName);
            Assert.AreEqual(studentEntity.LastName, studentModel.LastName);
            Assert.AreEqual(studentEntity.Age, studentModel.Age);
            Assert.AreEqual(studentEntity.Grade, studentModel.Grade);

            Assert.AreEqual(school.Name, studentModel.School.Name);
            Assert.AreEqual(school.Location, studentModel.School.Location);

            // Check marks
            Assert.AreEqual(studentEntity.Marks.First().Subject, studentModel.Marks.First().Subject);
            Assert.AreEqual(studentEntity.Marks.First().Value, studentModel.Marks.First().Value);
        }
        public void GetByValidID_ShouldReturnCorrectStudent()
        {
            var unitOfWork = Mock.Create<IUnitOfWork>();

            School school = new School() { Location = "Location", Name = "Name" };

            Student studentEntity = new Student()
            {
                FirstName = "Pesho",
                LastName = "Peshov",
                Age = 16,
                Grade = 10,
                School = school,
                Marks = new List<Mark>() { new Mark() { Subject = "math", Value = 6 } }
            };

            IList<Student> studentEntities = new List<Student>();
            studentEntities.Add(studentEntity);

            int id = 1; // Database IDs starts with 1
            id--;
            Mock.Arrange(() => unitOfWork.StudentsRepository.Get(id))
                .Returns(() => id >= 0 ? studentEntities[id] : null);

            var studentsController = new StudentsController(unitOfWork);
            SetupController(studentsController);

            var httpResponseWithStudentModels = studentsController.Get(id);
            var studentModel = httpResponseWithStudentModels.Content.ReadAsAsync<StudentModel>().Result;

            Assert.AreEqual(httpResponseWithStudentModels.StatusCode, HttpStatusCode.OK);
            // Check personal information
            Assert.AreEqual(studentEntity.FirstName, studentModel.FirstName);
            Assert.AreEqual(studentEntity.LastName, studentModel.LastName);
            Assert.AreEqual(studentEntity.Age, studentModel.Age);
            Assert.AreEqual(studentEntity.Grade, studentModel.Grade);

            Assert.AreEqual(school.Name, studentModel.School.Name);
            Assert.AreEqual(school.Location, studentModel.School.Location);

            // Check marks
            Assert.AreEqual(studentEntity.Marks.First().Subject, studentModel.Marks.First().Subject);
            Assert.AreEqual(studentEntity.Marks.First().Value, studentModel.Marks.First().Value);
        }
        public void GetByInvalidId_ShoulReturnInternalServerErrorResponse()
        {
            var unitOfWork = Mock.Create<IUnitOfWork>();

            School school = new School() { Location = "Location", Name = "Name" };

            Student studentEntity = new Student()
            {
                FirstName = "Pesho",
                LastName = "Peshov",
                Age = 16,
                Grade = 10,
                School = school,
                Marks = new List<Mark>() { new Mark() { Subject = "math", Value = 6 } }
            };

            IList<Student> studentEntities = new List<Student>();
            studentEntities.Add(studentEntity);

            int id = -1; // Database IDs starts with 1
            id--;
            Mock.Arrange(() => unitOfWork.StudentsRepository.Get(id))
                .Returns(() => id >= 0 ? studentEntities[id] : null);

            var studentsController = new StudentsController(unitOfWork);
            SetupController(studentsController);

            var httpResponseWithStudentModels = studentsController.Get(id);

            Assert.AreEqual(httpResponseWithStudentModels.StatusCode, HttpStatusCode.InternalServerError);
        }
        public void GetAllFromACollectionWithMultipleStudents_ShouldReturnMultipleStudents()
        {
            var unitOfWork = Mock.Create<IUnitOfWork>();

            School school = new School() { Location = "Location", Name = "Name" };

            Student studentEntity1 = new Student()
            {
                FirstName = "Pesho",
                LastName = "Peshov",
                Age = 16,
                Grade = 10,
                School = school,
                Marks = new List<Mark>() { new Mark() { Subject = "math", Value = 6 } }
            };

            Student studentEntity2 = new Student()
            {
                FirstName = "Pesho",
                LastName = "Peshov",
                Age = 16,
                Grade = 10,
                School = school,
                Marks = new List<Mark>() { new Mark() { Subject = "math", Value = 6 } }
            };

            IList<Student> studentEntities = new List<Student>();
            studentEntities.Add(studentEntity1);
            studentEntities.Add(studentEntity2);

            Mock.Arrange(() => unitOfWork.StudentsRepository.GetAll())
                .Returns(() => studentEntities.AsQueryable<Student>());

            var studentsController = new StudentsController(unitOfWork);
            SetupController(studentsController);

            var httpResponseWithStudentModels = studentsController.GetAll();
            var studentModels = httpResponseWithStudentModels.Content.ReadAsAsync<IQueryable<StudentModel>>().Result;

            Assert.AreEqual(2, studentModels.Count());
        }
        public void GetAllFromACollectionOfOne_ShouldSingleStudent()
        {
            var unitOfWork = Mock.Create<IUnitOfWork>();

            School school = new School() { Location = "Location", Name = "Name" };

            Student studentEntity = new Student()
            {
                FirstName = "Pesho",
                LastName = "Peshov",
                Age = 16,
                Grade = 10,
                School = school,
                Marks = new List<Mark>() { new Mark() { Subject = "math", Value = 6 } }
            };

            IList<Student> studentEntities = new List<Student>();
            studentEntities.Add(studentEntity);

            Mock.Arrange(() => unitOfWork.StudentsRepository.GetAll())
                .Returns(() => studentEntities.AsQueryable<Student>());

            var studentsController = new StudentsController(unitOfWork);
            SetupController(studentsController);

            var httpResponseWithStudentModels = studentsController.GetAll();
            var studentModels = httpResponseWithStudentModels.Content.ReadAsAsync<IQueryable<StudentModel>>().Result;

            // Check count
            Assert.AreEqual(1, studentModels.Count());

            // Check personal information
            Assert.AreEqual(studentEntity.FirstName, studentModels.First().FirstName);
            Assert.AreEqual(studentEntity.LastName, studentModels.First().LastName);
            Assert.AreEqual(studentEntity.Age, studentModels.First().Age);
            Assert.AreEqual(studentEntity.Grade, studentModels.First().Grade);

            Assert.AreEqual(school.Name, studentModels.First().School.Name);
            Assert.AreEqual(school.Location, studentModels.First().School.Location);

            // Check marks
            Assert.AreEqual(studentEntity.Marks.First().Subject, studentModels.First().Marks.First().Subject);
            Assert.AreEqual(studentEntity.Marks.First().Value, studentModels.First().Marks.First().Value);
        }