コード例 #1
0
ファイル: MinimalApiTest.cs プロジェクト: dsuryd/dotNetify
        public void MinimalApiTest_WithAuthorizeOnAuthenticatedClient_AccessGranted()
        {
            var vmName  = "HelloWorldAccessGranted";
            var builder = WebApplication.CreateBuilder();

            builder.Services.AddDotNetify().AddSignalR();
            var app = builder.Build();

            app.MapVM(vmName, [Authorize]() => new { FirstName = "Hello", LastName = "World" });

            var vm = VMController.CreateVMInstance(vmName);

            var hubEmulator = new HubEmulatorBuilder()
                              .Register(vmName, vm)
                              .UseFilter <AuthorizeFilter>()
                              .Build();

            var identity = Stubber.Create <IIdentity>().Setup(x => x.AuthenticationType).Returns("CustomAuth").Object;
            var client   = hubEmulator.CreateClient(user: new ClaimsPrincipal(identity));

            var response = client.Connect(vmName).As <HelloWorldState>();

            Assert.AreEqual("Hello", response.FirstName);
            Assert.AreEqual("World", response.LastName);
        }
コード例 #2
0
        public ExampleSimpleListTest()
        {
            _mockData = new List <Employee>()
            {
                new Employee {
                    Id = 1, FirstName = "John", LastName = "Doe "
                },
                new Employee {
                    Id = 2, FirstName = "Jane", LastName = "Doe "
                }
            };

            var employeeRepositoryStub = Stubber.Create <IEmployeeRepository>()
                                         .Setup(x => x.GetAll(It.IsAny <int>())).Returns(_mockData)
                                         .Setup(x => x.Get(It.IsAny <int>())).Returns((int id) => _mockData.FirstOrDefault(x => x.Id == id))
                                         .Setup(x => x.Update(It.IsAny <Employee>())).Calls((Employee update) =>
            {
                var data       = _mockData.First(x => x.Id == update.Id);
                data.FirstName = update.FirstName;
                data.LastName  = update.LastName;
            })
                                         .Setup(x => x.Remove(It.IsAny <int>())).Calls((int id) => _mockData.Remove(_mockData.First(x => x.Id == id)))
                                         .Object;

            _hubEmulator = new HubEmulatorBuilder()
                           .AddServices(services => services.AddTransient(x => employeeRepositoryStub))
                           .Register <SimpleListVM>()
                           .Build();
        }
コード例 #3
0
ファイル: MinimalApiTest.cs プロジェクト: dsuryd/dotNetify
        public void MinimalApiTest_WithAuthorizeOnUnauthenticatedClient_AccessDenied()
        {
            var vmName  = "HelloWorldAccessDenied";
            var builder = WebApplication.CreateBuilder();

            builder.Services.AddDotNetify().AddSignalR();
            var app = builder.Build();

            app.MapVM(vmName, [Authorize]() => new { FirstName = "Hello", LastName = "World" });

            var vm = VMController.CreateVMInstance(vmName);

            var hubEmulator = new HubEmulatorBuilder()
                              .Register(vmName, vm)
                              .UseFilter <AuthorizeFilter>()
                              .Build();

            var identity = Stubber.Create <IIdentity>().Setup(x => x.AuthenticationType).Returns(string.Empty).Object;
            var client   = hubEmulator.CreateClient(user: null);

            var response = client.Connect(vmName);

            Assert.IsTrue(response.First().ToString().Contains(nameof(UnauthorizedAccessException)));
        }
コード例 #4
0
        private void Setup(IClientEmulator forwardingClient, IDotNetifyHubForwarderFactory hubForwarderFactory, IClientEmulator[] clients, Action <string, string> callback = null)
        {
            // Build a mock hub proxy that will be used to forward messages.  This proxy will be set to communicate to another hub emulator.
            var hubProxy = Substitute.For <IDotNetifyHubProxy>();

            hubProxy.StartAsync().Returns(Task.CompletedTask);
            hubProxy.ConnectionState.Returns(HubConnectionState.Connected);

            // When the hub proxy's Invoke method is called, call the other hub emulator's Invoke method,
            // then get the response through the client emulator connecting with that hub, and finally
            // raise the hub proxy's own Response_VM event with the response.
            hubProxy.Invoke(Arg.Any <string>(), Arg.Any <object[]>(), Arg.Any <IDictionary <string, object> >())
            .Returns(arg =>
            {
                var callType   = arg[0].ToString();
                var methodArgs = (arg[1] as object[]).Select(x =>
                {
                    if (x is string)
                    {
                        return(x);
                    }
                    if (x != null)
                    {
                        return(JObject.FromObject(x));
                    }
                    return(null);
                }).ToArray();

                var metadataString = JsonSerializer.Serialize((IDictionary <string, object>)arg[2]);
                var metadata       = Newtonsoft.Json.JsonConvert.DeserializeObject <IDictionary <string, object> >(metadataString);
                foreach (var kvp in metadata.ToList())
                {
                    metadata[kvp.Key] = kvp.Value is string?kvp.Value: JObject.FromObject(kvp.Value);
                }

                forwardingClient.Hub.InvokeAsync(callType, methodArgs, metadata).GetAwaiter().GetResult();

                var responses = forwardingClient.ResponseHistory.Select(x => x.Payload).ToArray();
                forwardingClient.ResponseHistory.Clear();
                foreach (var response in responses)
                {
                    hubProxy.Response_VM += Raise.EventWith(this,
                                                            (ResponseVMEventArgs) new InvokeResponseEventArgs
                    {
                        MethodName = response[0].ToString(),
                        MethodArgs = (response[1] as object[]).Select(x => x.ToString()).ToArray(),
                        Metadata   = (response[2] as Dictionary <string, object>).ToDictionary(x => x.Key, x => x.Value.ToString())
                    });
                }
                callback?.Invoke(callType, methodArgs[0].ToString());

                return(Task.CompletedTask);
            });

            // Build a mock hub response that will receive response back to the above hub proxy.
            var hubResponse = Stubber.Create <IDotNetifyHubResponse>()
                              .Setup(x => x.SendAsync(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>()))
                              .Returns((string connectionId, string vmId, string data) =>
            {
                var client = clients.First(x => x.ConnectionId == connectionId);
                return((client as IClientProxy).SendCoreAsync(nameof(IDotNetifyHubMethod.Response_VM), new object[] { new object[] { vmId, data } }));
            })
                              .Setup(x => x.SendToManyAsync(It.IsAny <IReadOnlyList <string> >(), It.IsAny <string>(), It.IsAny <string>()))
                              .Returns((IReadOnlyList <string> connectionIds, string vmId, string data) =>
            {
                foreach (var connectionId in connectionIds)
                {
                    var client = clients.First(x => x.ConnectionId == connectionId);
                    (client as IClientProxy).SendCoreAsync(nameof(IDotNetifyHubMethod.Response_VM), new object[] { new object[] { vmId, data } });
                }
                return(Task.CompletedTask);
            })
                              .Object;

            var hubForwarder = new DotNetifyHubForwarder(hubProxy, hubResponse);

            hubForwarderFactory.InvokeInstanceAsync(Arg.Any <string>(), Arg.Any <ForwardingOptions>(), Arg.Any <Func <DotNetifyHubForwarder, Task> >())
            .Returns((callInfo) => callInfo.Arg <Func <DotNetifyHubForwarder, Task> >().Invoke(hubForwarder));
        }