From d25ba79c2f16b8d8eced7dc49d0523edcbf06794 Mon Sep 17 00:00:00 2001 From: Pavel Krinitsyn Date: Mon, 26 Feb 2024 19:04:41 +0300 Subject: [PATCH] Added method for build DbSet from IEnumerable. --- .../FakeItEasyExtensions.cs | 2 + .../MockQueryable.Moq/MoqExtensions.cs | 4 +- .../NSubstituteExtensions.cs | 2 + .../MyServiceFakeItEasyTests.cs | 102 +++++++++++- .../MockQueryable.Sample/MyServiceMoqTests.cs | 154 +++++++++++++++++- .../MyServiceNSubstituteTests.cs | 127 +++++++++++++++ 6 files changed, 382 insertions(+), 9 deletions(-) diff --git a/src/MockQueryable/MockQueryable.FakeItEasy/FakeItEasyExtensions.cs b/src/MockQueryable/MockQueryable.FakeItEasy/FakeItEasyExtensions.cs index 17e9558..809d4d3 100644 --- a/src/MockQueryable/MockQueryable.FakeItEasy/FakeItEasyExtensions.cs +++ b/src/MockQueryable/MockQueryable.FakeItEasy/FakeItEasyExtensions.cs @@ -15,6 +15,8 @@ public static class FakeItEasyExtensions return new TestAsyncEnumerableEfCore(data); } + public static DbSet BuildMockDbSet(this IEnumerable data) where TEntity : class => data.BuildMock().BuildMockDbSet(); + public static DbSet BuildMockDbSet(this IQueryable data) where TEntity : class { var mock = A.Fake>(d => d.Implements>().Implements>()); diff --git a/src/MockQueryable/MockQueryable.Moq/MoqExtensions.cs b/src/MockQueryable/MockQueryable.Moq/MoqExtensions.cs index a877d11..d81da1f 100644 --- a/src/MockQueryable/MockQueryable.Moq/MoqExtensions.cs +++ b/src/MockQueryable/MockQueryable.Moq/MoqExtensions.cs @@ -10,11 +10,13 @@ namespace MockQueryable.Moq { public static class MoqExtensions { - public static IQueryable BuildMock(this IEnumerable data) where TEntity : class + public static IQueryable BuildMock(this IEnumerable data) where TEntity : class { return new TestAsyncEnumerableEfCore(data); } + public static Mock> BuildMockDbSet(this IEnumerable data) where TEntity : class => data.BuildMock().BuildMockDbSet(); + public static Mock> BuildMockDbSet(this IQueryable data) where TEntity : class { var mock = new Mock>(); diff --git a/src/MockQueryable/MockQueryable.NSubstitute/NSubstituteExtensions.cs b/src/MockQueryable/MockQueryable.NSubstitute/NSubstituteExtensions.cs index 810b845..0068608 100644 --- a/src/MockQueryable/MockQueryable.NSubstitute/NSubstituteExtensions.cs +++ b/src/MockQueryable/MockQueryable.NSubstitute/NSubstituteExtensions.cs @@ -15,6 +15,8 @@ public static class NSubstituteExtensions return new TestAsyncEnumerableEfCore(data); } + public static DbSet BuildMockDbSet(this IEnumerable data) where TEntity : class => data.BuildMock().BuildMockDbSet(); + public static DbSet BuildMockDbSet(this IQueryable data) where TEntity : class { var mock = Substitute.For, IQueryable, IAsyncEnumerable>(); diff --git a/src/MockQueryable/MockQueryable.Sample/MyServiceFakeItEasyTests.cs b/src/MockQueryable/MockQueryable.Sample/MyServiceFakeItEasyTests.cs index c65ad82..46a56ba 100644 --- a/src/MockQueryable/MockQueryable.Sample/MyServiceFakeItEasyTests.cs +++ b/src/MockQueryable/MockQueryable.Sample/MyServiceFakeItEasyTests.cs @@ -109,7 +109,32 @@ public void DbSetCreateUserIfNotExist(string firstName, string lastName, DateTim } - [TestCase("AnyFirstName", "ExistLastName", "01/20/2012")] + [TestCase("AnyFirstName", "AnyExistLastName", "01/20/2012", "Users with DateOfBirth more than limit")] + [TestCase("ExistFirstName", "AnyExistLastName", "02/20/2012", "User with FirstName already exist")] + [TestCase("AnyFirstName", "ExistLastName", "01/20/2012", "User already exist")] + public void DbSetCreatedFromCollectionCreateUserIfNotExist(string firstName, string lastName, DateTime dateOfBirth, string expectedError) + { + //arrange + var users = new List + { + new UserEntity {LastName = "ExistLastName", DateOfBirth = DateTime.Parse("01/20/2012", UsCultureInfo.DateTimeFormat)}, + new UserEntity {FirstName = "ExistFirstName"}, + new UserEntity {DateOfBirth = DateTime.Parse("01/20/2012", UsCultureInfo.DateTimeFormat)}, + new UserEntity {DateOfBirth = DateTime.Parse("01/20/2012", UsCultureInfo.DateTimeFormat)}, + new UserEntity {DateOfBirth = DateTime.Parse("01/20/2012", UsCultureInfo.DateTimeFormat)}, + }; + var mock = users.BuildMockDbSet(); + var userRepository = new TestDbSetRepository(mock); + var service = new MyService(userRepository); + //act + var ex = Assert.ThrowsAsync(() => + service.CreateUserIfNotExist(firstName, lastName, dateOfBirth)); + //assert + Assert.AreEqual(expectedError, ex.Message); + + } + + [TestCase("AnyFirstName", "ExistLastName", "01/20/2012")] public async Task DbSetCreateUser(string firstName, string lastName, DateTime dateOfBirth) { //arrange @@ -132,7 +157,30 @@ public async Task DbSetCreateUser(string firstName, string lastName, DateTime da Assert.AreEqual(dateOfBirth, entity.DateOfBirth); } - [TestCase("01/20/2012", "06/20/2018", 5)] + [TestCase("AnyFirstName", "ExistLastName", "01/20/2012")] + public async Task DbSetCreatedFromCollectionCreateUser1(string firstName, string lastName, DateTime dateOfBirth) + { + //arrange + var userEntities = new List(); + var mock = userEntities.BuildMockDbSet(); + A.CallTo(() => mock.AddAsync(A._, A._)) + .ReturnsLazily(call => + { + userEntities.Add((UserEntity)call.Arguments[0]); + return default; + }); + var userRepository = new TestDbSetRepository(mock); + var service = new MyService(userRepository); + //act + await service.CreateUserIfNotExist(firstName, lastName, dateOfBirth); + // assert + var entity = mock.Single(); + Assert.AreEqual(firstName, entity.FirstName); + Assert.AreEqual(lastName, entity.LastName); + Assert.AreEqual(dateOfBirth, entity.DateOfBirth); + } + + [TestCase("01/20/2012", "06/20/2018", 5)] [TestCase("01/20/2012", "06/20/2012", 4)] [TestCase("01/20/2012", "02/20/2012", 3)] [TestCase("01/20/2010", "02/20/2011", 0)] @@ -149,7 +197,24 @@ public async Task DbSetGetUserReports(DateTime from, DateTime to, int expectedCo Assert.AreEqual(expectedCount, result.Count); } - [TestCase] + [TestCase("01/20/2012", "06/20/2018", 5)] + [TestCase("01/20/2012", "06/20/2012", 4)] + [TestCase("01/20/2012", "02/20/2012", 3)] + [TestCase("01/20/2010", "02/20/2011", 0)] + public async Task DbSetCreatedFromCollectionGetUserReports(DateTime from, DateTime to, int expectedCount) + { + //arrange + var users = CreateUserList(); + var mock = users.BuildMockDbSet(); + var userRepository = new TestDbSetRepository(mock); + var service = new MyService(userRepository); + //act + var result = await service.GetUserReports(from, to); + //assert + Assert.AreEqual(expectedCount, result.Count); + } + + [TestCase] public async Task DbSetGetAllUserEntitiesAsync() { // arrange @@ -166,6 +231,22 @@ public async Task DbSetGetAllUserEntitiesAsync() } [TestCase] + public async Task DbSetCreatedFromCollectionGetAllUserEntitiesAsync() + { + // arrange + var users = CreateUserList(); + + var mockDbSet = users.BuildMockDbSet(); + var userRepository = new TestDbSetRepository(mockDbSet); + + // act + var result = await userRepository.GetAllAsync().ToListAsync(); + + // assert + Assert.AreEqual(users.Count, result.Count); + } + + [TestCase] public async Task DbSetGetAllUserEntity() { //arrange @@ -178,7 +259,20 @@ public async Task DbSetGetAllUserEntity() Assert.AreEqual(users.Count, result.Count); } - private static List CreateUserList() => new List + [TestCase] + public async Task DbSetCreatedFromCollectionGetAllUserEntity() + { + //arrange + var users = CreateUserList(); + var mock = users.BuildMockDbSet(); + var userRepository = new TestDbSetRepository(mock); + //act + var result = await userRepository.GetAll(); + //assert + Assert.AreEqual(users.Count, result.Count); + } + + private static List CreateUserList() => new List { new UserEntity { diff --git a/src/MockQueryable/MockQueryable.Sample/MyServiceMoqTests.cs b/src/MockQueryable/MockQueryable.Sample/MyServiceMoqTests.cs index 5fa418b..fc38f63 100644 --- a/src/MockQueryable/MockQueryable.Sample/MyServiceMoqTests.cs +++ b/src/MockQueryable/MockQueryable.Sample/MyServiceMoqTests.cs @@ -110,7 +110,31 @@ public void DbSetCreateUserIfNotExist(string firstName, string lastName, DateTim Assert.AreEqual(expectedError, ex.Message); } - [TestCase("AnyFirstName", "ExistLastName", "01/20/2012")] + [TestCase("AnyFirstName", "AnyExistLastName", "01/20/2012", "Users with DateOfBirth more than limit")] + [TestCase("ExistFirstName", "AnyExistLastName", "02/20/2012", "User with FirstName already exist")] + [TestCase("AnyFirstName", "ExistLastName", "01/20/2012", "User already exist")] + public void DbSetCreatedFromCollectionCreateUserIfNotExist(string firstName, string lastName, DateTime dateOfBirth, string expectedError) + { + //arrange + var users = new List + { + new UserEntity {LastName = "ExistLastName", DateOfBirth = DateTime.Parse("01/20/2012", UsCultureInfo.DateTimeFormat)}, + new UserEntity {FirstName = "ExistFirstName"}, + new UserEntity {DateOfBirth = DateTime.Parse("01/20/2012", UsCultureInfo.DateTimeFormat)}, + new UserEntity {DateOfBirth = DateTime.Parse("01/20/2012", UsCultureInfo.DateTimeFormat)}, + new UserEntity {DateOfBirth = DateTime.Parse("01/20/2012", UsCultureInfo.DateTimeFormat)} + }; + var mock = users.BuildMockDbSet(); + var userRepository = new TestDbSetRepository(mock.Object); + var service = new MyService(userRepository); + //act + var ex = Assert.ThrowsAsync(() => + service.CreateUserIfNotExist(firstName, lastName, dateOfBirth)); + //assert + Assert.AreEqual(expectedError, ex.Message); + } + + [TestCase("AnyFirstName", "ExistLastName", "01/20/2012")] public async Task DbSetCreateUser(string firstName, string lastName, DateTime dateOfBirth) { //arrange @@ -130,7 +154,27 @@ public async Task DbSetCreateUser(string firstName, string lastName, DateTime da Assert.AreEqual(dateOfBirth, entity.DateOfBirth); } - [TestCase("01/20/2012", "06/20/2018", 5)] + [TestCase("AnyFirstName", "ExistLastName", "01/20/2012")] + public async Task DbSetCreatedFromCollectionCreateUser(string firstName, string lastName, DateTime dateOfBirth) + { + //arrange + var userEntities = new List(); + var mock = userEntities.BuildMockDbSet(); + + mock.Setup(set => set.AddAsync(It.IsAny(), It.IsAny())) + .Callback((UserEntity entity, CancellationToken _) => userEntities.Add(entity)); + var userRepository = new TestDbSetRepository(mock.Object); + var service = new MyService(userRepository); + //act + await service.CreateUserIfNotExist(firstName, lastName, dateOfBirth); + // assert + var entity = mock.Object.Single(); + Assert.AreEqual(firstName, entity.FirstName); + Assert.AreEqual(lastName, entity.LastName); + Assert.AreEqual(dateOfBirth, entity.DateOfBirth); + } + + [TestCase("01/20/2012", "06/20/2018", 5)] [TestCase("01/20/2012", "06/20/2012", 4)] [TestCase("01/20/2012", "02/20/2012", 3)] [TestCase("01/20/2010", "02/20/2011", 0)] @@ -147,7 +191,24 @@ public async Task DbSetGetUserReports(DateTime from, DateTime to, int expectedCo Assert.AreEqual(expectedCount, result.Count); } - [TestCase] + [TestCase("01/20/2012", "06/20/2018", 5)] + [TestCase("01/20/2012", "06/20/2012", 4)] + [TestCase("01/20/2012", "02/20/2012", 3)] + [TestCase("01/20/2010", "02/20/2011", 0)] + public async Task DbSetCreatedFromCollectionGetUserReports(DateTime from, DateTime to, int expectedCount) + { + //arrange + var users = CreateUserList(); + var mock = users.BuildMockDbSet(); + var userRepository = new TestDbSetRepository(mock.Object); + var service = new MyService(userRepository); + //act + var result = await service.GetUserReports(from, to); + //assert + Assert.AreEqual(expectedCount, result.Count); + } + + [TestCase] public async Task DbSetGetAllUserEntity() { //arrange @@ -161,6 +222,19 @@ public async Task DbSetGetAllUserEntity() } [TestCase] + public async Task DbSetCreatedFromCollectionGetAllUserEntity() + { + //arrange + var users = CreateUserList(); + var mock = users.BuildMockDbSet(); + var userRepository = new TestDbSetRepository(mock.Object); + //act + var result = await userRepository.GetAll(); + //assert + Assert.AreEqual(users.Count, result.Count); + } + + [TestCase] public async Task DbSetFindAsyncUserEntity() { //arrange @@ -215,7 +289,63 @@ public async Task DbSetFindAsyncUserEntity() Assert.AreEqual("FirstName3", result.FirstName); } + [TestCase] + public async Task DbSetCreatedFromCollectionFindAsyncUserEntity() + { + //arrange + var userId = Guid.NewGuid(); + var users = new List + { + new UserEntity + { + Id = Guid.NewGuid(), + FirstName = "FirstName1", LastName = "LastName", + DateOfBirth = DateTime.Parse("01/20/2012", UsCultureInfo.DateTimeFormat) + }, + new UserEntity + { + Id = Guid.NewGuid(), + FirstName = "FirstName2", LastName = "LastName", + DateOfBirth = DateTime.Parse("01/20/2012", UsCultureInfo.DateTimeFormat) + }, + new UserEntity + { + Id = userId, + FirstName = "FirstName3", LastName = "LastName", + DateOfBirth = DateTime.Parse("01/20/2012", UsCultureInfo.DateTimeFormat) + }, + new UserEntity + { + Id = Guid.NewGuid(), + FirstName = "FirstName3", LastName = "LastName", + DateOfBirth = DateTime.Parse("03/20/2012", UsCultureInfo.DateTimeFormat) + }, + new UserEntity + { + Id = Guid.NewGuid(), + FirstName = "FirstName5", LastName = "LastName", + DateOfBirth = DateTime.Parse("01/20/2018", UsCultureInfo.DateTimeFormat) + } + }; + + var mock = users.BuildMockDbSet(); + mock.Setup(x => x.FindAsync(It.IsAny())).ReturnsAsync((object[] ids) => + { + var id = (Guid)ids.First(); + return users.FirstOrDefault(x => x.Id == id); + }); + var userRepository = new TestDbSetRepository(mock.Object); + + //act + var result = await ((DbSet)userRepository.GetQueryable()).FindAsync(userId); + + //assert + Assert.IsNotNull(result); + Assert.AreEqual("FirstName3", result.FirstName); + } + + [TestCase] public async Task DbSetGetAllUserEntitiesAsync() { // arrange @@ -231,7 +361,23 @@ public async Task DbSetGetAllUserEntitiesAsync() Assert.AreEqual(users.Count, result.Count); } - private static List CreateUserList() => new List + [TestCase] + public async Task DbSetCreatedFromCollectionGetAllUserEntitiesAsync() + { + // arrange + var users = CreateUserList(); + + var mockDbSet = users.BuildMockDbSet(); + var userRepository = new TestDbSetRepository(mockDbSet.Object); + + // act + var result = await userRepository.GetAllAsync().ToListAsync(); + + // assert + Assert.AreEqual(users.Count, result.Count); + } + + private static List CreateUserList() => new List { new UserEntity { FirstName = "FirstName1", LastName = "LastName", DateOfBirth = DateTime.Parse("01/20/2012", UsCultureInfo.DateTimeFormat) }, new UserEntity { FirstName = "FirstName2", LastName = "LastName", DateOfBirth = DateTime.Parse("01/20/2012", UsCultureInfo.DateTimeFormat) }, diff --git a/src/MockQueryable/MockQueryable.Sample/MyServiceNSubstituteTests.cs b/src/MockQueryable/MockQueryable.Sample/MyServiceNSubstituteTests.cs index 3039149..35caa2a 100644 --- a/src/MockQueryable/MockQueryable.Sample/MyServiceNSubstituteTests.cs +++ b/src/MockQueryable/MockQueryable.Sample/MyServiceNSubstituteTests.cs @@ -80,6 +80,25 @@ public async Task GetUserReports_AutoMap(DateTime from, DateTime to, int expecte } + [TestCase("01/20/2012", "06/20/2018", 5)] + [TestCase("01/20/2012", "06/20/2012", 4)] + [TestCase("01/20/2012", "02/20/2012", 3)] + [TestCase("01/20/2010", "02/20/2011", 0)] + public async Task GetUserReports_AutoMap_FromDbSetCreatedFromCollection(DateTime from, DateTime to, int expectedCount) + { + //arrange + List users = CreateUserList(); + + var mock = users.BuildMockDbSet(); + var userRepository = new TestDbSetRepository(mock); + var service = new MyService(userRepository); + //act + var result = await service.GetUserReportsAutoMap(from, to); + //assert + Assert.AreEqual(expectedCount, result.Count); + + } + [TestCase("AnyFirstName", "AnyExistLastName", "01/20/2012", "Users with DateOfBirth more than limit")] [TestCase("ExistFirstName", "AnyExistLastName", "02/20/2012", "User with FirstName already exist")] [TestCase("AnyFirstName", "ExistLastName", "01/20/2012", "User already exist")] @@ -105,6 +124,30 @@ public void DbSetCreateUserIfNotExist(string firstName, string lastName, DateTim } + [TestCase("AnyFirstName", "AnyExistLastName", "01/20/2012", "Users with DateOfBirth more than limit")] + [TestCase("ExistFirstName", "AnyExistLastName", "02/20/2012", "User with FirstName already exist")] + [TestCase("AnyFirstName", "ExistLastName", "01/20/2012", "User already exist")] + public void DbSetCreatedFromCollectionCreateUserIfNotExist(string firstName, string lastName, DateTime dateOfBirth, string expectedError) + { + //arrange + var users = new List + { + new UserEntity{LastName = "ExistLastName", DateOfBirth = DateTime.Parse("01/20/2012",UsCultureInfo.DateTimeFormat)}, + new UserEntity{FirstName = "ExistFirstName"}, + new UserEntity{DateOfBirth = DateTime.Parse("01/20/2012",UsCultureInfo.DateTimeFormat)}, + new UserEntity{DateOfBirth = DateTime.Parse("01/20/2012",UsCultureInfo.DateTimeFormat)}, + new UserEntity{DateOfBirth = DateTime.Parse("01/20/2012",UsCultureInfo.DateTimeFormat)}, + }; + var mock = users.BuildMockDbSet(); + var userRepository = new TestDbSetRepository(mock); + var service = new MyService(userRepository); + //act + var ex = Assert.ThrowsAsync(() => service.CreateUserIfNotExist(firstName, lastName, dateOfBirth)); + //assert + Assert.AreEqual(expectedError, ex.Message); + + } + [TestCase("AnyFirstName", "ExistLastName", "01/20/2012")] public async Task DbSetCreateUser(string firstName, string lastName, DateTime dateOfBirth) { @@ -125,6 +168,26 @@ public async Task DbSetCreateUser(string firstName, string lastName, DateTime da Assert.AreEqual(dateOfBirth, entity.DateOfBirth); } + [TestCase("AnyFirstName", "ExistLastName", "01/20/2012")] + public async Task DbSetCreatedFromCollectionCreateUser(string firstName, string lastName, DateTime dateOfBirth) + { + //arrange + var userEntities = new List(); + var mock = userEntities.BuildMockDbSet(); + mock.AddAsync(Arg.Any()) + .Returns(info => null) + .AndDoes(info => userEntities.Add(info.Arg())); + var userRepository = new TestDbSetRepository(mock); + var service = new MyService(userRepository); + //act + await service.CreateUserIfNotExist(firstName, lastName, dateOfBirth); + // assert + var entity = mock.Single(); + Assert.AreEqual(firstName, entity.FirstName); + Assert.AreEqual(lastName, entity.LastName); + Assert.AreEqual(dateOfBirth, entity.DateOfBirth); + } + [TestCase("01/20/2012", "06/20/2018", 5)] [TestCase("01/20/2012", "06/20/2012", 4)] [TestCase("01/20/2012", "02/20/2012", 3)] @@ -143,6 +206,23 @@ public async Task DbSetGetUserReports(DateTime from, DateTime to, int expectedCo Assert.AreEqual(expectedCount, result.Count); } + [TestCase("01/20/2012", "06/20/2018", 5)] + [TestCase("01/20/2012", "06/20/2012", 4)] + [TestCase("01/20/2012", "02/20/2012", 3)] + [TestCase("01/20/2010", "02/20/2011", 0)] + public async Task DbSetCreatedFromCollectionGetUserReports(DateTime from, DateTime to, int expectedCount) + { + //arrange + var users = CreateUserList(); + + var mock = users.BuildMockDbSet(); + var userRepository = new TestDbSetRepository(mock); + var service = new MyService(userRepository); + //act + var result = await service.GetUserReports(from, to); + //assert + Assert.AreEqual(expectedCount, result.Count); + } [TestCase] public async Task DbSetGetAllUserEntity() @@ -157,6 +237,19 @@ public async Task DbSetGetAllUserEntity() Assert.AreEqual(users.Count, result.Count); } + [TestCase] + public async Task DbSetCreatedFromCollectionGetAllUserEntity() + { + //arrange + var users = CreateUserList(); + var mock = users.BuildMockDbSet(); + var userRepository = new TestDbSetRepository(mock); + //act + var result = await userRepository.GetAll(); + //assert + Assert.AreEqual(users.Count, result.Count); + } + [TestCase] public async Task DbSetGetAllUserEntitiesAsync() { @@ -173,6 +266,22 @@ public async Task DbSetGetAllUserEntitiesAsync() Assert.AreEqual(users.Count, result.Count); } + [TestCase] + public async Task DbSetCreatedFromCollectionGetAllUserEntitiesAsync() + { + // arrange + var users = CreateUserList(); + + var mockDbSet = users.BuildMockDbSet(); + var userRepository = new TestDbSetRepository(mockDbSet); + + // act + var result = await userRepository.GetAllAsync().ToListAsync(); + + // assert + Assert.AreEqual(users.Count, result.Count); + } + [TestCase] public async Task DbSetGetOneUserTntityAsync() { @@ -191,6 +300,24 @@ public async Task DbSetGetOneUserTntityAsync() Assert.AreEqual(users.First(), result); } + [TestCase] + public async Task DbSetCreatedFromCollectionGetOneUserTntityAsync() + { + // arrange + var users = CreateUserList(); + + var mockDbSet = users.BuildMockDbSet(); + var userRepository = new TestDbSetRepository(mockDbSet); + + // act + var result = await userRepository.GetAllAsync() + .Where(user => user.FirstName == "FirstName1") + .FirstOrDefaultAsync(); + + // assert + Assert.AreEqual(users.First(), result); + } + private static List CreateUserList() => new List { new UserEntity { FirstName = "FirstName1", LastName = "LastName", DateOfBirth = DateTime.Parse("01/20/2012", UsCultureInfo.DateTimeFormat) },