Example #1
0
        public void SuppliesSynchronouslyAvailableAuthStateToChildContent()
        {
            // Arrange: Service
            var services          = new ServiceCollection();
            var authStateProvider = new TestAuthenticationStateProvider()
            {
                CurrentAuthStateTask = Task.FromResult(CreateAuthenticationState("Bert"))
            };

            services.AddSingleton <AuthenticationStateProvider>(authStateProvider);

            // Arrange: Renderer and component
            var renderer  = new TestRenderer(services.BuildServiceProvider());
            var component = new UseCascadingAuthenticationStateComponent();

            // Act
            renderer.AssignRootComponentId(component);
            component.TriggerRender();

            // Assert
            var batch = renderer.Batches.Single();
            var receiveAuthStateId   = batch.GetComponentFrames <ReceiveAuthStateComponent>().Single().ComponentId;
            var receiveAuthStateDiff = batch.DiffsByComponentId[receiveAuthStateId].Single();

            Assert.Collection(receiveAuthStateDiff.Edits, edit =>
            {
                Assert.Equal(RenderTreeEditType.PrependFrame, edit.Type);
                AssertFrame.Text(
                    batch.ReferenceFrames[edit.ReferenceFrameIndex],
                    "Authenticated: True; Name: Bert; Pending: False; Renders: 1");
            });
        }
Example #2
0
        public void SuppliesAsynchronouslyAvailableAuthStateToChildContent()
        {
            // Arrange: Service
            var services = new ServiceCollection();
            var authStateTaskCompletionSource = new TaskCompletionSource <AuthenticationState>();
            var authStateProvider             = new TestAuthenticationStateProvider()
            {
                CurrentAuthStateTask = authStateTaskCompletionSource.Task
            };

            services.AddSingleton <AuthenticationStateProvider>(authStateProvider);

            // Arrange: Renderer and component
            var renderer  = new TestRenderer(services.BuildServiceProvider());
            var component = new UseCascadingAuthenticationStateComponent();

            // Act 1: Initial synchronous render
            renderer.AssignRootComponentId(component);
            component.TriggerRender();

            // Assert 1: Empty state
            var batch1 = renderer.Batches.Single();
            var receiveAuthStateFrame     = batch1.GetComponentFrames <ReceiveAuthStateComponent>().Single();
            var receiveAuthStateId        = receiveAuthStateFrame.ComponentId;
            var receiveAuthStateComponent = (ReceiveAuthStateComponent)receiveAuthStateFrame.Component;
            var receiveAuthStateDiff1     = batch1.DiffsByComponentId[receiveAuthStateId].Single();

            Assert.Collection(receiveAuthStateDiff1.Edits, edit =>
            {
                Assert.Equal(RenderTreeEditType.PrependFrame, edit.Type);
                AssertFrame.Text(
                    batch1.ReferenceFrames[edit.ReferenceFrameIndex],
                    "Authenticated: False; Name: ; Pending: True; Renders: 1");
            });

            // Act/Assert 2: Auth state fetch task completes in background
            // No new renders yet, because the cascading parameter itself hasn't changed
            authStateTaskCompletionSource.SetResult(CreateAuthenticationState("Bert"));
            Assert.Single(renderer.Batches);

            // Act/Assert 3: Refresh display
            receiveAuthStateComponent.TriggerRender();
            Assert.Equal(2, renderer.Batches.Count);
            var batch2 = renderer.Batches.Last();
            var receiveAuthStateDiff2 = batch2.DiffsByComponentId[receiveAuthStateId].Single();

            Assert.Collection(receiveAuthStateDiff2.Edits, edit =>
            {
                Assert.Equal(RenderTreeEditType.UpdateText, edit.Type);
                AssertFrame.Text(
                    batch2.ReferenceFrames[edit.ReferenceFrameIndex],
                    "Authenticated: True; Name: Bert; Pending: False; Renders: 2");
            });
        }
Example #3
0
        public void RespondsToNotificationsFromAuthenticationStateProvider()
        {
            // Arrange: Service
            var services          = new ServiceCollection();
            var authStateProvider = new TestAuthenticationStateProvider()
            {
                CurrentAuthStateTask = Task.FromResult(CreateAuthenticationState(null))
            };

            services.AddSingleton <AuthenticationStateProvider>(authStateProvider);

            // Arrange: Renderer and component, initially rendered
            var renderer  = new TestRenderer(services.BuildServiceProvider());
            var component = new UseCascadingAuthenticationStateComponent();

            renderer.AssignRootComponentId(component);
            component.TriggerRender();
            var receiveAuthStateId = renderer.Batches.Single()
                                     .GetComponentFrames <ReceiveAuthStateComponent>().Single().ComponentId;

            // Act 2: AuthenticationStateProvider issues notification
            authStateProvider.TriggerAuthenticationStateChanged(
                Task.FromResult(CreateAuthenticationState("Bert")));

            // Assert 2: Re-renders content
            Assert.Equal(2, renderer.Batches.Count);
            var batch = renderer.Batches.Last();
            var receiveAuthStateDiff = batch.DiffsByComponentId[receiveAuthStateId].Single();

            Assert.Collection(receiveAuthStateDiff.Edits, edit =>
            {
                Assert.Equal(RenderTreeEditType.UpdateText, edit.Type);
                AssertFrame.Text(
                    batch.ReferenceFrames[edit.ReferenceFrameIndex],
                    "Authenticated: True; Name: Bert; Pending: False; Renders: 2");
            });
        }