コード例 #1
0
        private static void ConfigureAutofac()
        {
            var repository = new InMemoryMovieRepository();
            var bus        = new MessageBus();

            bus.Register <CreateMovie>(x => CommandHandlers.Handle(() => bus, x));
            bus.Register <ChangeMovieTitle>(x => CommandHandlers.Handle(() => bus, x));

            bus.Register <MovieCreated>(x => EventHandlers.Handle(() => repository, x));
            bus.Register <MovieTitleChanged>(x => EventHandlers.Handle(() => repository, x));

            bus.Send(new CreateMovie(Guid.NewGuid(), "Pupl Fiction", new DateTime(1994, 1, 1), "Crime", 8.5m));

            bus.Send(new CreateMovie(Guid.NewGuid(), "From Dusk Till Dawn", new DateTime(2003, 1, 1), "Action", 8.99m));

            var builder = new ContainerBuilder();

            builder.RegisterControllers(typeof(MvcApplication).Assembly);

            builder.RegisterType <MoviesController>()
            .WithParameter("commandSender", bus)
            .WithParameter("movieQueryFacade", repository);

            var container = builder.Build();

            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        }
コード例 #2
0
        public async Task given_movie_not_found_then_FindMovie_returns_NotFoundResult(
            Guid movieId,
            InMemoryMovieRepository readerStub,
            [NoAutoProperties] QueriesController sut)
        {
            var           facade = new MovieReadModelFacade(readerStub);
            IActionResult actual = await sut.FindMovie(movieId, facade);

            actual.Should().BeOfType <NotFoundResult>();
        }
コード例 #3
0
        public async Task GetAllMovies_sort_transfer_objects_by_CreatedAt(
            ImmutableArray <Movie> entities,
            InMemoryMovieRepository readerStub)
        {
            entities.ForEach(x => readerStub.Data[x.Id] = x);
            var sut = new MovieReadModelFacade(readerStub);

            ImmutableArray <MovieDto> actual = await sut.GetAllMovies();

            actual.Should().BeInDescendingOrder(x => x.CreatedAt);
        }
コード例 #4
0
        public async Task ScreeningAdded_event_handler_add_screening_entity_correctly(
            MovieCreated movieCreated,
            Theater theater,
            InMemoryMovieRepository movieRepositoryDouble,
            InMemoryTheaterRepository theaterReaderStub,
            IFixture builder)
        {
            // Arrange
            theaterReaderStub.Data[theater.Id] = theater;

            var sut = new MovieReadModelGenerator(
                movieRepositoryDouble, theaterReaderStub);

            await sut.Handle(new Envelope(movieCreated));

            Guid movieId = movieCreated.MovieId;

            ScreeningAdded domainEvent = builder
                                         .Build <ScreeningAdded>()
                                         .With(x => x.SourceId, movieId)
                                         .With(x => x.TheaterId, theater.Id)
                                         .With(x => x.SeatRowCount, theater.SeatRowCount)
                                         .With(x => x.SeatColumnCount, theater.SeatColumnCount)
                                         .Create();

            // Act
            await sut.Handle(new Envelope(domainEvent));

            // Assert
            Movie actual = movieRepositoryDouble.Data[movieId];

            actual.Screenings
            .Should().Contain(s => s.Id == domainEvent.ScreeningId).Which
            .Should().BeEquivalentTo(new
            {
                Id = domainEvent.ScreeningId,
                domainEvent.TheaterId,
                TheaterName = theater.Name,
                Seats       =
                    from r in Enumerable.Range(0, theater.SeatRowCount)
                    from c in Enumerable.Range(0, theater.SeatColumnCount)
                    select new Seat
                {
                    Row        = r,
                    Column     = c,
                    IsReserved = false,
                },
                domainEvent.ScreeningTime,
                domainEvent.DefaultFee,
                domainEvent.ChildrenFee,
                CreatedAt = domainEvent.RaisedAt,
            });
        }
