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> { public TestOrderItemListDataSource(AcSignalRClientBase signalRClient, SignalRCrudTags crudTags) : base(signalRClient, crudTags) { } } public class TestOrderItemObservableDataSource : AcSignalRDataSource> { public TestOrderItemObservableDataSource(AcSignalRClientBase signalRClient, SignalRCrudTags crudTags) : base(signalRClient, crudTags) { } } #endregion #region Abstract Test Base /// /// Base class for SignalR DataSource tests. /// Derived classes specify the serializer type and collection type. /// /// The concrete DataSource type /// The inner list type (List or AcObservableCollection) public abstract class SignalRDataSourceTestBase where TDataSource : AcSignalRDataSource where TIList : class, IList { 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> { protected override AcSerializerOptions SerializerOption => AcBinarySerializerOptions.Default; protected override TestOrderItemListDataSource CreateDataSource(TestableSignalRClient2 client, SignalRCrudTags crudTags) => new(client, crudTags); } [TestClass] public class SignalRDataSourceTests_Observable : SignalRDataSourceTestBase> { protected override AcSerializerOptions SerializerOption => AcBinarySerializerOptions.Default; protected override TestOrderItemObservableDataSource CreateDataSource(TestableSignalRClient2 client, SignalRCrudTags crudTags) => new(client, crudTags); } #endregion