Example #1
0
        public async Task CommitAsync_should_create_messages_from_domain_events()
        {
            await using var dbContext = _fixture.BuildDbContext();

            var studentsRepo       = new StudentsRepository(dbContext);
            var coursesRepo        = new CoursesRepository(dbContext);
            var messagesRepository = NSubstitute.Substitute.For <IMessagesRepository>();
            var eventSerializer    = NSubstitute.Substitute.For <IEventSerializer>();

            var sut = new SchoolUnitOfWork(dbContext, coursesRepo, studentsRepo, messagesRepository, eventSerializer);

            var course = new Course(Guid.NewGuid(), "course");
            await sut.CoursesRepository.CreateAsync(course, CancellationToken.None);

            var student = new Student(Guid.NewGuid(), "firstname", "lastname");

            student.Enroll(course);
            student.Complete(course);

            await sut.StudentsRepository.CreateAsync(student, CancellationToken.None);

            await sut.CommitAsync(CancellationToken.None);

            var messages = await dbContext.Messages.ToListAsync();

            messages.Should().HaveCount(2);
        }
Example #2
0
        static void UpdateTeacher()
        {
            Console.WriteLine("Update teacher...");

            // Get a teacher to update

            Teacher teacher;

            using (SchoolUnitOfWork schoolUnitOfWork = new SchoolUnitOfWork(new SchoolDbContext()))
            {
                teacher = schoolUnitOfWork.TeacherRepository.Get(p => p.LastName == "Pulling").FirstOrDefault();

                Console.WriteLine("\tBefore:: " + teacher);
            }

            // change the last name
            teacher.LastName = DateTime.Now.ToString();

            using (SchoolUnitOfWork schoolUnitOfWork = new SchoolUnitOfWork(new SchoolDbContext()))
            {
                schoolUnitOfWork.TeacherRepository.Add(teacher);
                schoolUnitOfWork.Commit();
            }

            using (SchoolUnitOfWork schoolUnitOfWork = new SchoolUnitOfWork(new SchoolDbContext()))
            {
                teacher = schoolUnitOfWork.TeacherRepository.Get(2);

                Console.WriteLine("\tAfter:: " + teacher);
            }
        }
        public async Task Handle_should_enroll_student()
        {
            await using var dbContext = _fixture.BuildDbContext();

            var student = new Student(Guid.NewGuid(), "student", "to enroll");

            dbContext.Students.Add(student);

            var course = new Course(Guid.NewGuid(), "course");

            dbContext.Courses.Add(course);

            await dbContext.SaveChangesAsync();

            //dbContext.Entry(student).State = Microsoft.EntityFrameworkCore.EntityState.Detached;
            //dbContext.Entry(course).State = Microsoft.EntityFrameworkCore.EntityState.Detached;

            var studentsRepo       = new StudentsRepository(dbContext);
            var coursesRepo        = new CoursesRepository(dbContext);
            var messagesRepository = NSubstitute.Substitute.For <IMessagesRepository>();
            var eventSerializer    = NSubstitute.Substitute.For <IEventSerializer>();

            var unitOfWork = new SchoolUnitOfWork(dbContext, coursesRepo, studentsRepo, messagesRepository, eventSerializer);

            var sut = new EnrollHandler(new FakeValidator <Enroll>(), unitOfWork);

            var command = new Enroll(course.Id, student.Id);
            await sut.Handle(command, CancellationToken.None);

            var loadedStudent = await dbContext.Students.FindAsync(student.Id);

            loadedStudent.Courses.Count.Should().Be(1);
        }
Example #4
0
        static void CleanSchool()
        {
            Console.WriteLine("\nRemoving all students and teachers...\n");

            using (SchoolUnitOfWork unitOfWork = new SchoolUnitOfWork(new SchoolDbContext()))
            {
                unitOfWork.StudentRepository.RemoveRange(unitOfWork.StudentRepository.GetAll());
                unitOfWork.TeacherRepository.RemoveRange(unitOfWork.TeacherRepository.GetAll());
                unitOfWork.Commit();
            }
        }
Example #5
0
        public virtual void ReadEntityWithOneToManyLaterAdded()
        {
            using (var collection = CreateTransactionalCollection())
            {
                using (var unitOfWork = new SchoolUnitOfWork(collection))
                {
                    unitOfWork.SchoolRepository.Save(Known.Schools.SchoolWithOneChild);
                    unitOfWork.SchoolRepository.Commit();
                }
            }

            using (var collection = CreateTransactionalCollection())
            {
                using (var unitOfWork = new SchoolUnitOfWork(collection))
                {
                    unitOfWork.ChildOnlyRepository.Count()
                    .Should().Be.EqualTo(Known.Schools.SchoolWithOneChild.Children.Count);
                }
            }
        }
