diff --git a/backend/api.test/Mocks/SignalRServiceMock.cs b/backend/api.test/Mocks/SignalRServiceMock.cs index a8f3cfdef..6a94373f8 100644 --- a/backend/api.test/Mocks/SignalRServiceMock.cs +++ b/backend/api.test/Mocks/SignalRServiceMock.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Api.Database.Models; using Api.Services; @@ -7,7 +8,25 @@ namespace Api.Test.Mocks { public class MockSignalRService : ISignalRService { - public List LatestMessages { get; set; } = []; + // Messages are added from MQTT background threads while tests poll this collection, + // so access is locked and readers get a snapshot to enumerate safely. + private readonly object _lock = new(); + private readonly List _latestMessages = []; + + public IReadOnlyList LatestMessages + { + get + { + lock (_lock) + return _latestMessages.ToList(); + } + } + + private void AddMessage(string label, object? messageObject) + { + lock (_lock) + _latestMessages.Add(new { Label = label, Message = messageObject }); + } public async Task SendMessageAsync( string label, @@ -15,7 +34,7 @@ public async Task SendMessageAsync( T messageObject ) { - LatestMessages.Add(new { Label = label, Message = messageObject }); + AddMessage(label, messageObject); await Task.CompletedTask; } @@ -25,7 +44,7 @@ public async Task SendMessageAsync( T messageObject ) { - LatestMessages.Add(new { Label = label, Message = messageObject }); + AddMessage(label, messageObject); await Task.CompletedTask; }