using System; using GermanApp.Domain.Entities; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace GermanApp.Tests.Unit.Domain.Entities; /// /// Unit tests for RefreshToken domain entity. /// Tests the refresh token factory methods and business logic. /// [TestClass] public class RefreshTokenTests { #region Factory Method Tests [TestMethod] [TestCategory("Factory")] public void Create_WithValidParameters_ReturnsRefreshToken() { // Arrange int userId = 1; string token = "test-token-string"; int expireDays = 7; // Act var refreshToken = RefreshToken.Create(userId, token, expireDays); // Assert Assert.IsNotNull(refreshToken); Assert.AreEqual(userId, refreshToken.UserId); Assert.AreEqual(token, refreshToken.Token); Assert.AreEqual(DateTime.UtcNow.Date, refreshToken.CreatedAt.Date); Assert.IsTrue(refreshToken.ExpiresAt > DateTime.UtcNow); Assert.IsTrue(refreshToken.IsActive); Assert.IsNull(refreshToken.RevokedAt); } [TestMethod] [TestCategory("Factory")] public void Create_WithDefaultExpireDays_Uses7Days() { // Arrange int userId = 1; string token = "test-token-string"; // Act var refreshToken = RefreshToken.Create(userId, token); // Assert var timeDifference = refreshToken.ExpiresAt - DateTime.UtcNow; Assert.IsTrue(timeDifference.TotalDays > 6.9 && timeDifference.TotalDays < 7.1); } [TestMethod] [TestCategory("Factory")] public void Create_WithCustomExpireDays_SetsCorrectExpiry() { // Arrange int userId = 1; string token = "test-token"; int expireDays = 30; // Act var refreshToken = RefreshToken.Create(userId, token, expireDays); // Assert var expectedExpiry = DateTime.UtcNow.AddDays(expireDays); var timeDifference = refreshToken.ExpiresAt - DateTime.UtcNow; Assert.IsTrue(timeDifference.TotalDays > 29.9 && timeDifference.TotalDays < 30.1); } #endregion #region Revoke Method Tests [TestMethod] [TestCategory("Behavior")] public void Revoke_ActiveToken_DeactivatesAndSetsRevokedAt() { // Arrange var refreshToken = RefreshToken.Create(1, "test-token"); // Act refreshToken.Revoke(); // Assert Assert.IsFalse(refreshToken.IsActive); Assert.IsNotNull(refreshToken.RevokedAt); Assert.IsTrue(refreshToken.RevokedAt > DateTime.UtcNow.AddSeconds(-1)); } [TestMethod] [TestCategory("Behavior")] public void Revoke_AlreadyRevokedToken_UpdatesRevokedAt() { // Arrange var refreshToken = RefreshToken.Create(1, "test-token"); refreshToken.Revoke(); System.Threading.Thread.Sleep(10); // Small delay var firstRevokedAt = refreshToken.RevokedAt; // Act refreshToken.Revoke(); // Assert Assert.IsFalse(refreshToken.IsActive); Assert.IsNotNull(refreshToken.RevokedAt); Assert.IsTrue(refreshToken.RevokedAt >= firstRevokedAt); } #endregion #region IsExpired Method Tests [TestMethod] [TestCategory("Query")] public void IsExpired_NotExpiredToken_ReturnsFalse() { // Arrange var refreshToken = RefreshToken.Create(1, "test-token", 7); // Act var isExpired = refreshToken.IsExpired(); // Assert Assert.IsFalse(isExpired); } [TestMethod] [TestCategory("Query")] public void IsExpired_ExpiredToken_ReturnsTrue() { // Arrange var refreshToken = RefreshToken.Create(1, "test-token"); refreshToken.ExpiresAt = DateTime.UtcNow.AddDays(-1); // Set to past // Act var isExpired = refreshToken.IsExpired(); // Assert Assert.IsTrue(isExpired); } [TestMethod] [TestCategory("Query")] public void IsExpired_ExactlyAtExpiryTime_ReturnsTrue() { // Arrange var refreshToken = RefreshToken.Create(1, "test-token"); refreshToken.ExpiresAt = DateTime.UtcNow; // Set to exactly now // Act var isExpired = refreshToken.IsExpired(); // Assert Assert.IsTrue(isExpired); } [TestMethod] [TestCategory("Query")] public void IsExpired_FarFutureExpiry_ReturnsFalse() { // Arrange var refreshToken = RefreshToken.Create(1, "test-token"); refreshToken.ExpiresAt = DateTime.UtcNow.AddYears(1); // Act var isExpired = refreshToken.IsExpired(); // Assert Assert.IsFalse(isExpired); } #endregion #region IsValid Method Tests [TestMethod] [TestCategory("Query")] public void IsValid_ActiveNotExpiredToken_ReturnsTrue() { // Arrange var refreshToken = RefreshToken.Create(1, "test-token", 7); // Act var isValid = refreshToken.IsValid(); // Assert Assert.IsTrue(isValid); } [TestMethod] [TestCategory("Query")] public void IsValid_RevokedToken_ReturnsFalse() { // Arrange var refreshToken = RefreshToken.Create(1, "test-token", 7); refreshToken.Revoke(); // Act var isValid = refreshToken.IsValid(); // Assert Assert.IsFalse(isValid); } [TestMethod] [TestCategory("Query")] public void IsValid_ExpiredToken_ReturnsFalse() { // Arrange var refreshToken = RefreshToken.Create(1, "test-token"); refreshToken.ExpiresAt = DateTime.UtcNow.AddDays(-1); // Act var isValid = refreshToken.IsValid(); // Assert Assert.IsFalse(isValid); } [TestMethod] [TestCategory("Query")] public void IsValid_RevokedAndExpiredToken_ReturnsFalse() { // Arrange var refreshToken = RefreshToken.Create(1, "test-token"); refreshToken.Revoke(); refreshToken.ExpiresAt = DateTime.UtcNow.AddDays(-1); // Act var isValid = refreshToken.IsValid(); // Assert Assert.IsFalse(isValid); } #endregion #region Property Tests [TestMethod] [TestCategory("Property")] public void Id_HasDefaultValueOfZero() { // Arrange & Act var refreshToken = RefreshToken.Create(1, "test-token"); // Assert Assert.AreEqual(0, refreshToken.Id); } [TestMethod] [TestCategory("Property")] public void UserId_IsSetCorrectly() { // Arrange int userId = 42; // Act var refreshToken = RefreshToken.Create(userId, "test-token"); // Assert Assert.AreEqual(userId, refreshToken.UserId); } [TestMethod] [TestCategory("Property")] public void Token_IsSetCorrectly() { // Arrange string tokenString = "test-token-12345"; // Act var refreshToken = RefreshToken.Create(1, tokenString); // Assert Assert.AreEqual(tokenString, refreshToken.Token); } [TestMethod] [TestCategory("Property")] public void IsActive_HasDefaultValueOfTrue() { // Arrange & Act var refreshToken = RefreshToken.Create(1, "test-token"); // Assert Assert.IsTrue(refreshToken.IsActive); } [TestMethod] [TestCategory("Property")] public void RevokedAt_IsNullByDefault() { // Arrange & Act var refreshToken = RefreshToken.Create(1, "test-token"); // Assert Assert.IsNull(refreshToken.RevokedAt); } [TestMethod] [TestCategory("Property")] public void CreatedAt_IsSetToCurrentTime() { // Arrange var beforeCreation = DateTime.UtcNow; // Act var refreshToken = RefreshToken.Create(1, "test-token"); var afterCreation = DateTime.UtcNow; // Assert Assert.IsTrue(refreshToken.CreatedAt >= beforeCreation); Assert.IsTrue(refreshToken.CreatedAt <= afterCreation); } #endregion }