diff --git a/src/Components/test/E2ETest/Tests/SignalRClientTest.cs b/src/Components/test/E2ETest/Tests/SignalRClientTest.cs new file mode 100644 index 0000000000..aa4e82bb1d --- /dev/null +++ b/src/Components/test/E2ETest/Tests/SignalRClientTest.cs @@ -0,0 +1,51 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Linq; +using BasicTestApp; +using Microsoft.AspNetCore.Components.E2ETest.Infrastructure; +using Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures; +using Microsoft.AspNetCore.E2ETesting; +using OpenQA.Selenium; +using TestServer; +using Xunit; +using Xunit.Abstractions; + +namespace Microsoft.AspNetCore.Components.E2ETest.Tests +{ + public class SignalRClientTest : ServerTestBase>, + IClassFixture> + { + private readonly ServerFixture _apiServerFixture; + + public SignalRClientTest( + BrowserFixture browserFixture, + DevHostServerFixture devHostServerFixture, + BasicTestAppServerSiteFixture apiServerFixture, + ITestOutputHelper output) + : base(browserFixture, devHostServerFixture, output) + { + _serverFixture.PathBase = "/subdir"; + _apiServerFixture = apiServerFixture; + } + + protected override void InitializeAsyncCore() + { + Navigate(ServerPathBase); + Browser.MountTestComponent(); + Browser.Exists(By.Id("signalr-client")); + } + + [Fact] + public void SignalRClientWorks() + { + Browser.FindElement(By.Id("hub-url")).SendKeys( + new Uri(_apiServerFixture.RootUri, "/subdir/chathub").AbsoluteUri); + Browser.FindElement(By.Id("hub-connect")).Click(); + + Browser.Equal("SignalR Client: Echo", + () => Browser.FindElements(By.CssSelector("li")).FirstOrDefault()?.Text); + } + } +} diff --git a/src/Components/test/testassets/BasicTestApp/BasicTestApp.csproj b/src/Components/test/testassets/BasicTestApp/BasicTestApp.csproj index 13f08442bf..58d604dda8 100644 --- a/src/Components/test/testassets/BasicTestApp/BasicTestApp.csproj +++ b/src/Components/test/testassets/BasicTestApp/BasicTestApp.csproj @@ -16,6 +16,7 @@ + diff --git a/src/Components/test/testassets/BasicTestApp/Index.razor b/src/Components/test/testassets/BasicTestApp/Index.razor index d73fb75fbf..99379de0bd 100644 --- a/src/Components/test/testassets/BasicTestApp/Index.razor +++ b/src/Components/test/testassets/BasicTestApp/Index.razor @@ -80,6 +80,7 @@ + diff --git a/src/Components/test/testassets/BasicTestApp/SignalRClientComponent.razor b/src/Components/test/testassets/BasicTestApp/SignalRClientComponent.razor new file mode 100644 index 0000000000..3f0869ee2d --- /dev/null +++ b/src/Components/test/testassets/BasicTestApp/SignalRClientComponent.razor @@ -0,0 +1,51 @@ +@using Microsoft.AspNetCore.SignalR.Client + +

SignalR Client

+ +

This shows that the SignalR client can be used on WebAssembly.

+ +

+ Hub URL: + + +

+ +
Connected: @IsConnected
+ +
    + @foreach (var message in messages) + { +
  • @message
  • + } +
+ +@code { + private string hubUrl; + private HubConnection hubConnection; + private List messages = new List(); + + protected async Task Connect() + { + hubConnection = new HubConnectionBuilder() + .WithUrl(hubUrl) + .Build(); + + hubConnection.On("ReceiveMessage", (user, message) => + { + var encodedMsg = $"{user}: {message}"; + messages.Add(encodedMsg); + StateHasChanged(); + }); + + await hubConnection.StartAsync(); + await hubConnection.SendAsync("SendMessage", "SignalR Client", "Echo"); + } + + public bool IsConnected => + hubConnection != null && hubConnection.State == HubConnectionState.Connected; + + public ValueTask DisposeAsync() + { + return hubConnection.DisposeAsync(); + } +} diff --git a/src/Components/test/testassets/TestServer/ChatHub.cs b/src/Components/test/testassets/TestServer/ChatHub.cs new file mode 100644 index 0000000000..770f2dcaa9 --- /dev/null +++ b/src/Components/test/testassets/TestServer/ChatHub.cs @@ -0,0 +1,16 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Threading.Tasks; +using Microsoft.AspNetCore.SignalR; + +namespace TestServer +{ + public class ChatHub : Hub + { + public async Task SendMessage(string user, string message) + { + await Clients.All.SendAsync("ReceiveMessage", user, message); + } + } +} diff --git a/src/Components/test/testassets/TestServer/CorsStartup.cs b/src/Components/test/testassets/TestServer/CorsStartup.cs index 8674037117..7459d9fb86 100644 --- a/src/Components/test/testassets/TestServer/CorsStartup.cs +++ b/src/Components/test/testassets/TestServer/CorsStartup.cs @@ -18,6 +18,7 @@ namespace TestServer // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { + services.AddSignalR(); services.AddMvc(); services.AddCors(options => { @@ -50,10 +51,11 @@ namespace TestServer app.UseRouting(); - app.UseCors(); + app.UseCors("AllowAll"); app.UseEndpoints(endpoints => { + endpoints.MapHub("/chathub"); endpoints.MapControllers(); endpoints.MapFallbackToFile("index.html"); });