From babe2735ee63dd4d5b51c135009fc39c899b8630 Mon Sep 17 00:00:00 2001
From: Keivan <kay.one@gmail.com>
Date: Mon, 27 Sep 2010 20:04:39 -0700
Subject: [PATCH] failed attempt to write a test for Series Controller

---
 NzbDrone.Core.Test/MockLib.cs                 | 42 +++++++++++++++++++
 NzbDrone.Core.Test/NzbDrone.Core.Test.csproj  |  1 +
 NzbDrone.Core.Test/SeriesTest.cs              | 25 ++++++++---
 NzbDrone.Core/Controllers/DiskController.cs   |  8 ----
 NzbDrone.Core/Controllers/IDiskController.cs  |  1 -
 NzbDrone.Core/Controllers/SeriesController.cs | 18 ++++++--
 NzbDrone.Core/Helpers/Disk.cs                 | 25 +++++++++++
 NzbDrone.Core/Main.cs                         |  5 +--
 NzbDrone.Core/NzbDrone.Core.csproj            |  1 +
 NzbDrone.Core/Repository/Series.cs            |  2 +-
 10 files changed, 105 insertions(+), 23 deletions(-)
 create mode 100644 NzbDrone.Core.Test/MockLib.cs
 create mode 100644 NzbDrone.Core/Helpers/Disk.cs

diff --git a/NzbDrone.Core.Test/MockLib.cs b/NzbDrone.Core.Test/MockLib.cs
new file mode 100644
index 000000000..5a1dad397
--- /dev/null
+++ b/NzbDrone.Core.Test/MockLib.cs
@@ -0,0 +1,42 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Moq;
+using NzbDrone.Core.Controllers;
+
+namespace NzbDrone.Core.Test
+{
+    /// <summary>
+    /// Provides the standard Mocks needed for a typical test
+    /// </summary>
+    static class MockLib
+    {
+        public static string[] StandardSeries
+        {
+            get { return new string[] { "C:\\TV\\The Simpsons", "C:\\TV\\Family Guy" }; }
+        }
+
+
+        public static IConfigController StandardConfig
+        {
+            get
+            {
+                var mock = new Mock<IConfigController>();
+                mock.SetupGet(c => c.SeriesRoot).Returns("C:\\");
+                return mock.Object;
+            }
+        }
+
+        public static IDiskController StandardDisk
+        {
+            get
+            {
+                var mock = new Mock<IDiskController>();
+                mock.Setup(c => c.GetDirectories(It.IsAny<String>())).Returns(StandardSeries);
+                mock.Setup(c => c.Exists(It.Is<String>(d => StandardSeries.Contains(d)))).Returns(true);
+                return mock.Object;
+            }
+        }
+    }
+}
diff --git a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj
index ed47967a3..50208906e 100644
--- a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj
+++ b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj
@@ -67,6 +67,7 @@
   </ItemGroup>
   <ItemGroup>
     <Compile Include="DbConfigControllerTest.cs" />
+    <Compile Include="MockLib.cs" />
     <Compile Include="Ninject.Moq\ExtensionsForBindingSyntax.cs" />
     <Compile Include="Ninject.Moq\MockingKernel.cs" />
     <Compile Include="Ninject.Moq\MockProvider.cs" />
diff --git a/NzbDrone.Core.Test/SeriesTest.cs b/NzbDrone.Core.Test/SeriesTest.cs
index 246f6633e..8ac0db330 100644
--- a/NzbDrone.Core.Test/SeriesTest.cs
+++ b/NzbDrone.Core.Test/SeriesTest.cs
@@ -1,6 +1,7 @@
 using System;
 using System.Collections;
 using System.Collections.Generic;
+using System.IO;
 using System.Text;
 using FizzWare.NBuilder;
 using Gallio.Framework;
