From d19a755fb129e895aef5f45e77daac88ea616d00 Mon Sep 17 00:00:00 2001
From: Mark McDowall <markus.mcd5@gmail.com>
Date: Fri, 20 Sep 2013 19:07:42 -0700
Subject: [PATCH] Integration tests use the api key now

---
 .../Configuration/ConfigFileProvider.cs       |  4 ++-
 .../Client/ClientBase.cs                      | 13 ++++++---
 .../Client/EpisodeClient.cs                   |  4 +--
 .../Client/IndexerClient.cs                   |  7 ++---
 .../Client/ReleaseClient.cs                   |  7 ++---
 .../Client/SeriesClient.cs                    | 11 +++----
 NzbDrone.Integration.Test/IntegrationTest.cs  | 19 ++++++------
 NzbDrone.Integration.Test/NzbDroneRunner.cs   | 29 +++++++++++++++----
 8 files changed, 54 insertions(+), 40 deletions(-)

diff --git a/NzbDrone.Core/Configuration/ConfigFileProvider.cs b/NzbDrone.Core/Configuration/ConfigFileProvider.cs
index da0fa5569..f2b970763 100644
--- a/NzbDrone.Core/Configuration/ConfigFileProvider.cs
+++ b/NzbDrone.Core/Configuration/ConfigFileProvider.cs
@@ -32,7 +32,7 @@ namespace NzbDrone.Core.Configuration
 
     public class ConfigFileProvider : IConfigFileProvider
     {
-        private const string CONFIG_ELEMENT_NAME = "Config";
+        public const string CONFIG_ELEMENT_NAME = "Config";
 
         private readonly IEventAggregator _eventAggregator;
         private readonly ICached<string> _cache;
@@ -214,6 +214,8 @@ namespace NzbDrone.Core.Configuration
                 var xDoc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
                 xDoc.Add(new XElement(CONFIG_ELEMENT_NAME));
                 xDoc.Save(_configFile);
+
+                SaveConfigDictionary(GetConfigDictionary());
             }
         }
 
