using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using MockQueryable.Moq; using Moq; using NUnit.Framework; using Ombi.Api.External.ExternalApis.TheMovieDb; using Ombi.Core.Authentication; using Ombi.Core.Engine; using Ombi.Core.Helpers; using Ombi.Core.Models.Requests; using Ombi.Core.Rule.Interfaces; using Ombi.Core.Services; using Ombi.Core.Settings; using Ombi.Helpers; using Ombi.Settings.Settings.Models; using Ombi.Store.Entities; using Ombi.Store.Entities.Requests; using Ombi.Store.Repository; using Ombi.Store.Repository.Requests; using Ombi.Test.Common; namespace Ombi.Core.Tests.Engine { [TestFixture] public class MovieRequestEngineGetRequestTests { private const string UserA = "user-a"; private const string UserB = "user-b"; private MovieRequestEngine _engine; private Mock _repo; private Mock _currentUser; private Mock _cache; private Mock _userManager; private OmbiSettings _settings; private List _requests; [SetUp] public void Setup() { _requests = new List { new MovieRequests { Id = 1, RequestedUserId = UserA, RequestedUser = new OmbiUser { Id = UserA, UserAccessToken = "token-a" } }, new MovieRequests { Id = 2, RequestedUserId = UserB, RequestedUser = new OmbiUser { Id = UserB, UserAccessToken = "token-b" } }, }; _repo = new Mock(); _repo.Setup(x => x.GetWithUser()).Returns(() => _requests.AsQueryable().BuildMock()); _repo.Setup(x => x.GetWithUser(It.IsAny())) .Returns((string userId) => _requests.Where(r => r.RequestedUserId == userId).AsQueryable().BuildMock()); var requestService = new Mock(); requestService.Setup(x => x.MovieRequestService).Returns(_repo.Object); _currentUser = new Mock(); SetCurrentUser(UserA); _settings = new OmbiSettings { HideRequestsUsers = true }; _cache = new Mock(); _cache.Setup(x => x.GetOrAddAsync(It.IsAny(), It.IsAny>>(), It.IsAny())) .ReturnsAsync(() => _settings); var subs = new Mock>(); subs.Setup(x => x.GetAll()).Returns(new List().AsQueryable().BuildMock()); var played = new Mock(); played.Setup(x => x.GetAll()).Returns(new List().AsQueryable().BuildMock()); _userManager = MockHelper.MockUserManager(new List()); _userManager.Setup(x => x.IsInRoleAsync(It.IsAny(), It.IsAny())).ReturnsAsync(false); _engine = new MovieRequestEngine(new Mock().Object, requestService.Object, _currentUser.Object, new Mock().Object, new Mock().Object, new Mock().Object, new Mock>().Object, _userManager.Object, new Mock>().Object, _cache.Object, new Mock>().Object, subs.Object, new Mock().Object, new Mock().Object, played.Object); } private void SetCurrentUser(string id) { var user = new OmbiUser { Id = id, UserName = id, UserType = UserType.LocalUser }; _currentUser.Setup(x => x.Username).Returns(id); _currentUser.Setup(x => x.GetUser()).ReturnsAsync(user); } [Test] public async Task GetRequest_HideEnabled_OtherUsersRequest_ReturnsNull() { var result = await _engine.GetRequest(2); Assert.That(result, Is.Null); } [Test] public async Task GetRequest_HideEnabled_OwnRequest_ReturnsRequest() { var result = await _engine.GetRequest(1); Assert.That(result, Is.Not.Null); Assert.That(result.Id, Is.EqualTo(1)); } [Test] public async Task GetRequest_HideDisabled_OtherUsersRequest_ReturnsRequest() { _settings.HideRequestsUsers = false; var result = await _engine.GetRequest(2); Assert.That(result, Is.Not.Null); Assert.That(result.Id, Is.EqualTo(2)); } [TestCase("Admin")] [TestCase("PowerUser")] public async Task GetRequest_HideEnabled_PrivilegedUser_CanSeeOtherUsersRequest(string role) { _userManager.Setup(x => x.IsInRoleAsync(It.IsAny(), role)).ReturnsAsync(true); var result = await _engine.GetRequest(2); Assert.That(result, Is.Not.Null); Assert.That(result.Id, Is.EqualTo(2)); } [Test] public async Task GetRequest_RequestDoesNotExist_ReturnsNull() { _settings.HideRequestsUsers = false; var result = await _engine.GetRequest(999); Assert.That(result, Is.Null); } } }