src/Ombi.Tests/PlexControllerTests.cs
Rama develop · réplica de lectura del repositorio original.
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<IPlexApi> _plexApi;
private Mock<ISettingsService<PlexSettings>> _plexSettings;
private Mock<IPlexOAuthManager> _oAuthManager;
private Mock<IPlexService> _plexService;
private Mock<OmbiUserManager> _userManager;
private PlexController _subject;
[SetUp]
public void Setup()
{
_plexApi = new Mock<IPlexApi>();
_plexSettings = new Mock<ISettingsService<PlexSettings>>();
_oAuthManager = new Mock<IPlexOAuthManager>();
_plexService = new Mock<IPlexService>();
_userManager = MockHelper.MockUserManager(new List<OmbiUser>());
_subject = new PlexController(_plexApi.Object, _plexSettings.Object,
Mock.Of<ILogger<PlexController>>(), _oAuthManager.Object, _plexService.Object, _userManager.Object);
}
private void SetAdminExists(bool exists)
{
var admins = exists
? new List<OmbiUser> { new OmbiUser { Id = "admin-id", UserName = "admin" } }
: new List<OmbiUser>();
_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<UserRequest>()), Times.Never);
_plexSettings.Verify(x => x.SaveSettingsAsync(It.IsAny<PlexSettings>()), 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<PlexServers> { 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<UserRequest>()), 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<UserRequest>())).ReturnsAsync(new PlexAuthentication());
var result = await _subject.SignIn(new UserRequest { login = "user", password = "pw" });
_plexApi.Verify(x => x.SignIn(It.IsAny<UserRequest>()), Times.Once);
Assert.That(result, Is.Not.Null);
_plexSettings.Verify(x => x.SaveSettingsAsync(It.IsAny<PlexSettings>()), Times.Never);
}
}
}