Release/v2.1.0 #44
@@ -1,11 +1,21 @@
|
|||||||
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AEditContextDataAnnotationsExtensions_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Fbc307cd57fb42fc4c7fb9795381958122734d3750f41b6c1735c7d132ecda70_003FEditContextDataAnnotationsExtensions_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AEditContextDataAnnotationsExtensions_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Fbc307cd57fb42fc4c7fb9795381958122734d3750f41b6c1735c7d132ecda70_003FEditContextDataAnnotationsExtensions_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AExceptionDispatchInfo_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Fbd1d5c50194fea68ff3559c160230b0ab50f5acf4ce3061bffd6d62958e2182_003FExceptionDispatchInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AList_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Fb7208b3f72528d22781d25fde9a55271bdf2b5aade4f03b1324579a25493cd8_003FList_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AList_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Fb7208b3f72528d22781d25fde9a55271bdf2b5aade4f03b1324579a25493cd8_003FList_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AThrowHelper_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F2c8e7ca976f350cba9836d5565dac56b11e0b56656fa786460eb1395857a6fa_003FThrowHelper_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AValidationMessageStore_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Ffc81648e473bb3cc818f71427c286ecddc3604d2f4c69c565205bb89e8b4ef4_003FValidationMessageStore_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AValidationMessageStore_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003Ffc81648e473bb3cc818f71427c286ecddc3604d2f4c69c565205bb89e8b4ef4_003FValidationMessageStore_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/Environment/AssemblyExplorer/XmlDocument/@EntryValue"><AssemblyExplorer>
|
<s:String x:Key="/Default/Environment/AssemblyExplorer/XmlDocument/@EntryValue"><AssemblyExplorer>
|
||||||
<Assembly Path="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\7.0.16\ref\net7.0\System.ComponentModel.Annotations.dll" />
|
<Assembly Path="C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\7.0.16\ref\net7.0\System.ComponentModel.Annotations.dll" />
|
||||||
<Assembly Path="C:\Users\Remote\.nuget\packages\blazorstrap\5.2.100.61524\lib\net7.0\BlazorStrap.dll" />
|
<Assembly Path="C:\Users\Remote\.nuget\packages\blazorstrap\5.2.100.61524\lib\net7.0\BlazorStrap.dll" />
|
||||||
</AssemblyExplorer></s:String>
|
</AssemblyExplorer></s:String>
|
||||||
|
<s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=420e6947_002Dcf5f_002D4e55_002D94cb_002D22d1ee8dd4ee/@EntryIndexedValue"><SessionState ContinuousTestingMode="0" IsActive="True" Name="UserRepositoryTests" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session">
|
||||||
|
<TestAncestor>
|
||||||
|
<TestId>xUnit::1CAAC943-B8FE-48DD-9712-92699647DE18::net8.0::HopFrame.Database.Tests.Repositories.UserRepositoryTests</TestId>
|
||||||
|
</TestAncestor>
|
||||||
|
</SessionState></s:String>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,6 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\..\src\HopFrame.Database\HopFrame.Database.csproj" />
|
<ProjectReference Include="..\..\src\HopFrame.Database\HopFrame.Database.csproj" />
|
||||||
<ProjectReference Include="..\src\HopFrame.Database\HopFrame.Database.csproj" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -0,0 +1,184 @@
|
|||||||
|
using HopFrame.Database.Models;
|
||||||
|
using HopFrame.Database.Repositories;
|
||||||
|
using HopFrame.Database.Repositories.Implementation;
|
||||||
|
using HopFrame.Database.Tests.Data;
|
||||||
|
|
||||||
|
namespace HopFrame.Database.Tests.Repositories;
|
||||||
|
|
||||||
|
public class UserRepositoryTests {
|
||||||
|
|
||||||
|
private async Task<(DatabaseContext, IUserRepository)> SetupEnvironment(int count = 5) {
|
||||||
|
var context = new DatabaseContext();
|
||||||
|
var repo = new UserRepository<DatabaseContext>(context, new GroupRepository<DatabaseContext>(context));
|
||||||
|
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
await context.Users.AddAsync(CreateTestUser());
|
||||||
|
}
|
||||||
|
await context.SaveChangesAsync();
|
||||||
|
|
||||||
|
return (context, repo);
|
||||||
|
}
|
||||||
|
|
||||||
|
private User CreateTestUser() => new () {
|
||||||
|
Username = "",
|
||||||
|
Email = "",
|
||||||
|
Password = ""
|
||||||
|
};
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task GetUsers_Returns_AllUsers() {
|
||||||
|
// Arrange
|
||||||
|
var count = 5;
|
||||||
|
var (context, repo) = await SetupEnvironment(count);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var users = await repo.GetUsers();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.NotNull(users);
|
||||||
|
Assert.Equal(count, users.Count);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task GetUser_Returns_SingleUser() {
|
||||||
|
// Arrange
|
||||||
|
var (context, repo) = await SetupEnvironment();
|
||||||
|
var guid = context.Users.First().Id;
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var user = await repo.GetUser(guid);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.NotNull(user);
|
||||||
|
Assert.Equal(guid, user.Id);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task GetUserByMail_Returns_SingleUser() {
|
||||||
|
// Arrange
|
||||||
|
var (context, repo) = await SetupEnvironment();
|
||||||
|
var user = CreateTestUser();
|
||||||
|
user.Email = "test@example.com";
|
||||||
|
await context.Users.AddAsync(user);
|
||||||
|
await context.SaveChangesAsync();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = await repo.GetUserByEmail("test@example.com");
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.NotNull(result);
|
||||||
|
Assert.Equal(user, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task GetUserByUsername_Returns_SingleUser() {
|
||||||
|
// Arrange
|
||||||
|
var (context, repo) = await SetupEnvironment();
|
||||||
|
var user = CreateTestUser();
|
||||||
|
user.Username = "test.user";
|
||||||
|
await context.Users.AddAsync(user);
|
||||||
|
await context.SaveChangesAsync();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = await repo.GetUserByUsername("test.user");
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.NotNull(result);
|
||||||
|
Assert.Equal(user, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task AddUser_Returns_NewUser() {
|
||||||
|
// Arrange
|
||||||
|
var count = 5;
|
||||||
|
var (context, repo) = await SetupEnvironment(count);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var user = await repo.AddUser(new User {
|
||||||
|
Username = "test.user",
|
||||||
|
Email = "test@example.com",
|
||||||
|
Password = "changeme"
|
||||||
|
});
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.NotNull(user);
|
||||||
|
Assert.Equal(count + 1, context.Users.Count());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task UpdateUser_Should_UpdateAUser() {
|
||||||
|
// Arrange
|
||||||
|
var (context, repo) = await SetupEnvironment();
|
||||||
|
var user = context.Users.First();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
user.Username = "test.user";
|
||||||
|
await repo.UpdateUser(user);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
var result = context.Users.SingleOrDefault(u => u.Username == "test.user");
|
||||||
|
Assert.NotNull(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task DeleteUser_Should_DeleteSingleUser() {
|
||||||
|
// Arrange
|
||||||
|
var count = 5;
|
||||||
|
var (context, repo) = await SetupEnvironment(count);
|
||||||
|
var user = context.Users.First();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
await repo.DeleteUser(user);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(count - 1, context.Users.Count());
|
||||||
|
Assert.DoesNotContain(user, context.Users);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task CheckUserPassword_Returns_True() {
|
||||||
|
// Arrange
|
||||||
|
var (context, repo) = await SetupEnvironment(0);
|
||||||
|
var user = CreateTestUser();
|
||||||
|
user.Password = "changeme";
|
||||||
|
user = await repo.AddUser(user);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = await repo.CheckUserPassword(user, "changeme");
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.True(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task CheckUserPassword_Returns_False() {
|
||||||
|
// Arrange
|
||||||
|
var (context, repo) = await SetupEnvironment(0);
|
||||||
|
var user = CreateTestUser();
|
||||||
|
user.Password = "changeme";
|
||||||
|
user = await repo.AddUser(user);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = await repo.CheckUserPassword(user, "dontchangeme");
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.False(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task ChangePassword_Should_ChangeUserPassword() {
|
||||||
|
// Arrange
|
||||||
|
var (context, repo) = await SetupEnvironment(0);
|
||||||
|
var user = CreateTestUser();
|
||||||
|
user.Password = "changeme";
|
||||||
|
user = await repo.AddUser(user);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
await repo.ChangePassword(user, "changedme");
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
var result = await repo.CheckUserPassword(user, "changedme");
|
||||||
|
Assert.True(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user