Skip to content

Commit f3f42ca

Browse files
committed
2 parents d2eb89e + 234627a commit f3f42ca

File tree

4 files changed

+58
-11
lines changed

4 files changed

+58
-11
lines changed

Utils.DOM.Tests/DomConnectionMockTests.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@
44
using System.Collections.Generic;
55
using System.Linq;
66

7+
using FluentAssertions;
8+
79
using Microsoft.VisualStudio.TestTools.UnitTesting;
810

911
using Skyline.DataMiner.Net;
1012
using Skyline.DataMiner.Net.Apps.DataMinerObjectModel;
13+
using Skyline.DataMiner.Net.ManagerStore;
1114
using Skyline.DataMiner.Net.Messages;
1215
using Skyline.DataMiner.Net.Messages.SLDataGateway;
1316
using Skyline.DataMiner.Net.SubscriptionFilters;
@@ -149,5 +152,24 @@ public void DomConnectionMock_Subscription_Delete()
149152
CollectionAssert.AreEquivalent(Array.Empty<DomInstance>(), receivedEvent.Updated);
150153
CollectionAssert.AreEquivalent(new[] { TestData.Instance1 }, receivedEvent.Deleted);
151154
}
155+
156+
[TestMethod]
157+
public void DomConnectionMock_ITrackProperties()
158+
{
159+
// arrange
160+
var connection = new DomConnectionMock();
161+
var domHelper = new DomHelper(connection.HandleMessages, "module");
162+
163+
// act
164+
domHelper.DomInstances.CreateOrUpdate(new[] { TestData.Instance1, TestData.Instance2 }.ToList());
165+
var result = domHelper.DomInstances.ReadAll();
166+
167+
// assert
168+
result.Should().HaveCount(2);
169+
result[0].As<ITrackCreatedAt>().CreatedAt.Should().NotBe(default);
170+
result[0].As<ITrackCreatedBy>().CreatedBy.Should().NotBeNullOrEmpty();
171+
result[0].As<ITrackLastModified>().LastModified.Should().NotBe(default);
172+
result[0].As<ITrackLastModifiedBy>().LastModifiedBy.Should().NotBeNullOrEmpty();
173+
}
152174
}
153175
}

Utils.DOM/Extensions/DomInstanceExtensions.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Linq;
66

77
using Skyline.DataMiner.Net.Apps.DataMinerObjectModel;
8+
using Skyline.DataMiner.Net.ManagerStore;
89
using Skyline.DataMiner.Net.Messages.SLDataGateway;
910
using Skyline.DataMiner.Net.Sections;
1011

@@ -159,5 +160,29 @@ public static IEnumerable<Section> GetSectionsWithDefinition(this DomInstance in
159160

160161
return instance.GetSectionsWithDefinition(definition);
161162
}
163+
164+
/// <summary>
165+
/// Creates a deep clone of the specified <see cref="DomInstance"/>, including audit tracking properties.
166+
/// </summary>
167+
/// <param name="instance">The <see cref="DomInstance"/> to clone.</param>
168+
/// <returns>
169+
/// A deep clone of the <see cref="DomInstance"/>, with <see cref="ITrackCreatedAt.CreatedAt"/>,
170+
/// <see cref="ITrackCreatedBy.CreatedBy"/>, <see cref="ITrackLastModified.LastModified"/>, and
171+
/// <see cref="ITrackLastModifiedBy.LastModifiedBy"/> properties copied from the original instance.
172+
/// </returns>
173+
/// <remarks>
174+
/// The returned clone is a new instance with the same data and audit tracking information as the original.
175+
/// </remarks>
176+
public static DomInstance DeepClone(this DomInstance instance)
177+
{
178+
var clone = (DomInstance)instance.Clone();
179+
180+
((ITrackCreatedAt)clone).CreatedAt = ((ITrackCreatedAt)instance).CreatedAt;
181+
((ITrackCreatedBy)clone).CreatedBy = ((ITrackCreatedBy)instance).CreatedBy;
182+
((ITrackLastModified)clone).LastModified = ((ITrackLastModified)instance).LastModified;
183+
((ITrackLastModifiedBy)clone).LastModifiedBy = ((ITrackLastModifiedBy)instance).LastModifiedBy;
184+
185+
return clone;
186+
}
162187
}
163188
}

