public void Supplied_by_immutable_instance()
        {
            var clientConfiguration = new Abstractions.Immutable.ClientConfiguration(
                new Abstractions.Immutable.ClientApiKeyConfiguration(
                    file: null,
                    id: "modified-foobar",
                    secret: "modified-barbaz"),

                cacheManager: new Abstractions.Immutable.ClientCacheManagerConfiguration(
                    enabled: false,
                    defaultTimeToLive: 500,
                    defaultTimeToIdle: 600,
                    caches: new Dictionary<string, Abstractions.Immutable.ClientCacheConfiguration>()
                    {
                        ["application"] = new Abstractions.Immutable.ClientCacheConfiguration(timeToLive: 450, timeToIdle: 700),
                        ["directory"] = new Abstractions.Immutable.ClientCacheConfiguration(timeToLive: 200, timeToIdle: 300)
                    }),

                baseUrl: "https://api.foo.com/v1",
                connectionTimeout: 90,
                authenticationScheme: ClientAuthenticationScheme.Basic,

                proxy: new Abstractions.Immutable.ClientProxyConfiguration(
                    port: 8088,
                    host: "proxy.foo.bar",
                    username: "******",
                    password: "******"
                )
            );

            var applicationConfiguration = new Abstractions.Immutable.ApplicationConfiguration(
                name: "Lightsabers Galore",
                href: "https://api.foo.com/v1/applications/foo");

            var webConfiguration = new Abstractions.Immutable.WebConfiguration(
                serverUri: "https://localhost:9000",
                basePath: "#/",

                oauth2Route: new Abstractions.Immutable.WebOauth2RouteConfiguration(
                    enabled: false,
                    uri: "/oauth2/token",
                    clientCredentialsGrant: new Abstractions.Immutable.WebOauth2ClientCredentialsGrantConfiguration(
                        enabled: false,
                        accessToken: new Abstractions.Immutable.WebOauth2TokenConfiguration(timeToLive: 3601)
                    ),
                    passwordGrant: new Abstractions.Immutable.WebOauth2PasswordGrantConfiguration(
                        enabled: false,
                        validationStrategy: WebOauth2TokenValidationStrategy.Stormpath)
                ),

                accessTokenCookie: new Abstractions.Immutable.WebCookieConfiguration(
                    name: "accessToken",
                    httpOnly: false,
                    secure: false,
                    path: "/bar",
                    domain: "foo.bar"),

                refreshTokenCookie: new Abstractions.Immutable.WebCookieConfiguration(
                    name: "refreshToken",
                    httpOnly: false,
                    secure: true,
                    path: "/foo",
                    domain: "baz.qux"),

                produces: new List<string>()
                {
                    "foo/bar",
                },

                registerRoute: new Abstractions.Immutable.WebRegisterRouteConfiguration(
                    enabled: false,
                    uri: "/register1",
                    nextUri: "/1",
                    autoLogin: true,
                    view: "registerView",
                    form: new Abstractions.Immutable.WebRegisterRouteFormConfiguration(
                        fields: new Dictionary<string, Abstractions.Immutable.WebFieldConfiguration>()
                        {
                            ["email"] = new Abstractions.Immutable.WebFieldConfiguration(
                                enabled: false,
                                visible: false,
                                label: "I Can Has Email",
                                placeholder: "Can Has?",
                                required: false,
                                type: "text")
                        },
                        fieldOrder: new List<string>()
                        {
                            "email",
                            "hidden",
                        })
                    ),

                verifyRoute: new Abstractions.Immutable.WebVerifyEmailRouteConfiguration(
                    enabled: true,
                    uri: "/verify1",
                    nextUri: "/login2",
                    view: "verifyView"),

                loginRoute: new Abstractions.Immutable.WebLoginRouteConfiguration(
                    enabled: false,
                    uri: "/login3",
                    nextUri: "/3",
                    view: "loginView",
                    form: new Abstractions.Immutable.WebLoginRouteFormConfiguration(
                        fields: new Dictionary<string, Abstractions.Immutable.WebFieldConfiguration>()
                        {
                            ["password"] = new Abstractions.Immutable.WebFieldConfiguration(
                                enabled: false,
                                visible: false,
                                label: "Password?",
                                placeholder: "Maybe",
                                required: false,
                                type: "email")
                        },
                        fieldOrder: new List<string>()
                        {
                            "password",
                        })
                    ),

                logoutRoute: new Abstractions.Immutable.WebLogoutRouteConfiguration(
                    enabled: false,
                    uri: "/logout4",
                    nextUri: "/4"),

                forgotPasswordRoute: new Abstractions.Immutable.WebForgotPasswordRouteConfiguration(
                    enabled: true,
                    uri: "/forgot5",
                    view: "forgot-password-view",
                    nextUri: "/login?status=forgot!"),

                changePasswordRoute: new Abstractions.Immutable.WebChangePasswordRouteConfiguration(
                    enabled: true,
                    uri: "/change6",
                    nextUri: "/login?status=reset?",
                    view: "change-password-view",
                    errorUri: "/forgot?status=invalid_sptoken:("),

                idSite: new Abstractions.Immutable.WebIdSiteConfiguration(
                    enabled: true,
                    loginUri: "/456",
                    forgotUri: "/#/forgot789",
                    registerUri: "/#/register0"),

                callbackRoute: new Abstractions.Immutable.WebCallbackRouteConfiguration(
                    enabled: false,
                    uri: "/stormpath-callback"),

                social: new Dictionary<string, Abstractions.Immutable.WebSocialProviderConfiguration>()
                {
                    ["facebook"] = new Abstractions.Immutable.WebSocialProviderConfiguration("/callbackz/facebook", "email birthday"),
                    ["github"] = new Abstractions.Immutable.WebSocialProviderConfiguration("/callbackz/github", "user:everything"),
                    ["google"] = new Abstractions.Immutable.WebSocialProviderConfiguration("/callbackz/google", "email profile friends"),
                    ["linkedin"] = new Abstractions.Immutable.WebSocialProviderConfiguration("/callbackz/linkedin", "email interests")
                },

                meRoute: new Abstractions.Immutable.WebMeRouteConfiguration(
                    expand: new Dictionary<string, bool>()
                    {
                        ["directory"] = true
                    },
                    enabled: false,
                    uri: "/myself")
            );

            var stormpathConfiguration = new Abstractions.Immutable.StormpathConfiguration(
                clientConfiguration,
                applicationConfiguration,
                webConfiguration);

            var config = ConfigurationLoader.Initialize().Load(stormpathConfiguration);

            ValidateConfig(config);
        }
        public void Copied_default_dictionaries_are_case_insensitive()
        {
            var config = new Abstractions.Immutable.StormpathConfiguration(Default.Configuration);

            config.Web.Social["Facebook"].Uri.Should().Be("/callbacks/facebook");
        }