public async Task GetBannerInfo_TeacherEmail_ShouldCallCorrectApiAndReturnBackTeacherInfo(string identifier)
        {
            var bannerInfo = new BannerPersonInfo()
            {
                EmailAddress = identifier,
                WVUPID       = Utils.ParseOrDefault(identifier, 11243213),
                FirstName    = "Barry",
                LastName     = "LoppySomph",
                Teacher      = true
            };
            var cleanedIdentifier = identifier.Split("@")[0];

            server
            .Given(Request.Create().WithPath($"/teacher/{cleanedIdentifier}").UsingGet())
            .RespondWith(
                Response.Create()
                .WithStatusCode(200)
                .WithHeader("Content-Type", "application/json")
                .WithBodyAsJson(bannerInfo)
                );

            var teacherInfo = await bannerApi.GetBannerInfo(identifier);

            Assert.NotNull(teacherInfo);
            Assert.True(teacherInfo.Teacher);
        }
        public async void GetPersonInfo_TeacherDoesNotExists_ShouldReturnTeacherInfoAndSaveToDatabase(string identifier)
        {
            var email            = identifier;
            var id               = Utils.ParseOrDefault(identifier, 54321687);
            var bannerPersonInfo = new BannerPersonInfo()
            {
                EmailAddress = email,
                WVUPID       = id,
                FirstName    = "Barry",
                LastName     = "Lomphson",
                Teacher      = true
            };

            mockBannerService.Setup(x => x.GetBannerInfo(It.IsAny <string>())).ReturnsAsync(() => bannerPersonInfo);

            var personInfo = await unitPerson.GetPersonInfo(identifier);

            var teacher = db.People.LastOrDefault(x => x.Email == bannerPersonInfo.EmailAddress || x.Id == bannerPersonInfo.WVUPID);

            Assert.NotNull(teacher);
            Assert.Equal(PersonType.Teacher, teacher.PersonType);
            var semester = db.Semesters.Last();

            Assert.NotNull(semester);
        }
        public async void GetPersonInfo_StudentIsNotSavedInDatabase_ShouldReturnPersonInfoAndSaveToDatabase(string identifier)
        {
            var email   = identifier;
            var id      = Utils.ParseOrDefault(identifier, 19834567);
            var courses = new List <BannerClass>()
            {
                new BannerClass()
                {
                    CourseName = "Intro to Computation",
                    CRN        = 13548,
                    ShortName  = "CS 101",
                    Department = new BannerDepartment()
                    {
                        Name = "STEM",
                        Code = 42
                    }
                },
                new BannerClass()
                {
                    CourseName = "Intro to Web Design",
                    CRN        = 13464,
                    ShortName  = "CS 129",
                    Department = new BannerDepartment()
                    {
                        Name = "STEM",
                        Code = 42
                    }
                }
            };
            var semesterCode     = 201902;
            var bannerPersonInfo = new BannerPersonInfo()
            {
                WVUPID       = id,
                EmailAddress = identifier,
                Courses      = courses,
                FirstName    = "Bob",
                LastName     = "Dylan",
                TermCode     = semesterCode
            };

            mockBannerService.Setup(x => x.GetBannerInfo(It.IsAny <string>())).ReturnsAsync(() => bannerPersonInfo);


            var personInfo = await unitPerson.GetPersonInfo(email);

            mockBannerService.Verify(x => x.GetBannerInfo(It.Is <string>(a => a == bannerPersonInfo.EmailAddress || a == bannerPersonInfo.WVUPID.ToString())), Times.Once());
            Assert.NotNull(personInfo);
            Assert.NotNull(personInfo.Schedule);
            var person = db.People.FirstOrDefault(x => x.Email == email || x.Id == id);

            Assert.NotNull(person);
            var semester = db.Semesters.FirstOrDefault(x => x.Code == semesterCode);

            Assert.NotNull(semester);
            courses.ForEach(c =>
            {
                var course = db.Classes.FirstOrDefault(x => c.CRN == x.CRN);
                Assert.NotNull(course);
                var department = db.Departments.FirstOrDefault(x => x.Code == c.Department.Code);
                Assert.NotNull(department);
            });

            var schedules = db.Schedules.Where(x => x.PersonId == person.Id);

            Assert.Equal(schedules.Count(), courses.Count);
            Assert.Equal(schedules.Count(), personInfo.Schedule.Count());
            Assert.All(schedules, x => Assert.Equal(x.PersonId, person.Id));
        }
        public async void GetPersonInfo_StudentExistsAndHasSemesterSchedule_ShouldReturnStudentInfoWithoutCallingBanner(string identifier)
        {
            var email  = identifier;
            var id     = Utils.ParseOrDefault(identifier, 54321687);
            var person = new Person()
            {
                Email     = email,
                FirstName = "Billy",
                LastName  = "Bob",
                Id        = id
            };
            var semester = new Semester()
            {
                Code = 201901
            };
            var classes = new List <Class>()
            {
                new Class()
                {
                    CRN        = 163574,
                    Name       = "Intro to Powerpoint",
                    ShortName  = "PO124",
                    Department = new Department()
                    {
                        Code = 315,
                        Name = "STEM"
                    }
                }
            };
            var schedule = new Schedule()
            {
                PersonId     = person.Id,
                ClassCRN     = classes[0].CRN,
                SemesterCode = semester.Code
            };

            db.Semesters.Add(semester);
            db.People.Add(person);
            db.Classes.AddRange(classes);
            db.Schedules.Add(schedule);
            await db.SaveChangesAsync();

            var bannerPersonInfo = new BannerPersonInfo()
            {
                WVUPID       = person.Id,
                EmailAddress = person.Email,
                Courses      = null,
                FirstName    = "Bob",
                LastName     = "Dylan",
                TermCode     = semester.Code
            };

            mockBannerService.Setup(x => x.GetBannerInfo(It.IsAny <string>())).ReturnsAsync(() => bannerPersonInfo);

            var personInfo = await unitPerson.GetPersonInfo(person.Email);

            Assert.NotNull(personInfo);
            Assert.Equal(personInfo.Email, person.Email);
            mockBannerService.Verify(x => x.GetBannerInfo(It.IsAny <string>()), Times.Once());
            Assert.Equal(classes.Select(x => x.CRN), personInfo.Schedule.ToList().Select(x => x.CRN));
            var inDBSchedule = db.Schedules.Where(x => x.PersonId == person.Id);

            Assert.Equal(classes.Count(), inDBSchedule.Count());
        }
        public async void GetPersonInfo_StudentDoesNotExist_StudentCoursesDoExist_ShouldReturnStudentAndNotSaveNewCoursesToDatabase(string identifier)
        {
            var email  = identifier;
            var id     = Utils.ParseOrDefault(identifier, 54321687);
            var person = new Person()
            {
                Email      = email,
                FirstName  = "Billy",
                LastName   = "Careless",
                Id         = id,
                PersonType = PersonType.Student
            };
            var otherPerson = new Person()
            {
                Email      = "*****@*****.**",
                FirstName  = "Bob",
                LastName   = "Parker",
                Id         = 13496,
                PersonType = PersonType.Student
            };

            var semester = new Semester()
            {
                Code = 201901
            };
            var classes = new List <Class>()
            {
                new Class()
                {
                    CRN        = 16748,
                    Name       = "Yoga",
                    ShortName  = "GYM302",
                    Department = new Department()
                    {
                        Code = 234,
                        Name = "Physical Wellness"
                    }
                }
            };
            var previousSchedule = new Schedule()
            {
                Person   = otherPerson,
                Class    = classes[0],
                Semester = semester
            };

            db.People.Add(otherPerson);
            db.Classes.AddRange(classes);
            db.Schedules.Add(previousSchedule);
            db.Semesters.Add(semester);
            db.SaveChanges();

            var bannerPersonInfo = new BannerPersonInfo()
            {
                WVUPID       = person.Id,
                EmailAddress = person.Email,
                Courses      = classes.Select(x => new BannerClass()
                {
                    CourseName = x.Name,
                    CRN        = x.CRN,
                    ShortName  = x.ShortName,
                    Department = new BannerDepartment()
                    {
                        Code = x.Department.Code,
                        Name = x.Department.Name
                    }
                }),
                FirstName = person.FirstName,
                LastName  = person.LastName,
                TermCode  = semester.Code
            };

            mockBannerService.Setup(x => x.GetBannerInfo(It.IsAny <string>())).ReturnsAsync(() => bannerPersonInfo);

            var personInfo = await unitPerson.GetPersonInfo(identifier);

            mockBannerService.Verify(x => x.GetBannerInfo(It.Is <string>(a => a == person.Email || a == person.Id.ToString())), Times.Once());

            var addedPerson = db.People.Find(personInfo.Id);

            Assert.NotNull(addedPerson);
            Assert.Equal(classes.Count(), db.Classes.Count());
            var schedule = db.Schedules.Where(x => x.PersonId == addedPerson.Id);

            Assert.Equal(schedule.Count(), classes.Count());
            Assert.NotNull(db.Semesters.Find(semester.Code));
        }
        public async void GetPersonInfo_StudentExistsButHasOldSchedule_ShouldReturnStudentInfoAndSaveToDatabase(string identifier)
        {
            var email  = identifier;
            var id     = Utils.ParseOrDefault(identifier, 54321687);
            var person = new Person()
            {
                Id        = id,
                Email     = email,
                FirstName = "Billy",
                LastName  = "Joe"
            };
            var semester = new Semester()
            {
                Code = 201901
            };

            var newSemesterId = 201902;
            var oldCourses    = new List <Class>()
            {
                new Class()
                {
                    CRN        = 13465,
                    Name       = "Intro to Computers",
                    Department = new Department()
                    {
                        Code = 13465,
                        Name = "STEM"
                    }
                }
            };

            var bannerPersonInfo = new BannerPersonInfo()
            {
                WVUPID       = person.Id,
                EmailAddress = person.Email,
                Courses      = new List <BannerClass>()
                {
                    new BannerClass()
                    {
                        CRN        = 11112,
                        CourseName = "Intro to Excel",
                        ShortName  = "CS 101",
                        Department = new BannerDepartment()
                        {
                            Code = 1234,
                            Name = "STEM"
                        }
                    }
                },
                FirstName = person.FirstName,
                LastName  = person.LastName,
                TermCode  = newSemesterId
            };

            db.People.Add(person);
            db.Semesters.Add(semester);
            db.Classes.AddRange(oldCourses);
            db.SaveChanges();


            mockBannerService.Setup(x => x.GetBannerInfo(It.IsAny <string>())).ReturnsAsync(() => bannerPersonInfo);

            var personInfo = await unitPerson.GetPersonInfo(identifier);

            mockBannerService.Verify(x => x.GetBannerInfo(It.Is <string>(a => a == person.Email || a == person.Id.ToString())), Times.Once());

            Assert.Equal(personInfo.Schedule.Select(x => x.CRN), bannerPersonInfo.Courses.Select(x => x.CRN));
            var addedSemester = db.Semesters.SingleOrDefault(x => x.Code == newSemesterId);

            Assert.NotNull(addedSemester);
            Assert.Equal(personInfo.Schedule.Select(x => x.CRN), db.Schedules.Where(x => x.Person.Email == person.Email).Select(x => x.ClassCRN));
        }