Example #6
0
        public virtual void AddEntityAndGet()
        {
            using (var collection = CreateTransactionalCollection())
            {
                using (var unitOfWork = new SchoolUnitOfWork(collection))
                {
                    unitOfWork.SchoolRepository.Save(Known.Schools.School);
                    unitOfWork.SchoolRepository.Commit();
                }
            }

            using (var collection = CreateTransactionalCollection())
            {
                using (var unitOfWork = new SchoolUnitOfWork(collection))
                {
                    unitOfWork.SchoolRepository.Single()
                    .Name.Should().Be.EqualTo(Known.Schools.School.Name);
                }
            }
        }
Example #7
0
        public async Task Handle_should_create_entity()
        {
            await using var dbContext = _fixture.BuildDbContext();

            var studentsRepo       = new StudentsRepository(dbContext);
            var coursesRepo        = new CoursesRepository(dbContext);
            var messagesRepository = NSubstitute.Substitute.For <IMessagesRepository>();
            var eventSerializer    = NSubstitute.Substitute.For <IEventSerializer>();

            var unitOfWork = new SchoolUnitOfWork(dbContext, coursesRepo, studentsRepo, messagesRepository, eventSerializer);

            var sut = new CreateCourseHandler(new FakeValidator <CreateCourse>(), unitOfWork);

            var command = new CreateCourse(Guid.NewGuid(), "new course");
            await sut.Handle(command, CancellationToken.None);

            var createdCourse = await coursesRepo.FindByIdAsync(command.CourseId, CancellationToken.None);

            createdCourse.Should().NotBeNull();
            createdCourse.Id.Should().Be(command.CourseId);
            createdCourse.Title.Should().Be(command.CourseTitle);
        }
Example #8
0
        static void PopulateSchool()
        {
            Console.WriteLine("\nAdding students and teachers...\n");

            using (SchoolUnitOfWork schoolUnitOfWork = new SchoolUnitOfWork(new SchoolDbContext()))
            {
                Teacher teacher1 = new Teacher()
                {
                    FirstName = "Mathew", LastName = "Ernsto"
                };

                teacher1.Students.Add(new Student()
                {
                    FirstName = "Michael", LastName = "Wong"
                });
                teacher1.Students.Add(new Student()
                {
                    FirstName = "Janice", LastName = "Song"
                });
                teacher1.Students.Add(new Student()
                {
                    FirstName = "Jules", LastName = "Bong"
                });

                schoolUnitOfWork.TeacherRepository.Add(teacher1);

                Teacher teacher2 = new Teacher()
                {
                    FirstName = "Susan", LastName = "Pulling"
                };

                teacher2.Students.Add(new Student()
                {
                    FirstName = "Debra", LastName = "Stafford"
                });
                teacher2.Students.Add(new Student()
                {
                    FirstName = "Millie", LastName = "Himpton"
                });
                teacher2.Students.Add(new Student()
                {
                    FirstName = "Jill", LastName = "Abbie"
                });

                schoolUnitOfWork.TeacherRepository.Add(teacher2);

                schoolUnitOfWork.Commit();

                Console.WriteLine("\nteacherRepo.FindById({0})", teacher1.TeacherId);
                teacher1 = schoolUnitOfWork.TeacherRepository.Get(teacher1.TeacherId);
                Console.WriteLine(teacher1);

                Console.WriteLine("Removing teacher with id = {0}", teacher1.TeacherId);
                schoolUnitOfWork.TeacherRepository.Remove(teacher1);

                Console.WriteLine("\nteacherRepo.Find(p => p.FirstName.Contains(\"a\"):");
                var listOfTeachers = schoolUnitOfWork.TeacherRepository.Get(p => p.FirstName.Contains("a"));

                foreach (Teacher t in listOfTeachers)
                {
                    Console.WriteLine(t);
                }

                Console.WriteLine("\nList of all students:");
                foreach (Student s in schoolUnitOfWork.StudentRepository.GetAll())
                {
                    Console.WriteLine(s);
                }


                var teacherWithStudents = schoolUnitOfWork.TeacherRepository.GetTeacherAndStudents(teacher2.TeacherId);

                Console.WriteLine("\n{0} with students", teacher2);

                foreach (Student s in teacher2.Students)
                {
                    Console.WriteLine(string.Format("\t{0}", s));
                }
            }
        }