Skip to content

Commit 7482bed

Browse files
committed
Add unit tests for MockDataBackend and QueryProcessor services
1 parent bffa347 commit 7482bed

File tree

4 files changed

+255
-0
lines changed

4 files changed

+255
-0
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net10.0</TargetFramework>
5+
<LangVersion>latest</LangVersion>
6+
<ImplicitUsings>enable</ImplicitUsings>
7+
<Nullable>enable</Nullable>
8+
<IsPackable>false</IsPackable>
9+
</PropertyGroup>
10+
11+
<ItemGroup>
12+
<PackageReference Include="MSTest" Version="3.2.0" />
13+
<PackageReference Include="Microsoft.Testing.Extensions.CodeCoverage" Version="17.10.1" />
14+
</ItemGroup>
15+
16+
<ItemGroup>
17+
<ProjectReference Include="..\..\src\NLWebNet\NLWebNet.csproj" />
18+
</ItemGroup>
19+
20+
<ItemGroup>
21+
<Using Include="Microsoft.VisualStudio.TestTools.UnitTesting" />
22+
</ItemGroup>
23+
24+
</Project>
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
using NLWebNet.Models;
2+
using NLWebNet.Services;
3+
4+
namespace NLWebNet.Tests.Services;
5+
6+
[TestClass]
7+
public class MockDataBackendTests
8+
{
9+
private MockDataBackend _mockDataBackend = null!;
10+
11+
[TestInitialize]
12+
public void Initialize()
13+
{
14+
var logger = new TestLogger<MockDataBackend>();
15+
_mockDataBackend = new MockDataBackend(logger);
16+
}
17+
18+
[TestMethod]
19+
public async Task SearchAsync_ReturnsResults()
20+
{
21+
// Arrange
22+
var query = "NET Core"; // Use a term that appears in the sample data
23+
24+
// Act
25+
var results = await _mockDataBackend.SearchAsync(query, null, 10, CancellationToken.None);
26+
var resultsList = results.ToList();
27+
28+
// Assert
29+
Assert.IsTrue(resultsList.Count > 0);
30+
foreach (var result in resultsList)
31+
{
32+
Assert.IsNotNull(result.Name);
33+
Assert.IsTrue(result.Name.Length > 0);
34+
Assert.IsNotNull(result.Url);
35+
Assert.IsTrue(result.Url.Length > 0);
36+
Assert.IsNotNull(result.Description);
37+
Assert.IsTrue(result.Description.Length > 0);
38+
}
39+
}
40+
41+
[TestMethod]
42+
public async Task SearchAsync_WithSiteFilter_ReturnsFilteredResults()
43+
{
44+
// Arrange
45+
var query = "documentation"; // Use a term that appears in the sample data
46+
var site = "docs.microsoft.com"; // Use a site that exists in sample data
47+
48+
// Act
49+
var results = await _mockDataBackend.SearchAsync(query, site, 10, CancellationToken.None);
50+
var resultsList = results.ToList();
51+
52+
// Assert
53+
Assert.IsTrue(resultsList.Count > 0);
54+
foreach (var result in resultsList)
55+
{
56+
Assert.AreEqual(site, result.Site);
57+
}
58+
}
59+
60+
[TestMethod]
61+
public async Task SearchAsync_RespectsMaxResults()
62+
{
63+
// Arrange
64+
var query = "microsoft"; // Use a term that will match multiple results
65+
var maxResults = 3;
66+
67+
// Act
68+
var results = await _mockDataBackend.SearchAsync(query, null, maxResults, CancellationToken.None);
69+
var resultsList = results.ToList();
70+
71+
// Assert
72+
Assert.IsTrue(resultsList.Count <= maxResults);
73+
}
74+
75+
[TestMethod]
76+
[DataRow("")]
77+
[DataRow(null)]
78+
public async Task SearchAsync_WithEmptyQuery_ReturnsEmptyResults(string? query)
79+
{
80+
// Act
81+
var results = await _mockDataBackend.SearchAsync(query!, null, 10, CancellationToken.None);
82+
var resultsList = results.ToList();
83+
84+
// Assert
85+
Assert.AreEqual(0, resultsList.Count);
86+
}
87+
}
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
using Microsoft.Extensions.Logging;
2+
using Microsoft.Extensions.Options;
3+
using NLWebNet.Models;
4+
using NLWebNet.Services;
5+
6+
namespace NLWebNet.Tests.Services;
7+
8+
[TestClass]
9+
public class QueryProcessorTests
10+
{
11+
private QueryProcessor _queryProcessor = null!;
12+
private ILogger<QueryProcessor> _logger = null!;
13+
14+
[TestInitialize]
15+
public void Initialize()
16+
{
17+
_logger = new TestLogger<QueryProcessor>();
18+
_queryProcessor = new QueryProcessor(_logger);
19+
}
20+
21+
[TestMethod]
22+
public void ValidateRequest_WithValidRequest_ReturnsTrue()
23+
{
24+
// Arrange
25+
var request = new NLWebRequest
26+
{
27+
Query = "test query",
28+
Mode = QueryMode.List
29+
};
30+
31+
// Act
32+
var result = _queryProcessor.ValidateRequest(request);
33+
34+
// Assert
35+
Assert.IsTrue(result);
36+
}
37+
38+
[TestMethod]
39+
public void ValidateRequest_WithEmptyQuery_ReturnsFalse()
40+
{
41+
// Arrange
42+
var request = new NLWebRequest
43+
{
44+
Query = "",
45+
Mode = QueryMode.List
46+
};
47+
48+
// Act
49+
var result = _queryProcessor.ValidateRequest(request);
50+
51+
// Assert
52+
Assert.IsFalse(result);
53+
}
54+
55+
[TestMethod]
56+
public void ValidateRequest_WithNullQuery_ReturnsFalse()
57+
{
58+
// Arrange
59+
var request = new NLWebRequest
60+
{
61+
Query = null!,
62+
Mode = QueryMode.List
63+
};
64+
65+
// Act
66+
var result = _queryProcessor.ValidateRequest(request);
67+
68+
// Assert
69+
Assert.IsFalse(result);
70+
}
71+
72+
[TestMethod]
73+
public void GenerateQueryId_WithNullRequestQueryId_GeneratesNewId()
74+
{
75+
// Arrange
76+
var request = new NLWebRequest
77+
{
78+
Query = "test query",
79+
QueryId = null
80+
};
81+
82+
// Act
83+
var result = _queryProcessor.GenerateQueryId(request);
84+
85+
// Assert
86+
Assert.IsNotNull(result);
87+
Assert.IsTrue(result.Length > 0);
88+
}
89+
90+
[TestMethod]
91+
public void GenerateQueryId_WithExistingQueryId_ReturnsExistingId()
92+
{
93+
// Arrange
94+
var existingId = "existing-id";
95+
var request = new NLWebRequest
96+
{
97+
Query = "test query",
98+
QueryId = existingId
99+
};
100+
101+
// Act
102+
var result = _queryProcessor.GenerateQueryId(request);
103+
104+
// Assert
105+
Assert.AreEqual(existingId, result);
106+
}
107+
108+
[TestMethod]
109+
public async Task ProcessQueryAsync_ReturnsQuery()
110+
{
111+
// Arrange
112+
var request = new NLWebRequest
113+
{
114+
Query = "test query",
115+
Mode = QueryMode.List
116+
};
117+
118+
// Act
119+
var result = await _queryProcessor.ProcessQueryAsync(request, CancellationToken.None);
120+
121+
// Assert
122+
Assert.AreEqual("test query", result);
123+
}
124+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using Microsoft.Extensions.Logging;
2+
3+
namespace NLWebNet.Tests;
4+
5+
/// <summary>
6+
/// Simple test logger implementation for unit tests.
7+
/// </summary>
8+
/// <typeparam name="T">The type being logged.</typeparam>
9+
public class TestLogger<T> : ILogger<T>
10+
{
11+
public IDisposable? BeginScope<TState>(TState state) where TState : notnull => null;
12+
13+
public bool IsEnabled(LogLevel logLevel) => true;
14+
15+
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string> formatter)
16+
{
17+
// In a real test, you might want to capture log messages for assertions
18+
Console.WriteLine($"[{logLevel}] {formatter(state, exception)}");
19+
}
20+
}

0 commit comments

Comments
 (0)