Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

namespace Wemogy.Infrastructure.Database.Core.UnitTests.DatabaseRepositories;

[RepositoryOptions(enableSoftDelete: true)]
[RepositoryOptions(enableSoftDelete: false)]
[RepositoryReadFilter(typeof(GeneralUserReadFilter))]
[RepositoryPropertyFilter(typeof(GeneralUserPropertyFilter))]
public interface IUserRepository : IDatabaseRepository<User>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,20 +122,19 @@ public async Task DeleteByPredicateForPartitionKeyAsync_ShouldDeleteFromCorrectT
await MicrosoftUserRepository.CreateAsync(user2);

// Act
await MicrosoftUserRepository.DeleteAsync(u => u.TenantId == user2.TenantId && u.Id == user2.Id);
var count = await MicrosoftUserRepository.DeleteAsync(u => u.TenantId == user2.TenantId && u.Id == user2.Id);

// Assert
var msEntities = await MicrosoftUserRepository.GetAllAsync();

msEntities.Should().HaveCount(1);
msEntities.Should().ContainSingle(u => u.Id == user1.Id);
count.Should().Be(1);
}

[Fact]
public async Task DeleteShouldThrowIfNotExists()
public async Task DeleteByIdAndPartitionKeyShouldThrowIfNotExists()
{
// TODO: This is inconsistent to the other DeleteAsync behaviours -> DeleteAsync(id) does not throw.

// Arrange
await ResetAsync();

Expand All @@ -149,4 +148,43 @@ public async Task DeleteShouldThrowIfNotExists()
exception1.Should().BeOfType<NotFoundErrorException>();
AssertExceptionMessageDoesNotContainPrefix(exception1);
}

[Fact]
public async Task DeleteByIdShouldThrowIfNotExists()
{
// Arrange
await ResetAsync();

// Act
var exception1 = await Record.ExceptionAsync(
() => MicrosoftUserRepository.DeleteAsync("123"));

// Assert
exception1.Should().BeOfType<NotFoundErrorException>();
AssertExceptionMessageDoesNotContainPrefix(exception1);
}

[Fact]
public async Task MultitenantDeleteAllAsync_ShouldWork()
{
// Arrange
await ResetAsync();
await AppleUserRepository.CreateAsync(User.Faker.Generate());
await AppleUserRepository.CreateAsync(User.Faker.Generate());
await MicrosoftUserRepository.CreateAsync(User.Faker.Generate());
await MicrosoftUserRepository.CreateAsync(User.Faker.Generate());
await MicrosoftUserRepository.CreateAsync(User.Faker.Generate());
await MicrosoftUserRepository.CreateAsync(User.Faker.Generate());

// Act
var count = await MicrosoftUserRepository.DeleteAsync(x => true);

// Assert
var entities = await MicrosoftUserRepository.QueryAsync(x => true);
entities.Should().BeEmpty();
count.Should().Be(4);

var appleEntities = await AppleUserRepository.QueryAsync(x => true);
appleEntities.Count.Should().Be(2);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ public async Task EnsureExistsByPredicateForPartitionKeyMultipleAsync_ShouldWork
var user = User.Faker.Generate();
await MicrosoftUserRepository.CreateAsync(user);

// Act - TODO: Predicate does not support the PartitionKey
// Act
var exception =
await Record.ExceptionAsync(
() => MicrosoftUserRepository.EnsureExistsAsync(u => u.TenantId == user.TenantId));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,56 +75,6 @@ public async Task GetAsyncMultiple_ShouldGetExistingItemsById()
AssertExceptionMessageDoesNotContainPrefix(exception2);
}

[Fact]
public async Task GetAsyncMultiple_ShouldGetExistingItemsByPredicate()
{
// Arrange
await ResetAsync();
var user1 = User.Faker.Generate();
var user2 = User.Faker.Generate();
await MicrosoftUserRepository.CreateAsync(user1);
await AppleUserRepository.CreateAsync(user2);

// Act
var msUserFromDb = await MicrosoftUserRepository.GetAsync(u => u.Firstname == user1.Firstname);
var appleUserFromDb = await AppleUserRepository.GetAsync(u => u.Lastname == user2.Lastname);

// Assert
msUserFromDb.Should().BeEquivalentTo(user1);
appleUserFromDb.Should().BeEquivalentTo(user2);
AssertPartitionKeyPrefixIsRemoved(msUserFromDb);
AssertPartitionKeyPrefixIsRemoved(appleUserFromDb);

var exception1 = await Record.ExceptionAsync(() => MicrosoftUserRepository.GetAsync(user2.Id));
exception1.Should().BeOfType<NotFoundErrorException>();
AssertExceptionMessageDoesNotContainPrefix(exception1);

var exception2 = await Record.ExceptionAsync(() => AppleUserRepository.GetAsync(user1.Id));
exception2.Should().BeOfType<NotFoundErrorException>();
AssertExceptionMessageDoesNotContainPrefix(exception2);
}