@@ -21,6 +22,7 @@ namespace NzbDrone.Core.Test
     public class SeriesTest
     {
         [Test]
+        [Ignore("Can't get it to work")]
         [Description("This test will confirm that a folder will be skipped if it has been resolved to a series already assigned to another folder")]
         public void skip_same_series_diffrent_folder()
         {
@@ -35,21 +37,34 @@ namespace NzbDrone.Core.Test
                 .With(f => f.TvdbId = tvDbId.ToString())
                 .Build();
 
-            moqData.Setup(f => f.Single<Series>(tvDbId)).
-                Returns(fakeSeries);
+            moqData.Setup(f => f.Exists<Series>(c => c.TvdbId == tvDbId.ToString())).
+                Returns(true);
 
             //setup tvdb to return the same show,
             IList<TvdbSearchResult> fakeSearchResult = Builder<TvdbSearchResult>.CreateListOfSize(4).WhereTheFirst(1).Has(f => f.Id = tvDbId).Build();
-            
+            TvdbSeries fakeTvDbSeries = Builder<TvdbSeries>.CreateNew()
+                .With(f => f.Id = tvDbId)
+                .Build();
+
+            moqTvdb.Setup(f => f.GetSeries(It.IsAny<int>(), It.IsAny<TvdbLanguage>())).Returns(fakeTvDbSeries);
             moqTvdb.Setup(f => f.SearchSeries(It.IsAny<string>())).
-                Returns(fakeSearchResult);
+               Returns(fakeSearchResult);
 
             var kernel = new MockingKernel();
             kernel.Bind<IRepository>().ToConstant(moqData.Object);
             kernel.Bind<ITvDbController>().ToConstant(moqTvdb.Object);
+            kernel.Bind<IConfigController>().ToConstant(MockLib.StandardConfig);
+            kernel.Bind<IDiskController>().ToConstant(MockLib.StandardDisk);
+            kernel.Bind<ISeriesController>().To<SeriesController>();
 
+
+            //Act
             var seriesController = kernel.Get<ISeriesController>();
-            seriesController.a
+            seriesController.SyncSeriesWithDisk();
+
+            //Assert
+            //Verify that the show was added to the database only once.
+            moqData.Verify(c => c.Add(It.IsAny<Series>()), Times.Once());
         }
     }
 }
diff --git a/NzbDrone.Core/Controllers/DiskController.cs b/NzbDrone.Core/Controllers/DiskController.cs
index ed1622231..a715e4880 100644
--- a/NzbDrone.Core/Controllers/DiskController.cs
+++ b/NzbDrone.Core/Controllers/DiskController.cs
@@ -22,14 +22,6 @@ namespace NzbDrone.Core.Controllers
             return Directory.CreateDirectory(path).FullName;
         }
 
-
-        public string CleanPath(string path)
-        {
-            if (string.IsNullOrEmpty(path)) throw new ArgumentException("Path can not be null or empty");
-
-            return path.ToLower().Trim('/', '\\', ' ');
-        }
-
         #endregion
     }
 }
\ No newline at end of file
diff --git a/NzbDrone.Core/Controllers/IDiskController.cs b/NzbDrone.Core/Controllers/IDiskController.cs
index 2040545e5..03568f638 100644
--- a/NzbDrone.Core/Controllers/IDiskController.cs
+++ b/NzbDrone.Core/Controllers/IDiskController.cs
@@ -7,6 +7,5 @@ namespace NzbDrone.Core.Controllers
         bool Exists(string path);
         string[] GetDirectories(string path);
         String CreateDirectory(string path);
-        string CleanPath(string path);
     }
 }
\ No newline at end of file
diff --git a/NzbDrone.Core/Controllers/SeriesController.cs b/NzbDrone.Core/Controllers/SeriesController.cs
index d1c1d6064..06405bf8c 100644
--- a/NzbDrone.Core/Controllers/SeriesController.cs
+++ b/NzbDrone.Core/Controllers/SeriesController.cs
@@ -2,6 +2,7 @@
 using System.IO;
 using System.Linq;
 using log4net;
+using NzbDrone.Core.Helpers;
 using NzbDrone.Core.Repository;
 using SubSonic.Repository;
 using TvdbLib.Data;
@@ -34,7 +35,7 @@ namespace NzbDrone.Core.Controllers
 
         public Series GetSeries(int tvdbId)
         {
-            return _sonioRepo.Single<Series>(s=> s.TvdbId == tvdbId.ToString());
+            return _sonioRepo.Single<Series>(s => s.TvdbId == tvdbId.ToString());
         }
 
 