コード例 #5
0
        public async Task FindMovie_assembles_dto_correctly(
            Movie movie, InMemoryMovieRepository readerStub)
        {
            readerStub.Data[movie.Id] = movie;
            var sut = new MovieReadModelFacade(readerStub);

            MovieDto actual = await sut.FindMovie(movie.Id);

            actual.Should().BeEquivalentTo(
                expectation: movie,
                config: c => c.ExcludingMissingMembers());
        }
コード例 #6
0
        public async Task given_movie_found_then_FindMovie_returns_OkObjectResult(
            Movie movie,
            InMemoryMovieRepository readerStub,
            [NoAutoProperties] QueriesController sut)
        {
            readerStub.Data[movie.Id] = movie;
            var facade = new MovieReadModelFacade(readerStub);

            IActionResult actual = await sut.FindMovie(movie.Id, facade);

            actual.Should().BeOfType <OkObjectResult>();
        }
コード例 #7
0
        public async Task GetAllMovies_returns_transfer_objects_as_content(
            Movie[] movies,
            InMemoryMovieRepository readerStub,
            [NoAutoProperties] QueriesController sut)
        {
            movies.ForEach(t => readerStub.Data[t.Id] = t);
            var facade = new MovieReadModelFacade(readerStub);

            var actual = (OkObjectResult)await sut.GetAllMovies(facade);

            actual.Value.Should().BeEquivalentTo(await facade.GetAllMovies());
        }
コード例 #8
0
        public async Task GetAllMovies_returns_OkObjectResult(
            Movie[] movies,
            InMemoryMovieRepository readerStub,
            [NoAutoProperties] QueriesController sut)
        {
            movies.ForEach(t => readerStub.Data[t.Id] = t);
            var facade = new MovieReadModelFacade(readerStub);

            IActionResult actual = await sut.GetAllMovies(facade);

            actual.Should().BeOfType <OkObjectResult>();
        }
コード例 #9
0
        public async Task GetAllMovies_assembles_all_transfer_objects_correctly(
            ImmutableArray <Movie> movies,
            InMemoryMovieRepository readerStub)
        {
            movies.ForEach(x => readerStub.Data[x.Id] = x);
            var sut = new MovieReadModelFacade(readerStub);

            ImmutableArray <MovieDto> actual = await sut.GetAllMovies();

            actual.Should().BeEquivalentTo(
                expectation: movies,
                config: c => c.ExcludingMissingMembers());
        }
コード例 #10
0
        public async Task given_screening_not_found_then_FindScreening_returns_NotFoundResult(
            Movie movie,
            Guid screeningId,
            InMemoryMovieRepository readerStub,
            [NoAutoProperties] QueriesController sut)
        {
            readerStub.Data[movie.Id] = movie;
            var facade = new MovieReadModelFacade(readerStub);

            IActionResult actual = await
                                   sut.FindScreening(movie.Id, screeningId, facade);

            actual.Should().BeOfType <NotFoundResult>();
        }
コード例 #11
0
        public async Task MovieCreated_event_handler_creates_read_model_entity_correctly(
            MovieCreated domainEvent,
            InMemoryMovieRepository repositorySpy)
        {
            var sut = new MovieReadModelGenerator(
                repositorySpy, Mock.Of <ITheaterReader>());

            await sut.Handle(new Envelope(domainEvent));

            IDictionary <Guid, Movie> data = repositorySpy.Data;

            data.Should().ContainKey(domainEvent.MovieId);
            data[domainEvent.MovieId].Should().BeEquivalentTo(new
            {
                domainEvent.Title,
                CreatedAt = domainEvent.RaisedAt,
                ETag      = default(string),
            });
        }
