From fee2b19b46c8bbff185aa7654ca688ab123b6862 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Wed, 23 Nov 2022 17:26:21 +0500 Subject: [PATCH 1/2] Make EF default data public --- AsbCloudDb/Model/DefaultData/DefaultData.cs | 9 ++++++++- AsbCloudDb/Model/DefaultData/EntityFiller.cs | 3 ++- AsbCloudDb/Model/DefaultData/EntityFillerCompany.cs | 2 +- AsbCloudDb/Model/DefaultData/EntityFillerCompanyType.cs | 2 +- AsbCloudDb/Model/DefaultData/EntityFillerFileCategory.cs | 2 +- .../Model/DefaultData/EntityFillerMeasureCategory.cs | 2 +- AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs | 2 +- .../EntityFillerRelationUserRolePermission.cs | 2 +- .../DefaultData/EntityFillerRelationUserRoleUserRole.cs | 2 +- .../DefaultData/EntityFillerRelationUserUserRole.cs | 2 +- AsbCloudDb/Model/DefaultData/EntityFillerSubsystem.cs | 2 +- AsbCloudDb/Model/DefaultData/EntityFillerUser.cs | 2 +- AsbCloudDb/Model/DefaultData/EntityFillerUserRole.cs | 2 +- .../DefaultData/EntityFillerWellOperationCategory.cs | 2 +- .../Model/DefaultData/EntityFillerWellSectionType.cs | 2 +- AsbCloudDb/Model/DefaultData/EntityFillerWellType.cs | 2 +- 16 files changed, 24 insertions(+), 16 deletions(-) diff --git a/AsbCloudDb/Model/DefaultData/DefaultData.cs b/AsbCloudDb/Model/DefaultData/DefaultData.cs index 0bfe29a7..770cfbb3 100644 --- a/AsbCloudDb/Model/DefaultData/DefaultData.cs +++ b/AsbCloudDb/Model/DefaultData/DefaultData.cs @@ -1,10 +1,11 @@ using Microsoft.EntityFrameworkCore; +using System.Collections.Generic; namespace AsbCloudDb.Model.DefaultData { internal static class DefaultContextData { - public static void Fill(ModelBuilder modelBuilder) + public static IEnumerable GetFillers() { var fillers = new IEntityFiller[] { @@ -24,6 +25,12 @@ namespace AsbCloudDb.Model.DefaultData new EntityFillerCompanyType(), new EntityFillerSubsystem(), }; + return fillers; + } + + public static void Fill(ModelBuilder modelBuilder) + { + var fillers = GetFillers(); foreach (var filler in fillers) filler.FillData(modelBuilder); diff --git a/AsbCloudDb/Model/DefaultData/EntityFiller.cs b/AsbCloudDb/Model/DefaultData/EntityFiller.cs index 3087f15c..3b401963 100644 --- a/AsbCloudDb/Model/DefaultData/EntityFiller.cs +++ b/AsbCloudDb/Model/DefaultData/EntityFiller.cs @@ -1,11 +1,12 @@ using Microsoft.EntityFrameworkCore; +using System.Collections.Generic; namespace AsbCloudDb.Model.DefaultData { internal abstract class EntityFiller : IEntityFiller where TEntity : class { - protected abstract TEntity[] GetData(); + public abstract TEntity[] GetData(); public void FillData(ModelBuilder modelBuilder) { diff --git a/AsbCloudDb/Model/DefaultData/EntityFillerCompany.cs b/AsbCloudDb/Model/DefaultData/EntityFillerCompany.cs index c6c4584d..d7416fd6 100644 --- a/AsbCloudDb/Model/DefaultData/EntityFillerCompany.cs +++ b/AsbCloudDb/Model/DefaultData/EntityFillerCompany.cs @@ -2,7 +2,7 @@ { internal class EntityFillerCompany : EntityFiller { - protected override Company[] GetData() => new Company[] + public override Company[] GetData() => new Company[] { new (){ Id = 1, Caption = "ООО \"АСБ\"", IdCompanyType = 3}, }; diff --git a/AsbCloudDb/Model/DefaultData/EntityFillerCompanyType.cs b/AsbCloudDb/Model/DefaultData/EntityFillerCompanyType.cs index 42c15726..2e3b77b3 100644 --- a/AsbCloudDb/Model/DefaultData/EntityFillerCompanyType.cs +++ b/AsbCloudDb/Model/DefaultData/EntityFillerCompanyType.cs @@ -2,7 +2,7 @@ { internal class EntityFillerCompanyType : EntityFiller { - protected override CompanyType[] GetData() => new CompanyType[] { + public override CompanyType[] GetData() => new CompanyType[] { new (){ Id = 1, Caption = "Недрапользователь", }, new (){ Id = 2, Caption = "Буровой подрядчик", }, new (){ Id = 3, Caption = "Сервис автоматизации бурения", }, diff --git a/AsbCloudDb/Model/DefaultData/EntityFillerFileCategory.cs b/AsbCloudDb/Model/DefaultData/EntityFillerFileCategory.cs index 914f27bb..1969bc4e 100644 --- a/AsbCloudDb/Model/DefaultData/EntityFillerFileCategory.cs +++ b/AsbCloudDb/Model/DefaultData/EntityFillerFileCategory.cs @@ -2,7 +2,7 @@ { internal class EntityFillerFileCategory: EntityFiller { - protected override FileCategory[] GetData() => new FileCategory[]{ + public override FileCategory[] GetData() => new FileCategory[]{ new () {Id = 1, Name = "Растворный сервис", ShortName = "fluidService"}, new () {Id = 2, Name = "Цементирование", ShortName = "cement"}, new () {Id = 3, Name = "ННБ", ShortName = "nnb"}, diff --git a/AsbCloudDb/Model/DefaultData/EntityFillerMeasureCategory.cs b/AsbCloudDb/Model/DefaultData/EntityFillerMeasureCategory.cs index 1dbb7dfc..94713108 100644 --- a/AsbCloudDb/Model/DefaultData/EntityFillerMeasureCategory.cs +++ b/AsbCloudDb/Model/DefaultData/EntityFillerMeasureCategory.cs @@ -2,7 +2,7 @@ { internal class EntityFillerMeasureCategory : EntityFiller { - protected override MeasureCategory[] GetData() => new MeasureCategory[] { + public override MeasureCategory[] GetData() => new MeasureCategory[] { new (){ Id = 1, Name = "Показатели бурового раствора", ShortName = "Раствор"}, new (){ Id = 2, Name = "Шламограмма", ShortName = "Шламограмма"}, new (){ Id = 3, Name = "ННБ", ShortName = "ННБ"}, diff --git a/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs b/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs index b6535f5c..da21fbe8 100644 --- a/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs +++ b/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs @@ -2,7 +2,7 @@ { internal class EntityFillerPermission : EntityFiller { - protected override Permission[] GetData() => new Permission[]{ + public override Permission[] GetData() => new Permission[]{ new (){ Id = 100, Name="AdminCluster.delete", Description="Разрешение удалять админ. Кусты"}, new (){ Id = 101, Name="AdminCluster.edit", Description="Разрешение редактировать админ. Кусты"}, new (){ Id = 102, Name="AdminCluster.get", Description="Разрешение просматривать админ. Кусты"}, diff --git a/AsbCloudDb/Model/DefaultData/EntityFillerRelationUserRolePermission.cs b/AsbCloudDb/Model/DefaultData/EntityFillerRelationUserRolePermission.cs index 53f6db3b..0064383b 100644 --- a/AsbCloudDb/Model/DefaultData/EntityFillerRelationUserRolePermission.cs +++ b/AsbCloudDb/Model/DefaultData/EntityFillerRelationUserRolePermission.cs @@ -2,7 +2,7 @@ { internal class EntityFillerRelationUserRolePermission: EntityFiller { - protected override RelationUserRolePermission[] GetData() => new RelationUserRolePermission[]{ + public override RelationUserRolePermission[] GetData() => new RelationUserRolePermission[]{ new (){ IdUserRole = 1100, IdPermission = 102}, new (){ IdUserRole = 1100, IdPermission = 111}, new (){ IdUserRole = 1101, IdPermission = 101}, new (){ IdUserRole = 1101, IdPermission = 100}, new (){ IdUserRole = 1102, IdPermission = 105}, new (){ IdUserRole = 1102, IdPermission = 108}, diff --git a/AsbCloudDb/Model/DefaultData/EntityFillerRelationUserRoleUserRole.cs b/AsbCloudDb/Model/DefaultData/EntityFillerRelationUserRoleUserRole.cs index 1a84fb1a..87a99eae 100644 --- a/AsbCloudDb/Model/DefaultData/EntityFillerRelationUserRoleUserRole.cs +++ b/AsbCloudDb/Model/DefaultData/EntityFillerRelationUserRoleUserRole.cs @@ -2,7 +2,7 @@ { internal class EntityFillerRelationUserRoleUserRole: EntityFiller< RelationUserRoleUserRole> { - protected override RelationUserRoleUserRole[] GetData() => new RelationUserRoleUserRole[]{ + public override RelationUserRoleUserRole[] GetData() => new RelationUserRoleUserRole[]{ new (){ Id = 1101, IdInclude = 1100 }, new (){ Id = 1103, IdInclude = 1102 }, new (){ Id = 1105, IdInclude = 1104 }, diff --git a/AsbCloudDb/Model/DefaultData/EntityFillerRelationUserUserRole.cs b/AsbCloudDb/Model/DefaultData/EntityFillerRelationUserUserRole.cs index 2216f22e..9d2b3d70 100644 --- a/AsbCloudDb/Model/DefaultData/EntityFillerRelationUserUserRole.cs +++ b/AsbCloudDb/Model/DefaultData/EntityFillerRelationUserUserRole.cs @@ -2,7 +2,7 @@ { internal class EntityFillerRelationUserUserRole : EntityFiller { - protected override RelationUserUserRole[] GetData() => new RelationUserUserRole[] + public override RelationUserUserRole[] GetData() => new RelationUserUserRole[] { new () { IdUser = 1, IdUserRole = 1, }, }; diff --git a/AsbCloudDb/Model/DefaultData/EntityFillerSubsystem.cs b/AsbCloudDb/Model/DefaultData/EntityFillerSubsystem.cs index 80fdfc66..bbea56e4 100644 --- a/AsbCloudDb/Model/DefaultData/EntityFillerSubsystem.cs +++ b/AsbCloudDb/Model/DefaultData/EntityFillerSubsystem.cs @@ -3,7 +3,7 @@ namespace AsbCloudDb.Model.DefaultData { internal class EntityFillerSubsystem : EntityFiller { - protected override Subsystem[] GetData() => new Subsystem[]{ + public override Subsystem[] GetData() => new Subsystem[]{ // САУБ - ид подсистем с 1 до 65_535 new () {Id = 1, Name = "АКБ", Description = "Совместная работа режимов \"Бурение в роторе\" и \"Бурение в слайде\""}, new () {Id = 2, Name = "MSE", Description = "Алгоритм поиска оптимальных параметров бурения САУБ"}, diff --git a/AsbCloudDb/Model/DefaultData/EntityFillerUser.cs b/AsbCloudDb/Model/DefaultData/EntityFillerUser.cs index 8d1a5f34..ed7a9fdc 100644 --- a/AsbCloudDb/Model/DefaultData/EntityFillerUser.cs +++ b/AsbCloudDb/Model/DefaultData/EntityFillerUser.cs @@ -2,7 +2,7 @@ { internal class EntityFillerUser : EntityFiller { - protected override User[] GetData() => new User[]{ + public override User[] GetData() => new User[]{ new (){ Id = 1, IdCompany = 1, diff --git a/AsbCloudDb/Model/DefaultData/EntityFillerUserRole.cs b/AsbCloudDb/Model/DefaultData/EntityFillerUserRole.cs index 78a8e0be..07d7b9dc 100644 --- a/AsbCloudDb/Model/DefaultData/EntityFillerUserRole.cs +++ b/AsbCloudDb/Model/DefaultData/EntityFillerUserRole.cs @@ -2,7 +2,7 @@ { internal class EntityFillerUserRole : EntityFiller { - protected override UserRole[] GetData() => new UserRole[]{ + public override UserRole[] GetData() => new UserRole[]{ new (){ Id = 1, Caption = "root", IdType = 1}, new (){ Id = 1100, Caption = "admin_cluster.view", IdType = 1}, new (){ Id = 1101, Caption = "admin_cluster.edit", IdType = 1}, diff --git a/AsbCloudDb/Model/DefaultData/EntityFillerWellOperationCategory.cs b/AsbCloudDb/Model/DefaultData/EntityFillerWellOperationCategory.cs index 63eab3ed..e4eaa404 100644 --- a/AsbCloudDb/Model/DefaultData/EntityFillerWellOperationCategory.cs +++ b/AsbCloudDb/Model/DefaultData/EntityFillerWellOperationCategory.cs @@ -2,7 +2,7 @@ { internal class EntityFillerWellOperationCategory : EntityFiller { - protected override WellOperationCategory[] GetData() => new WellOperationCategory[]{ + public override WellOperationCategory[] GetData() => new WellOperationCategory[]{ // Автоматически определяемые операции new () {Id = 1, Name = "Невозможно определить операцию", Code = 0, KeyValueName = "dT", KeyValueUnits = "мин"}, new () {Id = 2, Name = "Роторное бурение", Code = 0, KeyValueName = "МСП", KeyValueUnits = "м/ч" }, diff --git a/AsbCloudDb/Model/DefaultData/EntityFillerWellSectionType.cs b/AsbCloudDb/Model/DefaultData/EntityFillerWellSectionType.cs index 76439e7c..57ece797 100644 --- a/AsbCloudDb/Model/DefaultData/EntityFillerWellSectionType.cs +++ b/AsbCloudDb/Model/DefaultData/EntityFillerWellSectionType.cs @@ -2,7 +2,7 @@ { internal class EntityFillerWellSectionType : EntityFiller { - protected override WellSectionType[] GetData() => new WellSectionType[] + public override WellSectionType[] GetData() => new WellSectionType[] { new (){ Id = 1, Caption = "Пилотный ствол"}, new (){ Id = 2, Caption = "Направление"}, diff --git a/AsbCloudDb/Model/DefaultData/EntityFillerWellType.cs b/AsbCloudDb/Model/DefaultData/EntityFillerWellType.cs index 74a2f367..895f8f1e 100644 --- a/AsbCloudDb/Model/DefaultData/EntityFillerWellType.cs +++ b/AsbCloudDb/Model/DefaultData/EntityFillerWellType.cs @@ -2,7 +2,7 @@ { internal class EntityFillerWellType : EntityFiller { - protected override WellType[] GetData() => new WellType[] + public override WellType[] GetData() => new WellType[] { new (){ Id = 1, Caption = "Наклонно-направленная"}, new (){ Id = 2, Caption = "Горизонтальная"}, From 75a3ea410d76203d2075343efd9fb80d521f00c6 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Wed, 23 Nov 2022 17:28:29 +0500 Subject: [PATCH 2/2] Add MockQueryable.Moq to moq DbContext and DbSets --- .../AsbCloudWebApi.Tests.csproj | 1 + AsbCloudWebApi.Tests/TestHelpter.cs | 88 ++----------------- 2 files changed, 9 insertions(+), 80 deletions(-) diff --git a/AsbCloudWebApi.Tests/AsbCloudWebApi.Tests.csproj b/AsbCloudWebApi.Tests/AsbCloudWebApi.Tests.csproj index 0f182ff4..63153bee 100644 --- a/AsbCloudWebApi.Tests/AsbCloudWebApi.Tests.csproj +++ b/AsbCloudWebApi.Tests/AsbCloudWebApi.Tests.csproj @@ -13,6 +13,7 @@ + diff --git a/AsbCloudWebApi.Tests/TestHelpter.cs b/AsbCloudWebApi.Tests/TestHelpter.cs index 7df75b49..91f9631a 100644 --- a/AsbCloudWebApi.Tests/TestHelpter.cs +++ b/AsbCloudWebApi.Tests/TestHelpter.cs @@ -1,14 +1,12 @@ using AsbCloudDb.Model; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; +using MockQueryable.Moq; using Moq; using System; -using System.Collections; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; -using System.Threading; -using System.Threading.Tasks; namespace AsbCloudWebApi.Tests { @@ -29,9 +27,13 @@ namespace AsbCloudWebApi.Tests public static Mock AddDbSetMock(this Mock contextMock, IEnumerable dbSetData) where T : class { - var dbSetMock = MakeDbSetMock(dbSetData); + var mockDbSet = dbSetData + .ToList() + .AsQueryable() + .BuildMockDbSet(); + contextMock.Setup(o => o.Set()) - .Returns(() => dbSetMock.Object); + .Returns(mockDbSet.Object); var dbSetProperty = typeof(IAsbCloudDbContext) .GetProperties() @@ -43,84 +45,10 @@ namespace AsbCloudWebApi.Tests var objParameterExpr = Expression.Parameter(typeof(IAsbCloudDbContext), "instance"); var propertyExpr = Expression.Property(objParameterExpr, dbSetProperty); var expression = Expression.Lambda>>(propertyExpr, objParameterExpr); - contextMock.SetupGet(expression).Returns(dbSetMock.Object); + contextMock.SetupGet(expression).Returns(mockDbSet.Object); } return contextMock; } - - public static Mock> MakeDbSetMock() - where T : class - => MakeDbSetMock(new List()); - - class DummyAsyncQueriable : IQueryable, IAsyncEnumerable - { - private readonly IQueryable queriable; - - public Type ElementType => queriable.ElementType; - - public Expression Expression => queriable.Expression; - - public IQueryProvider Provider => queriable.Provider; - - class QueriableAsyncEminaretor : IAsyncEnumerator - { - private readonly IEnumerator syncEnumerator; - - public QueriableAsyncEminaretor(IEnumerator syncEnumerator) - { - this.syncEnumerator = syncEnumerator; - } - - public T2 Current => syncEnumerator.Current; - - public ValueTask DisposeAsync() - { - syncEnumerator.Dispose(); - return ValueTask.CompletedTask; - } - - public ValueTask MoveNextAsync() - { - var result = syncEnumerator.MoveNext(); - return ValueTask.FromResult(result); - } - } - - public DummyAsyncQueriable(IEnumerable dbSetData) - { - queriable = dbSetData.ToList().AsQueryable(); - } - - public IAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) - { - var enumerator = this.AsEnumerable().GetEnumerator(); - return new QueriableAsyncEminaretor(enumerator); - } - - public IEnumerator GetEnumerator() - => queriable.GetEnumerator(); - - IEnumerator IEnumerable.GetEnumerator() - => queriable.GetEnumerator(); - } - - public static Mock> MakeDbSetMock(IEnumerable dbSetData) - where T : class - { - var dbSetDataQueriable = new DummyAsyncQueriable(dbSetData); - - Mock> dbSetMock = new(); - dbSetMock.As>().Setup(o => o.Provider).Returns(() => dbSetDataQueriable.Provider); - dbSetMock.As>().Setup(o => o.Expression).Returns(() => dbSetDataQueriable.Expression); - dbSetMock.As>().Setup(o => o.ElementType).Returns(() => dbSetDataQueriable.ElementType); - dbSetMock.As>().Setup(o => o.GetEnumerator()).Returns(() => dbSetDataQueriable.GetEnumerator()); - - dbSetMock.As>() - .Setup(o => o.GetAsyncEnumerator(It.IsAny())) - .Returns(() => dbSetDataQueriable.GetAsyncEnumerator()); - - return dbSetMock; - } } }