using Bit.Api.Models.Public.Response; using Bit.Api.Public.Controllers; using Bit.Core.Context; using Bit.Core.Entities; using Bit.Core.Enums; using Bit.Core.Models.Data; using Bit.Core.Repositories; using Bit.Test.Common.AutoFixture; using Bit.Test.Common.AutoFixture.Attributes; using Microsoft.AspNetCore.Mvc; using NSubstitute; using Xunit; namespace Bit.Api.Test.Public.Controllers; [ControllerCustomize(typeof(CollectionsController))] [SutProviderCustomize] public class CollectionsControllerTests { [Theory, BitAutoData] public async Task Get_WithDefaultUserCollection_ReturnsNotFound( Collection collection, SutProvider sutProvider) { // Arrange collection.Type = CollectionType.DefaultUserCollection; var access = new CollectionAccessDetails { Groups = new List(), Users = new List() }; sutProvider.GetDependency() .OrganizationId.Returns(collection.OrganizationId); sutProvider.GetDependency() .GetByIdWithAccessAsync(collection.Id) .Returns(new Tuple(collection, access)); // Act var result = await sutProvider.Sut.Get(collection.Id); // Assert Assert.IsType(result); } [Theory, BitAutoData] public async Task Get_WithSharedCollection_ReturnsCollection( Collection collection, SutProvider sutProvider) { // Arrange collection.Type = CollectionType.SharedCollection; var access = new CollectionAccessDetails { Groups = [], Users = [] }; sutProvider.GetDependency() .OrganizationId.Returns(collection.OrganizationId); sutProvider.GetDependency() .GetByIdWithAccessAsync(collection.Id) .Returns(new Tuple(collection, access)); // Act var result = await sutProvider.Sut.Get(collection.Id); // Assert var jsonResult = Assert.IsType(result); var response = Assert.IsType(jsonResult.Value); Assert.Equal(collection.Id, response.Id); Assert.Equal(collection.Type, response.Type); } [Theory, BitAutoData] public async Task Delete_WithDefaultUserCollection_ReturnsBadRequest( Collection collection, SutProvider sutProvider) { // Arrange collection.Type = CollectionType.DefaultUserCollection; sutProvider.GetDependency() .OrganizationId.Returns(collection.OrganizationId); sutProvider.GetDependency() .GetByIdAsync(collection.Id) .Returns(collection); // Act var result = await sutProvider.Sut.Delete(collection.Id); // Assert var badRequestResult = Assert.IsType(result); var errorResponse = Assert.IsType(badRequestResult.Value); Assert.Contains("You cannot delete a collection with the type as DefaultUserCollection", errorResponse.Message); await sutProvider.GetDependency() .DidNotReceive() .DeleteAsync(Arg.Any()); } [Theory, BitAutoData] public async Task Delete_WithSharedCollection_ReturnsOk( Collection collection, SutProvider sutProvider) { // Arrange collection.Type = CollectionType.SharedCollection; sutProvider.GetDependency() .OrganizationId.Returns(collection.OrganizationId); sutProvider.GetDependency() .GetByIdAsync(collection.Id) .Returns(collection); // Act var result = await sutProvider.Sut.Delete(collection.Id); // Assert Assert.IsType(result); await sutProvider.GetDependency() .Received(1) .DeleteAsync(collection); } }