Skip to content

Commit

Permalink
Merge pull request #75 from sq735/DbSetShortcut
Browse files Browse the repository at this point in the history
Added method for build DbSet from IEnumerable.
  • Loading branch information
romantitov committed Mar 7, 2024
2 parents 7a660d6 + 103e0ef commit d48cbb1
Show file tree
Hide file tree
Showing 6 changed files with 382 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ public static class FakeItEasyExtensions
return new TestAsyncEnumerableEfCore<TEntity>(data);
}

public static DbSet<TEntity> BuildMockDbSet<TEntity>(this IEnumerable<TEntity> data) where TEntity : class => data.BuildMock().BuildMockDbSet();

public static DbSet<TEntity> BuildMockDbSet<TEntity>(this IQueryable<TEntity> data) where TEntity : class
{
var mock = A.Fake<DbSet<TEntity>>(d => d.Implements<IAsyncEnumerable<TEntity>>().Implements<IQueryable<TEntity>>());
Expand Down
4 changes: 3 additions & 1 deletion src/MockQueryable/MockQueryable.Moq/MoqExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@ namespace MockQueryable.Moq
{
public static class MoqExtensions
{
public static IQueryable<TEntity> BuildMock<TEntity>(this IEnumerable<TEntity> data) where TEntity : class
public static IQueryable<TEntity> BuildMock<TEntity>(this IEnumerable<TEntity> data) where TEntity : class
{
return new TestAsyncEnumerableEfCore<TEntity>(data);
}

public static Mock<DbSet<TEntity>> BuildMockDbSet<TEntity>(this IEnumerable<TEntity> data) where TEntity : class => data.BuildMock().BuildMockDbSet();

public static Mock<DbSet<TEntity>> BuildMockDbSet<TEntity>(this IQueryable<TEntity> data) where TEntity : class
{
var mock = new Mock<DbSet<TEntity>>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ public static class NSubstituteExtensions
return new TestAsyncEnumerableEfCore<TEntity>(data);
}

public static DbSet<TEntity> BuildMockDbSet<TEntity>(this IEnumerable<TEntity> data) where TEntity : class => data.BuildMock().BuildMockDbSet();

public static DbSet<TEntity> BuildMockDbSet<TEntity>(this IQueryable<TEntity> data) where TEntity : class
{
var mock = Substitute.For<DbSet<TEntity>, IQueryable<TEntity>, IAsyncEnumerable<TEntity>>();
Expand Down
102 changes: 98 additions & 4 deletions src/MockQueryable/MockQueryable.Sample/MyServiceFakeItEasyTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,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<UserEntity>
{
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<ApplicationException>(() =>
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
Expand All @@ -133,7 +158,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<UserEntity>();
var mock = userEntities.BuildMockDbSet();
A.CallTo(() => mock.AddAsync(A<UserEntity>._, A<CancellationToken>._))
.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)]
Expand All @@ -150,7 +198,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
Expand All @@ -166,6 +231,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 DbSetToListAsyncAsync_ShouldReturnAllEntities_WhenSourceIsChanged()
{
Expand Down Expand Up @@ -197,7 +278,20 @@ public async Task DbSetGetAllUserEntity()
Assert.AreEqual(users.Count, result.Count);
}

private static List<UserEntity> CreateUserList() => new List<UserEntity>
[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<UserEntity> CreateUserList() => new List<UserEntity>
{
new UserEntity
{
Expand Down
154 changes: 150 additions & 4 deletions src/MockQueryable/MockQueryable.Sample/MyServiceMoqTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<UserEntity>
{
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<ApplicationException>(() =>
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
Expand All @@ -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<UserEntity>();
var mock = userEntities.BuildMockDbSet();

mock.Setup(set => set.AddAsync(It.IsAny<UserEntity>(), It.IsAny<CancellationToken>()))
.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)]
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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<UserEntity>
{
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<object[]>())).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<UserEntity>)userRepository.GetQueryable()).FindAsync(userId);

//assert
Assert.IsNotNull(result);
Assert.AreEqual("FirstName3", result.FirstName);
}

[TestCase]
public async Task DbSetGetAllUserEntitiesAsync()
{
// arrange
Expand Down Expand Up @@ -252,7 +382,23 @@ public async Task DbSetToListAsyncAsync_ShouldReturnAllEntities_WhenSourceIsChan



private static List<UserEntity> CreateUserList() => new List<UserEntity>
[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<UserEntity> CreateUserList() => new List<UserEntity>
{
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) },
Expand Down
Loading

0 comments on commit d48cbb1

Please sign in to comment.