コード例 #12
0
        public async Task given_movie_found_then_FindMovie_returns_transfer_object_as_content(
            Movie movie,
            InMemoryMovieRepository readerStub,
            [NoAutoProperties] QueriesController sut)
        {
            readerStub.Data[movie.Id] = movie;
            var facade = new MovieReadModelFacade(readerStub);

            IActionResult result = await sut.FindMovie(movie.Id, facade);

            object actual = result.As <OkObjectResult>().Value;

            actual.Should().BeOfType <MovieDto>();
            actual.Should().BeEquivalentTo(new
            {
                movie.Id,
                movie.Title,
                movie.CreatedAt,
            });
        }
コード例 #13
0
        private static void Start()
        {
            var repository = new InMemoryMovieRepository();
            var bus        = new MessageBus();

            bus.Register <CreateMovie>(x => CommandHandlers.Handle(() => bus, x));
            bus.Register <ChangeMovieTitle>(x => CommandHandlers.Handle(() => bus, x));

            bus.Register <MovieCreated>(x => EventHandlers.Handle(() => repository, x));
            bus.Register <MovieTitleChanged>(x => EventHandlers.Handle(() => repository, x));

            bus.Send(new CreateMovie(Guid.NewGuid(), "Pupl Fiction", new DateTime(1994, 1, 1), "Crime", 8.5m));

            bus.Send(new CreateMovie(Guid.NewGuid(), "From Dusk Till Dawn", new DateTime(2003, 1, 1), "Action", 8.99m));

            var mainWindow = new MainWindow {
                DataContext = new MovieListViewModel(bus, repository)
            };

            mainWindow.ShowDialog();
        }
コード例 #14
0
        public async Task given_screening_found_then_FindScreening_returns_transfer_object_as_content(
            Movie movie,
            InMemoryMovieRepository readerStub,
            [NoAutoProperties] QueriesController sut)
        {
            // Arrange
            readerStub.Data[movie.Id] = movie;
            var       facade    = new MovieReadModelFacade(readerStub);
            Screening screening = movie.Screenings.Shuffle().First();

            // Act
            dynamic result = await
                             sut.FindScreening(movie.Id, screening.Id, facade);

            // Assert
            object actual = result.Value;

            actual.Should().BeOfType <ScreeningDto>();
            actual.Should().BeEquivalentTo(
                expectation: screening,
                config: c => c.ExcludingMissingMembers());
        }
コード例 #15
0
        public async void ReturnMoviesFilteredByGenreId()
        {
            var movieRepository = new InMemoryMovieRepository();

            var genreRepository = new InMemoryGenreRepository();

            var useCase = new ListMovieByGenre(movieRepository, genreRepository);

            var movies = await useCase.Execute(genreId : 1);

            Assert.Collection(movies,
                              (it) =>
            {
                Assert.Equal(1, it.Id);
                Assert.Equal(1, it.Genre.Id);
            },
                              (it) =>
            {
                Assert.Equal(2, it.Id);
                Assert.Equal(1, it.Genre.Id);
            });
        }
コード例 #16
0
        static void Main(string[] args)
        {
            var repository = new InMemoryMovieRepository();
            var bus        = new MessageBus();

            bus.Register <CreateMovie>(x => CommandHandlers.Handle(() => bus, x));
            bus.Register <ChangeMovieTitle>(x => CommandHandlers.Handle(() => bus, x));

            bus.Register <MovieCreated>(x => EventHandlers.Handle(() => repository, x));
            bus.Register <MovieTitleChanged>(x => EventHandlers.Handle(() => repository, x));

            bus.Register <MovieCreated>(x => OnMovieInserted(repository));
            bus.Register <MovieTitleChanged>(x => OnTitleChanged(repository));

            bus.Send(new CreateMovie(Guid.NewGuid(), "Pupl Fiction", new DateTime(1994, 1, 1), "Crime", 8.5m));

            bus.Send(new CreateMovie(Guid.NewGuid(), "From Dusk Till Dawn", new DateTime(2003, 1, 1), "Action", 8.99m));

            var id = repository.GetAll().ElementAt(1).Id;

            bus.Send(new ChangeMovieTitle(id, "Kill Bill Vol. I"));
        }