Skip to content

Commit e5cfa08

Browse files
authored
Add extension for QueryCollection (#195)
1 parent d6d1a60 commit e5cfa08

File tree

2 files changed

+184
-0
lines changed

2 files changed

+184
-0
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
using System.Collections.Generic;
2+
3+
using Microsoft.AspNetCore.Http;
4+
using Microsoft.AspNetCore.Http.Internal;
5+
using Microsoft.AspNetCore.WebUtilities;
6+
using Microsoft.Azure.Functions.Worker.Http;
7+
using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Extensions;
8+
using Microsoft.Extensions.Primitives;
9+
10+
namespace Microsoft.Azure.Functions.Worker.Extensions.OpenApi.Extensions
11+
{
12+
/// <summary>
13+
/// This represents the extension entity for <see cref="HttpRequestData"/>.
14+
/// </summary>
15+
public static class OpenApiHttpRequestDataExtensions
16+
{
17+
/// <summary>
18+
/// Gets the <see cref="QueryCollection"/> instance from the <see cref="HttpRequestData"/>.
19+
/// </summary>
20+
/// <param name="req"><see cref="HttpRequestData"/> instance.</param>
21+
/// <returns>Returns <see cref="QueryCollection"/> instance.</returns>
22+
public static IQueryCollection Queries(this HttpRequestData req)
23+
{
24+
req.ThrowIfNullOrDefault();
25+
26+
var queries = QueryHelpers.ParseNullableQuery(req.Url.Query);
27+
if (queries.IsNullOrDefault())
28+
{
29+
queries = new Dictionary<string, StringValues>();
30+
}
31+
32+
return new QueryCollection(queries);
33+
}
34+
35+
/// <summary>
36+
/// Gets the <see cref="StringValues"/> object from the <see cref="HttpRequestData"/>.
37+
/// </summary>
38+
/// <param name="req"><see cref="HttpRequestData"/> instance.</param>
39+
/// <param name="key">Querystring key.</param>
40+
/// <returns>Returns <see cref="StringValues"/> object.</returns>
41+
public static StringValues Query(this HttpRequestData req, string key)
42+
{
43+
req.ThrowIfNullOrDefault();
44+
45+
var queries = Queries(req);
46+
var value = queries.ContainsKey(key) ? queries[key] : new StringValues(default(string));
47+
48+
return value;
49+
}
50+
}
51+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
using System;
2+
3+
using FluentAssertions;
4+
5+
using Microsoft.Azure.Functions.Worker.Extensions.OpenApi.Extensions;
6+
using Microsoft.Azure.Functions.Worker.Extensions.OpenApi.Tests.Fakes;
7+
using Microsoft.Azure.Functions.Worker.Http;
8+
using Microsoft.VisualStudio.TestTools.UnitTesting;
9+
10+
using Moq;
11+
12+
namespace Microsoft.Azure.Functions.Worker.Extensions.OpenApi.Tests.Extensions
13+
{
14+
[TestClass]
15+
public class HttpRequestDataExtensionsTests
16+
{
17+
[TestMethod]
18+
public void Given_Null_When_Queries_Invoked_Then_It_Should_Throw_Exception()
19+
{
20+
Action action = () => OpenApiHttpRequestDataExtensions.Queries(null);
21+
22+
action.Should().Throw<ArgumentNullException>();
23+
}
24+
25+
[TestMethod]
26+
public void Given_NullQuerystring_When_Queries_Invoked_Then_It_Should_Return_Result()
27+
{
28+
var context = new Mock<FunctionContext>();
29+
30+
var baseHost = "localhost";
31+
var uri = Uri.TryCreate($"http://{baseHost}", UriKind.Absolute, out var tried) ? tried : null;
32+
33+
var req = (HttpRequestData) new FakeHttpRequestData(context.Object, uri);
34+
35+
var result = OpenApiHttpRequestDataExtensions.Queries(req);
36+
37+
result.Count.Should().Be(0);
38+
}
39+
40+
[DataTestMethod]
41+
[DataRow(null)]
42+
[DataRow("")]
43+
public void Given_NoQuerystring_When_Queries_Invoked_Then_It_Should_Return_Result(string querystring)
44+
{
45+
var context = new Mock<FunctionContext>();
46+
47+
var baseHost = "localhost";
48+
var uri = Uri.TryCreate($"http://{baseHost}?{querystring}", UriKind.Absolute, out var tried) ? tried : null;
49+
50+
var req = (HttpRequestData) new FakeHttpRequestData(context.Object, uri);
51+
52+
var result = OpenApiHttpRequestDataExtensions.Queries(req);
53+
54+
result.Count.Should().Be(0);
55+
}
56+
57+
[DataTestMethod]
58+
[DataRow("hello=world", "hello")]
59+
[DataRow("hello=world&lorem=ipsum", "hello", "lorem")]
60+
public void Given_Querystring_When_Queries_Invoked_Then_It_Should_Return_Result(string querystring, params string[] keys)
61+
{
62+
var context = new Mock<FunctionContext>();
63+
64+
var baseHost = "localhost";
65+
var uri = Uri.TryCreate($"http://{baseHost}?{querystring}", UriKind.Absolute, out var tried) ? tried : null;
66+
67+
var req = (HttpRequestData) new FakeHttpRequestData(context.Object, uri);
68+
69+
var result = OpenApiHttpRequestDataExtensions.Queries(req);
70+
71+
result.Count.Should().Be(keys.Length);
72+
result.Keys.Should().Contain(keys);
73+
}
74+
75+
[TestMethod]
76+
public void Given_Null_When_Query_Invoked_Then_It_Should_Throw_Exception()
77+
{
78+
Action action = () => OpenApiHttpRequestDataExtensions.Query(null, null);
79+
80+
action.Should().Throw<ArgumentNullException>();
81+
}
82+
83+
[DataTestMethod]
84+
[DataRow("hello=world", "hello", "world")]
85+
[DataRow("hello=world&lorem=ipsum", "hello", "world")]
86+
[DataRow("hello=world&lorem=ipsum", "lorem", "ipsum")]
87+
public void Given_Querystring_When_Query_Invoked_Then_It_Should_Return_Result(string querystring, string key, string expected)
88+
{
89+
var context = new Mock<FunctionContext>();
90+
91+
var baseHost = "localhost";
92+
var uri = Uri.TryCreate($"http://{baseHost}?{querystring}", UriKind.Absolute, out var tried) ? tried : null;
93+
94+
var req = (HttpRequestData) new FakeHttpRequestData(context.Object, uri);
95+
96+
var result = (string) OpenApiHttpRequestDataExtensions.Query(req, key);
97+
98+
result.Should().Be(expected);
99+
}
100+
101+
[TestMethod]
102+
public void Given_NullQuerystring_When_Query_Invoked_Then_It_Should_Return_Result()
103+
{
104+
var context = new Mock<FunctionContext>();
105+
106+
var baseHost = "localhost";
107+
var uri = Uri.TryCreate($"http://{baseHost}", UriKind.Absolute, out var tried) ? tried : null;
108+
109+
var req = (HttpRequestData) new FakeHttpRequestData(context.Object, uri);
110+
111+
var result = (string) OpenApiHttpRequestDataExtensions.Query(req, "hello");
112+
113+
result.Should().BeNull();
114+
}
115+
116+
[DataTestMethod]
117+
[DataRow(null)]
118+
[DataRow("")]
119+
public void Given_NoQuerystring_When_Query_Invoked_Then_It_Should_Return_Result(string querystring)
120+
{
121+
var context = new Mock<FunctionContext>();
122+
123+
var baseHost = "localhost";
124+
var uri = Uri.TryCreate($"http://{baseHost}?{querystring}", UriKind.Absolute, out var tried) ? tried : null;
125+
126+
var req = (HttpRequestData) new FakeHttpRequestData(context.Object, uri);
127+
128+
var result = (string) OpenApiHttpRequestDataExtensions.Query(req, "hello");
129+
130+
result.Should().BeNull();
131+
}
132+
}
133+
}

0 commit comments

Comments
 (0)