diff --git a/NzbDrone.Integration.Test/Client/ClientBase.cs b/NzbDrone.Integration.Test/Client/ClientBase.cs
index 20e35117f..9cd0b4b7a 100644
--- a/NzbDrone.Integration.Test/Client/ClientBase.cs
+++ b/NzbDrone.Integration.Test/Client/ClientBase.cs
@@ -14,10 +14,10 @@ namespace NzbDrone.Integration.Test.Client
     {
         private readonly IRestClient _restClient;
         private readonly string _resource;
-
+        private readonly string _apiKey;
         private readonly Logger _logger;
 
-        public ClientBase(IRestClient restClient, string resource = null)
+        public ClientBase(IRestClient restClient, string apiKey, string resource = null)
         {
             if (resource == null)
             {
@@ -26,6 +26,7 @@ namespace NzbDrone.Integration.Test.Client
 
             _restClient = restClient;
             _resource = resource;
+            _apiKey = apiKey;
 
             _logger = LogManager.GetLogger("REST");
         }
@@ -88,10 +89,14 @@ namespace NzbDrone.Integration.Test.Client
 
         public RestRequest BuildRequest(string command = "")
         {
-            return new RestRequest(_resource + "/" + command.Trim('/'))
+            var request = new RestRequest(_resource + "/" + command.Trim('/'))
                 {
-                    RequestFormat = DataFormat.Json
+                    RequestFormat = DataFormat.Json,
                 };
+
+            request.AddHeader("Authorization", _apiKey);
+
+            return request;
         }
 
         public T Get<T>(IRestRequest request, HttpStatusCode statusCode = HttpStatusCode.OK) where T : class, new()
diff --git a/NzbDrone.Integration.Test/Client/EpisodeClient.cs b/NzbDrone.Integration.Test/Client/EpisodeClient.cs
index 8cc89af4e..437226c2f 100644
--- a/NzbDrone.Integration.Test/Client/EpisodeClient.cs
+++ b/NzbDrone.Integration.Test/Client/EpisodeClient.cs
@@ -6,8 +6,8 @@ namespace NzbDrone.Integration.Test.Client
 {
     public class EpisodeClient : ClientBase<EpisodeResource>
     {
-        public EpisodeClient(IRestClient restClient)
-            : base(restClient, "episodes")
+        public EpisodeClient(IRestClient restClient, string apiKey)
+            : base(restClient, apiKey, "episodes")
         {
         }
 
diff --git a/NzbDrone.Integration.Test/Client/IndexerClient.cs b/NzbDrone.Integration.Test/Client/IndexerClient.cs
index 44f5d4c77..9d6f9b974 100644
--- a/NzbDrone.Integration.Test/Client/IndexerClient.cs
+++ b/NzbDrone.Integration.Test/Client/IndexerClient.cs
@@ -5,12 +5,9 @@ namespace NzbDrone.Integration.Test.Client
 {
     public class IndexerClient : ClientBase<IndexerResource>
     {
-        public IndexerClient(IRestClient restClient)
-            : base(restClient)
+        public IndexerClient(IRestClient restClient, string apiKey)
+            : base(restClient, apiKey)
         {
         }
-
-
-
     }
 }
\ No newline at end of file
diff --git a/NzbDrone.Integration.Test/Client/ReleaseClient.cs b/NzbDrone.Integration.Test/Client/ReleaseClient.cs
index fba274856..46a6db839 100644
--- a/NzbDrone.Integration.Test/Client/ReleaseClient.cs
+++ b/NzbDrone.Integration.Test/Client/ReleaseClient.cs
@@ -5,12 +5,9 @@ namespace NzbDrone.Integration.Test.Client
 {
     public class ReleaseClient : ClientBase<ReleaseResource>
     {
-        public ReleaseClient(IRestClient restClient)
-            : base(restClient)
+        public ReleaseClient(IRestClient restClient, string apiKey)
+            : base(restClient, apiKey)
         {
         }
-
-
-
     }
 }
diff --git a/NzbDrone.Integration.Test/Client/SeriesClient.cs b/NzbDrone.Integration.Test/Client/SeriesClient.cs
index 3dc88c969..1f0a572f9 100644
--- a/NzbDrone.Integration.Test/Client/SeriesClient.cs
+++ b/NzbDrone.Integration.Test/Client/SeriesClient.cs
@@ -7,8 +7,8 @@ namespace NzbDrone.Integration.Test.Client
 {
     public class SeriesClient : ClientBase<SeriesResource>
     {
-        public SeriesClient(IRestClient restClient)
-            : base(restClient)
+        public SeriesClient(IRestClient restClient, string apiKey)
+            : base(restClient, apiKey)
         {
         }
 
@@ -27,14 +27,11 @@ namespace NzbDrone.Integration.Test.Client
 
     }
 
-
     public class SystemInfoClient : ClientBase<SeriesResource>
     {
-        public SystemInfoClient(IRestClient restClient)
-            : base(restClient)
+        public SystemInfoClient(IRestClient restClient, string apiKey)
+            : base(restClient, apiKey)
         {
         }
-
-
     }
 }
diff --git a/NzbDrone.Integration.Test/IntegrationTest.cs b/NzbDrone.Integration.Test/IntegrationTest.cs
index a0b5b3bcd..f8556a58d 100644
--- a/NzbDrone.Integration.Test/IntegrationTest.cs
+++ b/NzbDrone.Integration.Test/IntegrationTest.cs
@@ -47,22 +47,21 @@ namespace NzbDrone.Integration.Test
             _runner = new NzbDroneRunner();
             _runner.KillAll();
 
-            InitRestClients();
-
             _runner.Start();
+            InitRestClients();
         }
 
         private void InitRestClients()
         {
             RestClient = new RestClient("http://localhost:8989/api");
-            Series = new SeriesClient(RestClient);
-            Releases = new ReleaseClient(RestClient);
-            RootFolders = new ClientBase<RootFolderResource>(RestClient);
-            Commands = new ClientBase<CommandResource>(RestClient);
-            History = new ClientBase<HistoryResource>(RestClient);
-            Indexers = new IndexerClient(RestClient);
-            Episodes = new EpisodeClient(RestClient);
-            NamingConfig = new ClientBase<NamingConfigResource>(RestClient, "config/naming");
+            Series = new SeriesClient(RestClient, _runner.ApiKey);
+            Releases = new ReleaseClient(RestClient, _runner.ApiKey);
+            RootFolders = new ClientBase<RootFolderResource>(RestClient, _runner.ApiKey);
+            Commands = new ClientBase<CommandResource>(RestClient, _runner.ApiKey);
+            History = new ClientBase<HistoryResource>(RestClient, _runner.ApiKey);
+            Indexers = new IndexerClient(RestClient, _runner.ApiKey);
+            Episodes = new EpisodeClient(RestClient, _runner.ApiKey);
+            NamingConfig = new ClientBase<NamingConfigResource>(RestClient, _runner.ApiKey, "config/naming");
         }
 
         //[TestFixtureTearDown]
diff --git a/NzbDrone.Integration.Test/NzbDroneRunner.cs b/NzbDrone.Integration.Test/NzbDroneRunner.cs
index 5955166ff..111ff02db 100644
--- a/NzbDrone.Integration.Test/NzbDroneRunner.cs
+++ b/NzbDrone.Integration.Test/NzbDroneRunner.cs
@@ -1,10 +1,13 @@
 using System;
 using System.Diagnostics;
 using System.IO;
+using System.Linq;
 using System.Threading;
+using System.Xml.Linq;
 using NUnit.Framework;
 using NzbDrone.Common;
 using NzbDrone.Common.EnvironmentInfo;
+using NzbDrone.Core.Configuration;
 using RestSharp;
 
 namespace NzbDrone.Integration.Test
@@ -15,16 +18,18 @@ namespace NzbDrone.Integration.Test
         private readonly IRestClient _restClient;
         private Process _nzbDroneProcess;
 
+        public string AppData { get; private set; }
+        public string ApiKey { get; private set; }
+
         public NzbDroneRunner(int port = 8989)
         {
             _processProvider = new ProcessProvider();
             _restClient = new RestClient("http://localhost:8989/api");
         }
 
-
         public void Start()
         {
-            AppDate = Path.Combine(Directory.GetCurrentDirectory(), "_intg_" + DateTime.Now.Ticks);
+            AppData = Path.Combine(Directory.GetCurrentDirectory(), "_intg_" + DateTime.Now.Ticks);
 
             var nzbdroneConsoleExe = "NzbDrone.Console.exe";
 
@@ -33,7 +38,6 @@ namespace NzbDrone.Integration.Test
                 nzbdroneConsoleExe = "NzbDrone.exe";
             }
 
-
             if (BuildInfo.IsDebug)
             {
 
@@ -53,8 +57,12 @@ namespace NzbDrone.Integration.Test
                     Assert.Fail("Process has exited");
                 }
 
+                SetApiKey();
+
+                var request = new RestRequest("system/status");
+                request.AddHeader("Authorization", ApiKey);
 
-                var statusCall = _restClient.Get(new RestRequest("system/status"));
+                var statusCall = _restClient.Get(request);
 
                 if (statusCall.ResponseStatus == ResponseStatus.Completed)
                 {
@@ -76,7 +84,7 @@ namespace NzbDrone.Integration.Test
 
         private void Start(string outputNzbdroneConsoleExe)
         {
-            var args = "-nobrowser -data=\"" + AppDate + "\"";
+            var args = "-nobrowser -data=\"" + AppData + "\"";
             _nzbDroneProcess = _processProvider.Start(outputNzbdroneConsoleExe, args, OnOutputDataReceived, OnOutputDataReceived);
 
         }
@@ -91,7 +99,16 @@ namespace NzbDrone.Integration.Test
             }
         }
 
+        private void SetApiKey()
+        {
+            var configFile = Path.Combine(AppData, "config.xml");
+
+            if (!String.IsNullOrWhiteSpace(ApiKey)) return;
+            if (!File.Exists(configFile)) return;
 
-        public string AppDate { get; private set; }
+            var xDoc = XDocument.Load(configFile);
+            var config = xDoc.Descendants(ConfigFileProvider.CONFIG_ELEMENT_NAME).Single();
+            ApiKey = config.Descendants("ApiKey").Single().Value;
+        }
     }
 }
\ No newline at end of file