diff --git a/Serenity.sln b/Serenity.sln index 8771d7d9e9..7b06931c97 100644 --- a/Serenity.sln +++ b/Serenity.sln @@ -85,6 +85,10 @@ Project("{54A90642-561A-4BB1-A94E-469ADEE60C69}") = "test-utils", "packages\test EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Serene.Web", "serene\src\Serene.Web\Serene.Web.csproj", "{0EE56BB8-D541-4152-8F50-10DE95B5DA1C}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "common-features-tests", "common-features-tests", "{BB7F4970-E88E-4963-BC28-E6B441BCC885}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Serenity.Extensions.Tests", "common-features\tests\Serenity.Extensions.Tests\Serenity.Extensions.Tests.csproj", "{91AC695B-AF0F-4226-97AD-4AC14C9C03C7}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -175,6 +179,10 @@ Global {0EE56BB8-D541-4152-8F50-10DE95B5DA1C}.Debug|Any CPU.Build.0 = Debug|Any CPU {0EE56BB8-D541-4152-8F50-10DE95B5DA1C}.Release|Any CPU.ActiveCfg = Release|Any CPU {0EE56BB8-D541-4152-8F50-10DE95B5DA1C}.Release|Any CPU.Build.0 = Release|Any CPU + {91AC695B-AF0F-4226-97AD-4AC14C9C03C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {91AC695B-AF0F-4226-97AD-4AC14C9C03C7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {91AC695B-AF0F-4226-97AD-4AC14C9C03C7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {91AC695B-AF0F-4226-97AD-4AC14C9C03C7}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -204,6 +212,8 @@ Global {9C4591C7-9BC1-497C-BB6F-FB74D739D5E9} = {4F13A746-0751-4EA0-BE46-A9A85886828F} {769C42AD-B57D-45BE-AEA1-6490F09C26DD} = {E46C59F2-F5A2-441B-B858-6FDD7674EF5F} {EE167232-372C-4036-AF27-AA3C586EC020} = {4F13A746-0751-4EA0-BE46-A9A85886828F} + {BB7F4970-E88E-4963-BC28-E6B441BCC885} = {CAD84B81-0B9D-4252-ADD0-5771F0B367AD} + {91AC695B-AF0F-4226-97AD-4AC14C9C03C7} = {BB7F4970-E88E-4963-BC28-E6B441BCC885} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {E2545865-7A32-47F4-A186-EDEBDCEF9EEF} diff --git a/common-features/src/extensions/Modules/Options/ExtensionsTypeSource.cs b/common-features/src/extensions/Modules/Options/ExtensionsTypeSource.cs new file mode 100644 index 0000000000..2f5dce4585 --- /dev/null +++ b/common-features/src/extensions/Modules/Options/ExtensionsTypeSource.cs @@ -0,0 +1,52 @@ +namespace Serenity.Extensions; + +/// +/// Base type source for apps using Serenity.Extensions assembly and its reference chain +/// +/// Additional assemblies to include +public class ExtensionsTypeSource(IEnumerable assemblies) + : DefaultTypeSource([..SerenityExtensionsAssemblyChain, ..assemblies]) +{ + /// + /// Reference to Serenity.Net.Core assembly + /// + public static readonly Assembly SerenityNetCoreAssembly = typeof(Localization.ILocalText).Assembly; + + /// + /// Reference to Serenity.Net.Data assembly + /// + public static readonly Assembly SerenityNetDataAssembly = typeof(DefaultSqlConnections).Assembly; + + /// + /// Reference to Serenity.Net.Entity assembly + /// + public static readonly Assembly SerenityNetEntityAssembly = typeof(Row<>).Assembly; + + /// + /// Reference to Serenity.Net.Services assembly + /// + public static readonly Assembly SerenityNetServicesAssembly = typeof(SaveRequestHandler<>).Assembly; + + /// + /// Reference to Serenity.Net.Web assembly + /// + public static readonly Assembly SerenityNetWebAssembly = typeof(HttpContextItemsAccessor).Assembly; + + /// + /// Reference to Serenity.Extensions assembly + /// + public static readonly Assembly SerenityExtensionsAssembly = typeof(ExtensionsTypeSource).Assembly; + + /// + /// List of assemblies up to Serenity.Extensions + /// + public static readonly Assembly[] SerenityExtensionsAssemblyChain = + [ + SerenityNetCoreAssembly, + SerenityNetDataAssembly, + SerenityNetEntityAssembly, + SerenityNetServicesAssembly, + SerenityNetWebAssembly, + SerenityExtensionsAssembly + ]; +} \ No newline at end of file diff --git a/common-features/tests/Directory.Build.props b/common-features/tests/Directory.Build.props new file mode 100644 index 0000000000..d375c1ed88 --- /dev/null +++ b/common-features/tests/Directory.Build.props @@ -0,0 +1,6 @@ + + + + Serenity.Tests + + \ No newline at end of file diff --git a/common-features/tests/Serenity.Extensions.Tests/ExtensionsTypeSourceTests.cs b/common-features/tests/Serenity.Extensions.Tests/ExtensionsTypeSourceTests.cs new file mode 100644 index 0000000000..4546a82be8 --- /dev/null +++ b/common-features/tests/Serenity.Extensions.Tests/ExtensionsTypeSourceTests.cs @@ -0,0 +1,86 @@ +using Serenity.Extensions; + +namespace Serenity.Tests; + +public class ExtensionsTypeSourceTests +{ + [Fact] + public void IncludesExtensionsAssemblyChain() + { + var typeSource = new ExtensionsTypeSource([]); + var assemblies = typeSource.GetAssemblies() + .Select(x => x.GetName().Name); + Assert.Collection(assemblies, + x => Assert.Equal("Serenity.Net.Core", x), + x => Assert.Equal("Serenity.Net.Data", x), + x => Assert.Equal("Serenity.Net.Entity", x), + x => Assert.Equal("Serenity.Net.Services", x), + x => Assert.Equal("Serenity.Net.Web", x), + x => Assert.Equal("Serenity.Extensions", x)); + } + + [Fact] + public void IncludesPassedAssembliesAtEnd() + { + var typeSource = new ExtensionsTypeSource([typeof(ExtensionsTypeSourceTests).Assembly]); + var assemblies = typeSource.GetAssemblies() + .Select(x => x.GetName().Name); + Assert.Collection(assemblies, + x => Assert.Equal("Serenity.Net.Core", x), + x => Assert.Equal("Serenity.Net.Data", x), + x => Assert.Equal("Serenity.Net.Entity", x), + x => Assert.Equal("Serenity.Net.Services", x), + x => Assert.Equal("Serenity.Net.Web", x), + x => Assert.Equal("Serenity.Extensions", x), + x => Assert.Equal(typeof(ExtensionsTypeSourceTests).Assembly.GetName().Name, x)); + } + + [Fact] + public void ExtensionsAssemblyChainIsCorrect() + { + Assert.Collection(ExtensionsTypeSource.SerenityExtensionsAssemblyChain + .Select(x => x.GetName().Name), + x => Assert.Equal("Serenity.Net.Core", x), + x => Assert.Equal("Serenity.Net.Data", x), + x => Assert.Equal("Serenity.Net.Entity", x), + x => Assert.Equal("Serenity.Net.Services", x), + x => Assert.Equal("Serenity.Net.Web", x), + x => Assert.Equal("Serenity.Extensions", x)); + } + + [Fact] + public void CoreAssemblyIsCorrect() + { + Assert.Equal("Serenity.Net.Core", ExtensionsTypeSource.SerenityNetCoreAssembly.GetName().Name); + } + + [Fact] + public void DataAssemblyIsCorrect() + { + Assert.Equal("Serenity.Net.Data", ExtensionsTypeSource.SerenityNetDataAssembly.GetName().Name); + } + + [Fact] + public void EntityAssemblyIsCorrect() + { + Assert.Equal("Serenity.Net.Entity", ExtensionsTypeSource.SerenityNetEntityAssembly.GetName().Name); + } + + [Fact] + public void ServicesAssemblyIsCorrect() + { + Assert.Equal("Serenity.Net.Services", ExtensionsTypeSource.SerenityNetServicesAssembly.GetName().Name); + } + + [Fact] + public void WebAssemblyIsCorrect() + { + Assert.Equal("Serenity.Net.Web", ExtensionsTypeSource.SerenityNetWebAssembly.GetName().Name); + } + + [Fact] + public void ExtensionsAssemblyIsCorrect() + { + Assert.Equal("Serenity.Extensions", ExtensionsTypeSource.SerenityExtensionsAssembly.GetName().Name); + } +} \ No newline at end of file diff --git a/common-features/tests/Serenity.Extensions.Tests/Serenity.Extensions.Tests.csproj b/common-features/tests/Serenity.Extensions.Tests/Serenity.Extensions.Tests.csproj new file mode 100644 index 0000000000..896c03fa5f --- /dev/null +++ b/common-features/tests/Serenity.Extensions.Tests/Serenity.Extensions.Tests.csproj @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/serene/src/Serene.Web/Modules/Common/AppServices/TypeSource.cs b/serene/src/Serene.Web/Modules/Common/AppServices/TypeSource.cs index 1fde7980b6..ebea12f322 100644 --- a/serene/src/Serene.Web/Modules/Common/AppServices/TypeSource.cs +++ b/serene/src/Serene.Web/Modules/Common/AppServices/TypeSource.cs @@ -1,29 +1,13 @@ namespace Serene.AppServices; -public class TypeSource : DefaultTypeSource -{ - public TypeSource() - : base(GetAssemblyList()) - { - } - - private static System.Reflection.Assembly[] GetAssemblyList() - { - return - [ - typeof(Serenity.Localization.ILocalText).Assembly, // Serenity.Core - typeof(DefaultSqlConnections).Assembly, // Serenity.Net.Data - typeof(Row<>).Assembly, // Serenity.Net.Entity - typeof(SaveRequestHandler<>).Assembly, // Serenity.Net.Services - typeof(HttpContextItemsAccessor).Assembly, // Serenity.Net.Web - typeof(Serenity.Reporting.ExcelExporter).Assembly, // Serenity.Extensions +public class TypeSource() : ExtensionsTypeSource([ #if (Northwind) - typeof(Serenity.Demo.Northwind.CustomerPage).Assembly, // Serenity.Demo.Northwind + typeof(Serenity.Demo.Northwind.CustomerPage).Assembly, // Serenity.Demo.Northwind #endif #if (BasicSamples) - typeof(Serenity.Demo.BasicSamples.BasicSamplesPage).Assembly, // Serenity.Demo.BasicSamples + typeof(Serenity.Demo.BasicSamples.BasicSamplesPage).Assembly, // Serenity.Demo.BasicSamples #endif - typeof(Startup).Assembly // Serene.Web - ]; - } + typeof(Startup).Assembly // Serene.Web +]) +{ } \ No newline at end of file diff --git a/serene/tests/Directory.Build.props b/serene/tests/Directory.Build.props new file mode 100644 index 0000000000..39578d43c6 --- /dev/null +++ b/serene/tests/Directory.Build.props @@ -0,0 +1,6 @@ + + + + Serene.Tests + + \ No newline at end of file diff --git a/serene/tests/Serene.Tests.Unit/AppServices/TypeSourceTests.cs b/serene/tests/Serene.Tests.Unit/AppServices/TypeSourceTests.cs new file mode 100644 index 0000000000..dba70d4c95 --- /dev/null +++ b/serene/tests/Serene.Tests.Unit/AppServices/TypeSourceTests.cs @@ -0,0 +1,22 @@ +namespace Serene.Tests; + +public class TypeSourceTests +{ + [Fact] + public void IncludesCorrectAssemblyList() + { + var typeSource = new AppServices.TypeSource(); + var assemblies = typeSource.GetAssemblies() + .Select(x => x.GetName().Name); + Assert.Collection(assemblies, + x => Assert.Equal("Serenity.Net.Core", x), + x => Assert.Equal("Serenity.Net.Data", x), + x => Assert.Equal("Serenity.Net.Entity", x), + x => Assert.Equal("Serenity.Net.Services", x), + x => Assert.Equal("Serenity.Net.Web", x), + x => Assert.Equal("Serenity.Extensions", x), + x => Assert.Equal("Serenity.Demo.Northwind", x), + x => Assert.Equal("Serenity.Demo.BasicSamples", x), + x => Assert.Equal("Serene.Web", x)); + } +} \ No newline at end of file diff --git a/serene/tests/Serene.Tests.Unit/Serene.Tests.Unit.csproj b/serene/tests/Serene.Tests.Unit/Serene.Tests.Unit.csproj new file mode 100644 index 0000000000..b2e8853ce6 --- /dev/null +++ b/serene/tests/Serene.Tests.Unit/Serene.Tests.Unit.csproj @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/tests/GlobalUsings.cs b/tests/GlobalUsings.cs deleted file mode 100644 index 5f282702bb..0000000000 --- a/tests/GlobalUsings.cs +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file