v1.3.0 Restructure Saxonite workspace and upgrade to .NET 10 (#1)

Move Saxonite’s projects into a dedicated `Workspace` folder and align the solution with .NET 10 and the current Common workspace. Update encryption integration, test project structure and coverage, and repository guidance and upgrade notes.

- Relocate application and library projects while retaining Git rename history.
- Split tests into Admin, Online, and Shared projects; add representative behavioral and serialization tests.
- Update Common integration, application version, and repository documentation.

Application version: 1.3.0

Reviewed-on: #1
Co-authored-by: andy <andy@sarand.com>
This commit was merged in pull request #1.
This commit is contained in:
2026-10-16 18:24:16 +01:00
committed by andy
parent 2c3fb146ab
commit 9f22b522df
1996 changed files with 1992 additions and 1179 deletions
@@ -0,0 +1,55 @@
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using NUnit.Framework;
using Moq;
using Saxonite.Net.Core.Web.Admin.App;
using Saxonite.Net.Standard.Base.App;
using System;
using System.Collections.Generic;
using System.Text;
namespace Saxonite.Net.Core.UnitTests.Web.Admin.App
{
//=======================================================================
[TestFixture]
public class SaxApplication_Admin_Tester
{
//-------------------------------------------------------------------
// Application.
private class SaxApplication_Admin_Test : SaxApplication_Admin
{
public SaxApplication_Admin_Test(IConfiguration configuration, IWebHostEnvironment env) :
base(configuration)
{
InitEnvironment(env);
}
}
private static SaxApplication_Admin_Test app;
public static SaxApplication_Admin App
{
get
{
if (app == null)
{
var mockConfiguration = new Mock<IConfiguration>();
var mockEnvironment = new Mock<IWebHostEnvironment>();
mockEnvironment.Setup(m => m.EnvironmentName).Returns(Environments.Development);
mockEnvironment.Setup(m => m.ContentRootPath).Returns(@"D:\Sarand\Projects\Users\AHoward\VS2022\Saxonite\Workspace\SaxoniteCoreWebAdmin");
app = new SaxApplication_Admin_Test(mockConfiguration.Object, mockEnvironment.Object);
}
return app;
}
}
//-------------------------------------------------------------------
// Internals - component managers etc.
private static SaxInternals internals;
public static SaxInternals Internals { get { if (internals == null) internals = new SaxInternals(App.SessionContext); return internals; } }
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,101 @@
using NUnit.Framework;
using Newtonsoft.Json;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Utils;
using Saxonite.Net.Core.Web.Admin.App;
using Saxonite.Net.Core.Web.Base.Controllers;
using Saxonite.Net.Standard.Base.App;
using Saxonite.Net.Standard.Base.Bus;
using Saxonite.Net.Standard.Base.Mgr;
using System;
using System.Collections.Generic;
using System.Text;
namespace Saxonite.Net.Core.UnitTests.Web.Admin.App
{
//=======================================================================
[TestFixture]
public class SaxSessionData_Admin_Tester
{
//-------------------------------------------------------------------
// Properties.
public static SaxApplication_Admin App { get { return SaxApplication_Admin_Tester.App; } }
public static SaxInternals Internals { get { return SaxApplication_Admin_Tester.Internals; } }
//-------------------------------------------------------------------
[Test]
public void Test_SmmSessionData_Admin_Serialization()
{
// User account.
SaxAccountMgr accountMgr = Internals.AccountMgr;
// User account.
SaxUserAccount userAccount = accountMgr.CreateUserAccount();
userAccount.Id = new SysId(45678);
userAccount.EmailAddress = "john.smith@acme.co.uk";
userAccount.FirstName = "John";
userAccount.LastName = "Smith";
// User Roles.
List<SaxUserRole> userRoles = new List<SaxUserRole>();
SaxUserRole userRole = accountMgr.CreateUserRole(userAccount.Id, Sax.UserRole.Journalist);
userRoles.Add(userRole);
// Create user session and verify user id.
SaxSessionData_Admin sessionData = new SaxSessionData_Admin(App.SessionContext, userAccount, userRoles);
Assert.That(SysId.ToInt(sessionData.User.UserAccountId), Is.EqualTo(SysId.ToInt(userAccount.Id)));
Assert.That(sessionData.User.FirstName, Is.EqualTo(userAccount.FirstName));
Assert.That(sessionData.User.LastName, Is.EqualTo(userAccount.LastName));
Assert.That(sessionData.ValidUserSession, Is.True);
Assert.That(sessionData.User.DisplayName, Is.Not.EqualTo(""));
// Filters.
sessionData.Filter.SportId = new SysId(2345);
sessionData.Filter.RegionId = new SysId(6543);
// Encryption data.
int idx = sessionData.NextItemIdx;
idx = sessionData.NextItemIdx;
idx = sessionData.NextItemIdx;
// Serialise session data using same method as base controller.
String sessionDataJson = NewtonsoftJsonUtil.SerializeObject(sessionData);
Assert.That(sessionDataJson, Is.Not.EqualTo(""));
Assert.That(sessionDataJson.Contains("Base64IV_"), Is.False);
// Deserialise session data using same method as base controller.
SaxSessionData_Admin sessionDataDeserialised =
JsonConvert.DeserializeObject<SaxSessionData_Admin>(
sessionDataJson,
SaxController_Web.SessionStorage.JsonDeserialisationSettings
);
Assert.That(sessionDataDeserialised, Is.Not.Null);
// Validate deserialised values.
Assert.That(sessionDataDeserialised.SessionIdx, Is.EqualTo(sessionData.SessionIdx));
Assert.That(sessionDataDeserialised.ItemIdx, Is.EqualTo(sessionData.ItemIdx));
Assert.That(sessionDataDeserialised.SessionContext.Index, Is.EqualTo(App.SessionContext.Index));
Assert.That(sessionDataDeserialised.SessionContext.Application, Is.EqualTo(Sax.Application.Admin));
Assert.That(SysId.ToInt(sessionDataDeserialised.User.UserAccountId), Is.EqualTo(SysId.ToInt(sessionData.User.UserAccountId)));
Assert.That(SysId.ToInt(sessionDataDeserialised.User.UserAccountId), Is.EqualTo(SysId.ToInt(sessionData.User.UserAccountId)));
Assert.That(sessionDataDeserialised.User.EmailAddress, Is.EqualTo(sessionData.User.EmailAddress));
Assert.That(sessionDataDeserialised.User.FirstName, Is.EqualTo(sessionData.User.FirstName));
Assert.That(sessionDataDeserialised.User.LastName, Is.EqualTo(sessionData.User.LastName));
Assert.That(sessionDataDeserialised.User.DisplayName, Is.EqualTo(sessionData.User.DisplayName));
// User roles.
Assert.That(sessionDataDeserialised.User.Roles.Count, Is.EqualTo(userRoles.Count));
// Filters.
// Filters.
Assert.That(sessionDataDeserialised.Filter.SportId, Is.EqualTo(sessionData.Filter.SportId));
Assert.That(sessionDataDeserialised.Filter.RegionId, Is.EqualTo(sessionData.Filter.RegionId));
// Encryption data.
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -0,0 +1,41 @@
using NUnit.Framework;
using Saxonite.Net.Core.Web.Admin.Models;
namespace Saxonite.Net.Core.UnitTests.Web.Admin.Models
{
//=======================================================================
[TestFixture]
public class ModelData_Address_Tester
{
//-------------------------------------------------------------------
[Test]
public void EmptyAddressIsNeitherSpecifiedNorPopulated()
{
ModelData_Address address = new ModelData_Address(null, "test");
Assert.That(address.IsSpecified(), Is.False);
Assert.That(address.IsPopulated(), Is.False);
}
//-------------------------------------------------------------------
[Test]
public void TownMakesAddressSpecifiedAndPopulated()
{
ModelData_Address address = new ModelData_Address(null, "test") { Town = "London" };
Assert.That(address.IsSpecified(), Is.True);
Assert.That(address.IsPopulated(), Is.True);
}
//-------------------------------------------------------------------
[Test]
public void EmptySubmittedTownIsSpecifiedButNotPopulated()
{
ModelData_Address address = new ModelData_Address(null, "test") { Town = "" };
Assert.That(address.IsSpecified(), Is.True);
Assert.That(address.IsPopulated(), Is.False);
}
}
//=======================================================================
}
@@ -0,0 +1,47 @@
using NUnit.Framework;
using Saxonite.Net.Core.Web.Admin.Models;
using Saxonite.Net.Standard.Base.App;
namespace Saxonite.Net.Core.UnitTests.Web.Admin.Models
{
//=======================================================================
[TestFixture]
public class Model_OrganisationAssociations_Tester
{
//-------------------------------------------------------------------
[Test]
public void AffiliateOptionsMapToAffiliateAndKeepDirection()
{
Model_OrganisationAssociations model = new Model_OrganisationAssociations(null);
Assert.That(model.IsAssociationTypeDirectionReversed(Sax.AssociationTypeOption.AffiliateParent), Is.False);
Assert.That(model.IsAssociationTypeDirectionReversed(Sax.AssociationTypeOption.AffiliateChild), Is.True);
Assert.That(model.GetAssociationTypeForOption(Sax.AssociationTypeOption.AffiliateParent), Is.EqualTo(Sax.AssociationType.Affiliate));
Assert.That(model.GetAssociationTypeForOption(Sax.AssociationTypeOption.AffiliateChild), Is.EqualTo(Sax.AssociationType.Affiliate));
Assert.That(model.IsConsistentWith(Sax.AssociationTypeOption.AffiliateChild, Sax.AssociationType.Affiliate), Is.True);
}
//-------------------------------------------------------------------
[Test]
public void PartnerOptionMapsToPartnerWithoutDirection()
{
Model_OrganisationAssociations model = new Model_OrganisationAssociations(null);
Assert.That(model.IsAssociationTypeDirectionReversed(Sax.AssociationTypeOption.Partner), Is.False);
Assert.That(model.GetAssociationTypeForOption(Sax.AssociationTypeOption.Partner), Is.EqualTo(Sax.AssociationType.Partner));
Assert.That(model.IsConsistentWith(Sax.AssociationTypeOption.Partner, Sax.AssociationType.Partner), Is.True);
}
//-------------------------------------------------------------------
[Test]
public void AssociationOptionMustMatchAssociationType()
{
Model_OrganisationAssociations model = new Model_OrganisationAssociations(null);
Assert.That(model.GetAssociationTypeForOption(Sax.AssociationTypeOption.Unknown), Is.EqualTo(Sax.AssociationType.Unknown));
Assert.That(model.IsConsistentWith(Sax.AssociationTypeOption.Partner, Sax.AssociationType.Affiliate), Is.False);
Assert.That(model.IsConsistentWith(Sax.AssociationTypeOption.Unknown, Sax.AssociationType.Unknown), Is.False);
}
}
//=======================================================================
}