@@ -44,7 +45,7 @@ namespace NzbDrone.Core.Controllers
 
             foreach (string seriesFolder in _diskController.GetDirectories(_config.SeriesRoot))
             {
-                var cleanPath  =_diskController.CleanPath(new DirectoryInfo(seriesFolder).FullName);
+                var cleanPath = Disk.CleanPath(new DirectoryInfo(seriesFolder).FullName);
                 if (!_sonioRepo.Exists<Series>(s => s.Path == cleanPath))
                 {
                     _logger.InfoFormat("Folder '{0} isn't mapped to a series in the database. Trying to map it.'", cleanPath);
@@ -59,7 +60,7 @@ namespace NzbDrone.Core.Controllers
         private void AddShow(string path)
         {
             var searchResults = _tvDb.SearchSeries(new DirectoryInfo(path).Name);
-            if (searchResults.Count != 0)
+            if (searchResults.Count != 0 && !_sonioRepo.Exists<Series>(s => s.TvdbId == searchResults[0].Id.ToString()))
             {
                 AddShow(path, _tvDb.GetSeries(searchResults[0].Id, searchResults[0].Language));
             }
@@ -67,7 +68,16 @@ namespace NzbDrone.Core.Controllers
 
         private void AddShow(string path, TvdbSeries series)
         {
-            _sonioRepo.Add(new Series { TvdbId = series.Id.ToString(), SeriesName = series.SeriesName, AirTimes = series.AirsTime, AirsDayOfWeek = series.AirsDayOfWeek, Overview = series.Overview, Status = series.Status, Language = series.Language.Abbriviation, Path = path });
+            var repoSeries = new Series();
+            repoSeries.TvdbId = series.Id.ToString();
+            repoSeries.SeriesName = series.SeriesName;
+            repoSeries.AirTimes = series.AirsTime;
+            repoSeries.AirsDayOfWeek = series.AirsDayOfWeek;
+            repoSeries.Overview = series.Overview;
+            repoSeries.Status = series.Status;
+            repoSeries.Language = series.Language != null ? series.Language.Abbriviation : string.Empty;
+            repoSeries.Path = path;
+            _sonioRepo.Add(repoSeries);
         }
     }
 }
\ No newline at end of file
diff --git a/NzbDrone.Core/Helpers/Disk.cs b/NzbDrone.Core/Helpers/Disk.cs
new file mode 100644
index 000000000..4c56b58a6
--- /dev/null
+++ b/NzbDrone.Core/Helpers/Disk.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace NzbDrone.Core.Helpers
+{
+
+    static class Disk
+    {
+
+        /// <summary>
+        /// Cleans the path. making it a uniform path.
+        /// this will normalize all different presentations of a single folder.
+        /// </summary>
+        /// <param name="path">The path.</param>
+        /// <returns>Cleaned Path</returns>
+        public static string CleanPath(string path)
+        {
+            if (string.IsNullOrEmpty(path)) throw new ArgumentException("Path can not be null or empty");
+            return path.ToLower().Trim('/', '\\', ' ');
+        }
+
+    }
+}
diff --git a/NzbDrone.Core/Main.cs b/NzbDrone.Core/Main.cs
index 9150069d5..5d9aa8a57 100644
--- a/NzbDrone.Core/Main.cs
+++ b/NzbDrone.Core/Main.cs
@@ -14,7 +14,7 @@ namespace NzbDrone.Core
 
         public static void BindKernel(IKernel kernel)
         {
-            string connectionString = String.Format("Data Source={0};Version=3;",Path.Combine(AppPath, "nzbdrone.db")) ;
+            string connectionString = String.Format("Data Source={0};Version=3;", Path.Combine(AppPath, "nzbdrone.db"));
             var provider = ProviderFactory.GetProvider(connectionString, "System.Data.SQLite");
 
             kernel.Bind<ISeriesController>().To<SeriesController>();
@@ -25,9 +25,6 @@ namespace NzbDrone.Core
             kernel.Bind<IRepository>().ToMethod(c => new SimpleRepository(provider, SimpleRepositoryOptions.RunMigrations));
         }
 
-
-        private static string _appPath;
-
         public static String AppPath
         {
             get { return new DirectoryInfo(HttpContext.Current.Server.MapPath("\\")).Parent.FullName; }
diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj
index 393b1637b..49faabaea 100644
--- a/NzbDrone.Core/NzbDrone.Core.csproj
+++ b/NzbDrone.Core/NzbDrone.Core.csproj
@@ -138,6 +138,7 @@
     <Compile Include="Controllers\ISeriesController.cs" />
     <Compile Include="Controllers\ITvDbController.cs" />
     <Compile Include="Controllers\SabController.cs" />
+    <Compile Include="Helpers\Disk.cs" />
     <Compile Include="Repository\Config.cs" />
     <Compile Include="Repository\Series.cs" />
     <Compile Include="Main.cs" />
diff --git a/NzbDrone.Core/Repository/Series.cs b/NzbDrone.Core/Repository/Series.cs
index 185aabeef..afd886c99 100644
--- a/NzbDrone.Core/Repository/Series.cs
+++ b/NzbDrone.Core/Repository/Series.cs
@@ -37,7 +37,7 @@ namespace NzbDrone.Core.Repository
             set;
         }
 
-        public string AirTimes
+        public String AirTimes
         {
             get;
             set;