Refactoring: Added interfaces, custom exceptions, UserManager unit tests, dependency injection/inversion; Regex match search by date, keywords

This commit is contained in:
Dimitar Byalkov
2023-06-06 17:52:36 +02:00
parent 180b261d37
commit 53c42a35d8
43 changed files with 668 additions and 211 deletions

View File

@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Tests
{
[TestClass]
public class AnnouncementManagerTest
{
}
}

View File

@@ -0,0 +1,60 @@
using Logic;
using Models;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace Tests.Mocks
{
public class AnnouncementRepositoryFake : IAnnouncementRepository
{
private List<Announcement> announcements;
private int currentId;
public AnnouncementRepositoryFake()
{
announcements = new List<Announcement>();
currentId = 1;
}
public void CreateAnnouncement(string title, string description, User author, DateTime publishDate, bool isImportant, bool isSticky)
{
announcements.Add(new Announcement(currentId, author, description, title, publishDate, isImportant, isSticky));
currentId++;
}
public void DeleteAnnouncement(int id)
{
announcements.RemoveAt(id--);
}
public List<Announcement> GetAllAnnouncements()
{
return announcements;
}
public Announcement GetAnnouncementById(int id)
{
return announcements.FirstOrDefault(x => x.ID == id);
}
public List<Announcement> GetAnnouncementsByPage(int p, int c)
{
return announcements.GetRange(p + c, c);
}
public void UpdateAnnouncement(int id, string title, string description, bool isImportant, bool isSticky)
{
Announcement announcement = announcements.First(x => x.ID == id);
announcement.Title = title;
announcement.Description = description;
announcement.IsImportant = isImportant;
announcement.IsSticky = isSticky;
}
}
}

View File

@@ -0,0 +1,64 @@
using Models;
using Logic;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Tests.Mocks
{
public class UserRepositoryFake : IUserRepository
{
private List<User> users;
private int currentId;
public UserRepositoryFake()
{
users = new List<User>();
currentId = 1;
}
public User CreateUser(string name, string password, UserRole role)
{
User user = new User(currentId, name, password, role);
users.Add(user);
currentId++;
return user;
}
public void DisableUser(int id)
{
User user = users.First(x => x.ID == id);
user.Name = $"Deleted User {user.ID}";
user.Password = "0";
}
public List<User> GetAllUsers()
{
return users;
}
public User GetUserById(int id)
{
return users.First(x => x.ID == id);
}
public User GetUserByName(string userName)
{
return users.FirstOrDefault(x => x.Name == userName);
}
public List<User> GetUsersByPage(int p, int c)
{
return users.GetRange(p + c, c);
}
public void UpdateUser(int id, string name, string password, UserRole role)
{
User user = users.First(x => x.ID == id);
user.Name = name;
user.Password = password;
user.Role = role;
}
}
}

View File

@@ -16,4 +16,9 @@
<PackageReference Include="coverlet.collector" Version="3.2.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Logic\Logic.csproj" />
<ProjectReference Include="..\Models\Models.csproj" />
</ItemGroup>
</Project>

View File

@@ -1,11 +0,0 @@
namespace Tests
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
}
}
}

View File

@@ -0,0 +1,153 @@
using BCrypt.Net;
using Logic;
using Models;
using Tests.Mocks;
namespace Tests
{
[TestClass]
public class UserManagerTest
{
// constants
readonly string USER_NAME = "user";
readonly string USER_PASSWORD = "password";
[TestMethod]
public void AuthenticatedUserWrongPasswordTest()
{
// Arrange
UserManager userManager = new UserManager(new UserRepositoryFake());
// Act
userManager.CreateUser(USER_NAME, BCrypt.Net.BCrypt.HashPassword(USER_PASSWORD), UserRole.TENANT);
User? result = userManager.AuthenticatedUser(USER_NAME, "incorrect");
// Assert
Assert.IsNull(result);
}
[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void AuthenticatedUserNullPasswordTest()
{
// Arrange
UserManager userManager = new UserManager(new UserRepositoryFake());
// Act
userManager.CreateUser(USER_NAME, BCrypt.Net.BCrypt.HashPassword(USER_PASSWORD), UserRole.TENANT);
userManager.AuthenticatedUser(USER_NAME, null);
// Assert
// ArgumentNullException expected
}
[TestMethod]
public void AuthenticatedUserWrongNameTest()
{
// Arrange
UserManager userManager = new UserManager(new UserRepositoryFake());
userManager.CreateUser(USER_NAME, USER_PASSWORD, UserRole.TENANT);
// Act
User? result = userManager.AuthenticatedUser("incorrect", USER_PASSWORD);
// Assert
Assert.IsNull(result);
}
[TestMethod]
public void AuthenticatedUserCorrectDetailsTest()
{
// Arrange
UserManager userManager = new UserManager(new UserRepositoryFake());
User user = userManager.CreateUser(USER_NAME, BCrypt.Net.BCrypt.HashPassword(USER_PASSWORD), UserRole.TENANT);
// Act
User? result = userManager.AuthenticatedUser(USER_NAME, USER_PASSWORD);
// Assert
Assert.AreEqual(user, result);
}
[TestMethod]
public void CreateUserCorrectDetailsTest()
{
// Arrange
UserManager userManager = new UserManager(new UserRepositoryFake());
int userId = 1;
string hashedPassword = BCrypt.Net.BCrypt.HashPassword(USER_PASSWORD);
User user = new User(userId, USER_NAME, hashedPassword, UserRole.TENANT);
// Act
User result = userManager.CreateUser(USER_NAME, hashedPassword, UserRole.TENANT);
// Assert
Assert.AreEqual(user.ID, result.ID);
Assert.AreEqual(user.Name, result.Name);
Assert.AreEqual(user.Password, result.Password);
Assert.AreEqual(user.Role, result.Role);
}
[TestMethod]
[ExpectedException(typeof(ArgumentException))]
public void CreateUserDuplicateNameTest()
{
// Arrange
UserManager userManager = new UserManager(new UserRepositoryFake());
// Act
userManager.CreateUser(USER_NAME, BCrypt.Net.BCrypt.HashPassword(USER_PASSWORD), UserRole.TENANT);
userManager.CreateUser(USER_NAME, BCrypt.Net.BCrypt.HashPassword(USER_PASSWORD), UserRole.TENANT);
// Assert
// ArgumentException expected
}
[TestMethod]
[ExpectedException(typeof(ArgumentException))]
public void CreateUserEmptyNameTest()
{
// Arrange
UserManager userManager = new UserManager(new UserRepositoryFake());
// Act
userManager.CreateUser("", BCrypt.Net.BCrypt.HashPassword(USER_PASSWORD), UserRole.TENANT);
// Assert
// ArgumentException expected
}
[TestMethod]
[ExpectedException(typeof(ArgumentException))]
public void CreateUserEmptyPasswordTest()
{
// Arrange
UserManager userManager = new UserManager(new UserRepositoryFake());
// Act
userManager.CreateUser(USER_NAME, "", UserRole.TENANT);
// Assert
// ArgumentException expected
}
[TestMethod]
public void DisableUserTest()
{
// Arrange
UserManager userManager = new UserManager(new UserRepositoryFake());
User user = userManager.CreateUser(USER_NAME, BCrypt.Net.BCrypt.HashPassword(USER_PASSWORD), UserRole.TENANT);
// Act
userManager.DisableUser(user.ID);
// Assert
Assert.AreEqual(user.Name, $"Deleted User {user.ID}");
Assert.AreEqual(user.Password, "0");
}
}
}