public SchemesQuerySpec()
 {
     this.testAccessor = Substitute.For <ISchemesReadModelAccessor>();
     this.testServer   = new TestServer(new WebHostBuilder()
                                        .ConfigureServices(services => services.AddAutofac())
                                        .ConfigureTestServices(services => services
                                                               .AddSingleton <ISchemesReadModelAccessor>(this.testAccessor))
                                        .UseSetting(nameof(ElasticSearchConfig.ELASTIC_SEARCH_CLIENT_URL), "http://test.com")
                                        .UseSetting(nameof(CorsConfig.ALLOWED_ORIGINS), "http://localhost")
                                        .UseSetting(nameof(AuthConfig.NoErrors), true.ToString())
                                        .UseSetting(nameof(ScreenshotsConfig.SCREENSHOT_SIZES), "test")
                                        .UseSetting(nameof(ScreenshotsConfig.SCREENSHOT_URL_TITLES), "test")
                                        .UseSetting(nameof(ScreenshotsConfig.SCREENSHOT_CDN_ID_TEMPLATE), "test")
                                        .UseSetting(nameof(ScreenshotsConfig.SCREENSHOT_CDN_URL_TEMPLATE), "test")
                                        .UseSetting(nameof(ElasticSearchConfig.ELASTIC_SEARCH_SCHEMES_READ_MODEL_INDEX_NAME), "test")
                                        .UseSetting(nameof(ElasticSearchConfig.ELASTIC_SEARCH_SCHEMES_READ_MODEL_TYPE_NAME), "test")
                                        .UseStartup <StartupStub>());
     this.testClient = this.testServer.CreateClient();
     this.testScheme = new PublicScheme
     {
         Id            = "test-public-scheme-id",
         Name          = "test-color-scheme",
         PublisherName = "test-publisher",
         PublisherId   = "test-publisher-id",
         Likes         = 1,
         LikedBy       = new[] { this.testUserId },
         Favorites     = 1,
         FavoritedBy   = new[] { this.testUserId },
         ColorScheme   = new ColorScheme
         {
             colorSchemeId            = "-",
             colorSchemeName          = "-",
             mode                     = "auto",
             scrollbarStyle           = "true",
             backgroundLightnessLimit = 42,
             hideBigBackgroundImages  = true,
             maxBackgroundImageSize   = 500
         }
     };
 }
        public SchemesQuery(ISchemesReadModelAccessor accessor)
        {
            this.Name = "Schemes";

            this.FieldAsync <PublicSchemeType, PublicScheme>(
                "details", "Get Midnight Lizard's color scheme details",
                new QueryArguments(new QueryArgument <IdGraphType> {
                Name = nameof(PublicScheme.Id)
            }),
                resolve: async context => await accessor.ReadModelAsync(
                    context.Arguments[this.ToCamelCase(nameof(PublicScheme.Id))] as string));

            this.FieldAsync <SchemesSearchResultsType, SearchResults <PublicScheme> >(
                "search", "Search Midnight Lizard's color schemes",
                new QueryArguments(
                    new QueryArgument <SchemeListEnum> {
                Name = nameof(SearchOptions.List), DefaultValue = SchemeList.full.ToString()
            },
                    new QueryArgument <SchemeSideEnum> {
                Name = nameof(SearchOptions.Side), DefaultValue = SchemeSide.any.ToString()
            },
                    new QueryArgument <HueFilterEnum> {
                Name = nameof(SearchOptions.Bg), DefaultValue = HueFilter.any.ToString()
            },
                    new QueryArgument <StringGraphType> {
                Name = nameof(SearchOptions.Query), DefaultValue = ""
            },
                    new QueryArgument <IdGraphType> {
                Name = nameof(SearchOptions.CurrentUserId), DefaultValue = ""
            },
                    new QueryArgument <IntGraphType> {
                Name = nameof(SearchOptions.PageSize), DefaultValue = 10
            },
                    new QueryArgument <StringGraphType> {
                Name = nameof(SearchOptions.Cursor), DefaultValue = ""
            },
                    new QueryArgument <IdGraphType>
            {
                Name         = nameof(SearchOptions.PublisherId),
                Description  = $@"This argument is deprecated. Use [{
                            this.ToCamelCase(nameof(SearchOptions.CurrentUserId))}] instead",
                DefaultValue = ""
            }
                    ),
                resolve: async context =>
            {
                var currentUserId = context.Arguments[this.ToCamelCase(nameof(SearchOptions.CurrentUserId))] as string;
                if (string.IsNullOrEmpty(currentUserId))
                {
                    currentUserId = context.Arguments[this.ToCamelCase(nameof(SearchOptions.PublisherId))] as string;
                }
                return(await accessor.SearchSchemesAsync(new SearchOptions(
                                                             list: Enum.Parse <SchemeList>(context.Arguments[this.ToCamelCase(nameof(SearchOptions.List))].ToString()),
                                                             side: Enum.Parse <SchemeSide>(context.Arguments[this.ToCamelCase(nameof(SearchOptions.Side))].ToString()),
                                                             bg: Enum.Parse <HueFilter>(context.Arguments[this.ToCamelCase(nameof(SearchOptions.Bg))].ToString()),
                                                             query: context.Arguments[this.ToCamelCase(nameof(SearchOptions.Query))] as string,
                                                             pageSize: Math.Min((int)context.Arguments[this.ToCamelCase(nameof(SearchOptions.PageSize))], 1000),
                                                             cursor: context.Arguments[this.ToCamelCase(nameof(SearchOptions.Cursor))] as string,
                                                             currentUserId: currentUserId
                                                             ), context.CancellationToken));
            });
        }