added signalR to Integration Test
This commit is contained in:
parent
47af488e4b
commit
5ab873150e
|
@ -1,7 +1,4 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Nancy;
|
||||
|
||||
namespace NzbDrone.Api.Extensions
|
||||
|
|
|
@ -1,15 +1,17 @@
|
|||
using System.Collections.Generic;
|
||||
using NzbDrone.Core.Messaging.Commands;
|
||||
using NzbDrone.Core.RootFolders;
|
||||
using NzbDrone.Api.Mapping;
|
||||
using NzbDrone.Api.Validation;
|
||||
|
||||
namespace NzbDrone.Api.RootFolders
|
||||
{
|
||||
public class RootFolderModule : NzbDroneRestModule<RootFolderResource>
|
||||
public class RootFolderModule : NzbDroneRestModuleWithSignalR<RootFolderResource, RootFolder>
|
||||
{
|
||||
private readonly IRootFolderService _rootFolderService;
|
||||
|
||||
public RootFolderModule(IRootFolderService rootFolderService)
|
||||
public RootFolderModule(IRootFolderService rootFolderService, ICommandExecutor commandExecutor)
|
||||
: base(commandExecutor)
|
||||
{
|
||||
_rootFolderService = rootFolderService;
|
||||
|
||||
|
@ -18,7 +20,7 @@ namespace NzbDrone.Api.RootFolders
|
|||
CreateResource = CreateRootFolder;
|
||||
DeleteResource = DeleteFolder;
|
||||
|
||||
SharedValidator.RuleFor(c=>c.Path).IsValidPath();
|
||||
SharedValidator.RuleFor(c => c.Path).IsValidPath();
|
||||
}
|
||||
|
||||
private RootFolderResource GetRootFolder(int id)
|
||||
|
|
|
@ -21,7 +21,7 @@ namespace NzbDrone.Core.Test.RootFolderTests
|
|||
[Test]
|
||||
public void should_return_one_drive_when_only_one_root_dir_exists()
|
||||
{
|
||||
Mocker.GetMock<IBasicRepository<RootFolder>>()
|
||||
Mocker.GetMock<IRootFolderRepository>()
|
||||
.Setup(s => s.All())
|
||||
.Returns(new List<RootFolder> { new RootFolder { Id = 1, Path = @"C:\Test\TV" } });
|
||||
|
||||
|
@ -41,7 +41,7 @@ namespace NzbDrone.Core.Test.RootFolderTests
|
|||
[Test]
|
||||
public void should_return_one_drive_when_two_rootDirs_on_the_same_drive_exist()
|
||||
{
|
||||
Mocker.GetMock<IBasicRepository<RootFolder>>()
|
||||
Mocker.GetMock<IRootFolderRepository>()
|
||||
.Setup(s => s.All())
|
||||
.Returns(new List<RootFolder> { new RootFolder { Id = 1, Path = @"C:\Test\TV" },
|
||||
new RootFolder { Id = 2, Path = @"C:\Test\TV2" }});
|
||||
|
@ -62,7 +62,7 @@ namespace NzbDrone.Core.Test.RootFolderTests
|
|||
[Test]
|
||||
public void should_return_two_drives_when_two_rootDirs_on_the_different_drive_exist()
|
||||
{
|
||||
Mocker.GetMock<IBasicRepository<RootFolder>>()
|
||||
Mocker.GetMock<IRootFolderRepository>()
|
||||
.Setup(s => s.All())
|
||||
.Returns(new List<RootFolder> { new RootFolder { Id = 1, Path = @"C:\Test\TV" },
|
||||
new RootFolder { Id = 2, Path = @"D:\Test\TV" }});
|
||||
|
@ -87,7 +87,7 @@ namespace NzbDrone.Core.Test.RootFolderTests
|
|||
[Test]
|
||||
public void should_skip_rootDir_if_not_found_on_disk()
|
||||
{
|
||||
Mocker.GetMock<IBasicRepository<RootFolder>>()
|
||||
Mocker.GetMock<IRootFolderRepository>()
|
||||
.Setup(s => s.All())
|
||||
.Returns(new List<RootFolder> { new RootFolder { Id = 1, Path = @"C:\Test\TV" } });
|
||||
|
||||
|
|
|
@ -1,13 +1,10 @@
|
|||
|
||||
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using FluentAssertions;
|
||||
using Moq;
|
||||
using NUnit.Framework;
|
||||
using NzbDrone.Common;
|
||||
using NzbDrone.Core.Datastore;
|
||||
using NzbDrone.Core.RootFolders;
|
||||
using NzbDrone.Core.Test.Framework;
|
||||
using NzbDrone.Test.Common;
|
||||
|
@ -25,7 +22,7 @@ namespace NzbDrone.Core.Test.RootFolderTests
|
|||
.Setup(m => m.FolderExists(It.IsAny<string>()))
|
||||
.Returns(true);
|
||||
|
||||
Mocker.GetMock<IBasicRepository<RootFolder>>()
|
||||
Mocker.GetMock<IRootFolderRepository>()
|
||||
.Setup(s => s.All())
|
||||
.Returns(new List<RootFolder>());
|
||||
}
|
||||
|
@ -45,7 +42,7 @@ namespace NzbDrone.Core.Test.RootFolderTests
|
|||
|
||||
Subject.Add(root);
|
||||
|
||||
Mocker.GetMock<IBasicRepository<RootFolder>>().Verify(c => c.Insert(root), Times.Once());
|
||||
Mocker.GetMock<IRootFolderRepository>().Verify(c => c.Insert(root), Times.Once());
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
@ -60,7 +57,7 @@ namespace NzbDrone.Core.Test.RootFolderTests
|
|||
public void should_be_able_to_remove_root_dir()
|
||||
{
|
||||
Subject.Remove(1);
|
||||
Mocker.GetMock<IBasicRepository<RootFolder>>().Verify(c => c.Delete(1), Times.Once());
|
||||
Mocker.GetMock<IRootFolderRepository>().Verify(c => c.Delete(1), Times.Once());
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
@ -68,7 +65,7 @@ namespace NzbDrone.Core.Test.RootFolderTests
|
|||
{
|
||||
WithNoneExistingFolder();
|
||||
|
||||
Mocker.GetMock<IBasicRepository<RootFolder>>().Setup(c => c.All()).Returns(new List<RootFolder>());
|
||||
Mocker.GetMock<IRootFolderRepository>().Setup(c => c.All()).Returns(new List<RootFolder>());
|
||||
|
||||
const string path = "d:\\bad folder";
|
||||
|
||||
|
@ -98,7 +95,7 @@ namespace NzbDrone.Core.Test.RootFolderTests
|
|||
[Test]
|
||||
public void adding_duplicated_root_folder_should_throw()
|
||||
{
|
||||
Mocker.GetMock<IBasicRepository<RootFolder>>().Setup(c => c.All()).Returns(new List<RootFolder> { new RootFolder { Path = "C:\\TV".AsOsAgnostic() } });
|
||||
Mocker.GetMock<IRootFolderRepository>().Setup(c => c.All()).Returns(new List<RootFolder> { new RootFolder { Path = "C:\\TV".AsOsAgnostic() } });
|
||||
|
||||
Assert.Throws<InvalidOperationException>(() => Subject.Add(new RootFolder { Path = @"C:\TV".AsOsAgnostic() }));
|
||||
}
|
||||
|
|
|
@ -116,6 +116,8 @@ namespace NzbDrone.Core.Datastore
|
|||
|
||||
DataMapper.Insert(model);
|
||||
|
||||
ModelCreated(model);
|
||||
|
||||
return model;
|
||||
}
|
||||
|
||||
|
@ -127,12 +129,15 @@ namespace NzbDrone.Core.Datastore
|
|||
}
|
||||
|
||||
DataMapper.Update(model, c => c.Id == model.Id);
|
||||
|
||||
ModelUpdated(model);
|
||||
|
||||
return model;
|
||||
}
|
||||
|
||||
public void Delete(TModel model)
|
||||
{
|
||||
DataMapper.Delete<TModel>(c => c.Id == model.Id);
|
||||
Delete(model.Id);
|
||||
}
|
||||
|
||||
public void InsertMany(IList<TModel> models)
|
||||
|
@ -199,6 +204,8 @@ namespace NzbDrone.Core.Datastore
|
|||
.ColumnsIncluding(properties)
|
||||
.Entity(model)
|
||||
.Execute();
|
||||
|
||||
ModelUpdated(model);
|
||||
}
|
||||
|
||||
public virtual PagingSpec<TModel> GetPaged(PagingSpec<TModel> pagingSpec)
|
||||
|
|
|
@ -436,6 +436,7 @@
|
|||
<Compile Include="Parser\Parser.cs" />
|
||||
<Compile Include="Parser\ParsingService.cs" />
|
||||
<Compile Include="Parser\QualityParser.cs" />
|
||||
<Compile Include="RootFolders\RootFolderRepository.cs" />
|
||||
<Compile Include="ThingiProvider\ConfigContractNotFoundException.cs" />
|
||||
<Compile Include="ThingiProvider\IProvider.cs" />
|
||||
<Compile Include="Qualities\QualityProfileInUseException.cs" />
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
using NzbDrone.Core.Datastore;
|
||||
using NzbDrone.Core.Messaging.Events;
|
||||
|
||||
namespace NzbDrone.Core.RootFolders
|
||||
{
|
||||
public interface IRootFolderRepository : IBasicRepository<RootFolder>
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public class RootFolderRepository : BasicRepository<RootFolder>, IRootFolderRepository
|
||||
{
|
||||
|
||||
public RootFolderRepository(IDatabase database, IEventAggregator eventAggregator)
|
||||
: base(database, eventAggregator)
|
||||
{
|
||||
}
|
||||
|
||||
protected override bool PublishModelEvents
|
||||
{
|
||||
get
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -25,7 +25,7 @@ namespace NzbDrone.Core.RootFolders
|
|||
public class RootFolderService : IRootFolderService
|
||||
{
|
||||
private static readonly Logger Logger = NzbDroneLogger.GetLogger();
|
||||
private readonly IBasicRepository<RootFolder> _rootFolderRepository;
|
||||
private readonly IRootFolderRepository _rootFolderRepository;
|
||||
private readonly IDiskProvider _diskProvider;
|
||||
private readonly ISeriesRepository _seriesRepository;
|
||||
private readonly IConfigService _configService;
|
||||
|
@ -33,7 +33,7 @@ namespace NzbDrone.Core.RootFolders
|
|||
private static readonly HashSet<string> SpecialFolders = new HashSet<string> { "$recycle.bin", "system volume information", "recycler", "lost+found" };
|
||||
|
||||
|
||||
public RootFolderService(IBasicRepository<RootFolder> rootFolderRepository,
|
||||
public RootFolderService(IRootFolderRepository rootFolderRepository,
|
||||
IDiskProvider diskProvider,
|
||||
ISeriesRepository seriesRepository,
|
||||
IConfigService configService)
|
||||
|
|
|
@ -22,7 +22,6 @@ namespace NzbDrone.Host
|
|||
|
||||
AutoRegisterImplementations<NzbDronePersistentConnection>();
|
||||
|
||||
Container.Register(typeof(IBasicRepository<RootFolder>), typeof(BasicRepository<RootFolder>));
|
||||
Container.Register(typeof(IBasicRepository<NamingConfig>), typeof(BasicRepository<NamingConfig>));
|
||||
|
||||
Container.Register<INancyBootstrapper, NancyBootstrapper>();
|
||||
|
|
|
@ -1,4 +1,9 @@
|
|||
using NLog;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using Microsoft.AspNet.SignalR.Client;
|
||||
using Microsoft.AspNet.SignalR.Client.Transports;
|
||||
using NLog;
|
||||
using NLog.Config;
|
||||
using NLog.Targets;
|
||||
using NUnit.Framework;
|
||||
|
@ -7,7 +12,9 @@ using NzbDrone.Api.Config;
|
|||
using NzbDrone.Api.History;
|
||||
using NzbDrone.Api.RootFolders;
|
||||
using NzbDrone.Common.EnvironmentInfo;
|
||||
using NzbDrone.Common.Serializer;
|
||||
using NzbDrone.Integration.Test.Client;
|
||||
using NzbDrone.SignalR;
|
||||
using NzbDrone.Test.Common;
|
||||
using NzbDrone.Test.Common.Categories;
|
||||
using RestSharp;
|
||||
|
@ -30,6 +37,16 @@ namespace NzbDrone.Integration.Test
|
|||
protected ClientBase<NamingConfigResource> NamingConfig;
|
||||
|
||||
private NzbDroneRunner _runner;
|
||||
private List<SignalRMessage> _signalRReceived;
|
||||
private Connection _signalrConnection;
|
||||
|
||||
protected IEnumerable<SignalRMessage> SignalRMessages
|
||||
{
|
||||
get
|
||||
{
|
||||
return _signalRReceived;
|
||||
}
|
||||
}
|
||||
|
||||
public IntegrationTest()
|
||||
{
|
||||
|
@ -71,5 +88,48 @@ namespace NzbDrone.Integration.Test
|
|||
{
|
||||
_runner.KillAll();
|
||||
}
|
||||
|
||||
[TearDown]
|
||||
public void IntegrationSetup()
|
||||
{
|
||||
if (_signalrConnection != null)
|
||||
{
|
||||
switch (_signalrConnection.State)
|
||||
{
|
||||
case ConnectionState.Connected:
|
||||
case ConnectionState.Connecting:
|
||||
{
|
||||
_signalrConnection.Stop();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
_signalrConnection = null;
|
||||
_signalRReceived = new List<SignalRMessage>();
|
||||
}
|
||||
}
|
||||
|
||||
protected void ConnectSignalR()
|
||||
{
|
||||
_signalRReceived = new List<SignalRMessage>();
|
||||
_signalrConnection = new Connection("http://localhost:8989/signalr");
|
||||
_signalrConnection.Start(new LongPollingTransport()).ContinueWith(task =>
|
||||
{
|
||||
if (task.IsFaulted)
|
||||
{
|
||||
Assert.Fail("SignalrConnection failed. {0}", task.Exception.GetBaseException());
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
while (_signalrConnection.State != ConnectionState.Connected)
|
||||
{
|
||||
Console.WriteLine("Connecting to signalR" + _signalrConnection.State);
|
||||
Thread.Sleep(200);
|
||||
}
|
||||
|
||||
_signalrConnection.Received += json => _signalRReceived.Add(Json.Deserialize<SignalRMessage>(json)); ;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -41,9 +41,9 @@
|
|||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\FluentValidation.5.0.0.1\lib\Net40\FluentValidation.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.AspNet.SignalR.Client, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
||||
<Reference Include="Microsoft.AspNet.SignalR.Client, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\Microsoft.AspNet.SignalR.Client.2.0.0\lib\net40\Microsoft.AspNet.SignalR.Client.dll</HintPath>
|
||||
<HintPath>..\packages\Microsoft.AspNet.SignalR.Client.1.1.3\lib\net40\Microsoft.AspNet.SignalR.Client.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Owin, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
|
@ -138,6 +138,10 @@
|
|||
<Project>{95C11A9E-56ED-456A-8447-2C89C1139266}</Project>
|
||||
<Name>NzbDrone.Host</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\NzbDrone.SignalR\NzbDrone.SignalR.csproj">
|
||||
<Project>{7C2CC69F-5CA0-4E5C-85CB-983F9F6C3B36}</Project>
|
||||
<Name>NzbDrone.SignalR</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\NzbDrone.Test.Common\NzbDrone.Test.Common.csproj">
|
||||
<Project>{CADDFCE0-7509-4430-8364-2074E1EEFCA2}</Project>
|
||||
<Name>NzbDrone.Test.Common</Name>
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using FluentAssertions;
|
||||
using Microsoft.AspNet.SignalR.Client;
|
||||
using Microsoft.AspNet.SignalR.Client.Transports;
|
||||
using NUnit.Framework;
|
||||
using NzbDrone.Api.RootFolders;
|
||||
|
||||
|
@ -11,39 +8,25 @@ namespace NzbDrone.Integration.Test
|
|||
[TestFixture]
|
||||
public class RootFolderIntegrationTest : IntegrationTest
|
||||
{
|
||||
private Connection _connection;
|
||||
private List<object> _signalRReceived;
|
||||
|
||||
[SetUp]
|
||||
public void Setup()
|
||||
{
|
||||
_signalRReceived = new List<object>();
|
||||
_connection = new Connection("http://localhost:8989/signalr/rootfolder");
|
||||
_connection.Start(new LongPollingTransport()).ContinueWith(task =>
|
||||
{
|
||||
if (task.IsFaulted)
|
||||
{
|
||||
Assert.Fail("SignalrConnection failed. {0}", task.Exception.GetBaseException());
|
||||
}
|
||||
});
|
||||
|
||||
_connection.Received += _connection_Received;
|
||||
}
|
||||
|
||||
private void _connection_Received(string obj)
|
||||
{
|
||||
_signalRReceived.Add(obj);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_have_no_root_folder_initially()
|
||||
{
|
||||
RootFolders.All().Should().BeEmpty();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_add_and_delete_root_folders()
|
||||
{
|
||||
|
||||
ConnectSignalR();
|
||||
|
||||
var rootFolder = new RootFolderResource
|
||||
{
|
||||
Path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
|
||||
};
|
||||
{
|
||||
Path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
|
||||
};
|
||||
|
||||
var postResponse = RootFolders.Post(rootFolder);
|
||||
|
||||
|
@ -56,6 +39,11 @@ namespace NzbDrone.Integration.Test
|
|||
RootFolders.Delete(postResponse.Id);
|
||||
|
||||
RootFolders.All().Should().BeEmpty();
|
||||
|
||||
|
||||
SignalRMessages.Should().Contain(c => c.Name == "rootfolder");
|
||||
|
||||
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<packages>
|
||||
<package id="FluentAssertions" version="2.1.0.0" targetFramework="net40" />
|
||||
<package id="FluentValidation" version="5.0.0.1" targetFramework="net40" />
|
||||
<package id="Microsoft.AspNet.SignalR.Client" version="2.0.0" targetFramework="net40" />
|
||||
<package id="Microsoft.AspNet.SignalR.Client" version="1.1.3" targetFramework="net40" />
|
||||
<package id="Microsoft.Owin" version="2.0.1" targetFramework="net40" />
|
||||
<package id="Microsoft.Owin.Host.HttpListener" version="2.0.1" targetFramework="net40" />
|
||||
<package id="Microsoft.Owin.Hosting" version="2.0.1" targetFramework="net40" />
|
||||
|
|
Loading…
Reference in New Issue