using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using MongoDB.Driver; using Moq; using QRRapidoApp.Data; using QRRapidoApp.Models; using QRRapidoApp.Services; using Xunit; namespace QRRapidoApp.Tests.Services { public class AdDisplayServiceTests { private readonly Mock _userServiceMock; private readonly Mock _contextMock; private readonly Mock _configMock; private readonly Mock> _loggerMock; private readonly Mock> _sessionCollectionMock; private readonly AdDisplayService _service; public AdDisplayServiceTests() { _userServiceMock = new Mock(); _contextMock = new Mock(Mock.Of(), Mock.Of()); _configMock = new Mock(); _loggerMock = new Mock>(); _sessionCollectionMock = new Mock>(); _contextMock.Setup(c => c.AdFreeSessions).Returns(_sessionCollectionMock.Object); _service = new AdDisplayService( _userServiceMock.Object, _contextMock.Object, _configMock.Object, _loggerMock.Object ); } [Fact] public async Task ShouldShowAds_WithAnonymousUser_ShouldReturnTrue() { // Arrange string? userId = null; // Act var result = await _service.ShouldShowAds(userId); // Assert Assert.True(result); } [Fact] public async Task ShouldShowAds_WithPremiumUser_ShouldReturnFalse() { // Arrange var userId = "test-user-id"; var user = new User { Id = userId, IsPremium = true, PremiumExpiresAt = DateTime.UtcNow.AddDays(30) }; _userServiceMock.Setup(s => s.GetUserAsync(userId)) .ReturnsAsync(user); // Act var result = await _service.ShouldShowAds(userId); // Assert Assert.False(result); } [Fact] public async Task ShouldShowAds_WithExpiredPremiumUser_ShouldReturnTrue() { // Arrange var userId = "test-user-id"; var user = new User { Id = userId, IsPremium = true, PremiumExpiresAt = DateTime.UtcNow.AddDays(-1) // Expired }; _userServiceMock.Setup(s => s.GetUserAsync(userId)) .ReturnsAsync(user); var cursor = new Mock>(); cursor.Setup(_ => _.Current).Returns(new List()); cursor.SetupSequence(_ => _.MoveNext(It.IsAny())) .Returns(false); cursor.SetupSequence(_ => _.MoveNextAsync(It.IsAny())) .ReturnsAsync(false); _sessionCollectionMock.Setup(c => c.FindAsync( It.IsAny>(), It.IsAny>(), It.IsAny())) .ReturnsAsync(cursor.Object); // Act var result = await _service.ShouldShowAds(userId); // Assert Assert.True(result); } [Fact] public async Task ShouldShowAds_WithActiveAdFreeSession_ShouldReturnFalse() { // Arrange var userId = "test-user-id"; var user = new User { Id = userId, IsPremium = false }; var activeSession = new AdFreeSession { UserId = userId, IsActive = true, ExpiresAt = DateTime.UtcNow.AddDays(1) }; _userServiceMock.Setup(s => s.GetUserAsync(userId)) .ReturnsAsync(user); var cursor = new Mock>(); cursor.Setup(_ => _.Current).Returns(new List { activeSession }); cursor.SetupSequence(_ => _.MoveNext(It.IsAny())) .Returns(true) .Returns(false); cursor.SetupSequence(_ => _.MoveNextAsync(It.IsAny())) .ReturnsAsync(true) .ReturnsAsync(false); _sessionCollectionMock.Setup(c => c.FindAsync( It.IsAny>(), It.IsAny>(), It.IsAny())) .ReturnsAsync(cursor.Object); // Act var result = await _service.ShouldShowAds(userId); // Assert Assert.False(result); } // TESTE REMOVIDO: GetAdFreeTimeRemaining_WithPremiumUser_ShouldReturnMaxValue - método não existe mais // TESTES REMOVIDOS: GetAdFreeTimeRemaining - método não existe mais [Fact] public async Task HasValidPremiumSubscription_WithValidPremium_ShouldReturnTrue() { // Arrange var userId = "test-user-id"; var user = new User { Id = userId, IsPremium = true, PremiumExpiresAt = DateTime.UtcNow.AddDays(30) }; _userServiceMock.Setup(s => s.GetUserAsync(userId)) .ReturnsAsync(user); // Act var result = await _service.HasValidPremiumSubscription(userId); // Assert Assert.True(result); } [Fact] public async Task HasValidPremiumSubscription_WithExpiredPremium_ShouldReturnFalse() { // Arrange var userId = "test-user-id"; var user = new User { Id = userId, IsPremium = true, PremiumExpiresAt = DateTime.UtcNow.AddDays(-1) // Expired }; _userServiceMock.Setup(s => s.GetUserAsync(userId)) .ReturnsAsync(user); // Act var result = await _service.HasValidPremiumSubscription(userId); // Assert Assert.False(result); } [Fact] public async Task GetAdFreeStatusAsync_WithPremiumUser_ShouldReturnPremium() { // Arrange var userId = "test-user-id"; var user = new User { Id = userId, IsPremium = true, PremiumExpiresAt = DateTime.UtcNow.AddDays(30) }; _userServiceMock.Setup(s => s.GetUserAsync(userId)) .ReturnsAsync(user); // Act var result = await _service.GetAdFreeStatusAsync(userId); // Assert Assert.Equal("Premium", result); } [Fact] public async Task GetAdFreeStatusAsync_WithActiveSession_ShouldReturnSessionType() { // Arrange var userId = "test-user-id"; var user = new User { Id = userId, IsPremium = false }; var activeSession = new AdFreeSession { UserId = userId, IsActive = true, ExpiresAt = DateTime.UtcNow.AddDays(1), SessionType = "Login" }; _userServiceMock.Setup(s => s.GetUserAsync(userId)) .ReturnsAsync(user); var cursor = new Mock>(); cursor.Setup(_ => _.Current).Returns(new List { activeSession }); cursor.SetupSequence(_ => _.MoveNext(It.IsAny())) .Returns(true) .Returns(false); cursor.SetupSequence(_ => _.MoveNextAsync(It.IsAny())) .ReturnsAsync(true) .ReturnsAsync(false); _sessionCollectionMock.Setup(c => c.FindAsync( It.IsAny>(), It.IsAny>(), It.IsAny())) .ReturnsAsync(cursor.Object); // Act var result = await _service.GetAdFreeStatusAsync(userId); // Assert Assert.Equal("Login", result); } } }