[Fact]
public async Task GetAsyncMultiple_ShouldGetExistingItemsByPredicateForPartitionKey()
{
// Arrange
await ResetAsync();
var user1 = User.Faker.Generate();
var user2 = User.Faker.Generate();
await MicrosoftUserRepository.CreateAsync(user1);
await AppleUserRepository.CreateAsync(user2);

// Act
var msUserFromDb = await MicrosoftUserRepository.GetAsync(u => u.TenantId == user1.TenantId);
var appleUserFromDb = await AppleUserRepository.GetAsync(u => u.TenantId == user2.TenantId && u.Id == user2.Id);
AssertPartitionKeyPrefixIsRemoved(msUserFromDb);
AssertPartitionKeyPrefixIsRemoved(appleUserFromDb);

// Assert
msUserFromDb.Should().BeEquivalentTo(user1);
appleUserFromDb.Should().BeEquivalentTo(user2);
}

[Fact]
public async Task GetAsyncMultiple_ShouldGetExistingItemsByIdAndPartitionKeyForSamePartitionKey()
{
Expand Down Expand Up @@ -198,60 +148,4 @@ public async Task GetAsyncMultiple_ShouldGetExistingItemsByIdForSamePartitionKey
exception2.Should().BeOfType<NotFoundErrorException>();
AssertExceptionMessageDoesNotContainPrefix(exception2);
}

[Fact]
public async Task GetAsyncMultiple_ShouldGetExistingItemsByPredicateForSamePartitionKey()
{
// Arrange
await ResetAsync();
var user1 = User.Faker.Generate();
user1.Firstname = "MS";
var user2 = User.Faker.Generate();
user2.TenantId = user1.TenantId; // fake same tenantId
user2.Firstname = "APPLE";
await MicrosoftUserRepository.CreateAsync(user1);
await AppleUserRepository.CreateAsync(user2);

// Act
var msUserFromDb = await MicrosoftUserRepository.GetAsync(u => u.Firstname == user1.Firstname);
var appleUserFromDb = await AppleUserRepository.GetAsync(u => u.Lastname == user2.Lastname);

// Assert
msUserFromDb.Should().BeEquivalentTo(user1);
appleUserFromDb.Should().BeEquivalentTo(user2);
AssertPartitionKeyPrefixIsRemoved(msUserFromDb);
AssertPartitionKeyPrefixIsRemoved(appleUserFromDb);

var exception1 = await Record.ExceptionAsync(() => MicrosoftUserRepository.GetAsync(user2.Id));
exception1.Should().BeOfType<NotFoundErrorException>();
AssertExceptionMessageDoesNotContainPrefix(exception1);

var exception2 = await Record.ExceptionAsync(() => AppleUserRepository.GetAsync(user1.Id));
exception2.Should().BeOfType<NotFoundErrorException>();
AssertExceptionMessageDoesNotContainPrefix(exception2);
}

