Skip to content

Commit 8c1c27f

Browse files
author
Niall Langley
committed
Added lots more unit tests
1 parent 4a8875a commit 8c1c27f

File tree

16 files changed

+607
-132
lines changed

16 files changed

+607
-132
lines changed

DataPipelineTools.Functions/DataLake/DataLakeConfigFactory.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,9 @@ private IEnumerable<Filter<DataLakeItem>> ParseFilters(HttpRequest req)
8181
{
8282
var filters = req.Query.Keys
8383
.Where(k => k.StartsWith("filter[") && k.EndsWith("]"))
84-
.SelectMany(k => req.Query[k].Select(v => Filter<DataLakeItem>.ParseFilter(k, v, _logger)))
84+
// Clean up the column name by removing the filter[...] parts
85+
.Select(f => f[7..^1])
86+
.SelectMany(k => req.Query[k].Select(v => FilterFactory<DataLakeItem>.Create(k, v, _logger)))
8587
.Where(f => f != null);
8688

8789
return filters;
Lines changed: 221 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,221 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Collections.ObjectModel;
4+
using Castle.Core.Logging;
5+
using Microsoft.Extensions.Logging;
6+
using Moq;
7+
using NUnit.Framework;
8+
using NUnit.Framework.Constraints;
9+
using SqlCollaborative.Azure.DataPipelineTools.Common;
10+
using SqlCollaborative.Azure.DataPipelineTools.DataLake;
11+
12+
namespace DataPipelineTools.Tests.Common.FilterFactoryTests
13+
{
14+
[TestFixture]
15+
public class CreateTests : TestBase<FilterFactory<TestPoco>>
16+
{
17+
[SetUp]
18+
public void Setup()
19+
{
20+
MockLogger.Reset();
21+
SetupConsoleLogging();
22+
}
23+
24+
#region Given_ColumNameIsNotValidProperty
25+
static string[] InvalidColumnNames = { "Some missing property", null, "" };
26+
27+
[TestCaseSource(nameof(InvalidColumnNames))]
28+
public void Given_ColumNameIsNotValidProperty_Should_ReturnFilterWithIsValidEqualsFalse(string propertyName)
29+
{
30+
var result = FilterFactory<TestPoco>.Create(propertyName, string.Empty, MockLogger.Object);
31+
32+
Assert.That(result.IsValid, Is.EqualTo(false));
33+
}
34+
35+
[TestCaseSource(nameof(InvalidColumnNames))]
36+
public void Given_ColumNameIsNotValidProperty_Should_ReturnFilterWithErrorMessageValue(string propertyName)
37+
{
38+
var result = FilterFactory<TestPoco>.Create(propertyName, string.Empty, MockLogger.Object);
39+
40+
Assert.That(result.ErrorMessage, Is.Not.Null);
41+
}
42+
43+
[TestCaseSource(nameof(InvalidColumnNames))]
44+
public void Given_ColumNameIsNotValidProperty_Should_LogWarningOnce(string propertyName)
45+
{
46+
var result = FilterFactory<TestPoco>.Create(propertyName, string.Empty, MockLogger.Object);
47+
48+
MockLogger.VerifyLogging(LogLevel.Warning, Times.Once());
49+
}
50+
#endregion Given_ColumNameIsNotValidProperty
51+
52+
53+
54+
#region Given_OperatorIsNotValid
55+
static string[] InvalidOperators = { "eq:", "=5", null, "" };
56+
57+
[TestCaseSource(nameof(InvalidOperators))]
58+
public void Given_OperatorIsNotValid_Should_ReturnFilterWithIsValidEqualsFalse(string filter)
59+
{
60+
var result = FilterFactory<TestPoco>.Create(nameof(TestPoco.StringProp), filter, MockLogger.Object);
61+
62+
Assert.That(result.IsValid, Is.EqualTo(false));
63+
}
64+
65+
[TestCaseSource(nameof(InvalidOperators))]
66+
public void Given_OperatorIsNotValid_Should_ReturnFilterWithErrorMessageValue(string filter)
67+
{
68+
var result = FilterFactory<TestPoco>.Create(nameof(TestPoco.StringProp), filter, MockLogger.Object);
69+
70+
Assert.That(result.ErrorMessage, Is.Not.Null);
71+
}
72+
73+
[TestCaseSource(nameof(InvalidOperators))]
74+
public void Given_OperatorIsNotValid_Should_LogWarningOnce(string filter)
75+
{
76+
var result = FilterFactory<TestPoco>.Create(nameof(TestPoco.StringProp), filter, MockLogger.Object);
77+
78+
MockLogger.VerifyLogging(LogLevel.Warning, Times.Once());
79+
}
80+
#endregion Given_OperatorIsNotValid
81+
82+
83+
84+
#region Given_ValueDoesNotCastToNamedColumnType
85+
static readonly string[] ValidNonStringColumnTypes =
86+
{
87+
nameof(TestPoco.BoolProp),
88+
nameof(TestPoco.Int16Prop),
89+
nameof(TestPoco.IntProp),
90+
nameof(TestPoco.Int64Prop),
91+
nameof(TestPoco.DoubleProp),
92+
nameof(TestPoco.DecimalProp),
93+
nameof(TestPoco.DateTimeProp)
94+
};
95+
private const string ValueDoesNotCastToNamedColumnTypeValue = "eq:abc";
96+
97+
[TestCaseSource(nameof(ValidNonStringColumnTypes))]
98+
public void Given_ValueDoesNotCastToNamedColumnType_Should_ReturnFilterWithIsValidEqualsFalse(string propertyName)
99+
{
100+
var result = FilterFactory<TestPoco>.Create(propertyName, ValueDoesNotCastToNamedColumnTypeValue, MockLogger.Object);
101+
102+
Assert.That(result.IsValid, Is.EqualTo(false));
103+
}
104+
105+
[TestCaseSource(nameof(InvalidOperators))]
106+
public void Given_ValueDoesNotCastToNamedColumnType_Should_ReturnFilterWithErrorMessageValue(string propertyName)
107+
{
108+
var result = FilterFactory<TestPoco>.Create(propertyName, ValueDoesNotCastToNamedColumnTypeValue, MockLogger.Object);
109+
110+
Assert.That(result.ErrorMessage, Is.Not.Null);
111+
}
112+
113+
[TestCaseSource(nameof(InvalidOperators))]
114+
public void Given_ValueDoesNotCastToNamedColumnType_Should_LogWarningOnce(string propertyName)
115+
{
116+
var result = FilterFactory<TestPoco>.Create(propertyName, ValueDoesNotCastToNamedColumnTypeValue, MockLogger.Object);
117+
118+
MockLogger.VerifyLogging(LogLevel.Warning, Times.Once());
119+
}
120+
#endregion Given_ValueDoesNotCastToNamedColumnType
121+
122+
123+
#region Given_ValidColumnNameAndFilter
124+
private static readonly Dictionary<string, string> ValidColumnNamesAndValues = new Dictionary<string, string> {
125+
{nameof(TestPoco.StringProp), "hello"},
126+
{nameof(TestPoco.BoolProp), "true"},
127+
{nameof(TestPoco.Int16Prop), "42"},
128+
{nameof(TestPoco.IntProp), "42"},
129+
{nameof(TestPoco.Int64Prop), "42"},
130+
{nameof(TestPoco.DoubleProp), "42.1"},
131+
{nameof(TestPoco.DecimalProp), "42.1"},
132+
{ nameof(TestPoco.DateTimeProp), "2021-01-01T12:00:00"}
133+
};
134+
private static readonly string[] SimpleFilterTypes = {"eq", "ne", "lt", "gt", "le", "ge" };
135+
136+
[Combinatorial]
137+
public void Given_ValidColumnNameAndFilter_Should_ReturnFilterWithIsValidEqualsTrue(
138+
[ValueSource(nameof(ValidColumnNamesAndValues))] KeyValuePair<string, string> propertyName,
139+
[ValueSource(nameof(SimpleFilterTypes))] string filter
140+
)
141+
{
142+
var result = FilterFactory<TestPoco>.Create(propertyName.Key, $"{filter}:{propertyName.Value}", MockLogger.Object);
143+
144+
Assert.That(result.IsValid, Is.EqualTo(true));
145+
}
146+
147+
[Combinatorial]
148+
public void Given_ValidColumnNameAndFilter_Should_ReturnFilterErrorMessageIsNull(
149+
[ValueSource(nameof(ValidColumnNamesAndValues))] KeyValuePair<string, string> propertyName,
150+
[ValueSource(nameof(SimpleFilterTypes))] string filter
151+
)
152+
{
153+
var result = FilterFactory<TestPoco>.Create(propertyName.Key, $"{filter}:{propertyName.Value}", MockLogger.Object);
154+
155+
Assert.That(result.ErrorMessage, Is.Null);
156+
}
157+
158+
[Combinatorial]
159+
public void Given_ValidColumnNameAndFilter_Should_LogZeroWarnings(
160+
[ValueSource(nameof(ValidColumnNamesAndValues))] KeyValuePair<string, string> propertyName,
161+
[ValueSource(nameof(SimpleFilterTypes))] string filter
162+
)
163+
{
164+
var result = FilterFactory<TestPoco>.Create(propertyName.Key, $"{filter}:{propertyName.Value}", MockLogger.Object);
165+
166+
MockLogger.VerifyLogging(LogLevel.Warning, Times.Never());
167+
}
168+
#endregion Given_ValidColumnNameAndFilter
169+
170+
171+
#region Given_LikeFilter
172+
[Test]
173+
public void Given_LikeFilterWithStringColumn_Should_ReturnFilterWithIsValidEqualsTrue()
174+
{
175+
var result = FilterFactory<TestPoco>.Create(nameof(TestPoco.StringProp), $"like:hello*", MockLogger.Object);
176+
177+
Assert.That(result.IsValid, Is.EqualTo(true));
178+
}
179+
180+
[Test]
181+
public void Given_LikeFilterWithStringColumn_Should_ReturnFilterErrorMessageIsNull()
182+
{
183+
var result = FilterFactory<TestPoco>.Create(nameof(TestPoco.StringProp), $"like:hello*", MockLogger.Object);
184+
185+
Assert.That(result.ErrorMessage, Is.Null);
186+
}
187+
188+
[Test]
189+
public void Given_LikeFilterWithStringColumn_Should_LogZeroWarnings()
190+
{
191+
var result = FilterFactory<TestPoco>.Create(nameof(TestPoco.StringProp), $"like:hello*", MockLogger.Object);
192+
193+
MockLogger.VerifyLogging(LogLevel.Warning, Times.Never());
194+
}
195+
196+
[TestCaseSource(nameof(ValidNonStringColumnTypes))]
197+
public void Given_LikeFilterWithNonStringColumn_Should_ReturnFilterWithIsValidEqualsFalse(string propertyName)
198+
{
199+
var result = FilterFactory<TestPoco>.Create(propertyName, $"like:hello*", MockLogger.Object);
200+
201+
Assert.That(result.IsValid, Is.EqualTo(false));
202+
}
203+
204+
[TestCaseSource(nameof(ValidNonStringColumnTypes))]
205+
public void Given_LikeFilterWithNonStringColumn_Should_ReturnFilterWithErrorMessageValue(string propertyName)
206+
{
207+
var result = FilterFactory<TestPoco>.Create(propertyName, $"like:hello*", MockLogger.Object);
208+
209+
Assert.That(result.ErrorMessage, Is.Not.Null);
210+
}
211+
212+
[TestCaseSource(nameof(ValidNonStringColumnTypes))]
213+
public void Given_LikeFilterWithNonStringColumn_Should_LogWarningOnce(string propertyName)
214+
{
215+
var result = FilterFactory<TestPoco>.Create(propertyName, $"like:hello*", MockLogger.Object);
216+
217+
MockLogger.VerifyLogging(LogLevel.Warning, Times.Once());
218+
}
219+
#endregion Given_LikeFilter
220+
}
221+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using NUnit.Framework;
2+
using SqlCollaborative.Azure.DataPipelineTools.Common;
3+
4+
namespace DataPipelineTools.Tests.Common.FilterTests
5+
{
6+
[TestFixture]
7+
public class GetDynamicLinqStringTests : TestBase
8+
{
9+
[SetUp]
10+
public void Setup()
11+
{
12+
13+
}
14+
15+
[Test]
16+
public void Given_Name_And_OpertatorIsNotLike_Should_Return_SimpleDynamicLinqString()
17+
{
18+
var filter = new Filter<TestPoco>
19+
{
20+
PropertyName = "Name",
21+
Operator = "eq"
22+
};
23+
24+
var result = filter.GetDynamicLinqString();
25+
26+
27+
Assert.That(result, Is.EqualTo("Name eq @0"));
28+
}
29+
30+
[Test]
31+
public void Given_Name_And_OpertatorIsLike_Should_Return_DynamicLinqStringUsingRegexMatchFunction()
32+
{
33+
var filter = new Filter<TestPoco>
34+
{
35+
PropertyName = "Name",
36+
Operator = "like"
37+
};
38+
39+
var result = filter.GetDynamicLinqString();
40+
41+
Assert.That(result, Is.EqualTo("DynamicLinqUtils.IsRegexMatch(Name, @0)"));
42+
}
43+
}
44+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
using NUnit.Framework;
2+
using SqlCollaborative.Azure.DataPipelineTools.Common;
3+
4+
namespace DataPipelineTools.Tests.Common.FilterTests
5+
{
6+
[TestFixture]
7+
public class GetDynamicLinqValueTests : TestBase
8+
{
9+
[SetUp]
10+
public void Setup()
11+
{
12+
13+
}
14+
15+
[Test]
16+
public void Given_Value_And_OpertatorIsNotLike_Should_Return_Value()
17+
{
18+
var filter = new Filter<TestPoco>
19+
{
20+
Operator = "eq",
21+
Value = "Someone"
22+
};
23+
24+
var result = filter.GetDynamicLinqValue();
25+
26+
27+
Assert.That(result, Is.EqualTo(filter.Value));
28+
}
29+
30+
[Test]
31+
public void Given_ValueWithoutWildcards_And_OpertatorIsLike_Should_Return_Value()
32+
{
33+
var filter = new Filter<TestPoco>
34+
{
35+
Operator = "like",
36+
Value = "Someone"
37+
};
38+
39+
var result = filter.GetDynamicLinqValue();
40+
41+
42+
Assert.That(result, Is.EqualTo(filter.Value));
43+
}
44+
45+
[Test]
46+
public void Given_ValueWithWildcards_And_OpertatorIsLike_Should_Return_ValueWithWildcardsReplacedForRegexWildcard()
47+
{
48+
var filter = new Filter<TestPoco>
49+
{
50+
Operator = "like",
51+
Value = "Some*ne"
52+
};
53+
54+
var result = filter.GetDynamicLinqValue();
55+
56+
57+
Assert.That(result, Is.EqualTo("Some.+ne"));
58+
}
59+
}
60+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using NUnit.Framework;
2+
using SqlCollaborative.Azure.DataPipelineTools.Common;
3+
4+
namespace DataPipelineTools.Tests.Common.FilterTests
5+
{
6+
[TestFixture]
7+
public class PropertyTests : TestBase
8+
{
9+
[SetUp]
10+
public void Setup()
11+
{
12+
13+
}
14+
15+
[Test]
16+
public void Given_IsValid_IsDefault_Should_Return_False()
17+
{
18+
var filter = new Filter<TestPoco>();
19+
20+
Assert.That(filter.IsValid, Is.EqualTo(false));
21+
}
22+
23+
24+
[Test]
25+
public void Given_ErrorMessage_IsDefault_Should_Return_Null()
26+
{
27+
var filter = new Filter<TestPoco>();
28+
29+
Assert.That(filter.ErrorMessage, Is.EqualTo(null));
30+
}
31+
}
32+
}

0 commit comments

Comments
 (0)