using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Moq; using NUnit.Framework; using Ombi.Api.External.MediaServers.Plex; using Ombi.Api.External.MediaServers.Plex.Models; using Ombi.Controllers.V1.External; using Ombi.Core.Authentication; using Ombi.Core.Services; using Ombi.Core.Settings; using Ombi.Core.Settings.Models.External; using Ombi.Helpers; using Ombi.Store.Entities; using Ombi.Test.Common; namespace Ombi.Tests { [TestFixture] public class PlexControllerTests { private Mock _plexApi; private Mock> _plexSettings; private Mock _oAuthManager; private Mock _plexService; private Mock _userManager; private PlexController _subject; [SetUp] public void Setup() { _plexApi = new Mock(); _plexSettings = new Mock>(); _oAuthManager = new Mock(); _plexService = new Mock(); _userManager = MockHelper.MockUserManager(new List()); _subject = new PlexController(_plexApi.Object, _plexSettings.Object, Mock.Of>(), _oAuthManager.Object, _plexService.Object, _userManager.Object); } private void SetAdminExists(bool exists) { var admins = exists ? new List { new OmbiUser { Id = "admin-id", UserName = "admin" } } : new List(); _userManager.Setup(x => x.GetUsersInRoleAsync(OmbiRoles.Admin)).ReturnsAsync(admins); } [Test] public async Task SignIn_ReturnsNull_WhenAdminAlreadyExists() { // SignIn is only part of the first-run wizard. Once an administrator account exists the // wizard is finished, so it must return before touching Plex.tv or the stored config. SetAdminExists(true); var result = await _subject.SignIn(new UserRequest { login = "user", password = "pw" }); Assert.That(result, Is.Null); _plexApi.Verify(x => x.SignIn(It.IsAny()), Times.Never); _plexSettings.Verify(x => x.SaveSettingsAsync(It.IsAny()), Times.Never); } [Test] public async Task SignIn_ReturnsNull_WhenPlexAlreadyConfigured() { // Guard regression: "!settings.Servers?.Any() ?? false" let the request through whenever // Plex was already configured. The corrected guard must block it. SetAdminExists(false); _plexSettings.Setup(x => x.GetSettingsAsync()).ReturnsAsync(new PlexSettings { Servers = new List { new PlexServers() } }); var result = await _subject.SignIn(new UserRequest { login = "user", password = "pw" }); Assert.That(result, Is.Null); _plexApi.Verify(x => x.SignIn(It.IsAny()), Times.Never); } [Test] public async Task SignIn_ProceedsPastGuard_WhenNoAdminAndPlexUnconfigured() { // The legitimate first-run wizard case: no admin yet and Plex not configured. The request // must be allowed through to Plex.tv. A returned authentication with a null user makes the // action return without saving any server configuration. SetAdminExists(false); _plexSettings.Setup(x => x.GetSettingsAsync()).ReturnsAsync(new PlexSettings { Servers = null }); _plexApi.Setup(x => x.SignIn(It.IsAny())).ReturnsAsync(new PlexAuthentication()); var result = await _subject.SignIn(new UserRequest { login = "user", password = "pw" }); _plexApi.Verify(x => x.SignIn(It.IsAny()), Times.Once); Assert.That(result, Is.Not.Null); _plexSettings.Verify(x => x.SaveSettingsAsync(It.IsAny()), Times.Never); } } }