@ -1,17 +1,4 @@
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUser s ;
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.Interfaces ;
using Bit.Core.AdminConsole.Repositories ;
using Bit.Core.Context ;
using Bit.Core.Entities ;
using Bit.Core.Enums ;
using Bit.Core.Models.Commands ;
using Bit.Core.Repositories ;
using Bit.Core.Services ;
using Bit.Core.Test.AutoFixture.OrganizationUserFixtures ;
using Bit.Test.Common.AutoFixture ;
using Bit.Test.Common.AutoFixture.Attributes ;
using NSubstitute ;
using Xunit ;
using Bit.Test.Common.AutoFixture.Attribute s ;
namespace Bit.Core.Test.AdminConsole.OrganizationFeatures.OrganizationUsers ;
@ -19,415 +6,415 @@ namespace Bit.Core.Test.AdminConsole.OrganizationFeatures.OrganizationUsers;
public class DeleteManagedOrganizationUserAccountCommandTests
{
[Theory]
[BitAutoData]
public async Task DeleteUserAsync_WithValidUser_DeletesUserAndLogsEvents (
SutProvider< DeleteManagedOrganizationUserAccountCommand> sutProvider, User user, Guid organizationId ,
[OrganizationUser(OrganizationUserStatusType.Confirmed, OrganizationUserType.User)] OrganizationUser orgUser )
{
// Arrange
orgUser. OrganizationId = organizationId ;
orgUser. UserId = user . Id ;
sutProvider. GetDependency< IOrganizationUserRepository> ( )
. GetManyAsync( Arg . Any < IEnumerable < Guid > > ( ) )
. Returns( new List < OrganizationUser > { orgUser } ) ;
sutProvider. GetDependency< IUserRepository> ( )
. GetManyAsync( Arg . Is < IEnumerable < Guid > > ( ids = > ids . Contains ( user . Id ) ) )
. Returns( new [ ] { user } ) ;
sutProvider. GetDependency< IGetOrganizationUsersManagementStatusQuery> ( )
. GetUsersOrganizationManagementStatusAsync( organizationId, Arg . Any < IEnumerable < Guid > > ( ) )
. Returns( new Dictionary < Guid , bool > { { orgUser . Id , true } } ) ;
// Act
await sutProvider. Sut . DeleteUserAsync( organizationId, orgUser. Id , null ) ;
// Assert
await sutProvider. GetDependency< IUserRepository> ( ) . Received ( 1 ) . DeleteManyAsync ( Arg . Is < IEnumerable < User > > ( users = > users . Any ( u = > u . Id = = user . Id ) ) ) ;
await sutProvider. GetDependency< IEventService> ( ) . Received ( 1 ) . LogOrganizationUserEventsAsync (
Arg. Is < IEnumerable< ( OrganizationUser, EventType, DateTime? ) > > ( events = >
events. Count ( e = > e . Item1 . Id = = orgUser . Id & & e . Item2 = = EventType. OrganizationUser_Deleted) = = 1 ) ) ;
}
[Theory]
[BitAutoData]
public async Task DeleteUserAsync_WhenError_ShouldReturnFailure (
SutProvider< DeleteManagedOrganizationUserAccountCommand> sutProvider, User user, Guid organizationId ,
[OrganizationUser(OrganizationUserStatusType.Confirmed, OrganizationUserType.User)] OrganizationUser orgUser )
{
// Arrange
orgUser. OrganizationId = organizationId ;
orgUser. UserId = user . Id ;
sutProvider. GetDependency< IOrganizationUserRepository> ( )
. GetManyAsync( Arg . Any < IEnumerable < Guid > > ( ) )
. Returns( new List < OrganizationUser > { } ) ;
// Act
// Test is not ready
await sutProvider. Sut . DeleteUserAsync( organizationId, orgUser. Id , null ) ;
// Assert
}
[Theory]
[BitAutoData]
public async Task DeleteManyUsersAsync_WithValidUsers_DeletesUsersAndLogsEvents (
SutProvider< DeleteManagedOrganizationUserAccountCommand> sutProvider, User user1, User user2, Guid organizationId ,
[OrganizationUser(OrganizationUserStatusType.Confirmed, OrganizationUserType.User)] OrganizationUser orgUser1 ,
[OrganizationUser(OrganizationUserStatusType.Confirmed, OrganizationUserType.User)] OrganizationUser orgUser2 )
{
// Arrange
orgUser1. OrganizationId = orgUser2. OrganizationId = organizationId ;
orgUser1. UserId = user1 . Id ;
orgUser2. UserId = user2 . Id ;
sutProvider. GetDependency< IOrganizationUserRepository> ( )
. GetManyAsync( Arg . Any < IEnumerable < Guid > > ( ) )
. Returns( new List < OrganizationUser> { orgUser1, orgUser2 } ) ;
sutProvider. GetDependency< IUserRepository> ( )
. GetManyAsync( Arg . Is < IEnumerable < Guid > > ( ids = > ids . Contains ( user1 . Id ) & & ids . Contains ( user2 . Id ) ) )
. Returns( new [ ] { user1 , user2 } ) ;
sutProvider. GetDependency< IGetOrganizationUsersManagementStatusQuery> ( )
. GetUsersOrganizationManagementStatusAsync( organizationId, Arg . Any < IEnumerable < Guid > > ( ) )
. Returns( new Dictionary < Guid , bool > { { orgUser1 . Id , true } , { orgUser2 . Id , true } } ) ;
// Act
var userIds = new [ ] { orgUser1 . Id , orgUser2 . Id } ;
var results = await sutProvider. Sut . DeleteManyUsersAsync( organizationId, userIds, null ) ;
// Assert
Assert. Equal ( 2 , results . Count ( ) ) ;
Assert. All ( results , r = > Assert. IsType< Success> ( r . Item2 ) ) ;
await sutProvider. GetDependency< IOrganizationUserRepository> ( ) . Received ( 1 ) . GetManyAsync( userIds) ;
await sutProvider. GetDependency< IUserRepository> ( ) . Received ( 1 ) . DeleteManyAsync ( Arg . Is < IEnumerable < User > > ( users = > users . Any ( u = > u . Id = = user1 . Id ) & & users . Any ( u = > u . Id = = user2 . Id ) ) ) ;
await sutProvider. GetDependency< IEventService> ( ) . Received ( 1 ) . LogOrganizationUserEventsAsync (
Arg. Is < IEnumerable< ( OrganizationUser, EventType, DateTime? ) > > ( events = >
events. Count ( e = > e . Item1 . Id = = orgUser1 . Id & & e . Item2 = = EventType. OrganizationUser_Deleted) = = 1
& & events . Count ( e = > e . Item1 . Id = = orgUser2 . Id & & e . Item2 = = EventType. OrganizationUser_Deleted) = = 1 ) ) ;
}
[Theory]
[BitAutoData]
public async Task DeleteManyUsersAsync_WhenUserNotFound_ReturnsErrorMessage (
SutProvider< DeleteManagedOrganizationUserAccountCommand> sutProvider ,
Guid organizationId ,
Guid orgUserId )
{
// Act
var result = await sutProvider. Sut . DeleteManyUsersAsync( organizationId, new [ ] { orgUserId } , null ) ;
// Assert
Assert. Single( result) ;
var userId = result . First ( ) . Item1 ;
Assert. Equal ( orgUserId, userId) ;
var commandResult = result . First ( ) . Item2 ;
AssertErrorMessages( "Member not found.", commandResult) ;
await sutProvider. GetDependency< IUserRepository> ( )
. DidNotReceiveWithAnyArgs( )
. DeleteManyAsync( default) ;
await sutProvider. GetDependency< IEventService> ( ) . Received ( 0 )
. LogOrganizationUserEventsAsync( Arg . Any < IEnumerable< ( OrganizationUser, EventType, DateTime? ) > > ( ) ) ;
}
[Theory]
[BitAutoData]
public async Task DeleteManyUsersAsync_WhenDeletingYourself_ReturnsErrorMessage (
SutProvider< DeleteManagedOrganizationUserAccountCommand> sutProvider ,
User user, [ OrganizationUser] OrganizationUser orgUser, Guid deletingUserId )
{
// Arrange
orgUser. UserId = user . Id = deletingUserId ;
sutProvider. GetDependency< IOrganizationUserRepository> ( )
. GetManyAsync( Arg . Any < IEnumerable < Guid > > ( ) )
. Returns( new List < OrganizationUser > { orgUser } ) ;
sutProvider. GetDependency< IUserRepository> ( )
. GetManyAsync( Arg . Is < IEnumerable < Guid > > ( ids = > ids . Contains ( user . Id ) ) )
. Returns( new [ ] { user } ) ;
// Act
var result = await sutProvider. Sut . DeleteManyUsersAsync( orgUser. OrganizationId, new [ ] { orgUser . Id } , deletingUserId) ;
// Assert
Assert. Single( result) ;
var userId = result . First ( ) . Item1 ;
Assert. Equal ( orgUser . Id , userId) ;
var commandResult = result . First ( ) . Item2 ;
AssertErrorMessages( "You cannot delete yourself.", commandResult) ;
await sutProvider. GetDependency< IUserService> ( ) . Received ( 0 ) . DeleteAsync ( Arg . Any < User > ( ) ) ;
await sutProvider. GetDependency< IEventService> ( ) . Received ( 0 )
. LogOrganizationUserEventsAsync( Arg . Any < IEnumerable< ( OrganizationUser, EventType, DateTime? ) > > ( ) ) ;
}
[Theory]
[BitAutoData]
public async Task DeleteManyUsersAsync_WhenUserIsInvited_ReturnsErrorMessage (
SutProvider< DeleteManagedOrganizationUserAccountCommand> sutProvider ,
User user ,
[OrganizationUser(OrganizationUserStatusType.Invited, OrganizationUserType.User)] OrganizationUser orgUser )
{
// Arrange
orgUser. UserId = user . Id ;
sutProvider. GetDependency< IOrganizationUserRepository> ( )
. GetManyAsync( Arg . Any < IEnumerable < Guid > > ( ) )
. Returns( new List < OrganizationUser > { orgUser } ) ;
sutProvider. GetDependency< IUserRepository> ( )
. GetManyAsync( Arg . Is < IEnumerable < Guid > > ( input = > input . Contains ( user . Id ) ) )
. Returns( new [ ] { user } ) ;
// Act
var result = await sutProvider. Sut . DeleteManyUsersAsync( orgUser. OrganizationId, new [ ] { orgUser . Id } , null ) ;
// Assert
Assert. Single( result) ;
var userId = result . First ( ) . Item1 ;
Assert. Equal ( orgUser . Id , userId) ;
AssertErrorMessages( "You cannot delete a member with Invited status.", result . First ( ) . Item2 ) ;
await sutProvider. GetDependency< IUserService> ( ) . Received ( 0 ) . DeleteAsync ( Arg . Any < User > ( ) ) ;
await sutProvider. GetDependency< IEventService> ( ) . Received ( 0 )
. LogOrganizationUserEventsAsync( Arg . Any < IEnumerable< ( OrganizationUser, EventType, DateTime? ) > > ( ) ) ;
}
[Theory]
[BitAutoData]
public async Task DeleteManyUsersAsync_WhenDeletingOwnerAsNonOwner_ReturnsErrorMessage (
SutProvider< DeleteManagedOrganizationUserAccountCommand> sutProvider, User user ,
[OrganizationUser(OrganizationUserStatusType.Confirmed, OrganizationUserType.Owner)] OrganizationUser orgUser ,
Guid deletingUserId )
{
// Arrange
orgUser. UserId = user . Id ;
sutProvider. GetDependency< IOrganizationUserRepository> ( )
. GetManyAsync( Arg . Any < IEnumerable < Guid > > ( ) )
. Returns( new List < OrganizationUser > { orgUser } ) ;
sutProvider. GetDependency< IUserRepository> ( )
. GetManyAsync( Arg . Is < IEnumerable < Guid > > ( i = > i . Contains ( user . Id ) ) )
. Returns( new [ ] { user } ) ;
sutProvider. GetDependency< ICurrentContext> ( )
. OrganizationOwner( orgUser. OrganizationId )
. Returns( false ) ;
sutProvider. GetDependency< IGetOrganizationUsersManagementStatusQuery> ( )
. GetUsersOrganizationManagementStatusAsync( Arg . Any < Guid > ( ) , Arg . Any < IEnumerable < Guid > > ( ) )
. Returns( new Dictionary < Guid , bool > { { orgUser . Id , true } } ) ;
// Act
var result = await sutProvider. Sut . DeleteManyUsersAsync( orgUser. OrganizationId, new [ ] { orgUser . Id } , deletingUserId) ;
// Assert
Assert. Single( result) ;
var userId = result . First ( ) . Item1 ;
Assert. Equal ( orgUser . Id , userId) ;
var commandResult = result . First ( ) . Item2 ;
AssertErrorMessages( "Only owners can delete other owners.", commandResult) ;
await sutProvider. GetDependency< IUserService> ( ) . Received ( 0 ) . DeleteAsync ( Arg . Any < User > ( ) ) ;
await sutProvider. GetDependency< IEventService> ( ) . Received ( 0 )
. LogOrganizationUserEventsAsync( Arg . Any < IEnumerable< ( OrganizationUser, EventType, DateTime? ) > > ( ) ) ;
}
[Theory]
[BitAutoData]
public async Task DeleteManyUsersAsync_WhenUserNotManaged_ReturnsErrorMessage (
SutProvider< DeleteManagedOrganizationUserAccountCommand> sutProvider, User user ,
[OrganizationUser(OrganizationUserStatusType.Confirmed, OrganizationUserType.User)] OrganizationUser orgUser )
{
// Arrange
orgUser. UserId = user . Id ;
sutProvider. GetDependency< IOrganizationUserRepository> ( )
. GetManyAsync( Arg . Any < IEnumerable < Guid > > ( ) )
. Returns( new List < OrganizationUser > { orgUser } ) ;
sutProvider. GetDependency< IUserRepository> ( )
. GetManyAsync( Arg . Is < IEnumerable < Guid > > ( ids = > ids . Contains( orgUser. UserId. Value ) ) )
. Returns( new [ ] { user } ) ;
sutProvider. GetDependency< IGetOrganizationUsersManagementStatusQuery> ( )
. GetUsersOrganizationManagementStatusAsync( Arg . Any < Guid > ( ) , Arg . Any < IEnumerable < Guid > > ( ) )
. Returns( new Dictionary < Guid , bool > { { orgUser . Id , false } } ) ;
// Act
var result = await sutProvider. Sut . DeleteManyUsersAsync( orgUser. OrganizationId, new [ ] { orgUser . Id } , null ) ;
// Assert
Assert. Single( result) ;
var userId = result . First ( ) . Item1 ;
Assert. Equal ( orgUser . Id , userId) ;
var commandResult = result . First ( ) . Item2 ;
AssertErrorMessages( "Member is not managed by the organization.", commandResult) ;
// [Theory]
// [BitAutoData]
// public async Task DeleteUserAsync_WithValidUser_DeletesUserAndLogsEvents(
// SutProvider< DeleteManagedOrganizationUserAccountCommand> sutProvider, User user, Guid organizationId,
// [OrganizationUser(OrganizationUserStatusType.Confirmed, OrganizationUserType.User)] OrganizationUser orgUser)
// {
// // Arrange
// orgUser. OrganizationId = organizationId;
// orgUser. UserId = user.Id ;
// sutProvider. GetDependency< IOrganizationUserRepository>( )
// . GetManyAsync(Arg.Any<IEnumerable<Guid>>() )
// . Returns(new List<OrganizationUser> { orgUser }) ;
// sutProvider. GetDependency< IUserRepository>( )
// . GetManyAsync(Arg.Is<IEnumerable<Guid>>(ids => ids.Contains(user.Id)) )
// . Returns(new[] { user }) ;
// sutProvider. GetDependency< IGetOrganizationUsersManagementStatusQuery>( )
// . GetUsersOrganizationManagementStatusAsync( organizationId, Arg.Any<IEnumerable<Guid>>() )
// . Returns(new Dictionary<Guid, bool> { { orgUser.Id, true } }) ;
// // Act
// await sutProvider.Sut. DeleteUserAsync( organizationId, orgUser.Id, null) ;
// // Assert
// await sutProvider. GetDependency< IUserRepository>().Received(1).DeleteManyAsync(Arg.Is<IEnumerable<User>>(users => users.Any(u => u.Id == user.Id))) ;
// await sutProvider. GetDependency< IEventService>().Received(1). LogOrganizationUserEventsAsync(
// Arg.Is< IEnumerable<( OrganizationUser, EventType, DateTime?)>>(events = >
// events.Count(e => e.Item1.Id == orgUser.Id && e.Item2 == EventType. OrganizationUser_Deleted) == 1)) ;
// }
// [Theory]
// [BitAutoData]
// public async Task DeleteUserAsync_WhenError_ShouldReturnFailure(
// SutProvider< DeleteManagedOrganizationUserAccountCommand> sutProvider, User user, Guid organizationId,
// [OrganizationUser(OrganizationUserStatusType.Confirmed, OrganizationUserType.User)] OrganizationUser orgUser)
// {
// // Arrange
// orgUser. OrganizationId = organizationId;
// orgUser. UserId = user.Id ;
// sutProvider. GetDependency< IOrganizationUserRepository>( )
// . GetManyAsync(Arg.Any<IEnumerable<Guid>>() )
// . Returns(new List<OrganizationUser> { }) ;
// // Act
// // Test is not ready
// await sutProvider.Sut. DeleteUserAsync( organizationId, orgUser.Id, null) ;
// // Assert
// }
// [Theory]
// [BitAutoData]
// public async Task DeleteManyUsersAsync_WithValidUsers_DeletesUsersAndLogsEvents(
// SutProvider< DeleteManagedOrganizationUserAccountCommand> sutProvider, User user1, User user2, Guid organizationId,
// [OrganizationUser(OrganizationUserStatusType.Confirmed, OrganizationUserType.User)] OrganizationUser orgUser1,
// [OrganizationUser(OrganizationUserStatusType.Confirmed, OrganizationUserType.User)] OrganizationUser orgUser2)
// {
// // Arrange
// orgUser1. OrganizationId = orgUser2. OrganizationId = organizationId;
// orgUser1. UserId = user1.Id ;
// orgUser2. UserId = user2.Id ;
// sutProvider. GetDependency< IOrganizationUserRepository>( )
// . GetManyAsync(Arg.Any<IEnumerable<Guid>>() )
// . Returns(new List< OrganizationUser> { orgUser1, orgUser2 }) ;
// sutProvider. GetDependency< IUserRepository>( )
// . GetManyAsync(Arg.Is<IEnumerable<Guid>>(ids => ids.Contains(user1.Id) && ids.Contains(user2.Id)) )
// . Returns(new[] { user1, user2 }) ;
// sutProvider. GetDependency< IGetOrganizationUsersManagementStatusQuery>( )
// . GetUsersOrganizationManagementStatusAsync( organizationId, Arg.Any<IEnumerable<Guid>>() )
// . Returns(new Dictionary<Guid, bool> { { orgUser1.Id, true }, { orgUser2.Id, true } }) ;
// // Act
// var userIds = new[] { orgUser1.Id, orgUser2.Id } ;
// var results = await sutProvider.Sut. DeleteManyUsersAsync( organizationId, userIds, null) ;
// // Assert
// Assert.Equal(2, results.Count()) ;
// Assert.All(results, r => Assert. IsType< Success>(r.Item2)) ;
// await sutProvider. GetDependency< IOrganizationUserRepository>().Received(1). GetManyAsync( userIds) ;
// await sutProvider. GetDependency< IUserRepository>().Received(1).DeleteManyAsync(Arg.Is<IEnumerable<User>>(users => users.Any(u => u.Id == user1.Id) && users.Any(u => u.Id == user2.Id))) ;
// await sutProvider. GetDependency< IEventService>().Received(1). LogOrganizationUserEventsAsync(
// Arg.Is< IEnumerable<( OrganizationUser, EventType, DateTime?)>>(events = >
// events.Count(e => e.Item1.Id == orgUser1.Id && e.Item2 == EventType. OrganizationUser_Deleted) == 1
// && events.Count(e => e.Item1.Id == orgUser2.Id && e.Item2 == EventType. OrganizationUser_Deleted) == 1)) ;
// }
// [Theory]
// [BitAutoData]
// public async Task DeleteManyUsersAsync_WhenUserNotFound_ReturnsErrorMessage(
// SutProvider< DeleteManagedOrganizationUserAccountCommand> sutProvider,
// Guid organizationId,
// Guid orgUserId)
// {
// // Act
// var result = await sutProvider.Sut. DeleteManyUsersAsync( organizationId, new[] { orgUserId }, null) ;
// // Assert
// Assert. Single( result) ;
// var userId = result.First(). Item1;
// Assert.Equal( orgUserId, userId) ;
// var commandResult = result.First(). Item2;
// AssertErrorMessages( "Member not found.", commandResult) ;
// await sutProvider. GetDependency< IUserRepository>( )
// . DidNotReceiveWithAnyArgs( )
// . DeleteManyAsync( default) ;
// await sutProvider. GetDependency< IEventService>().Received(0 )
// . LogOrganizationUserEventsAsync(Arg.Any< IEnumerable<( OrganizationUser, EventType, DateTime?)>>()) ;
// }
// [Theory]
// [BitAutoData]
// public async Task DeleteManyUsersAsync_WhenDeletingYourself_ReturnsErrorMessage(
// SutProvider< DeleteManagedOrganizationUserAccountCommand> sutProvider,
// User user, [ OrganizationUser] OrganizationUser orgUser, Guid deletingUserId)
// {
// // Arrange
// orgUser. UserId = user.Id = deletingUserId;
// sutProvider. GetDependency< IOrganizationUserRepository>( )
// . GetManyAsync(Arg.Any<IEnumerable<Guid>>() )
// . Returns(new List<OrganizationUser> { orgUser }) ;
// sutProvider. GetDependency< IUserRepository>( )
// . GetManyAsync(Arg.Is<IEnumerable<Guid>>(ids => ids.Contains(user.Id)) )
// . Returns(new[] { user }) ;
// // Act
// var result = await sutProvider.Sut. DeleteManyUsersAsync( orgUser. OrganizationId, new[] { orgUser.Id }, deletingUserId) ;
// // Assert
// Assert. Single( result) ;
// var userId = result.First(). Item1;
// Assert.Equal(orgUser.Id, userId) ;
// var commandResult = result.First(). Item2;
// AssertErrorMessages( "You cannot delete yourself.", commandResult) ;
// await sutProvider. GetDependency< IUserService>().Received(0).DeleteAsync(Arg.Any<User>()) ;
// await sutProvider. GetDependency< IEventService>().Received(0 )
// . LogOrganizationUserEventsAsync(Arg.Any< IEnumerable<( OrganizationUser, EventType, DateTime?)>>()) ;
// }
// [Theory]
// [BitAutoData]
// public async Task DeleteManyUsersAsync_WhenUserIsInvited_ReturnsErrorMessage(
// SutProvider< DeleteManagedOrganizationUserAccountCommand> sutProvider,
// User user,
// [OrganizationUser(OrganizationUserStatusType.Invited, OrganizationUserType.User)] OrganizationUser orgUser)
// {
// // Arrange
// orgUser. UserId = user.Id ;
// sutProvider. GetDependency< IOrganizationUserRepository>( )
// . GetManyAsync(Arg.Any<IEnumerable<Guid>>() )
// . Returns(new List<OrganizationUser> { orgUser }) ;
// sutProvider. GetDependency< IUserRepository>( )
// . GetManyAsync(Arg.Is<IEnumerable<Guid>>(input => input.Contains(user.Id)) )
// . Returns(new[] { user }) ;
// // Act
// var result = await sutProvider.Sut. DeleteManyUsersAsync( orgUser. OrganizationId, new[] { orgUser.Id }, null) ;
// // Assert
// Assert. Single( result) ;
// var userId = result.First(). Item1;
// Assert.Equal(orgUser.Id, userId) ;
// AssertErrorMessages( "You cannot delete a member with Invited status.", result.First().Item2) ;
// await sutProvider. GetDependency< IUserService>().Received(0).DeleteAsync(Arg.Any<User>()) ;
// await sutProvider. GetDependency< IEventService>().Received(0 )
// . LogOrganizationUserEventsAsync(Arg.Any< IEnumerable<( OrganizationUser, EventType, DateTime?)>>()) ;
// }
// [Theory]
// [BitAutoData]
// public async Task DeleteManyUsersAsync_WhenDeletingOwnerAsNonOwner_ReturnsErrorMessage(
// SutProvider< DeleteManagedOrganizationUserAccountCommand> sutProvider, User user,
// [OrganizationUser(OrganizationUserStatusType.Confirmed, OrganizationUserType.Owner)] OrganizationUser orgUser,
// Guid deletingUserId)
// {
// // Arrange
// orgUser. UserId = user.Id ;
// sutProvider. GetDependency< IOrganizationUserRepository>( )
// . GetManyAsync(Arg.Any<IEnumerable<Guid>>() )
// . Returns(new List<OrganizationUser> { orgUser }) ;
// sutProvider. GetDependency< IUserRepository>( )
// . GetManyAsync(Arg.Is<IEnumerable<Guid>>(i => i.Contains(user.Id)) )
// . Returns(new[] { user }) ;
// sutProvider. GetDependency< ICurrentContext>( )
// . OrganizationOwner( orgUser. OrganizationId)
// . Returns(false) ;
// sutProvider. GetDependency< IGetOrganizationUsersManagementStatusQuery>( )
// . GetUsersOrganizationManagementStatusAsync(Arg.Any<Guid>(), Arg.Any<IEnumerable<Guid>>() )
// . Returns(new Dictionary<Guid, bool> { { orgUser.Id, true } }) ;
// // Act
// var result = await sutProvider.Sut. DeleteManyUsersAsync( orgUser. OrganizationId, new[] { orgUser.Id }, deletingUserId) ;
// // Assert
// Assert. Single( result) ;
// var userId = result.First(). Item1;
// Assert.Equal(orgUser.Id, userId) ;
// var commandResult = result.First(). Item2;
// AssertErrorMessages( "Only owners can delete other owners.", commandResult) ;
// await sutProvider. GetDependency< IUserService>().Received(0).DeleteAsync(Arg.Any<User>()) ;
// await sutProvider. GetDependency< IEventService>().Received(0 )
// . LogOrganizationUserEventsAsync(Arg.Any< IEnumerable<( OrganizationUser, EventType, DateTime?)>>()) ;
// }
// [Theory]
// [BitAutoData]
// public async Task DeleteManyUsersAsync_WhenUserNotManaged_ReturnsErrorMessage(
// SutProvider< DeleteManagedOrganizationUserAccountCommand> sutProvider, User user,
// [OrganizationUser(OrganizationUserStatusType.Confirmed, OrganizationUserType.User)] OrganizationUser orgUser)
// {
// // Arrange
// orgUser. UserId = user.Id ;
// sutProvider. GetDependency< IOrganizationUserRepository>( )
// . GetManyAsync(Arg.Any<IEnumerable<Guid>>() )
// . Returns(new List<OrganizationUser> { orgUser }) ;
// sutProvider. GetDependency< IUserRepository>( )
// . GetManyAsync(Arg.Is<IEnumerable<Guid>>(ids => ids. Contains( orgUser. UserId.Value)) )
// . Returns(new[] { user }) ;
// sutProvider. GetDependency< IGetOrganizationUsersManagementStatusQuery>( )
// . GetUsersOrganizationManagementStatusAsync(Arg.Any<Guid>(), Arg.Any<IEnumerable<Guid>>() )
// . Returns(new Dictionary<Guid, bool> { { orgUser.Id, false } }) ;
// // Act
// var result = await sutProvider.Sut. DeleteManyUsersAsync( orgUser. OrganizationId, new[] { orgUser.Id }, null) ;
// // Assert
// Assert. Single( result) ;
// var userId = result.First(). Item1;
// Assert.Equal(orgUser.Id, userId) ;
// var commandResult = result.First(). Item2;
// AssertErrorMessages( "Member is not managed by the organization.", commandResult) ;
await sutProvider. GetDependency< IUserService> ( ) . Received ( 0 ) . DeleteAsync ( Arg . Any < User > ( ) ) ;
await sutProvider. GetDependency< IEventService> ( ) . Received ( 0 )
. LogOrganizationUserEventsAsync( Arg . Any < IEnumerable< ( OrganizationUser, EventType, DateTime? ) > > ( ) ) ;
}
[Theory]
[BitAutoData]
public async Task DeleteManyUsersAsync_WhenUserIsASoleOwner_ReturnsErrorMessage (
SutProvider< DeleteManagedOrganizationUserAccountCommand> sutProvider, User user ,
[OrganizationUser(OrganizationUserStatusType.Confirmed, OrganizationUserType.User)] OrganizationUser orgUser )
{
// Arrange
orgUser. UserId = user . Id ;
sutProvider. GetDependency< IOrganizationUserRepository> ( )
. GetManyAsync( Arg . Any < IEnumerable < Guid > > ( ) )
. Returns( new List < OrganizationUser > { orgUser } ) ;
sutProvider. GetDependency< IUserRepository> ( )
. GetManyAsync( Arg . Is < IEnumerable < Guid > > ( ids = > ids . Contains( orgUser. UserId. Value ) ) )
. Returns( new [ ] { user } ) ;
sutProvider. GetDependency< IGetOrganizationUsersManagementStatusQuery> ( )
. GetUsersOrganizationManagementStatusAsync( Arg . Any < Guid > ( ) , Arg . Any < IEnumerable < Guid > > ( ) )
. Returns( new Dictionary < Guid , bool > { { orgUser . Id , true } } ) ;
const int onlyOwnerCount = 1 ;
sutProvider. GetDependency< IOrganizationUserRepository> ( )
. GetCountByOnlyOwnerAsync( Arg . Is < Guid > ( id = > id = = user . Id ) )
. Returns( onlyOwnerCount) ;
// await sutProvider. GetDependency< IUserService>().Received(0).DeleteAsync(Arg.Any<User>()) ;
// await sutProvider. GetDependency< IEventService>().Received(0 )
// . LogOrganizationUserEventsAsync(Arg.Any< IEnumerable<( OrganizationUser, EventType, DateTime?)>>()) ;
// }
// [Theory]
// [BitAutoData]
// public async Task DeleteManyUsersAsync_WhenUserIsASoleOwner_ReturnsErrorMessage(
// SutProvider< DeleteManagedOrganizationUserAccountCommand> sutProvider, User user,
// [OrganizationUser(OrganizationUserStatusType.Confirmed, OrganizationUserType.User)] OrganizationUser orgUser)
// {
// // Arrange
// orgUser. UserId = user.Id ;
// sutProvider. GetDependency< IOrganizationUserRepository>( )
// . GetManyAsync(Arg.Any<IEnumerable<Guid>>() )
// . Returns(new List<OrganizationUser> { orgUser }) ;
// sutProvider. GetDependency< IUserRepository>( )
// . GetManyAsync(Arg.Is<IEnumerable<Guid>>(ids => ids. Contains( orgUser. UserId.Value)) )
// . Returns(new[] { user }) ;
// sutProvider. GetDependency< IGetOrganizationUsersManagementStatusQuery>( )
// . GetUsersOrganizationManagementStatusAsync(Arg.Any<Guid>(), Arg.Any<IEnumerable<Guid>>() )
// . Returns(new Dictionary<Guid, bool> { { orgUser.Id, true } }) ;
// const int onlyOwnerCount = 1 ;
// sutProvider. GetDependency< IOrganizationUserRepository>( )
// . GetCountByOnlyOwnerAsync(Arg.Is<Guid>(id => id == user.Id) )
// . Returns( onlyOwnerCount) ;
// Act
var result = await sutProvider. Sut . DeleteManyUsersAsync( orgUser. OrganizationId, new [ ] { orgUser . Id } , null ) ;
// // Act
// var result = await sutProvider.Sut. DeleteManyUsersAsync( orgUser. OrganizationId, new[] { orgUser.Id }, null) ;
// Assert
Assert. Single( result) ;
// // Assert
// Assert. Single( result) ;
var userId = result . First ( ) . Item1 ;
Assert. Equal ( orgUser . Id , userId) ;
// var userId = result.First(). Item1;
// Assert.Equal(orgUser.Id, userId) ;
var commandResult = result . First ( ) . Item2 ;
AssertErrorMessages( "Cannot delete this user because it is the sole owner of at least one organization. Please delete these organizations or upgrade another user.", commandResult) ;
// var commandResult = result.First(). Item2;
// AssertErrorMessages( "Cannot delete this user because it is the sole owner of at least one organization. Please delete these organizations or upgrade another user.", commandResult) ;
await sutProvider. GetDependency< IUserService> ( ) . Received ( 0 ) . DeleteAsync ( Arg . Any < User > ( ) ) ;
await sutProvider. GetDependency< IEventService> ( ) . Received ( 0 )
. LogOrganizationUserEventsAsync( Arg . Any < IEnumerable< ( OrganizationUser, EventType, DateTime? ) > > ( ) ) ;
}
// await sutProvider. GetDependency< IUserService>().Received(0).DeleteAsync(Arg.Any<User>()) ;
// await sutProvider. GetDependency< IEventService>().Received(0 )
// . LogOrganizationUserEventsAsync(Arg.Any< IEnumerable<( OrganizationUser, EventType, DateTime?)>>()) ;
// }
[Theory]
[BitAutoData]
public async Task DeleteManyUsersAsync_WhenUserIsASoleProvider_ReturnsErrorMessage (
SutProvider< DeleteManagedOrganizationUserAccountCommand> sutProvider, User user ,
[OrganizationUser(OrganizationUserStatusType.Confirmed, OrganizationUserType.User)] OrganizationUser orgUser )
{
// Arrange
orgUser. UserId = user . Id ;
sutProvider. GetDependency< IOrganizationUserRepository> ( )
. GetManyAsync( Arg . Any < IEnumerable < Guid > > ( ) )
. Returns( new List < OrganizationUser > { orgUser } ) ;
sutProvider. GetDependency< IUserRepository> ( )
. GetManyAsync( Arg . Is < IEnumerable < Guid > > ( ids = > ids . Contains( orgUser. UserId. Value ) ) )
. Returns( new [ ] { user } ) ;
sutProvider. GetDependency< IGetOrganizationUsersManagementStatusQuery> ( )
. GetUsersOrganizationManagementStatusAsync( Arg . Any < Guid > ( ) , Arg . Any < IEnumerable < Guid > > ( ) )
. Returns( new Dictionary < Guid , bool > { { orgUser . Id , true } } ) ;
const int onlyOwnerCount = 0 ;
// [Theory]
// [BitAutoData]
// public async Task DeleteManyUsersAsync_WhenUserIsASoleProvider_ReturnsErrorMessage(
// SutProvider< DeleteManagedOrganizationUserAccountCommand> sutProvider, User user,
// [OrganizationUser(OrganizationUserStatusType.Confirmed, OrganizationUserType.User)] OrganizationUser orgUser)
// {
// // Arrange
// orgUser. UserId = user.Id ;
// sutProvider. GetDependency< IOrganizationUserRepository>( )
// . GetManyAsync(Arg.Any<IEnumerable<Guid>>() )
// . Returns(new List<OrganizationUser> { orgUser }) ;
// sutProvider. GetDependency< IUserRepository>( )
// . GetManyAsync(Arg.Is<IEnumerable<Guid>>(ids => ids. Contains( orgUser. UserId.Value)) )
// . Returns(new[] { user }) ;
// sutProvider. GetDependency< IGetOrganizationUsersManagementStatusQuery>( )
// . GetUsersOrganizationManagementStatusAsync(Arg.Any<Guid>(), Arg.Any<IEnumerable<Guid>>() )
// . Returns(new Dictionary<Guid, bool> { { orgUser.Id, true } }) ;
// const int onlyOwnerCount = 0 ;
sutProvider. GetDependency< IOrganizationUserRepository> ( )
. GetCountByOnlyOwnerAsync( Arg . Is < Guid > ( id = > id = = user . Id ) )
. Returns( onlyOwnerCount) ;
// sutProvider. GetDependency< IOrganizationUserRepository>( )
// . GetCountByOnlyOwnerAsync(Arg.Is<Guid>(id => id == user.Id) )
// . Returns( onlyOwnerCount) ;
const int onlyOwnerProviderCount = 1 ;
// const int onlyOwnerProviderCount = 1 ;
sutProvider. GetDependency< IProviderUserRepository> ( )
. GetCountByOnlyOwnerAsync( Arg . Is < Guid > ( id = > id = = user . Id ) )
. Returns( onlyOwnerProviderCount) ;
// sutProvider. GetDependency< IProviderUserRepository>( )
// . GetCountByOnlyOwnerAsync(Arg.Is<Guid>(id => id == user.Id) )
// . Returns( onlyOwnerProviderCount) ;
// Act
var result = await sutProvider. Sut . DeleteManyUsersAsync( orgUser. OrganizationId, new [ ] { orgUser . Id } , null ) ;
// // Act
// var result = await sutProvider.Sut. DeleteManyUsersAsync( orgUser. OrganizationId, new[] { orgUser.Id }, null) ;
// Assert
Assert. Single( result) ;
// // Assert
// Assert. Single( result) ;
var userId = result . First ( ) . Item1 ;
Assert. Equal ( orgUser . Id , userId) ;
// var userId = result.First(). Item1;
// Assert.Equal(orgUser.Id, userId) ;
var commandResult = result . First ( ) . Item2 ;
AssertErrorMessages( "Cannot delete this user because it is the sole owner of at least one provider. Please delete these providers or upgrade another user.", commandResult) ;
await sutProvider. GetDependency< IUserService> ( ) . Received ( 0 ) . DeleteAsync ( Arg . Any < User > ( ) ) ;
await sutProvider. GetDependency< IEventService> ( ) . Received ( 0 )
. LogOrganizationUserEventsAsync( Arg . Any < IEnumerable< ( OrganizationUser, EventType, DateTime? ) > > ( ) ) ;
}
// var commandResult = result.First(). Item2;
// AssertErrorMessages( "Cannot delete this user because it is the sole owner of at least one provider. Please delete these providers or upgrade another user.", commandResult) ;
// await sutProvider. GetDependency< IUserService>().Received(0).DeleteAsync(Arg.Any<User>()) ;
// await sutProvider. GetDependency< IEventService>().Received(0 )
// . LogOrganizationUserEventsAsync(Arg.Any< IEnumerable<( OrganizationUser, EventType, DateTime?)>>()) ;
// }
[Theory]
[BitAutoData]
public async Task DeleteManyUsersAsync_MixedValidAndInvalidUsers_ReturnsAppropriateResults (
SutProvider< DeleteManagedOrganizationUserAccountCommand> sutProvider, User user1, User user3 ,
Guid organizationId ,
[OrganizationUser(OrganizationUserStatusType.Confirmed, OrganizationUserType.User)] OrganizationUser orgUser1 ,
[OrganizationUser(OrganizationUserStatusType.Invited, OrganizationUserType.User)] OrganizationUser orgUser2 ,
[OrganizationUser(OrganizationUserStatusType.Confirmed, OrganizationUserType.User)] OrganizationUser orgUser3 )
{
// Arrange
orgUser1. UserId = user1 . Id ;
orgUser2. UserId = null ;
orgUser3. UserId = user3 . Id ;
orgUser1. OrganizationId = organizationId ;
orgUser2. OrganizationId = organizationId ;
orgUser3. OrganizationId = organizationId ;
// [Theory]
// [BitAutoData]
// public async Task DeleteManyUsersAsync_MixedValidAndInvalidUsers_ReturnsAppropriateResults(
// SutProvider< DeleteManagedOrganizationUserAccountCommand> sutProvider, User user1, User user3,
// Guid organizationId,
// [OrganizationUser(OrganizationUserStatusType.Confirmed, OrganizationUserType.User)] OrganizationUser orgUser1,
// [OrganizationUser(OrganizationUserStatusType.Invited, OrganizationUserType.User)] OrganizationUser orgUser2,
// [OrganizationUser(OrganizationUserStatusType.Confirmed, OrganizationUserType.User)] OrganizationUser orgUser3)
// {
// // Arrange
// orgUser1. UserId = user1.Id ;
// orgUser2. UserId = null;
// orgUser3. UserId = user3.Id ;
// orgUser1. OrganizationId = organizationId;
// orgUser2. OrganizationId = organizationId;
// orgUser3. OrganizationId = organizationId;
sutProvider. GetDependency< IOrganizationUserRepository> ( )
. GetManyAsync( Arg . Any < IEnumerable < Guid > > ( ) )
. Returns( new List < OrganizationUser> { orgUser1, orgUser2, orgUser3 } ) ;
// sutProvider. GetDependency< IOrganizationUserRepository>( )
// . GetManyAsync(Arg.Any<IEnumerable<Guid>>() )
// . Returns(new List< OrganizationUser> { orgUser1, orgUser2, orgUser3 }) ;
sutProvider. GetDependency< IUserRepository> ( )
. GetManyAsync( Arg . Is < IEnumerable < Guid > > ( ids = > ids . Contains ( user1 . Id ) & & ids . Contains ( user3 . Id ) ) )
. Returns( new [ ] { user1 , user3 } ) ;
// sutProvider. GetDependency< IUserRepository>( )
// . GetManyAsync(Arg.Is<IEnumerable<Guid>>(ids => ids.Contains(user1.Id) && ids.Contains(user3.Id)) )
// . Returns(new[] { user1, user3 }) ;
sutProvider. GetDependency< IGetOrganizationUsersManagementStatusQuery> ( )
. GetUsersOrganizationManagementStatusAsync( organizationId, Arg . Any < IEnumerable < Guid > > ( ) )
. Returns( new Dictionary < Guid , bool > { { orgUser1 . Id , true } , { orgUser3 . Id , false } } ) ;
// sutProvider. GetDependency< IGetOrganizationUsersManagementStatusQuery>( )
// . GetUsersOrganizationManagementStatusAsync( organizationId, Arg.Any<IEnumerable<Guid>>() )
// . Returns(new Dictionary<Guid, bool> { { orgUser1.Id, true }, { orgUser3.Id, false } }) ;
// Act
var results = await sutProvider. Sut . DeleteManyUsersAsync( organizationId, new [ ] { orgUser1 . Id , orgUser2 . Id , orgUser3 . Id } , null ) ;
// // Act
// var results = await sutProvider.Sut. DeleteManyUsersAsync( organizationId, new[] { orgUser1.Id, orgUser2.Id, orgUser3.Id }, null) ;
// Assert
Assert. Equal ( 3 , results . Count ( ) ) ;
var orgUser1ErrorMessage = results . First ( r = > r . Item1 = = orgUser1 . Id ) . Item2 ;
Assert. Null ( orgUser1ErrorMessage) ;
var orgUser2CommandResult = results . First ( r = > r . Item1 = = orgUser2 . Id ) . Item2 ;
AssertErrorMessages( "Member not found.", orgUser2CommandResult) ;
var orgUser3CommandResult = results . First ( r = > r . Item1 = = orgUser3 . Id ) . Item2 ;
AssertErrorMessages( "Member is not managed by the organization.", orgUser3CommandResult) ;
await sutProvider. GetDependency< IEventService> ( ) . Received ( 1 ) . LogOrganizationUserEventsAsync (
Arg. Is < IEnumerable< ( OrganizationUser, EventType, DateTime? ) > > ( events = >
events. Count ( e = > e . Item1 . Id = = orgUser1 . Id & & e . Item2 = = EventType. OrganizationUser_Deleted) = = 1 ) ) ;
}
private static void AssertErrorMessages( string expectedErrorMessage, CommandResult commandResult) = > Assert. Contains( [ expectedErrorMessage] , ( ( Failure) commandResult) . ErrorMessages. ToArray( ) ) ;
// // Assert
// Assert.Equal(3, results.Count()) ;
// var orgUser1ErrorMessage = results.First(r => r.Item1 == orgUser1.Id). Item2;
// Assert.Null( orgUser1ErrorMessage) ;
// var orgUser2CommandResult = results.First(r => r.Item1 == orgUser2.Id). Item2;
// AssertErrorMessages( "Member not found.", orgUser2CommandResult) ;
// var orgUser3CommandResult = results.First(r => r.Item1 == orgUser3.Id). Item2;
// AssertErrorMessages( "Member is not managed by the organization.", orgUser3CommandResult) ;
// await sutProvider. GetDependency< IEventService>().Received(1). LogOrganizationUserEventsAsync(
// Arg.Is< IEnumerable<( OrganizationUser, EventType, DateTime?)>>(events = >
// events.Count(e => e.Item1.Id == orgUser1.Id && e.Item2 == EventType. OrganizationUser_Deleted) == 1)) ;
// }
// private static void AssertErrorMessages( string expectedErrorMessage, CommandResult commandResult) => Assert. Contains([ expectedErrorMessage], (( Failure) commandResult). ErrorMessages. ToArray()) ;
}