22using ByteSync . Business . Sessions ;
33using ByteSync . Common . Business . Sessions ;
44using ByteSync . Common . Business . Sessions . Cloud ;
5+ using ByteSync . Common . Business . Synchronizations ;
56using ByteSync . Interfaces . Controls . Communications . Http ;
7+ using ByteSync . Interfaces . Controls . Synchronizations ;
68using ByteSync . Interfaces . Controls . TimeTracking ;
79using ByteSync . Interfaces . Factories ;
810using ByteSync . Interfaces . Services . Sessions ;
911using ByteSync . Services . Synchronizations ;
12+ using FluentAssertions ;
1013using Microsoft . Extensions . Logging ;
1114using Moq ;
1215using NUnit . Framework ;
@@ -22,8 +25,6 @@ public class SynchronizationServiceTests
2225 private Mock < ISynchronizationLooperFactory > _synchronizationLooperFactoryMock ;
2326 private Mock < ITimeTrackingCache > _timeTrackingCacheMock ;
2427 private Mock < ILogger < SynchronizationService > > _loggerMock ;
25-
26- // private SynchronizationService _synchronizationService;
2728
2829 [ SetUp ]
2930 public void Setup ( )
@@ -50,19 +51,115 @@ public async Task AbortSynchronization_CloudSession_AbortsSynchronization()
5051 _sessionServiceMock
5152 . SetupGet ( x => x . SessionStatusObservable )
5253 . Returns ( sessionStatusObservable ) ;
53- // _connectionManagerMock
54- // .Setup(x => x.HubWrapper.RequestAbortSynchronization(cloudSession.SessionId))
55- // .ReturnsAsync(new SynchronizationAbortRequest());
56- // _connectionManagerMock.SetupPushHandler();
5754
5855 var synchronizationService = new SynchronizationService ( _sessionServiceMock . Object , _sessionMemberServiceMock . Object , _synchronizationApiClientMock . Object ,
5956 _synchronizationLooperFactoryMock . Object , _timeTrackingCacheMock . Object , _loggerMock . Object ) ;
6057
6158 // Act
6259 await synchronizationService . AbortSynchronization ( ) ;
60+ }
61+
62+ [ Test ]
63+ public void SynchronizationStart_WhenDataTransmitted_ShouldStartSynchronizationLoop ( )
64+ {
65+ // Arrange
66+ var cloudSession = new CloudSession ( ) ;
67+ var sessionObservable = new BehaviorSubject < AbstractSession ? > ( cloudSession ) ;
68+ _sessionServiceMock
69+ . SetupGet ( x => x . SessionObservable )
70+ . Returns ( sessionObservable ) ;
71+
72+ var sessionStatusObservable = new BehaviorSubject < SessionStatus > ( SessionStatus . Preparation ) ;
73+ _sessionServiceMock
74+ . SetupGet ( x => x . SessionStatusObservable )
75+ . Returns ( sessionStatusObservable ) ;
76+
77+ var mockSynchronizationLooper = new Mock < ISynchronizationLooper > ( ) ;
78+ _synchronizationLooperFactoryMock
79+ . Setup ( x => x . CreateSynchronizationLooper ( ) )
80+ . Returns ( mockSynchronizationLooper . Object ) ;
81+
82+ var synchronizationService = new SynchronizationService (
83+ _sessionServiceMock . Object ,
84+ _sessionMemberServiceMock . Object ,
85+ _synchronizationApiClientMock . Object ,
86+ _synchronizationLooperFactoryMock . Object ,
87+ _timeTrackingCacheMock . Object ,
88+ _loggerMock . Object
89+ ) ;
90+
91+ var synchronization = new Synchronization { SessionId = "test-session" } ;
92+
93+ // Act
94+ synchronizationService . SynchronizationProcessData . SynchronizationStart . OnNext ( synchronization ) ;
95+ synchronizationService . SynchronizationProcessData . SynchronizationDataTransmitted . OnNext ( true ) ;
96+
97+ // Wait until the asynchronous task can start
98+ Thread . Sleep ( 100 ) ;
99+
100+ // Assert
101+ _synchronizationLooperFactoryMock . Verify ( x => x . CreateSynchronizationLooper ( ) , Times . Once ) ;
102+ mockSynchronizationLooper . Verify ( x => x . CloudSessionSynchronizationLoop ( ) , Times . Once ) ;
103+ }
104+
105+ [ Test ]
106+ public async Task SynchronizationStart_WhenDataTransmitted_ShouldRunInSeparateTask ( )
107+ {
108+ // Arrange
109+ var cloudSession = new CloudSession ( ) ;
110+ var sessionObservable = new BehaviorSubject < AbstractSession ? > ( cloudSession ) ;
111+ _sessionServiceMock
112+ . SetupGet ( x => x . SessionObservable )
113+ . Returns ( sessionObservable ) ;
114+
115+ var sessionStatusObservable = new BehaviorSubject < SessionStatus > ( SessionStatus . Preparation ) ;
116+ _sessionServiceMock
117+ . SetupGet ( x => x . SessionStatusObservable )
118+ . Returns ( sessionStatusObservable ) ;
119+
120+ // Setup un ManualResetEvent pour capturer l'exécution de la méthode
121+ var executionCaptured = new ManualResetEventSlim ( false ) ;
122+ var executionThreadId = 0 ;
123+
124+ var mockSynchronizationLooper = new Mock < ISynchronizationLooper > ( ) ;
125+ mockSynchronizationLooper
126+ . Setup ( x => x . CloudSessionSynchronizationLoop ( ) )
127+ . Callback ( ( ) => {
128+ executionThreadId = Environment . CurrentManagedThreadId ;
129+ executionCaptured . Set ( ) ;
130+ } ) ;
131+
132+ _synchronizationLooperFactoryMock
133+ . Setup ( x => x . CreateSynchronizationLooper ( ) )
134+ . Returns ( mockSynchronizationLooper . Object ) ;
135+
136+ var synchronizationService = new SynchronizationService (
137+ _sessionServiceMock . Object ,
138+ _sessionMemberServiceMock . Object ,
139+ _synchronizationApiClientMock . Object ,
140+ _synchronizationLooperFactoryMock . Object ,
141+ _timeTrackingCacheMock . Object ,
142+ _loggerMock . Object
143+ ) ;
144+
145+ var synchronization = new Synchronization { SessionId = "test-session" } ;
146+ var currentThreadId = Environment . CurrentManagedThreadId ;
147+
148+ // Act
149+ synchronizationService . SynchronizationProcessData . SynchronizationStart . OnNext ( synchronization ) ;
150+ synchronizationService . SynchronizationProcessData . SynchronizationDataTransmitted . OnNext ( true ) ;
151+
152+ // Attendre l'exécution avec timeout
153+ var executed = executionCaptured . Wait ( TimeSpan . FromSeconds ( 1 ) ) ;
63154
64155 // Assert
65- // _connectionManagerMock.Verify(x => x.HubWrapper.RequestAbortSynchronization(cloudSession.SessionId), Times.Once);
66- // _connectionManagerMock.Verify();
156+ executed . Should ( ) . BeTrue ( ) ;
157+ currentThreadId . Should ( ) . NotBe ( executionThreadId ) ;
158+ // Assert.IsTrue(executed, "La méthode CloudSessionSynchronizationLoop n'a pas été exécutée");
159+ // Assert.AreNotEqual(currentThreadId, executionThreadId,
160+ // "La méthode CloudSessionSynchronizationLoop a été exécutée sur le même thread, elle devrait être dans un Task séparé");
161+
162+ _synchronizationLooperFactoryMock . Verify ( x => x . CreateSynchronizationLooper ( ) , Times . Once ) ;
163+ mockSynchronizationLooper . Verify ( x => x . CloudSessionSynchronizationLoop ( ) , Times . Once ) ;
67164 }
68165}
0 commit comments