AyCode.Core/AyCode.Services.Server.Tests/SignalRs/SignalRDatasources/SignalRDataSourceTestBase.C...

384 lines
11 KiB
C#

using System.Collections;
using AyCode.Core.Enums;
using AyCode.Core.Tests.TestModels;
namespace AyCode.Services.Server.Tests.SignalRs.SignalRDatasources;
public abstract partial class SignalRDataSourceTestBase<TDataSource, TIList>
{
#region Collection Operations Tests
[TestMethod]
public virtual async Task Count_ReturnsCorrectValue()
{
var dataSource = CreateDataSource(_client, _crudTags);
await dataSource.LoadDataSource();
Assert.AreEqual(3, dataSource.Count);
}
[TestMethod]
public virtual void Clear_RemovesAllItems()
{
var dataSource = CreateDataSource(_client, _crudTags);
dataSource.Add(new TestOrderItem { Id = 1, ProductName = "Item1" });
dataSource.Add(new TestOrderItem { Id = 2, ProductName = "Item2" });
dataSource.Clear();
Assert.AreEqual(0, dataSource.Count);
Assert.AreEqual(0, dataSource.GetTrackingItems().Count);
}
[TestMethod]
public virtual void Clear_WithoutClearingTracking_PreservesTracking()
{
var dataSource = CreateDataSource(_client, _crudTags);
dataSource.Add(new TestOrderItem { Id = 1, ProductName = "Item1" });
dataSource.Clear(clearChangeTracking: false);
Assert.AreEqual(0, dataSource.Count);
Assert.AreEqual(1, dataSource.GetTrackingItems().Count);
}
[TestMethod]
public virtual async Task Contains_ReturnsTrue_WhenItemExists()
{
var dataSource = CreateDataSource(_client, _crudTags);
await dataSource.LoadDataSource();
Assert.IsTrue(dataSource.Contains(dataSource[0]));
}
[TestMethod]
public virtual void Contains_ReturnsFalse_WhenItemNotExists()
{
var dataSource = CreateDataSource(_client, _crudTags);
Assert.IsFalse(dataSource.Contains(new TestOrderItem { Id = 9999 }));
}
[TestMethod]
public virtual async Task IndexOf_ReturnsCorrectIndex()
{
var dataSource = CreateDataSource(_client, _crudTags);
await dataSource.LoadDataSource();
Assert.AreEqual(0, dataSource.IndexOf(dataSource[0]));
Assert.AreEqual(1, dataSource.IndexOf(dataSource[1]));
Assert.AreEqual(2, dataSource.IndexOf(dataSource[2]));
}
[TestMethod]
public virtual void IndexOf_ById_ReturnsCorrectIndex()
{
var dataSource = CreateDataSource(_client, _crudTags);
dataSource.Add(new TestOrderItem { Id = 5, ProductName = "Item5" });
Assert.AreEqual(0, dataSource.IndexOf(5));
}
[TestMethod]
public virtual void TryGetIndex_ReturnsTrue_WhenExists()
{
var dataSource = CreateDataSource(_client, _crudTags);
dataSource.Add(new TestOrderItem { Id = 10, ProductName = "Test" });
var result = dataSource.TryGetIndex(10, out var index);
Assert.IsTrue(result);
Assert.AreEqual(0, index);
}
[TestMethod]
public virtual async Task TryGetValue_ReturnsItem_WhenExists()
{
var dataSource = CreateDataSource(_client, _crudTags);
await dataSource.LoadDataSource();
var result = dataSource.TryGetValue(1, out var item);
Assert.IsTrue(result);
Assert.IsNotNull(item);
Assert.AreEqual("Product A", item.ProductName);
}
[TestMethod]
public virtual void TryGetValue_ReturnsFalse_WhenNotExists()
{
var dataSource = CreateDataSource(_client, _crudTags);
var result = dataSource.TryGetValue(9999, out var item);
Assert.IsFalse(result);
Assert.IsNull(item);
}
[TestMethod]
public virtual async Task CopyTo_CopiesAllItems()
{
var dataSource = CreateDataSource(_client, _crudTags);
await dataSource.LoadDataSource();
var array = new TestOrderItem[3];
dataSource.CopyTo(array);
Assert.AreEqual("Product A", array[0].ProductName);
Assert.AreEqual("Product B", array[1].ProductName);
Assert.AreEqual("Product C", array[2].ProductName);
}
[TestMethod]
public virtual async Task GetEnumerator_EnumeratesAllItems()
{
var dataSource = CreateDataSource(_client, _crudTags);
await dataSource.LoadDataSource();
var count = dataSource.Count();
Assert.AreEqual(3, count);
}
[TestMethod]
public virtual async Task AsReadOnly_ReturnsReadOnlyCollection()
{
var dataSource = CreateDataSource(_client, _crudTags);
await dataSource.LoadDataSource();
var readOnly = dataSource.AsReadOnly();
Assert.AreEqual(3, readOnly.Count);
Assert.IsInstanceOfType(readOnly, typeof(System.Collections.ObjectModel.ReadOnlyCollection<TestOrderItem>));
}
#endregion
#region Working Reference List Tests
[TestMethod]
public virtual async Task SetWorkingReferenceList_SetsNewInnerList()
{
var dataSource = CreateDataSource(_client, _crudTags);
await dataSource.LoadDataSource();
var externalList = Activator.CreateInstance<TIList>();
dataSource.SetWorkingReferenceList(externalList);
Assert.IsTrue(dataSource.HasWorkingReferenceList);
Assert.AreEqual(3, dataSource.Count);
}
[TestMethod]
public virtual async Task GetReferenceInnerList_ReturnsInnerList()
{
var dataSource = CreateDataSource(_client, _crudTags);
await dataSource.LoadDataSource();
var innerList = dataSource.GetReferenceInnerList();
Assert.IsNotNull(innerList);
Assert.AreEqual(3, innerList.Count);
}
#endregion
#region Sync State Tests
[TestMethod]
public virtual void IsSyncing_IsFalse_Initially()
{
var dataSource = CreateDataSource(_client, _crudTags);
Assert.IsFalse(dataSource.IsSyncing);
}
[TestMethod]
public virtual async Task OnSyncingStateChanged_Fires_DuringLoad()
{
var dataSource = CreateDataSource(_client, _crudTags);
var syncStarted = false;
var syncEnded = false;
dataSource.OnSyncingStateChanged += isSyncing =>
{
if (isSyncing) syncStarted = true;
else syncEnded = true;
};
await dataSource.LoadDataSource();
Assert.IsTrue(syncStarted);
Assert.IsTrue(syncEnded);
}
#endregion
#region IList Interface Tests
[TestMethod]
public virtual void IList_Add_ReturnsCorrectIndex()
{
var dataSource = CreateDataSource(_client, _crudTags);
var item = new TestOrderItem { Id = 1, ProductName = "Test" };
var index = ((IList)dataSource).Add(item);
Assert.AreEqual(0, index);
}
[TestMethod]
public virtual void IList_Contains_WorksCorrectly()
{
var dataSource = CreateDataSource(_client, _crudTags);
var item = new TestOrderItem { Id = 1, ProductName = "Test" };
dataSource.Add(item);
Assert.IsTrue(((IList)dataSource).Contains(item));
}
[TestMethod]
public virtual void IList_IndexOf_WorksCorrectly()
{
var dataSource = CreateDataSource(_client, _crudTags);
var item = new TestOrderItem { Id = 1, ProductName = "Test" };
dataSource.Add(item);
Assert.AreEqual(0, ((IList)dataSource).IndexOf(item));
}
[TestMethod]
public virtual void IList_Insert_WorksCorrectly()
{
var dataSource = CreateDataSource(_client, _crudTags);
dataSource.Add(new TestOrderItem { Id = 1, ProductName = "First" });
var newItem = new TestOrderItem { Id = 2, ProductName = "Inserted" };
((IList)dataSource).Insert(0, newItem);
Assert.AreEqual("Inserted", dataSource[0].ProductName);
}
[TestMethod]
public virtual void IList_Remove_WorksCorrectly()
{
var dataSource = CreateDataSource(_client, _crudTags);
var item = new TestOrderItem { Id = 1, ProductName = "Test" };
dataSource.Add(item);
((IList)dataSource).Remove(item);
Assert.AreEqual(0, dataSource.Count);
}
[TestMethod]
public virtual void IList_Indexer_GetSet_WorksCorrectly()
{
var dataSource = CreateDataSource(_client, _crudTags);
dataSource.Add(new TestOrderItem { Id = 1, ProductName = "Original" });
((IList)dataSource)[0] = new TestOrderItem { Id = 1, ProductName = "Modified" };
Assert.AreEqual("Modified", dataSource[0].ProductName);
}
[TestMethod]
public virtual void ICollection_CopyTo_WorksCorrectly()
{
var dataSource = CreateDataSource(_client, _crudTags);
dataSource.Add(new TestOrderItem { Id = 1, ProductName = "Item1" });
dataSource.Add(new TestOrderItem { Id = 2, ProductName = "Item2" });
var array = new TestOrderItem[2];
((ICollection)dataSource).CopyTo(array, 0);
Assert.AreEqual("Item1", array[0].ProductName);
Assert.AreEqual("Item2", array[1].ProductName);
}
[TestMethod]
public virtual void IsSynchronized_ReturnsTrue()
{
var dataSource = CreateDataSource(_client, _crudTags);
Assert.IsTrue(dataSource.IsSynchronized);
}
[TestMethod]
public virtual void SyncRoot_IsNotNull()
{
var dataSource = CreateDataSource(_client, _crudTags);
Assert.IsNotNull(dataSource.SyncRoot);
}
[TestMethod]
public virtual void IsFixedSize_ReturnsFalse()
{
var dataSource = CreateDataSource(_client, _crudTags);
Assert.IsFalse(dataSource.IsFixedSize);
}
[TestMethod]
public virtual void IsReadOnly_ReturnsFalse()
{
var dataSource = CreateDataSource(_client, _crudTags);
Assert.IsFalse(((IList)dataSource).IsReadOnly);
}
#endregion
#region Edge Cases
[TestMethod]
public virtual async Task Indexer_OutOfRange_ThrowsException()
{
var dataSource = CreateDataSource(_client, _crudTags);
await dataSource.LoadDataSource();
Assert.ThrowsExactly<ArgumentOutOfRangeException>(() => _ = dataSource[999]);
}
[TestMethod]
public virtual void Add_ThenRemove_ClearsTracking()
{
var dataSource = CreateDataSource(_client, _crudTags);
var item = new TestOrderItem { Id = 1, ProductName = "Temporary" };
dataSource.Add(item);
Assert.AreEqual(1, dataSource.GetTrackingItems().Count);
dataSource.Remove(item);
Assert.AreEqual(0, dataSource.GetTrackingItems().Count);
}
[TestMethod]
public virtual async Task ComplexWorkflow_AddUpdateRemoveSave()
{
var dataSource = CreateDataSource(_client, _crudTags);
// Add items
dataSource.Add(new TestOrderItem { Id = 1, ProductName = "Item1", Quantity = 10 });
dataSource.Add(new TestOrderItem { Id = 2, ProductName = "Item2", Quantity = 20 });
Assert.AreEqual(2, dataSource.GetTrackingItems().Count);
// Save
await dataSource.SaveChanges();
Assert.AreEqual(0, dataSource.GetTrackingItems().Count);
// Update
dataSource[0] = new TestOrderItem { Id = 1, ProductName = "Updated1", Quantity = 100 };
Assert.AreEqual(1, dataSource.GetTrackingItems().Count);
Assert.AreEqual(TrackingState.Update, dataSource.GetTrackingItems()[0].TrackingState);
// Remove
dataSource.Remove(dataSource[1]);
Assert.AreEqual(2, dataSource.GetTrackingItems().Count);
// Save all changes
await dataSource.SaveChanges();
Assert.AreEqual(0, dataSource.GetTrackingItems().Count);
Assert.AreEqual(1, dataSource.Count);
}
#endregion
}