Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added "ValuesOnly" property to Cookie and QueryString layout renderers + support for multivalue cookie keys in ASP.NET core #307

Merged
merged 2 commits into from
Aug 1, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -78,12 +78,7 @@ public void KeyNotFoundRendersEmptyString_Json_Formatting()
[Fact]
public void KeyFoundRendersValue_Multiple_Cookies_Flat_Formatting()
{
#if ASP_NET_CORE
//no multivalue cookie keys in ASP.NET core
var expectedResult = "key=TEST,Key1=TEST1";
#else
var expectedResult = "key=TEST&Key1=TEST1";
#endif

var renderer = CreateRenderer();

Expand All @@ -92,16 +87,10 @@ public void KeyFoundRendersValue_Multiple_Cookies_Flat_Formatting()
Assert.Equal(expectedResult, result);
}


[Fact]
public void KeyFoundRendersValue_Multiple_Cookies_Flat_Formatting_separators()
{
#if ASP_NET_CORE
//no multivalue cookie keys in ASP.NET core
var expectedResult = "key:TEST|Key1:TEST1";
#else
var expectedResult = "key:TEST&Key1=TEST1";
#endif

var renderer = CreateRenderer();
renderer.ValueSeparator = ":";
Expand Down Expand Up @@ -167,15 +156,131 @@ public void KeyFoundRendersValue_Multiple_Cookies_Json_Formatting(bool singleAsA
Assert.Equal(expectedResult, result);
}

[Fact]
public void KeyNotFoundRendersEmptyString_Flat_Formatting_ValuesOnly()
{
var renderer = CreateRenderer();
renderer.OutputFormat = AspNetRequestLayoutOutputFormat.Flat;
renderer.CookieNames = new List<string> { "notfound" };
renderer.ValuesOnly = true;

string result = renderer.Render(new LogEventInfo());

Assert.Empty(result);
}

[Fact]
public void KeyNotFoundRendersEmptyString_Json_Formatting_ValuesOnly()
{
var renderer = CreateRenderer();
renderer.OutputFormat = AspNetRequestLayoutOutputFormat.Json;
renderer.CookieNames = new List<string> { "notfound" };
renderer.ValuesOnly = true;

string result = renderer.Render(new LogEventInfo());

Assert.Empty(result);
}

[Fact]
public void KeyFoundRendersValue_Cookie_Multiple_Items_Flat_Formatting_ValuesOnly()
{
var expectedResult = "TEST,TEST1";

var renderer = CreateRenderer();
renderer.ValuesOnly = true;

string result = renderer.Render(new LogEventInfo());

Assert.Equal(expectedResult, result);
}

[Fact]
public void KeyFoundRendersValue_Cookie_Multiple_Items_Flat_Formatting_separators_ValuesOnly()
{
var expectedResult = "TEST|TEST1";

var renderer = CreateRenderer();
renderer.ValueSeparator = ":";
renderer.ItemSeparator = "|";
renderer.ValuesOnly = true;

string result = renderer.Render(new LogEventInfo());

Assert.Equal(expectedResult, result);
}

[Fact]
public void KeyFoundRendersValue_Single_Item_Flat_Formatting_ValuesOnly()
{
var expectedResult = "TEST";

var renderer = CreateRenderer(addSecondCookie: false);
renderer.ValuesOnly = true;

string result = renderer.Render(new LogEventInfo());

Assert.Equal(expectedResult, result);
}

[Fact]
public void KeyFoundRendersValue_Single_Item_Json_Formatting_ValuesOnly()
{
var expectedResult = "[\"TEST\"]";

var renderer = CreateRenderer(addSecondCookie: false);
renderer.OutputFormat = AspNetRequestLayoutOutputFormat.Json;
renderer.ValuesOnly = true;

string result = renderer.Render(new LogEventInfo());

Assert.Equal(expectedResult, result);
}

[Fact]
public void KeyFoundRendersValue_Single_Item_Json_Formatting_no_array_ValuesOnly()
{
// With ValuesOnly enabled, only arrays are valid
var expectedResult = "[\"TEST\"]";

var renderer = CreateRenderer(addSecondCookie: false);

renderer.OutputFormat = AspNetRequestLayoutOutputFormat.Json;
renderer.SingleAsArray = false;
renderer.ValuesOnly = true;

string result = renderer.Render(new LogEventInfo());

Assert.Equal(expectedResult, result);
}

[Theory]
[InlineData(false)]
[InlineData(true)]
public void KeyFoundRendersValue_Cookie_Multiple_Items_Json_Formatting_ValuesOnly(bool singleAsArray)
{
var expectedResult = "[\"TEST\",\"TEST1\"]";

var renderer = CreateRenderer();

renderer.OutputFormat = AspNetRequestLayoutOutputFormat.Json;
renderer.SingleAsArray = singleAsArray;
renderer.ValuesOnly = true;

string result = renderer.Render(new LogEventInfo());

Assert.Equal(expectedResult, result);
}

//no multivalue cookie keys in ASP.NET core
#if !ASP_NET_CORE

[Fact]
public void KeyFoundRendersValue_Multiple_Cookies_And_Cookie_Values_Flat_Formatting()
{
var expectedResult = "key=TEST&Key1=TEST1,key2=Test&key3=Test456";
var expectedResult = "key=TEST,key2=Test&key3=Test456";

var renderer = CreateRenderer(addMultiValueCookieKey: true);
var renderer = CreateRenderer(addSecondCookie: true, addMultiValueCookieKey: true);
renderer.CookieNames = new List<string> { "key", "key2" };

string result = renderer.Render(new LogEventInfo());
Expand All @@ -187,7 +292,7 @@ public void KeyFoundRendersValue_Multiple_Cookies_And_Cookie_Values_Flat_Formatt
public void KeyFoundRendersValue_Multiple_Cookies_And_Cookie_Values_Json_Formatting()
{
var expectedResult = "[{\"key\":\"TEST\"},{\"Key1\":\"TEST1\"},{\"key2\":\"Test\"},{\"key3\":\"Test456\"}]";
var renderer = CreateRenderer(addMultiValueCookieKey: true);
var renderer = CreateRenderer(addSecondCookie: true, addMultiValueCookieKey: true);
renderer.OutputFormat = AspNetRequestLayoutOutputFormat.Json;

string result = renderer.Render(new LogEventInfo());
Expand Down Expand Up @@ -308,18 +413,21 @@ void AddCookie(string key, string result)
#else

var cookie1 = new HttpCookie("key", "TEST");
var cookies = new HttpCookieCollection { cookie1 };
cookieNames.Add("key");

if (addSecondCookie)
{
cookie1["Key1"] = "TEST1";
var cookie2 = new HttpCookie("Key1", "TEST1");
cookies.Add(cookie2);
cookieNames.Add("Key1");
}
var cookies = new HttpCookieCollection { cookie1 };

if (addMultiValueCookieKey)
{
var cookie2 = new HttpCookie("key2", "Test");
cookie2["key3"] = "Test456";
cookies.Add(cookie2);
var multiValueCookie = new HttpCookie("key2", "Test");
multiValueCookie["key3"] = "Test456";
cookies.Add(multiValueCookie);
cookieNames.Add("key2");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
using HttpContextBase = Microsoft.AspNetCore.Http.HttpContext;
using HttpSessionState = Microsoft.AspNetCore.Http.ISession;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Extensions;
using Microsoft.AspNetCore.Http.Internal;
#endif
using NLog.Web.LayoutRenderers;
Expand Down Expand Up @@ -62,9 +63,6 @@ public void KeyNotFoundRendersEmptyString_Json_Formatting()
Assert.Empty(result);
}




[Fact]
public void KeyFoundRendersValue_QueryString_Single_Item_Flat_Formatting()
{
Expand Down Expand Up @@ -186,6 +184,85 @@ public void KeyFoundRendersValue_QueryString_Multiple_Item_Json_Formatting()
Assert.Equal(expectedResult, result);
}

[Fact]
public void KeyFoundRendersValue_QueryString_Single_Item_Flat_Formatting_ValuesOnly()
{
var expectedResult = "1";

var renderer = CreateAndMockRenderer(CreateTuple("Id", "1"));

renderer.QueryStringKeys = new List<string> { "Id" };
renderer.OutputFormat = AspNetRequestLayoutOutputFormat.Flat;
renderer.ValuesOnly = true;

string result = renderer.Render(new LogEventInfo());

Assert.Equal(expectedResult, result);
}

[Fact]
public void KeyFoundRendersValue_QueryString_Single_Item_Json_Formatting_ValuesOnly()
{
var expectedResult = "[\"1\"]";

var renderer = CreateAndMockRenderer(CreateTuple("Id", "1"));

renderer.QueryStringKeys = new List<string> { "Id" };
renderer.OutputFormat = AspNetRequestLayoutOutputFormat.Json;
renderer.ValuesOnly = true;

string result = renderer.Render(new LogEventInfo());

Assert.Equal(expectedResult, result);
}

[Fact]
public void KeyFoundRendersValue_QueryString_Multiple_Item_Flat_Formatting_ValuesOnly()
{
var expectedResult = "1,2";

var renderer = CreateAndMockRenderer(CreateTuple("Id", "1"), CreateTuple("Id2", "2"));

renderer.QueryStringKeys = new List<string> { "Id", "Id2" };
renderer.OutputFormat = AspNetRequestLayoutOutputFormat.Flat;
renderer.ValuesOnly = true;

string result = renderer.Render(new LogEventInfo());

Assert.Equal(expectedResult, result);
}

[Fact]
public void KeyFoundRendersValue_QueryString_Multiple_Item_Json_Formatting_ValuesOnly()
{
var expectedResult = "[\"1\",\"2\"]";

var renderer = CreateAndMockRenderer(CreateTuple("Id", "1"), CreateTuple("Id2", "2"));

renderer.QueryStringKeys = new List<string> { "Id", "Id2" };
renderer.OutputFormat = AspNetRequestLayoutOutputFormat.Json;
renderer.ValuesOnly = true;

string result = renderer.Render(new LogEventInfo());

Assert.Equal(expectedResult, result);
}

[Fact] public void MultipleValuesForOneKeyShouldWork_ValuesOnly()
{
var expectedResult = "1,2,3";

var renderer = CreateAndMockRenderer(CreateTuple("Id", "1", "2", "3"));

renderer.QueryStringKeys = null;
renderer.OutputFormat = AspNetRequestLayoutOutputFormat.Flat;
renderer.ValuesOnly = true;

string result = renderer.Render(new LogEventInfo());

Assert.Equal(expectedResult, result);
}


/// <summary>
/// Create tuple with 1 or more values (with 1 key)
Expand All @@ -198,48 +275,33 @@ private static Tuple<string, string[]> CreateTuple(string key, params string[] v
return new Tuple<string, string[]>(key, values);
}


private static AspNetQueryStringLayoutRenderer CreateAndMockRenderer(params Tuple<string, string[]>[] values)
private AspNetQueryStringLayoutRenderer CreateAndMockRenderer(params Tuple<string, string[]>[] pairs)
{
var renderer = new AspNetQueryStringLayoutRenderer();

#if !ASP_NET_CORE

var httpContext = Substitute.For<HttpContextBase>();
var namedClollection = new NameValueCollection();
foreach (var tuple in values)
var pairCollection = new NameValueCollection();
#else
var httpContext = this.HttpContext;
var pairCollection = new QueryBuilder();
#endif

foreach (var tuple in pairs)
{
foreach (var value in tuple.Item2)
{
namedClollection.Add(tuple.Item1, value);
pairCollection.Add(tuple.Item1, value);
}

}

httpContext.Request.QueryString.Returns(namedClollection);

renderer.HttpContextAccessor = new FakeHttpContextAccessor(httpContext);
#if !ASP_NET_CORE
httpContext.Request.QueryString.Returns(pairCollection);
#else
var httpContext = Substitute.For<HttpContextBase>();
var dict = new Dictionary<string, StringValues>();
foreach (var tuple in values)
{
dict.Add(tuple.Item1, new StringValues(tuple.Item2));

}
IQueryCollection querystringValues = new QueryCollection(dict);

httpContext.Request.Query.Returns(querystringValues);

renderer.HttpContextAccessor = new FakeHttpContextAccessor(httpContext);
httpContext.Request.QueryString = pairCollection.ToQueryString();
#endif

var renderer = new AspNetQueryStringLayoutRenderer();
renderer.HttpContextAccessor = new FakeHttpContextAccessor(httpContext);
return renderer;



}


}
}
Loading