1313using Bit . Test . Common . AutoFixture ;
1414using Bit . Test . Common . AutoFixture . Attributes ;
1515using Microsoft . Extensions . Logging ;
16+ using Microsoft . Extensions . Time . Testing ;
1617using NSubstitute ;
1718using Xunit ;
1819
@@ -21,11 +22,14 @@ namespace Bit.Scim.Test.Groups;
2122[ SutProviderCustomize ]
2223public class PatchGroupCommandTests
2324{
25+ private static readonly DateTime _expectedRevisionDate = DateTime . UtcNow . AddYears ( 1 ) ;
26+
2427 [ Theory ]
2528 [ BitAutoData ]
26- public async Task PatchGroup_ReplaceListMembers_Success ( SutProvider < PatchGroupCommand > sutProvider ,
29+ public async Task PatchGroup_ReplaceListMembers_Success (
2730 Organization organization , Group group , IEnumerable < Guid > userIds )
2831 {
32+ var sutProvider = SetupSutProvider ( ) ;
2933 group . OrganizationId = organization . Id ;
3034
3135 var scimPatchModel = new ScimPatchModel
@@ -48,7 +52,8 @@ await sutProvider.GetDependency<IGroupRepository>().Received(1).UpdateUsersAsync
4852 group . Id ,
4953 Arg . Is < IEnumerable < Guid > > ( arg =>
5054 arg . Count ( ) == userIds . Count ( ) &&
51- arg . ToHashSet ( ) . SetEquals ( userIds ) ) ) ;
55+ arg . ToHashSet ( ) . SetEquals ( userIds ) ) ,
56+ Arg . Is < DateTime > ( d => d == _expectedRevisionDate ) ) ;
5257 }
5358
5459 [ Theory ]
@@ -168,8 +173,9 @@ public async Task PatchGroup_ReplaceDisplayNameFromValueObject_MissingOrganizati
168173
169174 [ Theory ]
170175 [ BitAutoData ]
171- public async Task PatchGroup_AddSingleMember_Success ( SutProvider < PatchGroupCommand > sutProvider , Organization organization , Group group , ICollection < Guid > existingMembers , Guid userId )
176+ public async Task PatchGroup_AddSingleMember_Success ( Organization organization , Group group , ICollection < Guid > existingMembers , Guid userId )
172177 {
178+ var sutProvider = SetupSutProvider ( ) ;
173179 group . OrganizationId = organization . Id ;
174180
175181 sutProvider . GetDependency < IGroupRepository > ( )
@@ -193,7 +199,8 @@ public async Task PatchGroup_AddSingleMember_Success(SutProvider<PatchGroupComma
193199
194200 await sutProvider . GetDependency < IGroupRepository > ( ) . Received ( 1 ) . AddGroupUsersByIdAsync (
195201 group . Id ,
196- Arg . Is < IEnumerable < Guid > > ( arg => arg . Single ( ) == userId ) ) ;
202+ Arg . Is < IEnumerable < Guid > > ( arg => arg . Single ( ) == userId ) ,
203+ Arg . Is < DateTime > ( d => d == _expectedRevisionDate ) ) ;
197204 }
198205
199206 [ Theory ]
@@ -229,13 +236,14 @@ public async Task PatchGroup_AddSingleMember_ReturnsEarlyIfAlreadyInGroup(
229236
230237 await sutProvider . GetDependency < IGroupRepository > ( )
231238 . DidNotReceiveWithAnyArgs ( )
232- . AddGroupUsersByIdAsync ( default , default ) ;
239+ . AddGroupUsersByIdAsync ( default , default , default ) ;
233240 }
234241
235242 [ Theory ]
236243 [ BitAutoData ]
237- public async Task PatchGroup_AddListMembers_Success ( SutProvider < PatchGroupCommand > sutProvider , Organization organization , Group group , ICollection < Guid > existingMembers , ICollection < Guid > userIds )
244+ public async Task PatchGroup_AddListMembers_Success ( Organization organization , Group group , ICollection < Guid > existingMembers , ICollection < Guid > userIds )
238245 {
246+ var sutProvider = SetupSutProvider ( ) ;
239247 group . OrganizationId = organization . Id ;
240248
241249 sutProvider . GetDependency < IGroupRepository > ( )
@@ -262,15 +270,18 @@ await sutProvider.GetDependency<IGroupRepository>().Received(1).AddGroupUsersByI
262270 group . Id ,
263271 Arg . Is < IEnumerable < Guid > > ( arg =>
264272 arg . Count ( ) == userIds . Count &&
265- arg . ToHashSet ( ) . SetEquals ( userIds ) ) ) ;
273+ arg . ToHashSet ( ) . SetEquals ( userIds ) ) ,
274+ Arg . Is < DateTime > ( d => d == _expectedRevisionDate ) ) ;
266275 }
267276
268277 [ Theory ]
269278 [ BitAutoData ]
270279 public async Task PatchGroup_AddListMembers_IgnoresDuplicatesInRequest (
271- SutProvider < PatchGroupCommand > sutProvider , Organization organization , Group group ,
280+ Organization organization , Group group ,
272281 ICollection < Guid > existingMembers )
273282 {
283+ var sutProvider = SetupSutProvider ( ) ;
284+
274285 // Create 3 userIds
275286 var fixture = new Fixture { RepeatCount = 3 } ;
276287 var userIds = fixture . CreateMany < Guid > ( ) . ToList ( ) ;
@@ -308,17 +319,19 @@ await sutProvider.GetDependency<IGroupRepository>().Received(1).AddGroupUsersByI
308319 group . Id ,
309320 Arg . Is < IEnumerable < Guid > > ( arg =>
310321 arg . Count ( ) == 3 &&
311- arg . ToHashSet ( ) . SetEquals ( userIds ) ) ) ;
322+ arg . ToHashSet ( ) . SetEquals ( userIds ) ) ,
323+ Arg . Is < DateTime > ( d => d == _expectedRevisionDate ) ) ;
312324 }
313325
314326 [ Theory ]
315327 [ BitAutoData ]
316328 public async Task PatchGroup_AddListMembers_SuccessIfOnlySomeUsersAreInGroup (
317- SutProvider < PatchGroupCommand > sutProvider ,
318329 Organization organization , Group group ,
319330 ICollection < Guid > existingMembers ,
320331 ICollection < Guid > userIds )
321332 {
333+ var sutProvider = SetupSutProvider ( ) ;
334+
322335 // A user is already in the group, but some still need to be added
323336 userIds . Add ( existingMembers . First ( ) ) ;
324337
@@ -350,7 +363,8 @@ await sutProvider.GetDependency<IGroupRepository>()
350363 group . Id ,
351364 Arg . Is < IEnumerable < Guid > > ( arg =>
352365 arg . Count ( ) == userIds . Count &&
353- arg . ToHashSet ( ) . SetEquals ( userIds ) ) ) ;
366+ arg . ToHashSet ( ) . SetEquals ( userIds ) ) ,
367+ Arg . Is < DateTime > ( d => d == _expectedRevisionDate ) ) ;
354368 }
355369
356370 [ Theory ]
@@ -379,9 +393,10 @@ public async Task PatchGroup_RemoveSingleMember_Success(SutProvider<PatchGroupCo
379393
380394 [ Theory ]
381395 [ BitAutoData ]
382- public async Task PatchGroup_RemoveListMembers_Success ( SutProvider < PatchGroupCommand > sutProvider ,
396+ public async Task PatchGroup_RemoveListMembers_Success (
383397 Organization organization , Group group , ICollection < Guid > existingMembers )
384398 {
399+ var sutProvider = SetupSutProvider ( ) ;
385400 List < Guid > usersToRemove = [ existingMembers . First ( ) , existingMembers . Skip ( 1 ) . First ( ) ] ;
386401 group . OrganizationId = organization . Id ;
387402
@@ -412,7 +427,8 @@ await sutProvider.GetDependency<IGroupRepository>()
412427 group . Id ,
413428 Arg . Is < IEnumerable < Guid > > ( arg =>
414429 arg . Count ( ) == expectedRemainingUsers . Count &&
415- arg . ToHashSet ( ) . SetEquals ( expectedRemainingUsers ) ) ) ;
430+ arg . ToHashSet ( ) . SetEquals ( expectedRemainingUsers ) ) ,
431+ Arg . Is < DateTime > ( d => d == _expectedRevisionDate ) ) ;
416432 }
417433
418434 [ Theory ]
@@ -430,7 +446,7 @@ public async Task PatchGroup_InvalidOperation_Success(SutProvider<PatchGroupComm
430446 await sutProvider . Sut . PatchGroupAsync ( group , scimPatchModel ) ;
431447
432448 // Assert: no operation performed
433- await sutProvider . GetDependency < IGroupRepository > ( ) . DidNotReceiveWithAnyArgs ( ) . UpdateUsersAsync ( default , default ) ;
449+ await sutProvider . GetDependency < IGroupRepository > ( ) . DidNotReceiveWithAnyArgs ( ) . UpdateUsersAsync ( default , default , default ) ;
434450 await sutProvider . GetDependency < IGroupRepository > ( ) . DidNotReceiveWithAnyArgs ( ) . GetManyUserIdsByIdAsync ( default ) ;
435451 await sutProvider . GetDependency < IUpdateGroupCommand > ( ) . DidNotReceiveWithAnyArgs ( ) . UpdateGroupAsync ( default , default ) ;
436452 await sutProvider . GetDependency < IGroupService > ( ) . DidNotReceiveWithAnyArgs ( ) . DeleteUserAsync ( default , default ) ;
@@ -454,9 +470,18 @@ public async Task PatchGroup_NoOperation_Success(
454470
455471 await sutProvider . Sut . PatchGroupAsync ( group , scimPatchModel ) ;
456472
457- await sutProvider . GetDependency < IGroupRepository > ( ) . DidNotReceiveWithAnyArgs ( ) . UpdateUsersAsync ( default , default ) ;
473+ await sutProvider . GetDependency < IGroupRepository > ( ) . DidNotReceiveWithAnyArgs ( ) . UpdateUsersAsync ( default , default , default ) ;
458474 await sutProvider . GetDependency < IGroupRepository > ( ) . DidNotReceiveWithAnyArgs ( ) . GetManyUserIdsByIdAsync ( default ) ;
459475 await sutProvider . GetDependency < IUpdateGroupCommand > ( ) . DidNotReceiveWithAnyArgs ( ) . UpdateGroupAsync ( default , default ) ;
460476 await sutProvider . GetDependency < IGroupService > ( ) . DidNotReceiveWithAnyArgs ( ) . DeleteUserAsync ( default , default ) ;
461477 }
478+
479+ private static SutProvider < PatchGroupCommand > SetupSutProvider ( )
480+ {
481+ var sutProvider = new SutProvider < PatchGroupCommand > ( )
482+ . WithFakeTimeProvider ( )
483+ . Create ( ) ;
484+ sutProvider . GetDependency < FakeTimeProvider > ( ) . SetUtcNow ( _expectedRevisionDate ) ;
485+ return sutProvider ;
486+ }
462487}
0 commit comments