You've already forked Sonarr
							
							
				mirror of
				https://github.com/Sonarr/Sonarr.git
				synced 2025-10-31 00:07:55 +02:00 
			
		
		
		
	added signalR to Integration Test
This commit is contained in:
		| @@ -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" /> | ||||
|   | ||||
							
								
								
									
										27
									
								
								src/NzbDrone.Core/RootFolders/RootFolderRepository.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/NzbDrone.Core/RootFolders/RootFolderRepository.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -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" /> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user