public async Task Handle_Cast_Should_OrderedDesc()
        {
            var options = new DbContextOptionsBuilder <TvMazeDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options;

            using (var context = new TvMazeDbContext(options))
            {
                // Arrange
                var show1 = context.Shows.Add(new Show(1, "1"));

                var person1 = context.Persons.Add(new Person(1, "1", null));
                var person2 = context.Persons.Add(new Person(2, "2", DateTime.Parse("1900-01-01")));
                var person3 = context.Persons.Add(new Person(3, "3", DateTime.Parse("2000-01-01")));

                context.Casts.Add(new ShowCast(show1.Entity, person1.Entity));
                context.Casts.Add(new ShowCast(show1.Entity, person2.Entity));
                context.Casts.Add(new ShowCast(show1.Entity, person3.Entity));

                context.SaveChanges();

                // Act
                var queryHandler = new PaginatedShowsQueryHandler(context);
                var result       = await queryHandler.Handle(new PaginatedShowsQuery(1, 0), CancellationToken.None);

                // Assert
                Assert.AreEqual(3, result.First().Cast.Count);
                Assert.AreEqual(3, result.First().Cast[0].ID);
                Assert.AreEqual(2, result.First().Cast[1].ID);
                Assert.AreEqual(1, result.First().Cast[2].ID);
            }
        }
예제 #2
0
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env, TvMazeDbContext tvMazeContext)
        {
            try
            {
                tvMazeContext.Database.Migrate();
                Console.WriteLine("Database migrated.");
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception.Message);
            }

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            // app.UseHttpsRedirection();

            app.UseRouting();

            app.UseSwagger();
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "Rtl TvMaze API V1");
                c.RoutePrefix = string.Empty;
            });

            app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
        }
 public CastMemberRepository(
     TvMazeDbContext dbContext,
     IMapper mapper)
 {
     this.dbContext = dbContext;
     this.mapper    = mapper;
 }
 public ScrapeRepository(
     TvMazeDbContext dbContext,
     IMapper mapper)
 {
     this.dbContext = dbContext;
     this.mapper    = mapper;
 }
        private static List <ActorDto> GetActorsToAdd(TvMazeDbContext tvMazeDbContext, IEnumerable <ActorDto> actors)
        {
            var existingActorIds = tvMazeDbContext.Set <Actor>().Select(a => a.Id).ToList();
            var actorsToAdd      = actors.Where(actor => !existingActorIds.Contains(actor.Id))
                                   .GroupBy(a => a.Id).Select(a => a.First()).ToList();

            return(actorsToAdd);
        }
        /// <inheritdoc />
        public PaginatedShowsQueryHandler(TvMazeDbContext dbContext)
        {
            // Don't use DDD infrastrucure, only simple queries over dbcontext.
            // We could use Dapper or any other approach to fetch data.
            // But we already have EF context, therefore for now it's the most convenient way.

            _dbContext = dbContext ?? throw new ArgumentNullException(nameof(dbContext));
        }
