175 lines
5.7 KiB
C#
175 lines
5.7 KiB
C#
using AyCode.Core.Enums;
|
|
using AyCode.Core.Extensions;
|
|
using AyCode.Core.Helpers;
|
|
using AyCode.Core.Serializers.Binaries;
|
|
using AyCode.Core.Serializers.Jsons;
|
|
using AyCode.Core.Tests.TestModels;
|
|
using AyCode.Services.Server.SignalRs;
|
|
using AyCode.Services.SignalRs;
|
|
|
|
namespace AyCode.Services.Server.Tests.SignalRs;
|
|
|
|
#region DataSource Implementations
|
|
|
|
public class TestOrderItemListDataSource : AcSignalRDataSource<TestOrderItem, int, List<TestOrderItem>>
|
|
{
|
|
public TestOrderItemListDataSource(AcSignalRClientBase signalRClient, SignalRCrudTags crudTags)
|
|
: base(signalRClient, crudTags) { }
|
|
}
|
|
|
|
public class TestOrderItemObservableDataSource : AcSignalRDataSource<TestOrderItem, int, AcObservableCollection<TestOrderItem>>
|
|
{
|
|
public TestOrderItemObservableDataSource(AcSignalRClientBase signalRClient, SignalRCrudTags crudTags)
|
|
: base(signalRClient, crudTags) { }
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Abstract Test Base
|
|
|
|
/// <summary>
|
|
/// Base class for SignalR DataSource tests.
|
|
/// Derived classes specify the serializer type and collection type.
|
|
/// </summary>
|
|
/// <typeparam name="TDataSource">The concrete DataSource type</typeparam>
|
|
/// <typeparam name="TIList">The inner list type (List or AcObservableCollection)</typeparam>
|
|
public abstract class SignalRDataSourceTestBase<TDataSource, TIList>
|
|
where TDataSource : AcSignalRDataSource<TestOrderItem, int, TIList>
|
|
where TIList : class, IList<TestOrderItem>
|
|
{
|
|
protected abstract AcSerializerOptions SerializerOption { get; }
|
|
protected abstract TDataSource CreateDataSource(TestableSignalRClient2 client, SignalRCrudTags crudTags);
|
|
|
|
protected TestLogger _logger = null!;
|
|
protected TestableSignalRHub2 _hub = null!;
|
|
protected TestableSignalRClient2 _client = null!;
|
|
protected TestSignalRService2 _service = null!;
|
|
protected SignalRCrudTags _crudTags = null!;
|
|
|
|
[TestInitialize]
|
|
public void Setup()
|
|
{
|
|
_logger = new TestLogger();
|
|
_hub = new TestableSignalRHub2();
|
|
_service = new TestSignalRService2();
|
|
_client = new TestableSignalRClient2(_hub, _logger);
|
|
|
|
_hub.SetSerializerType(SerializerOption);
|
|
_hub.RegisterService(_service, _client);
|
|
|
|
_crudTags = new SignalRCrudTags(
|
|
TestSignalRTags.DataSourceGetAll,
|
|
TestSignalRTags.DataSourceGetItem,
|
|
TestSignalRTags.DataSourceAdd,
|
|
TestSignalRTags.DataSourceUpdate,
|
|
TestSignalRTags.DataSourceRemove
|
|
);
|
|
}
|
|
|
|
#region Load Tests
|
|
|
|
[TestMethod]
|
|
public async Task LoadDataSource_ReturnsAllItems()
|
|
{
|
|
var dataSource = CreateDataSource(_client, _crudTags);
|
|
|
|
await dataSource.LoadDataSource();
|
|
|
|
Assert.AreEqual(3, dataSource.Count);
|
|
Assert.AreEqual("Product A", dataSource[0].ProductName);
|
|
}
|
|
|
|
[TestMethod]
|
|
public async Task LoadItem_ReturnsSingleItem()
|
|
{
|
|
var dataSource = CreateDataSource(_client, _crudTags);
|
|
|
|
var result = await dataSource.LoadItem(2);
|
|
|
|
Assert.IsNotNull(result);
|
|
Assert.AreEqual(2, result.Id);
|
|
Assert.AreEqual("Product B", result.ProductName);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Add Tests
|
|
|
|
[TestMethod]
|
|
public async Task Add_WithAutoSave_AddsItem()
|
|
{
|
|
var dataSource = CreateDataSource(_client, _crudTags);
|
|
var newItem = new TestOrderItem { Id = 100, ProductName = "New Product", Quantity = 5, UnitPrice = 50m };
|
|
|
|
var result = await dataSource.Add(newItem, autoSave: true);
|
|
|
|
Assert.AreEqual(1, dataSource.Count);
|
|
Assert.AreEqual("New Product", result.ProductName);
|
|
}
|
|
|
|
[TestMethod]
|
|
public void Add_WithoutAutoSave_AddsToTrackingOnly()
|
|
{
|
|
var dataSource = CreateDataSource(_client, _crudTags);
|
|
var newItem = new TestOrderItem { Id = 100, ProductName = "New Product" };
|
|
|
|
dataSource.Add(newItem);
|
|
|
|
Assert.AreEqual(1, dataSource.Count);
|
|
Assert.AreEqual(1, dataSource.GetTrackingItems().Count);
|
|
Assert.AreEqual(TrackingState.Add, dataSource.GetTrackingItems()[0].TrackingState);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region SaveChanges Tests
|
|
|
|
[TestMethod]
|
|
public async Task SaveChanges_SavesTrackedItems()
|
|
{
|
|
var dataSource = CreateDataSource(_client, _crudTags);
|
|
dataSource.Add(new TestOrderItem { Id = 101, ProductName = "Item 1" });
|
|
dataSource.Add(new TestOrderItem { Id = 102, ProductName = "Item 2" });
|
|
|
|
var unsaved = await dataSource.SaveChanges();
|
|
|
|
Assert.AreEqual(0, unsaved.Count);
|
|
Assert.AreEqual(0, dataSource.GetTrackingItems().Count);
|
|
}
|
|
|
|
[TestMethod]
|
|
public async Task SaveChangesAsync_ClearsTracking()
|
|
{
|
|
var dataSource = CreateDataSource(_client, _crudTags);
|
|
dataSource.Add(new TestOrderItem { Id = 103, ProductName = "Item 3" });
|
|
|
|
await dataSource.SaveChangesAsync();
|
|
|
|
Assert.AreEqual(0, dataSource.GetTrackingItems().Count);
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region DataSources
|
|
|
|
[TestClass]
|
|
public class SignalRDataSourceTests_List : SignalRDataSourceTestBase<TestOrderItemListDataSource, List<TestOrderItem>>
|
|
{
|
|
protected override AcSerializerOptions SerializerOption => AcBinarySerializerOptions.Default;
|
|
protected override TestOrderItemListDataSource CreateDataSource(TestableSignalRClient2 client, SignalRCrudTags crudTags)
|
|
=> new(client, crudTags);
|
|
}
|
|
|
|
[TestClass]
|
|
public class SignalRDataSourceTests_Observable : SignalRDataSourceTestBase<TestOrderItemObservableDataSource, AcObservableCollection<TestOrderItem>>
|
|
{
|
|
protected override AcSerializerOptions SerializerOption => AcBinarySerializerOptions.Default;
|
|
|
|
protected override TestOrderItemObservableDataSource CreateDataSource(TestableSignalRClient2 client, SignalRCrudTags crudTags)
|
|
=> new(client, crudTags);
|
|
}
|
|
#endregion
|