Utils.DOM/UnitTesting/DomSLNetMessageHandler.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -286,15 +286,15 @@ public bool TryHandleMessage(DMSMessage message, out DMSMessage response)
286286
case ManagerStoreReadRequest<DomInstance> request:
287287
{
288288
var module = GetDomModule(request.ModuleId);
289-
var instances = request.Query.ExecuteInMemory(module.Instances.Values).ToList();
290-
response = new ManagerStoreCrudResponse<DomInstance>(instances.Clone());
289+
var instances = request.Query.ExecuteInMemory(module.Instances.Values).Select(instance => instance.DeepClone()).ToList();
290+
response = new ManagerStoreCrudResponse<DomInstance>(instances);
291291
return true;
292292
}
293293

294294
case ManagerStoreCreateRequest<DomInstance> request:
295295
{
296296
var module = GetDomModule(request.ModuleId);
297-
var instance = (DomInstance)request.Object.Clone();
297+
var instance = request.Object.DeepClone();
298298

299299
var utcNow = DateTime.UtcNow;
300300
((ITrackCreatedAt)instance).CreatedAt = utcNow;
@@ -322,7 +322,7 @@ public bool TryHandleMessage(DMSMessage message, out DMSMessage response)
322322
case ManagerStoreUpdateRequest<DomInstance> request:
323323
{
324324
var module = GetDomModule(request.ModuleId);
325-
var instance = (DomInstance)request.Object.Clone();
325+
var instance = request.Object.DeepClone();
326326

327327
var utcNow = DateTime.UtcNow;
328328
((ITrackLastModified)instance).LastModified = utcNow;
@@ -350,7 +350,7 @@ public bool TryHandleMessage(DMSMessage message, out DMSMessage response)
350350
case ManagerStoreDeleteRequest<DomInstance> request:
351351
{
352352
var module = GetDomModule(request.ModuleId);
353-
var instance = (DomInstance)request.Object.Clone();
353+
var instance = request.Object.DeepClone();
354354

355355
var @event = new DomInstancesChangedEventMessage(-1, request.ModuleId);
356356

@@ -376,7 +376,7 @@ public bool TryHandleMessage(DMSMessage message, out DMSMessage response)
376376
var utcNow = DateTime.UtcNow;
377377

378378
var module = GetDomModule(request.ModuleId);
379-
var instances = request.Objects.Clone();
379+
var instances = request.Objects.Select(instance => instance.DeepClone()).ToList();
380380

381381
var @event = new DomInstancesChangedEventMessage(-1, request.ModuleId);
382382

@@ -416,7 +416,7 @@ public bool TryHandleMessage(DMSMessage message, out DMSMessage response)
416416
case ManagerStoreBulkDeleteRequest<DomInstance> request:
417417
{
418418
var module = GetDomModule(request.ModuleId);
419-
var instances = request.Objects.Clone();
419+
var instances = request.Objects.Select(instance => instance.DeepClone()).ToList();
420420

421421
var successfulIds = new List<DomInstanceId>();
422422
var unsuccessfulIds = new List<DomInstanceId>();
@@ -444,7 +444,7 @@ public bool TryHandleMessage(DMSMessage message, out DMSMessage response)
444444
{
445445
var module = GetDomModule(request.ModuleId);
446446
var instances = request.Filter.ExecuteInMemory(module.Instances.Values).ToList();
447-
var pagingHandler = new DomPagingHandler<DomInstance>(instances.Clone());
447+
var pagingHandler = new DomPagingHandler<DomInstance>(instances.Select(instance => instance.DeepClone()));
448448
module.PagingHandlers.TryAdd(pagingHandler.Cookie, pagingHandler);
449449

450450
var nextPage = pagingHandler.GetNextPage(request.PreferredPageSize, out var isLast);

Utils.DOM/Utils.DOM.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,17 @@
2323
<RepositoryType>git</RepositoryType>
2424
<TreatWarningsAsErrors>True</TreatWarningsAsErrors>
2525
</PropertyGroup>
26-
26+
2727
<ItemGroup>
2828
<PackageReference Include="Skyline.DataMiner.Dev.Common" Version="10.5.2" />
2929
</ItemGroup>
30-
30+
3131
<ItemGroup>
3232
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
3333
<_Parameter1>$(MSBuildProjectName).Tests</_Parameter1>
3434
</AssemblyAttribute>
3535
</ItemGroup>
36-
36+
3737
<ItemGroup>
3838
<None Include="..\README.md" Pack="true" PackagePath="" />
3939
<None Include="..\LICENSE.txt" Pack="true" PackagePath="" />

0 commit comments

Comments
 (0)