-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Adding unit tests * Added unit tests and fixed issue with TypeExtensions
- Loading branch information
Showing
11 changed files
with
362 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
<SolutionConfiguration> | ||
<Settings> | ||
<AllowParallelTestExecution>True</AllowParallelTestExecution> | ||
<SolutionConfigured>True</SolutionConfigured> | ||
</Settings> | ||
</SolutionConfiguration> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
24 changes: 24 additions & 0 deletions
24
tests/myNOC.Tests.EntityFramework.Query/Extensions/IEnumerableExtensionsTests.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
using myNOC.EntityFramework.Query.Extensions; | ||
|
||
namespace myNOC.Tests.EntityFramework.Query.Extensions | ||
{ | ||
[TestClass] | ||
public class IEnumerableExtensionsTests | ||
{ | ||
[TestMethod] | ||
public void Apply_ExecutesAction_ReturnsIEnumerable() | ||
{ | ||
// Assemble | ||
var numbers = new List<int> { 1, 2, 3, 4, 5, 6 }; | ||
var total = numbers.Sum(); | ||
var calculated = 0; | ||
|
||
// Act | ||
var results = numbers.AsEnumerable().Apply(x => calculated += x); | ||
|
||
// Assert | ||
Assert.AreEqual(6, results.Count()); | ||
Assert.AreEqual(total, calculated); | ||
} | ||
} | ||
} |
53 changes: 53 additions & 0 deletions
53
tests/myNOC.Tests.EntityFramework.Query/Extensions/IServiceCollectionExtensionsTests.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
using Microsoft.Extensions.DependencyInjection; | ||
using myNOC.EntityFramework.Query; | ||
using myNOC.EntityFramework.Query.Extensions; | ||
|
||
namespace myNOC.Tests.EntityFramework.Query.Extensions | ||
{ | ||
[TestClass] | ||
public class IServiceCollectionExtensionsTests | ||
{ | ||
[TestMethod] | ||
public void AddQueryPattern_ScanAppDomainForClassesThatInheritFromIQueryContextOrIQueryRepository_ScopedAndRegister() | ||
{ | ||
// Assemble | ||
var services = new ServiceCollection(); | ||
|
||
// Act | ||
var results = services.AddQueryPattern(); | ||
|
||
// Assert | ||
Assert.IsNotNull(results); | ||
Assert.IsInstanceOfType(results, typeof(IServiceCollection)); | ||
|
||
Assert.IsNotNull(results.FirstOrDefault(x => x.ImplementationType == typeof(TestQueryContext) | ||
&& x.ServiceType == typeof(IQueryContext) | ||
&& x.Lifetime == ServiceLifetime.Scoped)); | ||
|
||
Assert.IsNotNull(results.FirstOrDefault(x => x.ImplementationType == typeof(TestQueryRepository) | ||
&& x.ServiceType == typeof(IQueryRepository) | ||
&& x.Lifetime == ServiceLifetime.Scoped)); | ||
} | ||
|
||
internal class TestQueryContext : IQueryContext | ||
{ | ||
public IQueryable<TEntity> Set<TEntity>() where TEntity : class | ||
{ | ||
throw new NotImplementedException(); | ||
} | ||
} | ||
|
||
internal class TestQueryRepository : IQueryRepository | ||
{ | ||
public Task<IEnumerable<TModel>> Query<TModel>(IQueryList<TModel> query) where TModel : class | ||
{ | ||
throw new NotImplementedException(); | ||
} | ||
|
||
public Task<TReturn?> Query<TReturn>(IQueryScalar<TReturn> query) | ||
{ | ||
throw new NotImplementedException(); | ||
} | ||
} | ||
} | ||
} |
109 changes: 109 additions & 0 deletions
109
tests/myNOC.Tests.EntityFramework.Query/Extensions/TypeExtensionsTests.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,109 @@ | ||
using myNOC.EntityFramework.Query.Extensions; | ||
using System.Reflection; | ||
|
||
namespace myNOC.Tests.EntityFramework.Query.Extensions | ||
{ | ||
[TestClass] | ||
public class TypeExtensionTests | ||
{ | ||
private IEnumerable<Type> _types = default!; | ||
|
||
[TestInitialize] | ||
public void Initialize() | ||
{ | ||
_types = Assembly.GetExecutingAssembly().GetTypes(); | ||
} | ||
|
||
[TestMethod] | ||
public void CanImplement_Types_ImplementsInterface_DirectInterface_ReturnsTypesThatInheritFromITestInterface2() | ||
{ | ||
// Arrange | ||
var implementedInterface = typeof(ITestInterface2); | ||
|
||
// Act | ||
var results = _types.CanImplement(implementedInterface); | ||
|
||
// Assert | ||
Assert.IsNotNull(results); | ||
Assert.AreEqual(1, results.Count()); | ||
Assert.AreEqual(1, results[0].Interfaces.Count()); | ||
Assert.AreEqual(implementedInterface, results[0].Interfaces[0]); | ||
Assert.AreEqual(typeof(TestClass3), results[0].Type); | ||
Assert.IsNull(results.FirstOrDefault(x => x.Type == typeof(TestClass4))); | ||
} | ||
|
||
[TestMethod] | ||
public void CanImplement_Types_ImplementsInterface_SupportsNestedInterfaces_ReturnsTypesThatInheritFromITestInterface() | ||
{ | ||
// Arrange | ||
var implementedInterface = typeof(ITestInterface); | ||
|
||
// Act | ||
var results = _types.CanImplement(implementedInterface); | ||
|
||
// Assert | ||
Assert.IsNotNull(results); | ||
Assert.AreEqual(3, results.Count()); | ||
Assert.IsNotNull(results.FirstOrDefault(x => x.Type == typeof(TestClass1))); | ||
Assert.IsNotNull(results.FirstOrDefault(x => x.Type == typeof(TestClass2))); | ||
Assert.IsNotNull(results.FirstOrDefault(x => x.Type == typeof(TestClass5))); | ||
Assert.IsNull(results.FirstOrDefault(x => x.Type == typeof(TestClass4))); | ||
} | ||
|
||
[TestMethod] | ||
public void CanImplement_Types_ImplementsInterface_NestedClassesRecursion() | ||
{ | ||
// Arrange | ||
var implementedInterface = typeof(ITestInterface3); | ||
|
||
// Act | ||
var results = _types.CanImplement(implementedInterface); | ||
|
||
// Assert | ||
Assert.IsNotNull(results); | ||
Assert.AreEqual(2, results.Count()); | ||
Assert.IsNotNull(results.FirstOrDefault(x => x.Type == typeof(TestClass6))); | ||
Assert.IsNotNull(results.FirstOrDefault(x => x.Type == typeof(TestClass8))); | ||
Assert.IsNull(results.FirstOrDefault(x => x.Type == typeof(TestClass4))); | ||
} | ||
|
||
[TestMethod] | ||
public void CanImplement_Types_ImplementsInterface_SkipIDisposableInterfaceInGetInterfaces() | ||
{ | ||
// Arrange | ||
var implementedInterface = typeof(ITestInterface5); | ||
|
||
// Act | ||
var results = _types.CanImplement(implementedInterface); | ||
|
||
// Assert | ||
Assert.IsNotNull(results); | ||
Assert.AreEqual(1, results.Count()); | ||
Assert.IsNotNull(results.FirstOrDefault(x => x.Type.Equals(typeof(TestClass7)))); | ||
Assert.IsNull(results.FirstOrDefault(x => x.Type == typeof(TestClass4))); | ||
} | ||
|
||
internal interface ITestInterface { } | ||
internal interface ITestInterface2 { } | ||
internal interface ITestInterface3 { } | ||
internal interface ITestInterface4 : ITestInterface { } | ||
internal interface ITestInterface5 : IDisposable { } | ||
internal interface ITestInterface7 : ITestInterface3 { } | ||
|
||
internal class TestClass1 : ITestInterface { } | ||
internal class TestClass2 : ITestInterface { } | ||
internal class TestClass3 : ITestInterface2 { } | ||
internal class TestClass4 { } | ||
internal class TestClass5 : ITestInterface4 { } | ||
internal class TestClass6 : TestClass4, ITestInterface7 { } | ||
internal class TestClass7 : ITestInterface5 | ||
{ | ||
public void Dispose() | ||
{ | ||
throw new NotImplementedException(); | ||
} | ||
} | ||
|
||
internal class TestClass8 : TestClass6 { } | ||
} | ||
} |
56 changes: 56 additions & 0 deletions
56
tests/myNOC.Tests.EntityFramework.Query/QueryContextTests.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
using Microsoft.EntityFrameworkCore; | ||
using myNOC.EntityFramework.Query; | ||
using NSubstitute; | ||
using System.ComponentModel.DataAnnotations; | ||
|
||
namespace myNOC.Tests.EntityFramework.Query | ||
{ | ||
[TestClass] | ||
public class QueryContextTests | ||
{ | ||
private TestContext _testDbContext = default!; | ||
private QueryContext _queryContext = Substitute.ForPartsOf<QueryContext>(); | ||
|
||
[TestInitialize] | ||
public void Initialize() | ||
{ | ||
var options = new DbContextOptionsBuilder<TestContext>().UseInMemoryDatabase("testContext").Options; | ||
_testDbContext = new TestContext(options); | ||
} | ||
|
||
|
||
[TestCleanup] | ||
public void Cleanup() | ||
{ | ||
_testDbContext?.Database?.EnsureDeleted(); | ||
_testDbContext?.Dispose(); | ||
} | ||
|
||
[TestMethod] | ||
public void Set_Returns_Entity() | ||
{ | ||
// Assemble | ||
_queryContext.GetContext().Returns(_testDbContext); | ||
|
||
// Act | ||
var result = _queryContext.Set<TestEntity>(); | ||
|
||
// Assert | ||
Assert.IsNotNull(result); | ||
Assert.IsInstanceOfType<IQueryable<TestEntity>>(result); | ||
} | ||
|
||
public class TestEntity | ||
{ | ||
[Key] | ||
public int Id { get; set; } | ||
} | ||
|
||
public class TestContext : DbContext | ||
{ | ||
public DbSet<TestEntity> TestEntities { get; set; } = default!; | ||
|
||
public TestContext(DbContextOptions options) : base(options) { } | ||
} | ||
} | ||
} |
96 changes: 96 additions & 0 deletions
96
tests/myNOC.Tests.EntityFramework.Query/QueryRepositoryTests.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
using Microsoft.EntityFrameworkCore; | ||
using myNOC.EntityFramework.Query; | ||
using NSubstitute; | ||
using System.ComponentModel.DataAnnotations; | ||
|
||
namespace myNOC.Tests.EntityFramework.Query | ||
{ | ||
[TestClass] | ||
public class QueryRepositoryTests | ||
{ | ||
private QueryContext _queryContext = default!; | ||
private TestContext _testDbContext = default!; | ||
private QueryRepository _queryRepository = default!; | ||
|
||
[TestInitialize] | ||
public void Initialize() | ||
{ | ||
var options = new DbContextOptionsBuilder<TestContext>().UseInMemoryDatabase("testRepository").Options; | ||
_testDbContext = new TestContext(options); | ||
_testDbContext.TestEntities.Add(new TestEntity()); | ||
_testDbContext.TestEntities.Add(new TestEntity()); | ||
_testDbContext.TestEntities.Add(new TestEntity()); | ||
_testDbContext.SaveChanges(); | ||
|
||
_queryContext = Substitute.ForPartsOf<QueryContext>(); | ||
_queryContext.GetContext().Returns(_testDbContext); | ||
|
||
_queryRepository = Substitute.ForPartsOf<QueryRepository>(_queryContext); | ||
} | ||
|
||
[TestCleanup] | ||
public void Cleanup() | ||
{ | ||
_testDbContext?.Database?.EnsureDeleted(); | ||
_testDbContext?.Dispose(); | ||
} | ||
|
||
[TestMethod] | ||
public async Task Query_RunAIQueryList_ReturnsIEnumerable() | ||
{ | ||
// Assemble | ||
var query = new TestEntitiesGetAll(); | ||
|
||
// Act | ||
var result = await _queryRepository.Query(query); | ||
|
||
// Assert | ||
Assert.AreEqual(3, result.Count()); | ||
} | ||
|
||
[TestMethod] | ||
public async Task Query_RunAIQueryScalar_ReturnsInt() | ||
{ | ||
// Assemble | ||
var query = new TestEntitiesCount(); | ||
|
||
// Act | ||
var result = await _queryRepository.Query(query); | ||
|
||
// Assert | ||
Assert.AreEqual(3, result); | ||
} | ||
|
||
public class TestModel { } | ||
|
||
public class TestEntity | ||
{ | ||
[Key] | ||
public int Id { get; set; } | ||
} | ||
|
||
public class TestContext : DbContext | ||
{ | ||
public DbSet<TestEntity> TestEntities { get; set; } = default!; | ||
|
||
public TestContext(DbContextOptions options) : base(options) { } | ||
} | ||
|
||
internal class TestEntitiesGetAll : IQueryList<TestModel> | ||
{ | ||
public IQueryable<TestModel> Query(IQueryContext context) | ||
{ | ||
return from te in context.Set<TestEntity>() | ||
select new TestModel(); | ||
} | ||
} | ||
|
||
internal class TestEntitiesCount : IQueryScalar<int> | ||
{ | ||
public async Task<int> GetScalar(IQueryContext context) | ||
{ | ||
return await context.Set<TestEntity>().CountAsync(); | ||
} | ||
} | ||
} | ||
} |
Oops, something went wrong.