[banshee] Lastfm: add some tests around LastfmRequest class



commit b3fefbf47721e2d9365695a74705fac228fefe2b
Author: Andres G. Aragoneses <knocte gmail com>
Date:   Fri Feb 15 21:16:40 2013 +0000

    Lastfm: add some tests around LastfmRequest class
    
    To be able to refactor it without the danger of breaking it.

 src/Libraries/Lastfm/Lastfm.csproj                 |    1 +
 src/Libraries/Lastfm/Lastfm/LastfmRequest.cs       |   27 ++++-
 .../Lastfm/Lastfm/Tests/LastfmRequestTests.cs      |  117 ++++++++++++++++++++
 src/Libraries/Lastfm/Makefile.am                   |    3 +-
 tests/Makefile.am                                  |    1 +
 5 files changed, 146 insertions(+), 3 deletions(-)
---
diff --git a/src/Libraries/Lastfm/Lastfm.csproj b/src/Libraries/Lastfm/Lastfm.csproj
index 1f09b93..25cb353 100644
--- a/src/Libraries/Lastfm/Lastfm.csproj
+++ b/src/Libraries/Lastfm/Lastfm.csproj
@@ -82,6 +82,7 @@
     <Compile Include="Lastfm.Data\LastfmAlbumData.cs" />
     <Compile Include="Lastfm\LastfmRequest.cs" />
     <Compile Include="Lastfm.Data\ILastfmInfo.cs" />
+    <Compile Include="Lastfm\Tests\LastfmRequestTests.cs" />
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <ProjectExtensions>
diff --git a/src/Libraries/Lastfm/Lastfm/LastfmRequest.cs b/src/Libraries/Lastfm/Lastfm/LastfmRequest.cs
index e18ad0d..9234d4d 100644
--- a/src/Libraries/Lastfm/Lastfm/LastfmRequest.cs
+++ b/src/Libraries/Lastfm/Lastfm/LastfmRequest.cs
@@ -54,6 +54,19 @@ namespace Lastfm
 
     public delegate void SendRequestHandler ();
 
+    internal interface IWebRequestCreator
+    {
+        HttpWebRequest Create (string requestUriString);
+    }
+
+    internal class WebRequestCreator : IWebRequestCreator
+    {
+        public HttpWebRequest Create (string requestUriString)
+        {
+            return (HttpWebRequest) HttpWebRequest.Create (requestUriString);
+        }
+    }
+
     public class LastfmRequest
     {
         private const string API_ROOT = "http://ws.audioscrobbler.com/2.0/";;
@@ -61,10 +74,17 @@ namespace Lastfm
         private Dictionary<string, string> parameters = new Dictionary<string, string> ();
         private Stream response_stream;
         private string response_string;
+        IWebRequestCreator web_request_creator;
 
         public LastfmRequest ()
         {}
 
+        internal LastfmRequest (string method, RequestType request_type, ResponseFormat response_format, 
IWebRequestCreator web_request_creator)
+            : this (method, request_type, response_format)
+        {
+            this.web_request_creator = web_request_creator;
+        }
+
         public LastfmRequest (string method) : this (method, RequestType.Read, ResponseFormat.Json)
         {}
 
@@ -73,6 +93,9 @@ namespace Lastfm
             this.method = method;
             this.request_type = request_type;
             this.response_format = response_format;
+            if (this.web_request_creator == null) {
+                this.web_request_creator = new WebRequestCreator ();
+            }
         }
 
         private string method;
