public void Test_GetMethodMetadata_UsesSerializerAndMethodOptions(Type serializerType) { var actionName = "actionName"; var controllerName = "controllerName"; var serializer = testEnvironment.ServiceProvider.GetRequiredService(serializerType) as IJsonRpcSerializer; var controllerModel = new Mock <ControllerModel>(typeof(JsonRpcTestController).GetTypeInfo(), new List <object> { }).Object; var model = new Mock <ActionModel>(typeof(JsonRpcTestController).GetMethod(nameof(JsonRpcTestController.VoidAction)), new List <object>()).Object; model.Controller = controllerModel; model.ActionName = actionName; model.Controller.ControllerName = controllerName; var options = new JsonRpcOptions(); var actionConvention = GetActionConvention(options); var methodOptions = new JsonRpcMethodOptions() { RequestSerializer = serializerType }; var result = actionConvention.GetMethodMetadata(model, methodOptions); result.Action.Should().BeEquivalentTo(serializer.GetJsonName(actionName)); result.Controller.Should().BeEquivalentTo(serializer.GetJsonName(controllerName)); result.MethodOptions.Should().NotBe(options.DefaultMethodOptions); result.MethodOptions.Should().Be(methodOptions); }
public ActionConvention(IOptions <JsonRpcOptions> options, IEnumerable <IJsonRpcSerializer> serializers, IMethodMatcher methodMatcher, IJsonRpcRoutes jsonRpcRoutes, ILogger <ActionConvention> log) { this.serializers = serializers; this.methodMatcher = methodMatcher; this.jsonRpcRoutes = jsonRpcRoutes; this.log = log; defaultMethodOptions = options.Value.DefaultMethodOptions; }
public void Test_JsonRpcMethodOptions_Defaults() { var options = new JsonRpcMethodOptions(); options.Route.Value.Should().Be(JsonRpcConstants.DefaultRoute); options.MethodStyle.Should().Be(MethodStyle.ControllerAndAction); options.RequestSerializer.Should().Be <SnakeCaseJsonRpcSerializer>(); }
internal MethodMetadata GetMethodMetadata(ActionModel actionModel, JsonRpcMethodOptions methodOptions) { var serializer = Utils.GetSerializer(serializers, methodOptions.RequestSerializer); var controllerName = serializer.GetJsonName(actionModel.Controller.ControllerName); var actionName = serializer.GetJsonName(actionModel.ActionName); var result = new MethodMetadata(methodOptions, controllerName, actionName); log.LogTrace($"{actionModel.DisplayName}: metadata [{result}]"); return(result); }
/// <summary> /// Replace framework conventions with explicit route and action selector /// </summary> /// <param name="actionModel"></param> /// <param name="methodOptions"></param> internal void SetAttributes(ActionModel actionModel, JsonRpcMethodOptions methodOptions) { actionModel.Selectors.Clear(); actionModel.Selectors.Add(new SelectorModel() { AttributeRouteModel = new AttributeRouteModel() { Template = methodOptions.Route }, ActionConstraints = { new JsonRpcAttribute(), new HttpMethodActionConstraint(new [] { HttpMethods.Post }) } // TODO может, оставить? }); log.LogTrace($"{actionModel.DisplayName}: applied {nameof(JsonRpcAttribute)}, route [{methodOptions.Route}]"); }
public void Test_BindModelAsync_UsesParserAndBinder() { var jsonRpcMethodOptions = new JsonRpcMethodOptions(); var methodMetadata = new MethodMetadata(jsonRpcMethodOptions, new JsonName("test", "test"), new JsonName("test", "test")); var parameterMetadata = new ParameterMetadata(new JsonName("test", "test"), typeof(object), 0, BindingStyle.Default, false); methodMetadata.Add(parameterMetadata); var name = "test"; var bindingContextMock = MockContext(methodMetadata: methodMetadata, name: name); var binder = testEnvironment.ServiceProvider.GetRequiredService <JsonRpcModelBinder>(); binder.BindModelAsync(bindingContextMock.Object).GetAwaiter().GetResult(); Mock.Get(testEnvironment.ServiceProvider.GetService <IParamsParser>()) .Verify(x => x.ParseParams(It.IsAny <JToken>(), parameterMetadata), Times.Once); Mock.Get(testEnvironment.ServiceProvider.GetService <IParameterBinder>()) .Verify(x => x.SetResult(bindingContextMock.Object, It.IsAny <IParseResult>(), name, It.IsAny <JsonRpcBindingContext>()), Times.Once); }
public void Test_GetRpcBindingContext_ThrowsOnNoSerializer() { var jsonRpcMethodOptions = new JsonRpcMethodOptions() { RequestSerializer = typeof(CamelCaseJsonRpcSerializer) }; var methodMetadata = new MethodMetadata(jsonRpcMethodOptions, new JsonName("test", "test"), new JsonName("test", "test")); methodMetadata.Add(new ParameterMetadata(new JsonName("test", "test"), typeof(object), 0, BindingStyle.Default, false)); var bindingContextMock = MockContext(methodMetadata: methodMetadata); var binder = testEnvironment.ServiceProvider.GetRequiredService <JsonRpcModelBinder>(); Action action = () => binder.GetRpcBindingContext(bindingContextMock.Object, "test"); action.Should().Throw <InvalidOperationException>(); bindingContextMock.VerifyGet(x => x.HttpContext); bindingContextMock.VerifyGet(x => x.ActionContext); bindingContextMock.VerifyGet(x => x.HttpContext.RequestServices); }
public void Test_GetRpcBindingContext_ReturnsValue() { var jsonRpcMethodOptions = new JsonRpcMethodOptions(); var methodMetadata = new MethodMetadata(jsonRpcMethodOptions, new JsonName("test", "test"), new JsonName("test", "test")); var parameterMetadata = new ParameterMetadata(new JsonName("test", "test"), typeof(object), 0, BindingStyle.Default, false); methodMetadata.Add(parameterMetadata); var bindingContextMock = MockContext(methodMetadata: methodMetadata); var binder = testEnvironment.ServiceProvider.GetRequiredService <JsonRpcModelBinder>(); var result = binder.GetRpcBindingContext(bindingContextMock.Object, "test"); bindingContextMock.VerifyGet(x => x.HttpContext); bindingContextMock.VerifyGet(x => x.ActionContext); bindingContextMock.VerifyGet(x => x.HttpContext.RequestServices); result.Should().NotBeNull(); result.Call.Should().Be(Mock.Get(result.Call).Object); result.ParameterMetadata.Should().Be(parameterMetadata); result.Serializer.Should().BeOfType(jsonRpcMethodOptions.RequestSerializer); }
public MethodMetadata(JsonRpcMethodOptions methodOptions, JsonName controller, JsonName action) { MethodOptions = methodOptions; Controller = controller ?? throw new ArgumentNullException(nameof(controller)); Action = action ?? throw new ArgumentNullException(nameof(action)); }