Exemplo n.º 1
0
        public static void CreateTestHost(string userName, IEnumerable <Claim> claims, string url, TestServer sut, ITestOutputHelper testOutputHelper, out TestHost host, out MockHttpMessageHandler mockHttp)
        {
            var navigationInterceptionMock = new Mock <INavigationInterception>();
            var jsRuntimeMock = new Mock <IJSRuntime>();

            host = new TestHost();
            var httpMock = host.AddMockHttp();

            mockHttp = httpMock;
            var localizerMock = new Mock <ISharedStringLocalizerAsync>();

            localizerMock.Setup(m => m[It.IsAny <string>()]).Returns((string key) => new LocalizedString(key, key));
            localizerMock.Setup(m => m[It.IsAny <string>(), It.IsAny <object[]>()]).Returns((string key, object[] p) => new LocalizedString(key, string.Format(key, p)));

            host.ConfigureServices(services =>
            {
                var httpClient       = sut.CreateClient();
                var appConfiguration = CreateApplicationConfiguration(httpClient);

                WebAssemblyHostBuilderExtensions.ConfigureServices(services, appConfiguration, appConfiguration.Get <Settings>(), httpClient.BaseAddress.ToString());

                sut.Services.GetRequiredService <TestUserService>()
                .SetTestUser(true, claims.Select(c => new Claim(c.Type, c.Value)));

                services
                .AddLogging(configure =>
                {
                    configure.AddProvider(new TestLoggerProvider(testOutputHelper));
                })
                .AddTransient(p => sut.CreateHandler())
                .AddIdentityServer4AdminHttpStores(p =>
                {
                    var client = new HttpClient(new BaseAddressAuthorizationMessageHandler(p.GetRequiredService <IAccessTokenProvider>(),
                                                                                           p.GetRequiredService <NavigationManager>())
                    {
                        InnerHandler = sut.CreateHandler()
                    })
                    {
                        BaseAddress = new Uri(httpClient.BaseAddress, "api")
                    };
                    return(Task.FromResult(client));
                })
                .AddSingleton(p => new TestNavigationManager(uri: url))
                .AddSingleton <NavigationManager>(p => p.GetRequiredService <TestNavigationManager>())
                .AddSingleton(p => navigationInterceptionMock.Object)
                .AddSingleton(p => jsRuntimeMock.Object)
                .AddSingleton <Settings>()
                .AddSingleton(localizerMock.Object)
                .AddSingleton <SignOutSessionStateManager, FakeSignOutSessionStateManager>()
                .AddSingleton <IAccessTokenProviderAccessor, AccessTokenProviderAccessor>()
                .AddSingleton <IAccessTokenProvider>(p => p.GetRequiredService <FakeAuthenticationStateProvider>())
                .AddSingleton <AuthenticationStateProvider>(p => p.GetRequiredService <FakeAuthenticationStateProvider>())
                .AddSingleton(p => new FakeAuthenticationStateProvider(p.GetRequiredService <NavigationManager>(),
                                                                       userName,
                                                                       claims));
            });
        }
Exemplo n.º 2
0
        public NotAuthorizedHandlerTests()
        {
            _authenticationStateProvider = new Mock <AuthenticationStateProvider>();
            _testNavigationManager       = new TestNavigationManager();
            _testNavigationManager.SetInitialized();

            testHost.ConfigureServices(services =>
            {
                services.AddLogging();
                services.AddAuthorization(options =>
                {
                    options.AddPolicy("RequireAdmin", c => c.RequireRole("Admin"));
                });
                services.AddSingleton <NavigationManager>(_testNavigationManager);
                services.AddSingleton <AuthenticationStateProvider>(_authenticationStateProvider.Object);
            });
        }
Exemplo n.º 3
0
        public async Task ToggleNavMenu_should_update_nav_menu_class()
        {
            var navigationInterceptionMock = new Mock <INavigationInterception>();

            using var host = new TestHost();
            host.ConfigureServices(services =>
            {
                services.AddSingleton <NavigationManager, TestNavigationManager>()
                .AddSingleton(p => navigationInterceptionMock.Object);
            });

            var component = host.AddComponent <NavMenu>();

            var div = component.Find("div.collapse");

            Assert.NotNull(div);

            await host.WaitForNextRenderAsync(() => div.ClickAsync());

            Assert.Null(component.Find("div.collapse"));
        }
Exemplo n.º 4
0
        public static void CreateTestHost(string userName, IEnumerable <Claim> claims, string url, TestServer sut, ITestOutputHelper testOutputHelper, out TestHost host, out MockHttpMessageHandler mockHttp)
        {
            var navigationInterceptionMock = new Mock <INavigationInterception>();
            var jsRuntimeMock = new Mock <IJSRuntime>();

            host = new TestHost();
            var httpMock = host.AddMockHttp();

            mockHttp = httpMock;
            host.ConfigureServices(services =>
            {
                blazorApp.Program.ConfigureServices(services);
                var httpClient = sut.CreateClient();

                sut.Services.GetRequiredService <TestUserService>()
                .SetTestUser(true, claims.Select(c => new Claim(c.Type, c.Value)));

                services
                .AddLogging(configure =>
                {
                    configure.AddProvider(new TestLoggerProvider(testOutputHelper));
                })
                .AddIdentityServer4AdminHttpStores(p =>
                {
                    var client         = new HttpClient(new blazorApp.OidcDelegationHandler(p.GetRequiredService <IAccessTokenProvider>(), sut.CreateHandler()));
                    client.BaseAddress = new Uri(httpClient.BaseAddress, "api");
                    return(Task.FromResult(client));
                })
                .AddSingleton(p => new TestNavigationManager(uri: url))
                .AddSingleton <NavigationManager>(p => p.GetRequiredService <TestNavigationManager>())
                .AddSingleton(p => navigationInterceptionMock.Object)
                .AddSingleton(p => jsRuntimeMock.Object)
                .AddSingleton <Settings>()
                .AddSingleton <SignOutSessionStateManager, FakeSignOutSessionStateManager>()
                .AddSingleton <AuthenticationStateProvider>(p => new FakeAuthenticationStateProvider(userName, claims));
            });
        }
