mirror of
https://github.com/bitwarden/server.git
synced 2025-06-30 15:42:48 -05:00
[PM-863] Fix Organization Folders in EF Databases (#2856)
* Fix Setting Organization Folders * Fix Formatting * Added ReplaceAsync Test * Fix SQL Server Test * Update Replace Call Also * Be Case Insensitive With Guids * Fix Assignment to Cipher
This commit is contained in:
@ -1,4 +1,5 @@
|
||||
using Bit.Core.Entities;
|
||||
using System.Text.Json;
|
||||
using Bit.Core.Entities;
|
||||
using Bit.Core.Enums;
|
||||
using Bit.Core.Models.Data;
|
||||
using Bit.Core.Repositories;
|
||||
@ -121,4 +122,84 @@ public class CipherRepositoryTests
|
||||
var collectionCiphers = await collectionCipherRepository.GetManyByOrganizationIdAsync(organization.Id);
|
||||
Assert.NotEmpty(collectionCiphers);
|
||||
}
|
||||
|
||||
[DatabaseTheory, DatabaseData]
|
||||
public async Task ReplaceAsync_SuccessfullyMovesCipherToOrganization(IUserRepository userRepository,
|
||||
ICipherRepository cipherRepository,
|
||||
IOrganizationRepository organizationRepository,
|
||||
IOrganizationUserRepository organizationUserRepository,
|
||||
IFolderRepository folderRepository,
|
||||
ITestDatabaseHelper helper)
|
||||
{
|
||||
// This tests what happens when a cipher is moved into an organizations
|
||||
var user = await userRepository.CreateAsync(new User
|
||||
{
|
||||
Name = "Test User",
|
||||
Email = $"test+{Guid.NewGuid()}@email.com",
|
||||
ApiKey = "TEST",
|
||||
SecurityStamp = "stamp",
|
||||
});
|
||||
|
||||
|
||||
user = await userRepository.GetByIdAsync(user.Id);
|
||||
|
||||
// Create cipher in personal vault
|
||||
var createdCipher = await cipherRepository.CreateAsync(new Cipher
|
||||
{
|
||||
UserId = user.Id,
|
||||
Data = "", // TODO: EF does not enforce this as NOT NULL
|
||||
});
|
||||
|
||||
var organization = await organizationRepository.CreateAsync(new Organization
|
||||
{
|
||||
Name = "Test Organization",
|
||||
BillingEmail = user.Email,
|
||||
Plan = "Test" // TODO: EF does not enforce this as NOT NULL
|
||||
});
|
||||
|
||||
_ = await organizationUserRepository.CreateAsync(new OrganizationUser
|
||||
{
|
||||
UserId = user.Id,
|
||||
OrganizationId = organization.Id,
|
||||
Status = OrganizationUserStatusType.Confirmed,
|
||||
Type = OrganizationUserType.Owner,
|
||||
});
|
||||
|
||||
var folder = await folderRepository.CreateAsync(new Folder
|
||||
{
|
||||
Name = "FolderName",
|
||||
UserId = user.Id,
|
||||
});
|
||||
|
||||
helper.ClearTracker();
|
||||
|
||||
// Move cipher to organization vault
|
||||
await cipherRepository.ReplaceAsync(new CipherDetails
|
||||
{
|
||||
Id = createdCipher.Id,
|
||||
UserId = user.Id,
|
||||
OrganizationId = organization.Id,
|
||||
FolderId = folder.Id,
|
||||
Data = "", // TODO: EF does not enforce this as NOT NULL
|
||||
});
|
||||
|
||||
var updatedCipher = await cipherRepository.GetByIdAsync(createdCipher.Id);
|
||||
|
||||
Assert.Null(updatedCipher.UserId);
|
||||
Assert.Equal(organization.Id, updatedCipher.OrganizationId);
|
||||
Assert.NotNull(updatedCipher.Folders);
|
||||
|
||||
using var foldersJsonDocument = JsonDocument.Parse(updatedCipher.Folders);
|
||||
var foldersJsonElement = foldersJsonDocument.RootElement;
|
||||
Assert.Equal(JsonValueKind.Object, foldersJsonElement.ValueKind);
|
||||
|
||||
// TODO: Should we force similar casing for guids across DB's
|
||||
// I'd rather we only interact with them as the actual Guid type
|
||||
var userProperty = foldersJsonElement
|
||||
.EnumerateObject()
|
||||
.FirstOrDefault(jp => string.Equals(jp.Name, user.Id.ToString(), StringComparison.OrdinalIgnoreCase));
|
||||
|
||||
Assert.NotEqual(default, userProperty);
|
||||
Assert.Equal(folder.Id, userProperty.Value.GetGuid());
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user