예제 #7
0
 public ScrapeTvMazeData(TvMazeDbContext dbContext, IShowsRepository showsRepository, ITvMazeApi tvMazeApi, ICastRepository castRepository, IPersonRepository personRepository)
 {
     DbContext        = dbContext;
     ShowsRepository  = showsRepository;
     TvMazeApi        = tvMazeApi;
     CastRepository   = castRepository;
     PersonRepository = personRepository;
 }
        public TvShowMassCreateHandler(TvMazeDbContext dbContext, ILogger <TvShowMassCreateHandler> logger)
        {
            _dbContext = dbContext;
            _logger    = logger;

            // this Migration step should not be here , it should happen during the CI pipline running throw console app that run as a step in the CI tasks.
            //I put it here to just build the database without send a script and make you run it , again this is not the correct place for it
            _dbContext.Database.Migrate();
        }
        private async Task <bool> CheckIfShowExist(CancellationToken stoppingToken, TvMazeDbContext tvMazeDbContext,
                                                   ShowDto show)
        {
            if (await tvMazeDbContext.Set <Show>().AnyAsync(s => s.Id == show.Id, stoppingToken))
            {
                logger.LogInformation($"Show {show.Id} - {show.Name} already exists.");
                return(true);
            }

            return(false);
        }
 private static async Task AddActors(CancellationToken stoppingToken, TvMazeDbContext tvMazeDbContext,
                                     IEnumerable <ActorDto> actorsToAdd)
 {
     await tvMazeDbContext.Set <Actor>().AddRangeAsync(actorsToAdd
                                                       .Select(actor => new Actor
     {
         Id          = actor.Id,
         Name        = actor.Name,
         DateOfBirth = actor.BirthDay
     }), stoppingToken);
 }
        private async Task WaitForDatabaseToBeReady(TvMazeDbContext tvMazeDbContext, CancellationToken stoppingToken)
        {
            while (true)
            {
                if (await tvMazeDbContext.Database.CanConnectAsync(stoppingToken))
                {
                    break;
                }

                logger.LogInformation("Waiting for Database to be ready.");
                await Task.Delay(3000, stoppingToken);
            }
        }
 private static async Task AddShow(CancellationToken stoppingToken, TvMazeDbContext tvMazeDbContext, ShowDto show,
                                   IEnumerable <ActorDto> actorsToAdd)
 {
     await tvMazeDbContext.Set <Show>().AddAsync(new Show
     {
         Id         = show.Id,
         Name       = show.Name,
         ShowActors = actorsToAdd
                      .Select(actor => new ShowActor
         {
             ShowId = show.Id, ActorId = actor.Id
         }).ToList()
     }, stoppingToken);
 }
        public void Handle_TooBigLimit_Should_Throw_ArgumentException()
        {
            var options = new DbContextOptionsBuilder <TvMazeDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options;

            using (var context = new TvMazeDbContext(options))
            {
                // Arrange
                context.Shows.Add(new Show(1, "1"));
                context.SaveChanges();

                // Act Assert
                var queryHandler = new PaginatedShowsQueryHandler(context);
                Assert.ThrowsAsync <ArgumentException>(async() => await queryHandler.Handle(new PaginatedShowsQuery(Int32.MaxValue, 0), CancellationToken.None));
            }
        }
        public async Task Handle_EmptyCast_Should_Return_EmptyCast()
        {
            var options = new DbContextOptionsBuilder <TvMazeDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options;

            using (var context = new TvMazeDbContext(options))
            {
                // Arrange
                context.Shows.Add(new Show(1, "1"));
                context.SaveChanges();

                // Act
                var queryHandler = new PaginatedShowsQueryHandler(context);
                var result       = await queryHandler.Handle(new PaginatedShowsQuery(1, 0), CancellationToken.None);

                // Assert
                Assert.AreEqual(0, result.First().Cast.Count);
            }
        }
        public async Task Handle_Cast_Should_Distinct_DupplicatedRows()
        {
            var options = new DbContextOptionsBuilder <TvMazeDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString()).Options;

            using (var context = new TvMazeDbContext(options))
            {
                // Arrange
                var show1   = context.Shows.Add(new Show(1, "1"));
                var person1 = context.Persons.Add(new Person(1, "1", null));
                context.Casts.Add(new ShowCast(show1.Entity, person1.Entity));
                context.Casts.Add(new ShowCast(show1.Entity, person1.Entity));
                context.Casts.Add(new ShowCast(show1.Entity, person1.Entity));

                context.SaveChanges();

                // Act
                var queryHandler = new PaginatedShowsQueryHandler(context);
                var result       = await queryHandler.Handle(new PaginatedShowsQuery(1, 0), CancellationToken.None);

                // Assert
                Assert.AreEqual(1, result.First().Cast.Count);
            }
        }
        private static int CalculateNextPageNumber(TvMazeDbContext tvMazeDbContext, TvMazeOptions tvMazeConfiguration)
        {
            try
            {
                var page = 0;

                if (!tvMazeDbContext.Set <Show>().Any())
                {
                    return(page);
                }

                var lastAddedShowId = tvMazeDbContext.Set <Show>().OrderBy(s => s.Id).Last().Id;

                page = Convert.ToInt32(Math.Round(lastAddedShowId / tvMazeConfiguration.MaximumNumberOfShowsPerPage,
                                                  MidpointRounding.ToZero));

                return(page);
            }
            catch (Exception)
            {
                throw;
            }
        }
 public TvShowsHandler(TvMazeDbContext dbContext)
 {
     _dbContext = dbContext;
 }
예제 #18
0
 /// <inheritdoc />
 public EfCoreShowsRepository(TvMazeDbContext dbContext)
 {
     _dbContext = dbContext;
 }
 /// <inheritdoc />
 public EfCorePersonsRepository(TvMazeDbContext dbContext)
 {
     _dbContext = dbContext;
 }
예제 #20
0
 public BookmarkDbRepository(TvMazeDbContext context)
 {
     _context = context ?? throw new ArgumentNullException(nameof(context));
 }
예제 #21
0
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, TvMazeDbContext context)
        {
            app.UseMvc();

            var hagfireOptions = new BackgroundJobServerOptions {
                WorkerCount = 1
            };

            app.UseHangfireServer(hagfireOptions);
            app.UseHangfireDashboard();
            app.UseSwagger();
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
            });

            context.Database.Migrate();
            RecurringJob.AddOrUpdate <SyncTvMazeDbJob>(job => job.ExecuteAsync(), Cron.Hourly);
        }
예제 #22
0
 public ShowsRepository(TvMazeDbContext _dbContext)
 {
     DbContext = _dbContext;
 }
 public PersonRepository(TvMazeDbContext dbContext)
 {
     DbContext = dbContext;
 }
예제 #24
0
 public TvShowRepository(TvMazeDbContext dbContext)
 {
     this._dbContext = dbContext;
 }
예제 #25
0
 public CastShowStorager(TvMazeDbContext context)
 {
     _context = context;
 }
 public ShowsService(TvMazeDbContext tvMazeDbContext)
 {
     this.tvMazeDbContext = tvMazeDbContext;
 }
예제 #27
0
 public ReadOnlyRepository(TvMazeDbContext context)
 {
     _context = context;
 }
예제 #28
0
 public CastRepository(TvMazeDbContext _dbContext)
 {
     DbContext = _dbContext;
 }
예제 #29
0
 public Repository(TvMazeDbContext context) : base(context)
 {
 }