Bläddra i källkod

add unit test for URI

nico 8 år sedan
förälder
incheckning
721e42ed52

+ 1 - 0
install/files/python_requirements.txt

@@ -16,3 +16,4 @@ flask==0.11.1
 Flask-Restful==0.3.5
 wikipedia==1.4.0
 requests==2.12.1
+httpretty==0.8.14

+ 1 - 1
manual_testing.py

@@ -12,7 +12,7 @@ logger.setLevel(logging.DEBUG)
 brain_to_test = "neurons/uri/tests/uri_test_brain.yml"
 bl = BrainLoader.Instance(file_path=brain_to_test)
 
-order = "test-get-url"
+order = "test-post-url"
 
 oa = OrderAnalyser(order, brain=bl.brain)
 

+ 148 - 0
neurons/uri/tests/test_uri_neuron.py

@@ -0,0 +1,148 @@
+import unittest
+
+from httpretty import httpretty
+
+from core.NeuronModule import InvalidParameterException
+from neurons.uri.uri import Uri
+
+
+class TestUri(unittest.TestCase):
+
+    def setUp(self):
+        self.test_url = "http://kalliope.fr/voices/"
+
+    def testGet(self):
+        expected_content = '{"voice": "nico"}'
+        httpretty.enable()
+        httpretty.register_uri(httpretty.GET, self.test_url, body=expected_content)
+
+        parameters = {
+            "url": self.test_url
+        }
+
+        uri_neuron = Uri(**parameters)
+        self.assertEqual(uri_neuron.text, expected_content)
+
+    def testGetRaw(self):
+        expected_content = 'raw line'
+        httpretty.enable()
+        httpretty.register_uri(httpretty.GET, self.test_url, body=expected_content)
+        parameters = {
+            "url": self.test_url
+        }
+        uri_neuron = Uri(**parameters)
+        self.assertEqual(uri_neuron.content, expected_content)
+
+    def testPost(self):
+        expected_content = '{"voice": "nico"}'
+        httpretty.enable()
+        httpretty.register_uri(httpretty.POST, self.test_url, body=expected_content)
+
+        parameters = {
+            "url": self.test_url,
+            "method": "POST"
+        }
+
+        uri_neuron = Uri(**parameters)
+        self.assertEqual(uri_neuron.text, expected_content)
+
+    def testPut(self):
+        expected_content = '{"voice": "nico"}'
+        httpretty.enable()
+        httpretty.register_uri(httpretty.PUT, self.test_url, body=expected_content)
+
+        parameters = {
+            "url": self.test_url,
+            "method": "PUT"
+        }
+
+        uri_neuron = Uri(**parameters)
+        self.assertEqual(uri_neuron.text, expected_content)
+
+    def testDelete(self):
+        expected_content = '{"voice": "nico"}'
+        httpretty.enable()
+        httpretty.register_uri(httpretty.DELETE, self.test_url, body=expected_content)
+
+        parameters = {
+            "url": self.test_url,
+            "method": "DELETE"
+        }
+
+        uri_neuron = Uri(**parameters)
+        self.assertEqual(uri_neuron.text, expected_content)
+
+    def testOptions(self):
+        expected_content = '{"voice": "nico"}'
+        httpretty.enable()
+        httpretty.register_uri(httpretty.OPTIONS, self.test_url, body=expected_content)
+
+        parameters = {
+            "url": self.test_url,
+            "method": "OPTIONS"
+        }
+
+        uri_neuron = Uri(**parameters)
+        self.assertEqual(uri_neuron.text, expected_content)
+
+    def testHead(self):
+        expected_content = '{"voice": "nico"}'
+        httpretty.enable()
+        httpretty.register_uri(httpretty.HEAD, self.test_url, body=expected_content)
+
+        parameters = {
+            "url": self.test_url,
+            "method": "HEAD"
+        }
+
+        uri_neuron = Uri(**parameters)
+        self.assertEqual(uri_neuron.status_code, 200)
+
+    def testPatch(self):
+        expected_content = '{"voice": "nico"}'
+        httpretty.enable()
+        httpretty.register_uri(httpretty.PATCH, self.test_url, body=expected_content)
+
+        parameters = {
+            "url": self.test_url,
+            "method": "PATCH"
+        }
+
+        uri_neuron = Uri(**parameters)
+        self.assertEqual(uri_neuron.text, expected_content)
+
+    def testParameters(self):
+        def run_test(parameters):
+            with self.assertRaises(InvalidParameterException):
+                Uri(**parameters)
+
+        parameters = dict()
+        run_test(parameters)
+
+        parameters = {
+            "url": self.test_url,
+            "headers": 1
+        }
+        run_test(parameters)
+
+        parameters = {
+            "url": self.test_url,
+            "timeout": "string"
+        }
+        run_test(parameters)
+
+        parameters = {
+            "url": self.test_url,
+            "data": "this is a data",
+            "data_from_file": "this is another data"
+        }
+        run_test(parameters)
+
+        parameters = {
+            "url": self.test_url,
+            "method": "NONEXIST"
+        }
+        run_test(parameters)
+
+if __name__ == '__main__':
+    unittest.main()

+ 1 - 0
neurons/uri/tests/uri_test_brain.yml

@@ -17,6 +17,7 @@
           url: "http://jsonplaceholder.typicode.com/posts"
           headers:
             user-agent: 'my-app/0.0.1'
+            Content-Type: 'application/json'
           timeout: 12
           method: POST
           data_from_file: "neurons/uri/tests/data_post_test.json"

+ 12 - 2
neurons/uri/uri.py

@@ -31,6 +31,7 @@ class Uri(NeuronModule):
         # output variable
         self.status_code = None
         self.content = None
+        self.text = None
         self.response_header = None
 
         # this is a switch case option
@@ -118,7 +119,12 @@ class Uri(NeuronModule):
         self.status_code = r.status_code
         self.content = r.content
         # we try to load into a json object the content. So Kalliope can use it to talk
-        self.content = json.loads(self.content)
+        try:
+            self.content = json.loads(self.content)
+        except ValueError:
+            logger.debug(self.neuron_name + "cannot get a valid json from returned content")
+            pass
+        self.text = r.text
         self.response_header = r.headers
 
         logger.debug(self.neuron_name + " status_code: %s" % self.status_code)
@@ -137,7 +143,7 @@ class Uri(NeuronModule):
         # headers can be null, but if provided it must be a list
         if self.headers is not None:
             if not isinstance(self.headers, dict):
-                raise InvalidParameterException("headers must be a list of string")
+                raise InvalidParameterException("headers must be a list of key: value")
 
         # timeout in second must be an integer
         if self.timeout is not None:
@@ -162,6 +168,10 @@ class Uri(NeuronModule):
             except ValueError, e:
                 raise InvalidParameterException("error in \"data\" parameter: %s" % e)
 
+        # we cannot provide both data and data from file
+        if self.data is not None and self.data_from_file is not None:
+            raise InvalidParameterException("URI can be used with data or data_from_file, not both in same time")
+
         # the provided method must exist
         allowed_method = ["GET", "POST", "DELETE", "PUT", "HEAD", "PATCH", "OPTIONS"]
         if self.method not in allowed_method: