public async Task BindAsync_Poco_FromRouteParameters() { ParameterInfo parameterInfo = GetType().GetMethod("TestPocoFunction").GetParameters()[0]; HttpTriggerAttributeBindingProvider.HttpTriggerBinding binding = new HttpTriggerAttributeBindingProvider.HttpTriggerBinding(new HttpTriggerAttribute(), parameterInfo, true); HttpRequest request = HttpTestHelpers.CreateHttpRequest("GET", "http://functions/myfunc"); Dictionary <string, object> routeData = new Dictionary <string, object> { { "Name", "Mathew Charles" }, { "Location", "Seattle" } }; request.HttpContext.Items.Add(HttpExtensionConstants.AzureWebJobsHttpRouteDataKey, routeData); FunctionBindingContext functionContext = new FunctionBindingContext(Guid.NewGuid(), CancellationToken.None); ValueBindingContext context = new ValueBindingContext(functionContext, CancellationToken.None); ITriggerData triggerData = await binding.BindAsync(request, context); Assert.Equal(5, triggerData.BindingData.Count); Assert.Equal("Mathew Charles", triggerData.BindingData["Name"]); Assert.Equal("Seattle", triggerData.BindingData["Location"]); TestPoco testPoco = (TestPoco)(await triggerData.ValueProvider.GetValueAsync()); Assert.Equal("Mathew Charles", testPoco.Name); Assert.Equal("Seattle", testPoco.Location); }
public async Task BindAsync_Poco_MergedBindingData() { ParameterInfo parameterInfo = GetType().GetMethod("TestPocoFunctionEx").GetParameters()[0]; HttpTriggerAttributeBindingProvider.HttpTriggerBinding binding = new HttpTriggerAttributeBindingProvider.HttpTriggerBinding(new HttpTriggerAttribute(), parameterInfo, true); JObject requestBody = new JObject { { "Name", "Mathew Charles" }, { "Phone", "(425) 555-6666" } }; var headers = new HeaderDictionary(); headers.Add("Content-Type", "application/json"); HttpRequest request = HttpTestHelpers.CreateHttpRequest("GET", "http://functions/myfunc?code=abc123&Age=25", headers, requestBody.ToString()); var services = new ServiceCollection(); services.AddOptions(); services.AddSingleton(Options.Create(new MvcOptions())); var formatter = new Mock <IInputFormatter>(); formatter.Setup(f => f.ReadAsync(It.IsAny <InputFormatterContext>())) .ReturnsAsync((InputFormatterContext c) => { TextReader reader = c.ReaderFactory(c.HttpContext.Request.Body, Encoding.UTF8); JsonSerializer serializer = new JsonSerializer(); object result = serializer.Deserialize(reader, c.Metadata.ModelType); return(InputFormatterResult.Success(result)); }); services.AddMvcCore(o => o.InputFormatters.Add(formatter.Object)); request.HttpContext.RequestServices = services.BuildServiceProvider(); Dictionary <string, object> routeData = new Dictionary <string, object> { { "Location", "Seattle" } }; request.HttpContext.Items.Add(HttpExtensionConstants.AzureWebJobsHttpRouteDataKey, routeData); FunctionBindingContext functionContext = new FunctionBindingContext(Guid.NewGuid(), CancellationToken.None); ValueBindingContext context = new ValueBindingContext(functionContext, CancellationToken.None); ITriggerData triggerData = await binding.BindAsync(request, context); Assert.Equal(9, triggerData.BindingData.Count); Assert.Equal("Mathew Charles", triggerData.BindingData["Name"]); Assert.Equal("Seattle", triggerData.BindingData["Location"]); Assert.Equal("(425) 555-6666", triggerData.BindingData["Phone"]); Assert.Equal("25", triggerData.BindingData["Age"]); TestPocoEx testPoco = (TestPocoEx)(await triggerData.ValueProvider.GetValueAsync()); Assert.Equal("Mathew Charles", testPoco.Name); Assert.Equal("Seattle", testPoco.Location); Assert.Equal("(425) 555-6666", testPoco.Phone); Assert.Equal(25, testPoco.Age); }
public void GetRequestBindingData_ReadsFromRoute_BindsAllTypes(Type type, object value, string stringValue) { HttpRequest request = HttpTestHelpers.CreateHttpRequest("POST", "http://functions/test"); Dictionary <string, object> routeData = new Dictionary <string, object> { { "test", stringValue } }; request.HttpContext.Items.Add(HttpExtensionConstants.AzureWebJobsHttpRouteDataKey, routeData); Dictionary <string, Type> bindingDataContract = new Dictionary <string, Type> { { "test", type } }; var bindingData = HttpTriggerAttributeBindingProvider.HttpTriggerBinding.GetRequestBindingData(request, bindingDataContract: bindingDataContract); Assert.Equal(3, bindingData.Count); Assert.Equal(value, bindingData["test"]); // Can only compare types if something was passed in if (value != null) { // Data is bound by underlying type if nullable Assert.Equal(Nullable.GetUnderlyingType(type) ?? type, bindingData["test"].GetType()); } }
public async Task BindAsync_HttpRequestMessage_FromRequestBody() { ParameterInfo parameterInfo = GetType().GetMethod("TestHttpRequestMessageFunction").GetParameters()[0]; HttpTriggerAttributeBindingProvider.HttpTriggerBinding binding = new HttpTriggerAttributeBindingProvider.HttpTriggerBinding(new HttpTriggerAttribute(), parameterInfo, false); // we intentionally do not send a content type on the request // to ensure that we can still extract binding data in such cases JObject requestBody = new JObject { { "Name", "Mathew Charles" }, { "Location", "Seattle" } }; HttpRequest request = HttpTestHelpers.CreateHttpRequest("POST", "http://functions/myfunc?code=abc123", null, requestBody.ToString()); request.ContentType = "application/json"; FunctionBindingContext functionContext = new FunctionBindingContext(Guid.NewGuid(), CancellationToken.None); ValueBindingContext context = new ValueBindingContext(functionContext, CancellationToken.None); ITriggerData triggerData = await binding.BindAsync(request, context); Assert.Equal(5, triggerData.BindingData.Count); Assert.Equal("Mathew Charles", triggerData.BindingData["Name"]); Assert.Equal("Seattle", triggerData.BindingData["Location"]); HttpRequestMessage result = (HttpRequestMessage)(await triggerData.ValueProvider.GetValueAsync()); Assert.NotNull(result); var contentResult = await result.Content.ReadAsAsync <JObject>(); Assert.Equal("Mathew Charles", contentResult["Name"]); }
public async Task BindAsync_Poco_WebHookData() { ParameterInfo parameterInfo = GetType().GetMethod("TestPocoFunction").GetParameters()[0]; HttpTriggerAttributeBindingProvider.HttpTriggerBinding binding = new HttpTriggerAttributeBindingProvider.HttpTriggerBinding(new HttpTriggerAttribute(), parameterInfo, true); HttpRequest request = HttpTestHelpers.CreateHttpRequest("POST", "http://functions/myfunc?code=abc123"); TestPoco testPoco = new TestPoco { Name = "Mathew Charles", Location = "Seattle" }; request.HttpContext.Items.Add(HttpExtensionConstants.AzureWebJobsWebHookDataKey, testPoco); FunctionBindingContext functionContext = new FunctionBindingContext(Guid.NewGuid(), CancellationToken.None); ValueBindingContext context = new ValueBindingContext(functionContext, CancellationToken.None); ITriggerData triggerData = await binding.BindAsync(request, context); Assert.Equal(5, triggerData.BindingData.Count); Assert.Equal("Mathew Charles", triggerData.BindingData["Name"]); Assert.Equal("Seattle", triggerData.BindingData["Location"]); TestPoco result = (TestPoco)(await triggerData.ValueProvider.GetValueAsync()); Assert.Same(testPoco, result); }
public async Task BasicResponse() { HttpRequest request = HttpTestHelpers.CreateHttpRequest("GET", "http://functions.com/api/abc"); var method = typeof(TestFunctions).GetMethod(nameof(TestFunctions.TestResponse)); await _host.CallAsync(method, new { req = request }); Assert.Equal("test-response", request.HttpContext.Items["$ret"]); // Verify resposne was set }
public async Task HttpTrigger_WithNoIdentities_ClaimsPrincipalIsNotAuthenticated() { var request = HttpTestHelpers.CreateHttpRequest("GET", "http://functions.com/api/TestIdentityBindings"); var method = typeof(TestFunctions).GetMethod(nameof(TestFunctions.HttpRequest)); await GetJobHost().CallAsync(method, new { req = request }); var principal = GetResult(request); Assert.False(principal.Identity.IsAuthenticated); }
public void HttpTriggerBinding_ToInvokeString_ReturnsExpectedResult() { var headers = new HeaderDictionary { { "Custom1", "Testing" } }; HttpRequest request = HttpTestHelpers.CreateHttpRequest("GET", "https://functions.azurewebsites.net/api/httptrigger?code=123&name=Mathew"); string result = HttpTriggerAttributeBindingProvider.HttpTriggerBinding.ToInvokeString(request); Assert.Equal("Method: GET, Uri: https://functions.azurewebsites.net/api/httptrigger", result); }
public async Task HttpTrigger_WithClaimsPrincipal_BindsClaimsPrincipalSuccessfully() { var request = HttpTestHelpers.CreateHttpRequest("GET", "http://functions.com/api/TestIdentityBindings"); request.HttpContext.User = GetSamplePrincipal(); var method = typeof(TestFunctions).GetMethod(nameof(TestFunctions.HttpRequest)); await GetJobHost().CallAsync(method, new { req = request }); var principal = GetResult(request); Assert.Equal(request.HttpContext.User, principal); }
public async Task GetRequestBindingDataAsync_ReadsFromBody() { string input = "{ test: 'testing', baz: 123, nestedArray: [ { nesting: 'yes' } ], nestedObject: { a: 123, b: 456 } }"; HttpRequest request = HttpTestHelpers.CreateHttpRequest("POST", "http://functions/test", null, input); var bindingData = await HttpTriggerAttributeBindingProvider.HttpTriggerBinding.GetRequestBindingDataAsync(request); Assert.Equal(5, bindingData.Count); Assert.Equal("testing", bindingData["test"]); Assert.Equal("123", bindingData["baz"]); JObject nestedObject = (JObject)bindingData["nestedObject"]; Assert.Equal(123, (int)nestedObject["a"]); }
public async Task GetRequestBindingDataAsync_Auth_Header() { var headers = new HeaderDictionary(); headers.Add("Authorization", "Bearer ey123"); headers.Add("x-ms-id-aad", "ey456"); HttpRequest request = HttpTestHelpers.CreateHttpRequest("POST", "http://functions/test", headers); var bindingData = await HttpTriggerAttributeBindingProvider.HttpTriggerBinding.GetRequestBindingDataAsync(request); TestBindingData(bindingData, "{headers.authorization}", "Bearer ey123", "{headers.x-ms-id-aad}", "ey456"); }
public async Task BindAsync_Poco_FromRequestBody(bool isChunked) { ParameterInfo parameterInfo = GetType().GetMethod("TestPocoFunction").GetParameters()[0]; var httpOptions = Options.Create <HttpOptions>(new HttpOptions() { EnableChunkedRequestBinding = isChunked }); HttpTriggerAttributeBindingProvider.HttpTriggerBinding binding = new HttpTriggerAttributeBindingProvider.HttpTriggerBinding(new HttpTriggerAttribute(), parameterInfo, true, httpOptions); JObject requestBody = new JObject { { "Name", "Mathew Charles" }, { "Location", "Seattle" } }; var headers = new HeaderDictionary(); headers.Add("Content-Type", "application/json"); HttpRequest request = HttpTestHelpers.CreateHttpRequest("POST", "http://functions/myfunc?code=abc123", headers, requestBody.ToString()); if (isChunked) { request.ContentLength = null; request.Headers.Add(HeaderNames.TransferEncoding, "chunked"); } IServiceCollection services = new ServiceCollection(); services.AddMvc(); services.AddSingleton <ObjectPoolProvider, DefaultObjectPoolProvider>(); services.AddSingleton <ILoggerFactory, NullLoggerFactory>(); request.HttpContext.RequestServices = services.BuildServiceProvider(); FunctionBindingContext functionContext = new FunctionBindingContext(Guid.NewGuid(), CancellationToken.None); ValueBindingContext context = new ValueBindingContext(functionContext, CancellationToken.None); ITriggerData triggerData = await binding.BindAsync(request, context); Assert.Equal(5, triggerData.BindingData.Count); Assert.Equal("Mathew Charles", triggerData.BindingData["Name"]); Assert.Equal("Seattle", triggerData.BindingData["Location"]); TestPoco testPoco = (TestPoco)(await triggerData.ValueProvider.GetValueAsync()); Assert.Equal("Mathew Charles", testPoco.Name); Assert.Equal("Seattle", testPoco.Location); }
public async Task GetRequestBindingDataAsync_ReadsFromQueryString() { HttpRequest request = HttpTestHelpers.CreateHttpRequest("POST", "http://functions/test?name=Mathew%20Charles&location=Seattle"); var bindingData = await HttpTriggerAttributeBindingProvider.HttpTriggerBinding.GetRequestBindingDataAsync(request); Assert.Equal(4, bindingData.Count); Assert.Equal("Mathew Charles", bindingData["name"]); Assert.Equal("Seattle", bindingData["location"]); TestBindingData(bindingData, "{name}", "Mathew Charles", "{location}", "Seattle", "{query.name}", "Mathew Charles", "{query.location}", "Seattle"); }
public async Task BasicInvoke() { HttpRequest request = HttpTestHelpers.CreateHttpRequest("GET", "http://functions.com/api/123/two/test?q1=123&q2=two"); request.Headers.Add("h1", "value1"); request.Headers.Add("h2", "value2"); var routeDataValues = new Dictionary <string, object> { { "r1", 123 }, { "r2", "two" } }; request.HttpContext.Items[HttpExtensionConstants.AzureWebJobsHttpRouteDataKey] = routeDataValues; var method = typeof(TestFunctions).GetMethod("TestFunction1"); await _host.CallAsync(method, new { req = request }); }
public async Task QueryHeaderBindingParameters() { string testId = Guid.NewGuid().ToString(); string testValue = Guid.NewGuid().ToString(); string testSuffix = Guid.NewGuid().ToString(); HttpRequest request = HttpTestHelpers.CreateHttpRequest("GET", $"http://functions.com/api/test?testId={testId}"); request.Headers.Add("h1", "value1"); request.Headers.Add("h2", "value2"); request.Headers.Add("testSuffix", testSuffix); request.Headers.Add("testValue", testValue); var routeDataValues = new Dictionary <string, object> { { "r1", 123 }, { "r2", "two" } }; request.HttpContext.Items[HttpExtensionConstants.AzureWebJobsHttpRouteDataKey] = routeDataValues; var method = typeof(TestFunctions).GetMethod(nameof(TestFunctions.TestFunction2)); await _host.CallAsync(method, new { req = request }); // verify blob was written string blobName = $"test-{testId}-{testSuffix}"; var account = CloudStorageAccount.Parse(Environment.GetEnvironmentVariable("AzureWebJobsStorage")); CloudBlobClient client = account.CreateCloudBlobClient(); CloudBlobContainer container = client.GetContainerReference("test-output"); var blobRef = await container.GetBlobReferenceFromServerAsync(blobName); await TestHelpers.Await(() => blobRef.ExistsAsync()); MemoryStream stream = new MemoryStream(); await blobRef.DownloadToStreamAsync(stream); stream.Seek(0, SeekOrigin.Begin); string result; using (var streamReader = new StreamReader(stream)) { result = await streamReader.ReadToEndAsync(); } Assert.Equal(testValue, result); }
public async Task GetRequestBindingDataAsync_ReadsFromRoute() { HttpRequest request = HttpTestHelpers.CreateHttpRequest("POST", "http://functions/test"); Dictionary <string, object> routeData = new Dictionary <string, object> { { "Name", "Mathew Charles" }, { "Location", "Seattle" } }; request.HttpContext.Items.Add(HttpExtensionConstants.AzureWebJobsHttpRouteDataKey, routeData); var bindingData = await HttpTriggerAttributeBindingProvider.HttpTriggerBinding.GetRequestBindingDataAsync(request); Assert.Equal(4, bindingData.Count); Assert.Equal("Mathew Charles", bindingData["Name"]); Assert.Equal("Seattle", bindingData["Location"]); }
public async Task BindAsync_HttpRequestMessage_FromQueryParameters() { ParameterInfo parameterInfo = GetType().GetMethod("TestHttpRequestMessageFunction").GetParameters()[0]; HttpTriggerAttributeBindingProvider.HttpTriggerBinding binding = new HttpTriggerAttributeBindingProvider.HttpTriggerBinding(new HttpTriggerAttribute(), parameterInfo, false); HttpRequest request = HttpTestHelpers.CreateHttpRequest("GET", "http://functions/myfunc?code=abc123&Name=Mathew%20Charles&location=Hawaii&Location=Ohio&Location=Seattle"); FunctionBindingContext functionContext = new FunctionBindingContext(Guid.NewGuid(), CancellationToken.None); ValueBindingContext context = new ValueBindingContext(functionContext, CancellationToken.None); ITriggerData triggerData = await binding.BindAsync(request, context); Assert.Equal(5, triggerData.BindingData.Count); Assert.Equal("Mathew Charles", triggerData.BindingData["Name"]); Assert.Equal("Seattle", triggerData.BindingData["Location"]); HttpRequestMessage result = (HttpRequestMessage)(await triggerData.ValueProvider.GetValueAsync()); Assert.NotNull(result); }
public async Task BindAsync_Dynamic() { ParameterInfo parameterInfo = GetType().GetMethod(nameof(TestDynamicFunction)).GetParameters()[0]; HttpTriggerAttributeBindingProvider.HttpTriggerBinding binding = new HttpTriggerAttributeBindingProvider.HttpTriggerBinding(new HttpTriggerAttribute(), parameterInfo, false); var headers = new HeaderDictionary(); headers.Add("Content-Type", "application/json"); HttpRequest request = HttpTestHelpers.CreateHttpRequest("POST", "http://functions/myfunc?code=abc123", headers, "{ \"value\" : \"This is a test\" }"); FunctionBindingContext functionContext = new FunctionBindingContext(Guid.NewGuid(), CancellationToken.None); ValueBindingContext context = new ValueBindingContext(functionContext, CancellationToken.None); ITriggerData triggerData = await binding.BindAsync(request, context); Assert.Equal(4, triggerData.BindingData.Count); var result = (JObject)(await triggerData.ValueProvider.GetValueAsync()); Assert.Equal("This is a test", result["value"].ToString()); }
public async Task BindAsync_Poco_FromQueryParameters() { ParameterInfo parameterInfo = GetType().GetMethod("TestPocoFunction").GetParameters()[0]; HttpTriggerAttributeBindingProvider.HttpTriggerBinding binding = new HttpTriggerAttributeBindingProvider.HttpTriggerBinding(new HttpTriggerAttribute(), parameterInfo, true); HttpRequest request = HttpTestHelpers.CreateHttpRequest("GET", "http://functions/myfunc?code=abc123&Name=Mathew%20Charles&Location=Seattle"); FunctionBindingContext functionContext = new FunctionBindingContext(Guid.NewGuid(), CancellationToken.None, new TestTraceWriter(Level.Verbose)); ValueBindingContext context = new ValueBindingContext(functionContext, CancellationToken.None); ITriggerData triggerData = await binding.BindAsync(request, context); Assert.Equal(4, triggerData.BindingData.Count); Assert.Equal("Mathew Charles", triggerData.BindingData["Name"]); Assert.Equal("Seattle", triggerData.BindingData["Location"]); TestPoco testPoco = (TestPoco)(await triggerData.ValueProvider.GetValueAsync()); Assert.Equal("Mathew Charles", testPoco.Name); Assert.Equal("Seattle", testPoco.Location); }
public async Task BindAsync_String() { ParameterInfo parameterInfo = GetType().GetMethod("TestStringFunction").GetParameters()[0]; HttpTriggerAttributeBindingProvider.HttpTriggerBinding binding = new HttpTriggerAttributeBindingProvider.HttpTriggerBinding(new HttpTriggerAttribute(), parameterInfo, false); var headers = new HeaderDictionary(); headers.Add("Content-Type", "application/text"); HttpRequest request = HttpTestHelpers.CreateHttpRequest("POST", "http://functions/myfunc?code=abc123", headers, "This is a test"); FunctionBindingContext functionContext = new FunctionBindingContext(Guid.NewGuid(), CancellationToken.None, new TestTraceWriter(Level.Verbose)); ValueBindingContext context = new ValueBindingContext(functionContext, CancellationToken.None); ITriggerData triggerData = await binding.BindAsync(request, context); Assert.Equal(2, triggerData.BindingData.Count); string result = (string)(await triggerData.ValueProvider.GetValueAsync()); Assert.Equal("This is a test", result); }
public async Task GetRequestBindingDataAsync_ReadsFrom_Duplicates() { string input = "{ name: 'body1', nestedObject: { name: 'body2' } }"; var headers = new HeaderDictionary(); headers.Add("name", "Mathew"); HttpRequest request = HttpTestHelpers.CreateHttpRequest("POST", "http://functions/{test:alpha}/test?name=Amy", headers, input); var routeData = new Dictionary <string, object> { { "test", "path1" } }; request.HttpContext.Items.Add(HttpExtensionConstants.AzureWebJobsHttpRouteDataKey, routeData); var bindingData = await HttpTriggerAttributeBindingProvider.HttpTriggerBinding.GetRequestBindingDataAsync(request); TestBindingData(bindingData, "{headers.name}", "Mathew", "{test}", "path1", "{query.name}", "Amy"); }
public async Task BindToPoco() { JObject jo = new JObject { { "b1", "bodyvalue1" } }; string json = jo.ToString(); HttpRequest request = HttpTestHelpers.CreateHttpRequest("POST", "http://functions.com/api/123/two/test?q1=one&q2=two", body: json); request.Headers.Add("h1", "value1"); request.Headers.Add("h2", "value2"); var routeDataValues = new Dictionary <string, object> { { "r1", 123 }, { "r2", "two" } }; request.HttpContext.Items[HttpExtensionConstants.AzureWebJobsHttpRouteDataKey] = routeDataValues; var method = typeof(TestFunctions).GetMethod("TestFunction3"); await _jobHost.CallAsync(method, new { poco = request }); }