Exemplo n.º 5
0
        private static void NavigateToLoginPage(TestLoggerProvider testLoggerProvider, TestServer server, IServiceScope scope, ConcurrentDictionary <object, object> sessionStore, out HttpClient httpClient, out string redirectUri)
        {
            SeedData.SeedUsers(scope);
            SeedData.SeedConfiguration(scope);

            using var host = new TestHost();
            var jsRuntimeMock = new Mock <IJSRuntime>();
            var navigationInterceptionMock = new Mock <INavigationInterception>();
            var navigationManager          = new TestNavigationManager(uri: "http://exemple.com");

            var client = server.CreateClient();

            httpClient = client;

            host.ConfigureServices(services =>
            {
                blazorApp.Program.ConfigureServices(services);
                services
                .AddLogging(configure =>
                {
                    configure.AddProvider(testLoggerProvider);
                })
                .AddIdentityServer4AdminHttpStores(p => Task.FromResult(client))
                .AddSingleton(p => navigationManager)
                .AddSingleton <NavigationManager>(p => p.GetRequiredService <TestNavigationManager>())
                .AddSingleton(p => jsRuntimeMock.Object)
                .AddSingleton(p => navigationInterceptionMock.Object);
            });

            var httpMock = host.AddMockHttp();

            httpMock.Fallback.Respond(httpClient);
            jsRuntimeMock.Setup(m => m.InvokeAsync <object>("sessionStorage.setItem", It.IsAny <object[]>()))
            .Callback <string, object[]>((_, array) => sessionStore.AddOrUpdate(array[0], array[1], (k, v) => array[1]))
            .ReturnsAsync(null);

            string navigatedUri = null;
            var    waitHandle   = new ManualResetEvent(false);

            navigationManager.OnNavigateToCore = (uri, f) =>
            {
                navigatedUri = uri;
                waitHandle.Set();
            };

            var settingsRequest = httpMock.Capture("/settings.json");
            var component       = host.AddComponent <blazorApp.App>();

            var markup = component.GetMarkup();

            Assert.Contains("Authentication in progress", markup);

            host.WaitForNextRender(() =>
            {
                settingsRequest.SetResult(new
                {
                    ClientId = "theidserveradmin",
                    Scope    = "openid profile theidserveradminapi"
                });
            });

            host.WaitForContains(component, "You are redirecting to the login page. please wait");

            WaitForHttpResponse(waitHandle);

            redirectUri = navigatedUri;
        }
Exemplo n.º 6
0
        private static void OpenLogggedPage(TestLoggerProvider testLoggerProvider, HttpClient httpClient, ConcurrentDictionary <object, object> sessionStore, string location)
        {
            using var host = new TestHost();
            var jsRuntimeMock = new Mock <IJSRuntime>();
            var navigationInterceptionMock = new Mock <INavigationInterception>();
            var navigationManager          = new TestNavigationManager(uri: location);

            host.ConfigureServices(services =>
            {
                blazorApp.Program.ConfigureServices(services);
                services
                .AddLogging(configure =>
                {
                    configure.AddProvider(testLoggerProvider);
                })
                .AddIdentityServer4AdminHttpStores(p => Task.FromResult(httpClient))
                .AddSingleton(p => navigationManager)
                .AddSingleton <NavigationManager>(p => p.GetRequiredService <TestNavigationManager>())
                .AddSingleton(p => jsRuntimeMock.Object)
                .AddSingleton(p => navigationInterceptionMock.Object);
            });

            var httpMock = host.AddMockHttp();

            httpMock.Fallback.Respond(httpClient);

            foreach (var key in sessionStore.Keys)
            {
                jsRuntimeMock.Setup(m => m.InvokeAsync <string>("sessionStorage.getItem", It.Is <object[]>(p => p[0].ToString() == key.ToString())))
                .ReturnsAsync <string, object[], IJSRuntime, string>((_, array) =>
                {
                    if (sessionStore.TryGetValue(array[0], out object value))
                    {
                        return((string)value);
                    }
                    throw new InvalidOperationException($"sessionStore doesn't contain key {key}");
                });
            }

            string navigatedUri = null;
            var    waitHandle   = new ManualResetEvent(false);

            navigationManager.OnNavigateToCore = (uri, f) =>
            {
                navigatedUri = uri;
                waitHandle.Set();
            };

            var settingsRequest = httpMock.Capture("/settings.json");
            var component       = host.AddComponent <blazorApp.App>();

            var markup = component.GetMarkup();

            Assert.Contains("Authentication in progress", markup);

            host.WaitForNextRender(() =>
            {
                settingsRequest.SetResult(new
                {
                    ClientId = "theidserveradmin",
                    Scope    = "openid profile theidserveradminapi"
                });
            });


            WaitForHttpResponse(waitHandle);

            Assert.Equal("http://exemple.com", navigatedUri);
        }