@@ -271,7 +294,7 @@ namespace Lastfm
 
         private Stream Get (string uri, string accept)
         {
-            HttpWebRequest request = (HttpWebRequest) WebRequest.Create (uri);
+            HttpWebRequest request = web_request_creator.Create (uri);
             if (accept != null) {
                 request.Accept = accept;
             }
@@ -293,7 +316,7 @@ namespace Lastfm
         private Stream Post (string uri, string data)
         {
             // Do not trust docs : it doesn't work if parameters are in the request body
-            HttpWebRequest request = (HttpWebRequest) WebRequest.Create (String.Concat (uri, "?", data));
+            HttpWebRequest request = web_request_creator.Create (String.Concat (uri, "?", data));
             request.UserAgent = LastfmCore.UserAgent;
             request.Timeout = 10000;
             request.Method = "POST";
diff --git a/src/Libraries/Lastfm/Lastfm/Tests/LastfmRequestTests.cs 
b/src/Libraries/Lastfm/Lastfm/Tests/LastfmRequestTests.cs
new file mode 100644
index 0000000..cf5cff7
--- /dev/null
+++ b/src/Libraries/Lastfm/Lastfm/Tests/LastfmRequestTests.cs
@@ -0,0 +1,117 @@
+//
+// LastfmRequestTests.cs
+//
+// Author:
+//   Andres G Aragoneses <knocte gmail com>
+//
+// Copyright (C) 2013 Andres G. Aragoneses
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#if ENABLE_TESTS
+
+using System;
+using System.Net;
+using NUnit.Framework;
+
+namespace Lastfm.Tests
+{
+    [TestFixture]
+    public class Tests
+    {
+        class FakeWebRequestCreator : IWebRequestCreator
+        {
+            public HttpWebRequest Create (string requestUriString)
+            {
+                Uri = requestUriString;
+                return (HttpWebRequest)WebRequest.Create (requestUriString);
+            }
+
+            internal string Uri { get; set; }
+        }
+
+        [Test]
+        public void EmptyGet ()
+        {
+            var expected = 
"http://ws.audioscrobbler.com/2.0/?method=someMethod&api_key=344e9141fffeb02201e1ae455d92ae9f&format=json";;
+            var creator = new FakeWebRequestCreator ();
+            new LastfmRequest ("someMethod", RequestType.Read, ResponseFormat.Json, creator).Send ();
+            Assert.AreEqual (expected, creator.Uri);
+        }
+
+        [Test]
+        public void GetWithParams ()
+        {
+            var expected = 
"http://ws.audioscrobbler.com/2.0/?method=someMethod&api_key=344e9141fffeb02201e1ae455d92ae9f&x=y&a=b&format=json";;
+            var creator = new FakeWebRequestCreator ();
+            var req = new LastfmRequest ("someMethod", RequestType.Read, ResponseFormat.Json, creator);
+            req.AddParameter ("x", "y");
+            req.AddParameter ("a", "b");
+            req.Send ();
+            Assert.AreEqual (expected, creator.Uri);
+        }
+
+        [Test]
+        public void EmptyRawGet ()
+        {
+            var expected = 
"http://ws.audioscrobbler.com/2.0/?method=someMethod&api_key=344e9141fffeb02201e1ae455d92ae9f&raw=true";;
+            var creator = new FakeWebRequestCreator ();
+            new LastfmRequest ("someMethod", RequestType.Read, ResponseFormat.Raw, creator).Send ();
+            Assert.AreEqual (expected, creator.Uri);
+        }
+
+        [Test]
+        public void EmptyJsonPost ()
+        {
+            var expected = 
"http://ws.audioscrobbler.com/2.0/?method=someMethod&api_key=344e9141fffeb02201e1ae455d92ae9f&format=json&sk=&api_sig=33ca04b6d45c54eb1405b3d7cb7735ea";;
+            var creator = new FakeWebRequestCreator ();
+            new LastfmRequest ("someMethod", RequestType.Write, ResponseFormat.Json, creator).Send ();
+            Assert.AreEqual (expected, creator.Uri);
+        }
+
+        [Test]
+        public void JsonPostWithParams ()
+        {
+            var expected = 
"http://ws.audioscrobbler.com/2.0/?method=someMethod&api_key=344e9141fffeb02201e1ae455d92ae9f&x=y&a=b&format=json&sk=&api_sig=6b369269588df3d3b1ac67834d703c6d";;
+            var creator = new FakeWebRequestCreator ();
+            var req = new LastfmRequest ("someMethod", RequestType.Write, ResponseFormat.Json, creator);
+            req.AddParameter ("x", "y");
+            req.AddParameter ("a", "b");
+            req.Send ();
+            Assert.AreEqual (expected, creator.Uri);
+        }
+
+        [Test]
+        public void JsonRawWithParams ()
+        {
+            var expected = 
"http://ws.audioscrobbler.com/2.0/?method=someMethod&api_key=344e9141fffeb02201e1ae455d92ae9f&x=y&a=b&raw=true&sk=&api_sig=3b419688648ce7e124c0056aba9a6438";;
+            var creator = new FakeWebRequestCreator ();
+            var req = new LastfmRequest ("someMethod", RequestType.Write, ResponseFormat.Raw, creator);
+            req.AddParameter ("x", "y");
+            req.AddParameter ("a", "b");
+            req.Send ();
+            Assert.AreEqual (expected, creator.Uri);
+        }
+
+    }
+}
+
+#endif
\ No newline at end of file
diff --git a/src/Libraries/Lastfm/Makefile.am b/src/Libraries/Lastfm/Makefile.am
index 7681cf1..7b77b5e 100644
--- a/src/Libraries/Lastfm/Makefile.am
+++ b/src/Libraries/Lastfm/Makefile.am
@@ -17,7 +17,8 @@ SOURCES =  \
        Lastfm/IQueue.cs \
        Lastfm/LastfmCore.cs \
        Lastfm/LastfmRequest.cs \
-       Lastfm/RadioConnection.cs 
+       Lastfm/RadioConnection.cs \
+       Lastfm/Tests/LastfmRequestTests.cs
 
 include $(top_srcdir)/build/build.mk
 
diff --git a/tests/Makefile.am b/tests/Makefile.am
index ad3cd33..aad42b1 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -10,6 +10,7 @@ TEST_ASSEMBLIES = \
        Hyena.dll \
        Hyena.Gui.dll \
        Hyena.Data.Sqlite.dll \
+       Lastfm.dll \
        Migo.dll \
        Mono.Media.dll \
        Banshee.Core.dll \


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]