Skip to content

Commit

Permalink
Add ExtensionsTypeSource and subclass that in Serene TypeSource. It a…
Browse files Browse the repository at this point in the history
…lso includes Serenity.Net.* and Serenity.Extensions assembly references and ExtensionsAssemblyChain. Add tests so that it does not break in the future when moving types between assemblies.
  • Loading branch information
volkanceylan committed Oct 28, 2024
1 parent a2e9865 commit c229ae3
Show file tree
Hide file tree
Showing 10 changed files with 200 additions and 23 deletions.
10 changes: 10 additions & 0 deletions Serenity.sln
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
namespace Serenity.Extensions;

/// <summary>
/// Base type source for apps using Serenity.Extensions assembly and its reference chain
/// </summary>
/// <param name="assemblies">Additional assemblies to include</param>
public class ExtensionsTypeSource(IEnumerable<Assembly> assemblies)
: DefaultTypeSource([..SerenityExtensionsAssemblyChain, ..assemblies])
{
/// <summary>
/// Reference to Serenity.Net.Core assembly
/// </summary>
public static readonly Assembly SerenityNetCoreAssembly = typeof(Localization.ILocalText).Assembly;

/// <summary>
/// Reference to Serenity.Net.Data assembly
/// </summary>
public static readonly Assembly SerenityNetDataAssembly = typeof(DefaultSqlConnections).Assembly;

/// <summary>
/// Reference to Serenity.Net.Entity assembly
/// </summary>
public static readonly Assembly SerenityNetEntityAssembly = typeof(Row<>).Assembly;

/// <summary>
/// Reference to Serenity.Net.Services assembly
/// </summary>
public static readonly Assembly SerenityNetServicesAssembly = typeof(SaveRequestHandler<>).Assembly;

/// <summary>
/// Reference to Serenity.Net.Web assembly
/// </summary>
public static readonly Assembly SerenityNetWebAssembly = typeof(HttpContextItemsAccessor).Assembly;

/// <summary>
/// Reference to Serenity.Extensions assembly
/// </summary>
public static readonly Assembly SerenityExtensionsAssembly = typeof(ExtensionsTypeSource).Assembly;

/// <summary>
/// List of assemblies up to Serenity.Extensions
/// </summary>
public static readonly Assembly[] SerenityExtensionsAssemblyChain =
[
SerenityNetCoreAssembly,
SerenityNetDataAssembly,
SerenityNetEntityAssembly,
SerenityNetServicesAssembly,
SerenityNetWebAssembly,
SerenityExtensionsAssembly
];
}
6 changes: 6 additions & 0 deletions common-features/tests/Directory.Build.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<Project>
<Import Project="$(MSBuildThisFileDirectory)..\..\tests\Test.Build.props" />
<PropertyGroup>
<RootNamespace>Serenity.Tests</RootNamespace>
</PropertyGroup>
</Project>
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<ProjectReference Include="..\..\src\extensions\Serenity.Extensions.csproj" />
<ProjectReference Include="..\..\..\tests\Serenity.Net.Web.Tests\Serenity.Net.Web.Tests.csproj" />
</ItemGroup>
</Project>
28 changes: 6 additions & 22 deletions serene/src/Serene.Web/Modules/Common/AppServices/TypeSource.cs
Original file line number Diff line number Diff line change
@@ -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
])
{
}
6 changes: 6 additions & 0 deletions serene/tests/Directory.Build.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<Project>
<Import Project="$(MSBuildThisFileDirectory)..\..\tests\Test.Build.props" />
<PropertyGroup>
<RootNamespace>Serene.Tests</RootNamespace>
</PropertyGroup>
</Project>
22 changes: 22 additions & 0 deletions serene/tests/Serene.Tests.Unit/AppServices/TypeSourceTests.cs
Original file line number Diff line number Diff line change
@@ -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));
}
}
6 changes: 6 additions & 0 deletions serene/tests/Serene.Tests.Unit/Serene.Tests.Unit.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<ProjectReference Include="..\..\src\Serene.Web\Serene.Web.csproj" />
<ProjectReference Include="..\..\..\common-features\tests\Serenity.Extensions.Tests\Serenity.Extensions.Tests.csproj" />
</ItemGroup>
</Project>
1 change: 0 additions & 1 deletion tests/GlobalUsings.cs

This file was deleted.

0 comments on commit c229ae3

Please sign in to comment.