public void CanAddNewCourse()
        {
            var dummyCourse = DummyDataGenerator.CreateDummyCourse();

            // Course Id's are autogenerated by the database, so when we
            // add a new one to the db, we cache the assigned Id after the
            // add operation has completed (that way we can retrieve the course
            // from the db to run our assertions on the data
            ICoursesModel model = new CoursesModel();
            dummyCourse.Id = model.AddOrUpdateCourse(dummyCourse).Id;

            // Retrieve the newly added course back out from the Db
            var repo = new BizCollegeRepository<Course, string>();
            var fromDb = repo.Get(dummyCourse.Id);

            // Check the values against our dummy course
            Assert.NotNull(fromDb);
            Assert.AreEqual(dummyCourse.Id, fromDb.Id);
            Assert.AreEqual(dummyCourse.Name, fromDb.Name);
            Assert.AreEqual(dummyCourse.Description, fromDb.Description);
            Assert.AreEqual(dummyCourse.CreatedByUsername, fromDb.CreatedByUsername);
            Assert.AreEqual(dummyCourse.LastUpdateByUsername, fromDb.LastUpdateByUsername);
            Assert.AreEqual(dummyCourse.CourseSlides.Count, fromDb.CourseSlides.Count);

            // clean-up db
            repo.Remove(fromDb.Id);
        }
        public void CanGetAllCourses()
        {
            List<Course> dummyCourses = new List<Course>();
            dummyCourses.Add(DummyDataGenerator.CreateDummyCourse());
            dummyCourses.Add(DummyDataGenerator.CreateDummyCourse());

            // Add two dummy courses to the database
            ICoursesModel model = new CoursesModel();
            dummyCourses[0].Id = model.AddOrUpdateCourse(dummyCourses[0]).Id;
            dummyCourses[1].Id = model.AddOrUpdateCourse(dummyCourses[1]).Id;

            // Retrieve all the courses in the database (should be only two we added above)
            var repo = new BizCollegeRepository<Course, string>();
            var allCoursesFromDb = repo.GetAllItems();

            Assert.NotNull(allCoursesFromDb);
            Assert.AreEqual(allCoursesFromDb.Count, dummyCourses.Count);

            foreach (var courseInDb in allCoursesFromDb)
            {
                Assert.IsTrue(dummyCourses.Contains(courseInDb));
            }

            // clean up Db
            repo.Remove(dummyCourses[0].Id);
            repo.Remove(dummyCourses[1].Id);
        }
        public void CanAddNewStudentCourseEnrollment()
        {
            // dummy username (provided by an external accounts
            // data store (e.g. ASP .net membership/authentication)
            string username = "******";

            // Create a dummy course and add it to the database (since the student
            // enrollments model will not allow an enrollment to be added to a student
            // for a course that doesn't exist in the database)
            var dummyCourse = DummyDataGenerator.CreateDummyCourse();
            ICoursesModel courseModel = new CoursesModel();
            dummyCourse.Id = courseModel.AddOrUpdateCourse(dummyCourse).Id;

            // add the new enrollment for the given user and specified course
            IStudentEnrollmentsModel model = new StudentEnrollmentsModel();
            StudentRecord studentEnrollmentRecord = model.AddEnrollment(username, dummyCourse.Id);

            Assert.NotNull(studentEnrollmentRecord);
            Assert.IsNotNullOrEmpty(studentEnrollmentRecord.Username);
            Assert.AreEqual(studentEnrollmentRecord.Username, username);
            Assert.NotNull(studentEnrollmentRecord.StudentCourseEnrollments);
            Assert.AreEqual(studentEnrollmentRecord.StudentCourseEnrollments.Count, 1);

            var enrollments = new List<Enrollment>(studentEnrollmentRecord.StudentCourseEnrollments);
            Assert.AreEqual(enrollments[0].CourseId, dummyCourse.Id);

            // clean up Db:  remove student record
            var enrollmentsRepo = new BizCollegeRepository<StudentRecord, string>();
            enrollmentsRepo.Remove(studentEnrollmentRecord.Username);

            // clean up Db:  remove dummy course
            var coursesRepo = new BizCollegeRepository<Course, string>();
            coursesRepo.Remove(dummyCourse.Id);
        }
        /// <summary>
        /// Given a Course.Id and a student's username, enroll the student in that course.  If
        /// a student record doesn't exist (e.g. the student was never enrolled in a course),
        /// a record is created internally and the course is added to the StudentRecord.StudentCourseEnrollments.
        /// If the student already has a record, we udpate the student's enrollments with the new course
        /// enrollment.
        /// </summary>
        /// <param name="username">The username is how we uniquely track/identify a StudentRecord</param>
        /// <param name="courseId">The Course.Id (unique id of the course)</param>
        /// <exception cref="System.InvalidOperationException">
        ///     <para>
        ///     1) If the given course (by Course.Id) does not exist in the system
        ///     2) If the student is already enrolled in that course
        ///     </para>
        /// </exception>
        /// <returns>A copy of the persisted/updated StudentRecord</returns>
        public StudentRecord AddEnrollment(string username, string courseId)
        {
            IRepository<Course, string> coursesRepo = new BizCollegeRepository<Course, string>();
            var course = coursesRepo.Get(courseId);
            if (course == null)
                throw new InvalidOperationException("That course does not exist in the system");

            // Try and retrive the student's record (by username).  If they don't
            // have an existing record, create a record for them
            var student = m_enrollmentsRepo.Get(username);
            if (student == null)
            {
                student = new StudentRecord() { Username = username, StudentCourseEnrollments = new List<Enrollment>() };
            }

            // Throw an error if the student is already enrolled in this course
            foreach (var currentEnrollment in student.StudentCourseEnrollments)
            {
                if (currentEnrollment.CourseId == courseId)
                {
                    throw new InvalidOperationException("The student is already enrolled in course:  " + courseId);
                }
            }

            // Add the new enrollment and save it the updated student record
            student.StudentCourseEnrollments.Add(new Enrollment()
            {
                CourseId = courseId,
                DateStarted = DateTime.Now,
                DateCompleted = SqlServerHelper.GetSqlServerMinimumDateTimeValue()
            });

            return m_enrollmentsRepo.AddOrUpdate(student);
        }
        public void CanGetStudentEnrollment()
        {
            // dummy username and course id
            string username = "******";
            string courseId = Guid.NewGuid().ToString();

            // Add the dummy student enrollment via the internal repository interfaces
            var dummyEnrollment = new StudentRecord(){ Username = username};
            dummyEnrollment.StudentCourseEnrollments = new List<Enrollment>();
            dummyEnrollment.StudentCourseEnrollments.Add(
                new Enrollment()
                {
                    CourseId = courseId,
                    DateStarted = DateTime.Now,
                    DateCompleted = SqlServerHelper.GetSqlServerMinimumDateTimeValue()
                }
            );
            var enrollmentsRepo = new BizCollegeRepository<StudentRecord, string>();
            dummyEnrollment = enrollmentsRepo.AddOrUpdate(dummyEnrollment);

            // Get the student record via the enrollments model interface that the web
            // application will use to retrieve student enrollment records by username
            IStudentEnrollmentsModel enrollmentsModel = new StudentEnrollmentsModel();
            var fromDb = enrollmentsModel.GetStudentRecord(username);

            Assert.NotNull(fromDb);
            Assert.AreEqual(fromDb.Username, dummyEnrollment.Username);
            Assert.NotNull(fromDb.StudentCourseEnrollments);
            Assert.AreEqual(fromDb.StudentCourseEnrollments.Count, dummyEnrollment.StudentCourseEnrollments.Count);
            Assert.AreEqual(fromDb.StudentCourseEnrollments[0].Id, dummyEnrollment.StudentCourseEnrollments[0].Id);
            Assert.AreEqual(fromDb.StudentCourseEnrollments[0].CourseId, dummyEnrollment.StudentCourseEnrollments[0].CourseId);
            Assert.AreEqual(fromDb.StudentCourseEnrollments[0].DateCompleted, dummyEnrollment.StudentCourseEnrollments[0].DateCompleted);

            // Clean up Db
            enrollmentsRepo.Remove(username);
        }
        public void CanGetCourseByCourseId()
        {
            var dummyCourse = DummyDataGenerator.CreateDummyCourse();

            ICoursesModel model = new CoursesModel();
            dummyCourse.Id = model.AddOrUpdateCourse(dummyCourse).Id;

            var fromDb = model.GetCourse(dummyCourse.Id);

            // Check the values against our dummy course
            Assert.NotNull(fromDb);
            Assert.AreEqual(dummyCourse.Id, fromDb.Id);
            Assert.AreEqual(dummyCourse.Name, fromDb.Name);
            Assert.AreEqual(dummyCourse.Description, fromDb.Description);
            Assert.AreEqual(dummyCourse.CreatedByUsername, fromDb.CreatedByUsername);
            Assert.AreEqual(dummyCourse.LastUpdateByUsername, fromDb.LastUpdateByUsername);
            Assert.AreEqual(dummyCourse.CourseSlides.Count, fromDb.CourseSlides.Count);

            // clean-up db
            var repo = new BizCollegeRepository<Course, string>();
            repo.Remove(fromDb.Id);
        }
        public void CanUpdateExistingCourse()
        {
            // Create a dummy course and add it to the database
            var dummyCourse = DummyDataGenerator.CreateDummyCourse();
            ICoursesModel model = new CoursesModel();
            dummyCourse.Id = model.AddOrUpdateCourse(dummyCourse).Id;

            // Update the course by adding a course slide and changing
            dummyCourse.CourseSlides.Add(new CourseContent()
            {
                CourseContentType = ContentType.Video,
                Description = "This video talks about how to start your own business",
                ResourcePath = "http://www.youtube.com",
                Title = "Business Course Introduction Video",
                IndexInSquence = 0,
            });

            // Also update the other properties of the coures
            dummyCourse.Name = "Business Savvy 101";
            dummyCourse.Description = "Tips on how to run a business properly";
            dummyCourse.State = CourseState.Active;
            dummyCourse.LastUpdateByUsername = "******";
            dummyCourse.CreatedByUsername = "******";

            //  Persist the course udpates to the database
            model.AddOrUpdateCourse(dummyCourse);

            // Retrieve a copy of the updated course back out from the Db
            var repo = new BizCollegeRepository<Course, string>();
            var fromDb = repo.Get(dummyCourse.Id);

            // Check that the course properties we updated were persisted
            Assert.NotNull(fromDb);
            Assert.AreEqual(dummyCourse.Id, fromDb.Id);

            Assert.AreEqual(dummyCourse.Name,                 fromDb.Name);
            Assert.AreEqual(dummyCourse.Description,          fromDb.Description);
            Assert.AreEqual(dummyCourse.State,                fromDb.State);
            Assert.AreEqual(dummyCourse.LastUpdateByUsername, fromDb.LastUpdateByUsername);
            Assert.AreEqual(dummyCourse.CreatedByUsername,    fromDb.CreatedByUsername);

            Assert.NotNull(fromDb.CourseSlides[0]);
            Assert.AreEqual(dummyCourse.CourseSlides.Count,                fromDb.CourseSlides.Count);
            Assert.AreEqual(dummyCourse.CourseSlides[0].CourseContentType, fromDb.CourseSlides[0].CourseContentType);
            Assert.AreEqual(dummyCourse.CourseSlides[0].Description,       fromDb.CourseSlides[0].Description);
            Assert.AreEqual(dummyCourse.CourseSlides[0].ResourcePath,      fromDb.CourseSlides[0].ResourcePath);
            Assert.AreEqual(dummyCourse.CourseSlides[0].Title,             fromDb.CourseSlides[0].Title);
            Assert.AreEqual(dummyCourse.CourseSlides[0].IndexInSquence,    fromDb.CourseSlides[0].IndexInSquence);

            // clean-up db
            repo.Remove(fromDb.Id);
        }
        public void CanRemoveExistingCourse()
        {
            var dummyCourse = DummyDataGenerator.CreateDummyCourse();

            ICoursesModel model = new CoursesModel();
            dummyCourse.Id = model.AddOrUpdateCourse(dummyCourse).Id;

            // Remove the dummyCourse
            model.RemoveCourse(dummyCourse.Id);

            // Check that the course was removed from the Db
            var repo = new BizCollegeRepository<Course, string>();
            var fromDb = repo.Get(dummyCourse.Id);

            Assert.IsNull(fromDb);
        }
        public void CanRemoveStudentEnrollment()
        {
            // dummy username and course id
            string username = "******";
            string courseId = Guid.NewGuid().ToString();

            // Add the dummy student enrollment via the internal repository interfaces
            var dummyEnrollment = new StudentRecord() { Username = username };
            dummyEnrollment.StudentCourseEnrollments = new List<Enrollment>();
            dummyEnrollment.StudentCourseEnrollments.Add(
                new Enrollment()
                {
                    CourseId = courseId,
                    DateStarted = DateTime.Now,
                    DateCompleted = SqlServerHelper.GetSqlServerMinimumDateTimeValue()
                }
            );
            var enrollmentsRepo = new BizCollegeRepository<StudentRecord, string>();
            dummyEnrollment = enrollmentsRepo.AddOrUpdate(dummyEnrollment);

            // Remove the enrollment via the enrollmnent model interface that the webapp
            // will use to remove a student's enrollment from their record
            IStudentEnrollmentsModel enrollmentsModel = new StudentEnrollmentsModel();
            enrollmentsModel.RemoveEnrollment(username, courseId);

            // retrieve the enrollment record from the Db and ensure the student has
            // no enrollments in his/her student record
            var fromDb = enrollmentsRepo.Get(username);

            Assert.NotNull(fromDb);
            Assert.AreEqual(fromDb.Username, username);
            Assert.AreEqual(fromDb.StudentCourseEnrollments.Count, 0);

            // clean up Db
            enrollmentsRepo.Remove(fromDb.Username);
        }
        public void CanUpdateExistingStudentEnrollmentsCollection()
        {
            // dummy username and dummy courses
            string username = "******";
            var dummyCourse1 = DummyDataGenerator.CreateDummyCourse();
            var dummyCourse2 = DummyDataGenerator.CreateDummyCourse();

            // Add the dummy courses to the database via the internal course repository interface
            IRepository<Course, string> coursesRepo = new BizCollegeRepository<Course, string>();
            dummyCourse1.Id = coursesRepo.AddOrUpdate(dummyCourse1).Id;
            dummyCourse2.Id = coursesRepo.AddOrUpdate(dummyCourse2).Id;

            // Add the dummy student enrollment via the internal enrollments repository interfaces
            var dummyEnrollment = new StudentRecord() { Username = username };
            dummyEnrollment.StudentCourseEnrollments = new List<Enrollment>();
            dummyEnrollment.StudentCourseEnrollments.Add(
                new Enrollment()
                {
                    CourseId = dummyCourse1.Id,
                    DateStarted = DateTime.Now,
                    DateCompleted = SqlServerHelper.GetSqlServerMinimumDateTimeValue()
                }
            );

            var enrollmentsRepo = new BizCollegeRepository<StudentRecord, string>();
            dummyEnrollment = enrollmentsRepo.AddOrUpdate(dummyEnrollment);

            // To update the student enrollment, we'll add another enrollment to their
            // current enrollment record (so we should have two enrollments after the update)
            IStudentEnrollmentsModel model = new StudentEnrollmentsModel();
            var updatedRecord = model.AddEnrollment(username, dummyCourse2.Id);

            Assert.NotNull(updatedRecord);
            Assert.IsNotNullOrEmpty(updatedRecord.Username);
            Assert.AreEqual(updatedRecord.Username, username);

            Assert.NotNull(updatedRecord);
            Assert.IsNotNullOrEmpty(updatedRecord.Username);
            Assert.NotNull(updatedRecord.StudentCourseEnrollments);
            Assert.AreEqual(updatedRecord.StudentCourseEnrollments.Count, 2);

            var updatedEnrollments = new List<Enrollment>(updatedRecord.StudentCourseEnrollments);
            Assert.AreEqual(updatedEnrollments[0].CourseId, dummyCourse1.Id);
            Assert.AreEqual(updatedEnrollments[1].CourseId, dummyCourse2.Id);

            // Clean up Db
            enrollmentsRepo.Remove(username);
            coursesRepo.Remove(dummyCourse1.Id);
            coursesRepo.Remove(dummyCourse2.Id);
        }
        public void CanSetStudentEnrollmentLastViewedSlide()
        {
            string username = "******";

            // Create a dummy course
            var dummyCourse = DummyDataGenerator.CreateDummyCourse();
            ICoursesModel courseModel = new CoursesModel();
            dummyCourse.Id = courseModel.AddOrUpdateCourse(dummyCourse).Id;

            // add a new enrollment for the given user and specified dummy course
            IStudentEnrollmentsModel model = new StudentEnrollmentsModel();
            StudentRecord studentEnrollmentRecord = model.AddEnrollment(username, dummyCourse.Id);

            // Simulate that the user last viewed/accessed slide 5 of the dummy course
            int lastViewedSlideIndex = 5;

            // Update the student enrollment for the dummy course with the specified last viewed slide index
            StudentRecord updatedRecord = model.SetStudentEnrollmentLastViewedSlide(username, dummyCourse.Id, lastViewedSlideIndex);

            Assert.NotNull(updatedRecord);
            Assert.AreEqual(updatedRecord.StudentCourseEnrollments[0].LastViewedSlideIndex, lastViewedSlideIndex);

            // clean up Db:  remove student record
            var enrollmentsRepo = new BizCollegeRepository<StudentRecord, string>();
            enrollmentsRepo.Remove(studentEnrollmentRecord.Username);

            // clean up Db:  remove dummy course
            var coursesRepo = new BizCollegeRepository<Course, string>();
            coursesRepo.Remove(dummyCourse.Id);
        }
        public void CanSetStudentEnrollmentCourseCompletion()
        {
            string username = "******";

            // Create a dummy course and add it to the database
            var dummyCourse = DummyDataGenerator.CreateDummyCourse();
            ICoursesModel courseModel = new CoursesModel();
            dummyCourse.Id = courseModel.AddOrUpdateCourse(dummyCourse).Id;

            // add the new enrollment for the given user and specified course
            IStudentEnrollmentsModel model = new StudentEnrollmentsModel();
            StudentRecord studentEnrollmentRecord = model.AddEnrollment(username, dummyCourse.Id);

            // set the course as completed
            model.SetStudentCourseCompletion(username, dummyCourse.Id);

            //  retrieve the record from the database and make sure that course
            // was set to complete.
            var enrollmentsRepo = new BizCollegeRepository<StudentRecord, string>();
            var fromDb = enrollmentsRepo.Get(studentEnrollmentRecord.Username);

            Assert.NotNull(fromDb);
            Assert.IsTrue(fromDb.StudentCourseEnrollments[0].WasCourseCompleted);

            // clean up Db:  remove student record
            enrollmentsRepo.Remove(studentEnrollmentRecord.Username);

            // clean up Db:  remove dummy course
            var coursesRepo = new BizCollegeRepository<Course, string>();
            coursesRepo.Remove(dummyCourse.Id);
        }