[Fact]
public async Task GetAsyncMultiple_ShouldGetExistingItemsByPredicateWithPartitionKeyFilterForSamePartitionKey()
{
// Arrange
await ResetAsync();
var user1 = User.Faker.Generate();
user1.Firstname = "MS";
var user2 = User.Faker.Generate();
user2.TenantId = user1.TenantId; // fake same tenantId
user2.Firstname = "APPLE";
await MicrosoftUserRepository.CreateAsync(user1);
await AppleUserRepository.CreateAsync(user2);

// Act - TODO: PartitionKey not supported
var msUserFromDb = await MicrosoftUserRepository.GetAsync(u => u.TenantId == user1.TenantId);
var appleUserFromDb = await AppleUserRepository.GetAsync(u => u.TenantId == user2.TenantId && u.Id == user2.Id);
AssertPartitionKeyPrefixIsRemoved(msUserFromDb);
AssertPartitionKeyPrefixIsRemoved(appleUserFromDb);

// Assert
msUserFromDb.Should().BeEquivalentTo(user1);
appleUserFromDb.Should().BeEquivalentTo(user2);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
using System.Threading.Tasks;
using FluentAssertions;
using Wemogy.Core.Errors.Exceptions;
using Wemogy.Infrastructure.Database.Core.UnitTests.Fakes.Entities;
using Xunit;

namespace Wemogy.Infrastructure.Database.Core.UnitTests.Plugins.MultiTenantDatabase;

public partial class MultiTenantDatabaseRepositoryTestsBase
{
[Fact]
public async Task QuerySingleAsync_ShouldGetExistingItemsByPredicate()
{
// Arrange
await ResetAsync();
var user1 = User.Faker.Generate();
var user2 = User.Faker.Generate();
await MicrosoftUserRepository.CreateAsync(user1);
await AppleUserRepository.CreateAsync(user2);

// Act
var msUserFromDb = await MicrosoftUserRepository.QuerySingleAsync(u => u.Firstname == user1.Firstname);
var appleUserFromDb = await AppleUserRepository.QuerySingleAsync(u => u.Lastname == user2.Lastname);

// Assert
msUserFromDb.Should().BeEquivalentTo(user1);
appleUserFromDb.Should().BeEquivalentTo(user2);
AssertPartitionKeyPrefixIsRemoved(msUserFromDb);
AssertPartitionKeyPrefixIsRemoved(appleUserFromDb);

var exception1 = await Record.ExceptionAsync(() => MicrosoftUserRepository.GetAsync(user2.Id));
exception1.Should().BeOfType<NotFoundErrorException>();
AssertExceptionMessageDoesNotContainPrefix(exception1);

var exception2 = await Record.ExceptionAsync(() => AppleUserRepository.GetAsync(user1.Id));
exception2.Should().BeOfType<NotFoundErrorException>();
AssertExceptionMessageDoesNotContainPrefix(exception2);
}

[Fact]
public async Task QuerySingleAsync_ShouldGetExistingItemsByPredicateForPartitionKey()
{
// Arrange
await ResetAsync();
var user1 = User.Faker.Generate();
var user2 = User.Faker.Generate();
await MicrosoftUserRepository.CreateAsync(user1);
await AppleUserRepository.CreateAsync(user2);

// Act
var msUserFromDb = await MicrosoftUserRepository.QuerySingleAsync(u => u.TenantId == user1.TenantId);
var appleUserFromDb =
await AppleUserRepository.QuerySingleAsync(u => u.TenantId == user2.TenantId && u.Id == user2.Id);
AssertPartitionKeyPrefixIsRemoved(msUserFromDb);
AssertPartitionKeyPrefixIsRemoved(appleUserFromDb);

// Assert
msUserFromDb.Should().BeEquivalentTo(user1);
appleUserFromDb.Should().BeEquivalentTo(user2);
}

[Fact]
public async Task QuerySingleAsync_ShouldGetExistingItemsByPredicateForSamePartitionKey()
{
// Arrange
await ResetAsync();
var user1 = User.Faker.Generate();
user1.Firstname = "MS";
var user2 = User.Faker.Generate();
user2.TenantId = user1.TenantId; // fake same tenantId
user2.Firstname = "APPLE";
await MicrosoftUserRepository.CreateAsync(user1);
await AppleUserRepository.CreateAsync(user2);

// Act
var msUserFromDb = await MicrosoftUserRepository.QuerySingleAsync(u => u.Firstname == user1.Firstname);
var appleUserFromDb = await AppleUserRepository.QuerySingleAsync(u => u.Lastname == user2.Lastname);

// Assert
msUserFromDb.Should().BeEquivalentTo(user1);
appleUserFromDb.Should().BeEquivalentTo(user2);
AssertPartitionKeyPrefixIsRemoved(msUserFromDb);
AssertPartitionKeyPrefixIsRemoved(appleUserFromDb);

var exception1 = await Record.ExceptionAsync(() => MicrosoftUserRepository.GetAsync(user2.Id));
exception1.Should().BeOfType<NotFoundErrorException>();
AssertExceptionMessageDoesNotContainPrefix(exception1);

var exception2 = await Record.ExceptionAsync(() => AppleUserRepository.GetAsync(user1.Id));
exception2.Should().BeOfType<NotFoundErrorException>();
AssertExceptionMessageDoesNotContainPrefix(exception2);
}

[Fact]
public async Task QuerySingleAsync_ShouldGetExistingItemsByPredicateWithPartitionKeyFilterForSamePartitionKey()
{
// Arrange
await ResetAsync();
var user1 = User.Faker.Generate();
user1.Firstname = "MS";
var user2 = User.Faker.Generate();
user2.TenantId = user1.TenantId; // fake same tenantId
user2.Firstname = "APPLE";
await MicrosoftUserRepository.CreateAsync(user1);
await AppleUserRepository.CreateAsync(user2);

// Act - TODO: PartitionKey not supported
var msUserFromDb = await MicrosoftUserRepository.QuerySingleAsync(u => u.TenantId == user1.TenantId);
var appleUserFromDb =
await AppleUserRepository.QuerySingleAsync(u => u.TenantId == user2.TenantId && u.Id == user2.Id);
AssertPartitionKeyPrefixIsRemoved(msUserFromDb);
AssertPartitionKeyPrefixIsRemoved(appleUserFromDb);

// Assert
msUserFromDb.Should().BeEquivalentTo(user1);
appleUserFromDb.Should().BeEquivalentTo(user2);
}
}
Loading