Index: appengine/monorail/framework/test/jsonfeed_test.py |
diff --git a/appengine/monorail/framework/test/jsonfeed_test.py b/appengine/monorail/framework/test/jsonfeed_test.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2ebe0dc98281c0787fdbfbc87ade4a24dc1d9213 |
--- /dev/null |
+++ b/appengine/monorail/framework/test/jsonfeed_test.py |
@@ -0,0 +1,142 @@ |
+# Copyright 2016 The Chromium Authors. All rights reserved. |
+# Use of this source code is govered by a BSD-style |
+# license that can be found in the LICENSE file or at |
+# https://developers.google.com/open-source/licenses/bsd |
+ |
+"""Unit tests for jsonfeed module.""" |
+ |
+import httplib |
+import logging |
+import unittest |
+ |
+from google.appengine.api import app_identity |
+ |
+from framework import jsonfeed |
+from framework import servlet |
+from framework import xsrf |
+from services import service_manager |
+from testing import testing_helpers |
+ |
+ |
+class JsonFeedTest(unittest.TestCase): |
+ |
+ def setUp(self): |
+ self.cnxn = 'fake cnxn' |
+ |
+ def testGet(self): |
+ """Tests handling of GET requests.""" |
+ feed = TestableJsonFeed() |
+ |
+ # all expected args are present + a bonus arg that should be ignored |
+ feed.mr = testing_helpers.MakeMonorailRequest( |
+ path='/foo/bar/wee?sna=foo', method='POST', |
+ params={'a': '123', 'z': 'zebra'}) |
+ self.assertRaises(servlet.AlreadySentResponseException, feed.get) |
+ |
+ self.assertEqual(True, feed.handle_request_called) |
+ self.assertEqual(1, len(feed.json_data)) |
+ |
+ def testPost(self): |
+ """Tests handling of POST requests.""" |
+ feed = TestableJsonFeed() |
+ feed.mr = testing_helpers.MakeMonorailRequest( |
+ path='/foo/bar/wee?sna=foo', method='POST', |
+ params={'a': '123', 'z': 'zebra'}) |
+ |
+ self.assertRaises(servlet.AlreadySentResponseException, feed.post) |
+ |
+ self.assertEqual(True, feed.handle_request_called) |
+ self.assertEqual(1, len(feed.json_data)) |
+ |
+ def testSecurityTokenChecked_BadToken(self): |
+ feed = TestableJsonFeed() |
+ feed.mr = testing_helpers.MakeMonorailRequest( |
+ user_info={'user_id': 555}) |
+ # Note that feed.mr has no token set. |
+ self.assertRaises(xsrf.TokenIncorrect, feed.get) |
+ self.assertRaises(xsrf.TokenIncorrect, feed.post) |
+ |
+ feed.mr.token = 'bad token' |
+ self.assertRaises(xsrf.TokenIncorrect, feed.get) |
+ self.assertRaises(xsrf.TokenIncorrect, feed.post) |
+ |
+ def testSecurityTokenChecked_HandlerDoesNotNeedToken(self): |
+ feed = TestableJsonFeed() |
+ feed.mr = testing_helpers.MakeMonorailRequest( |
+ user_info={'user_id': 555}) |
+ # Note that feed.mr has no token set. |
+ feed.CHECK_SECURITY_TOKEN = False |
+ self.assertRaises(servlet.AlreadySentResponseException, feed.get) |
+ self.assertRaises(servlet.AlreadySentResponseException, feed.post) |
+ |
+ def testSecurityTokenChecked_AnonUserDoesNotNeedToken(self): |
+ feed = TestableJsonFeed() |
+ feed.mr = testing_helpers.MakeMonorailRequest() |
+ # Note that feed.mr has no token set, but also no auth.user_id. |
+ self.assertRaises(servlet.AlreadySentResponseException, feed.get) |
+ self.assertRaises(servlet.AlreadySentResponseException, feed.post) |
+ |
+ def testSameAppOnly_ExternallyAccessible(self): |
+ feed = TestableJsonFeed() |
+ feed.mr = testing_helpers.MakeMonorailRequest() |
+ # Note that request has no X-Appengine-Inbound-Appid set. |
+ self.assertRaises(servlet.AlreadySentResponseException, feed.get) |
+ self.assertRaises(servlet.AlreadySentResponseException, feed.post) |
+ |
+ def testSameAppOnly_InternalOnlyCalledFromSameApp(self): |
+ feed = TestableJsonFeed() |
+ feed.CHECK_SAME_APP = True |
+ feed.mr = testing_helpers.MakeMonorailRequest() |
+ app_id = app_identity.get_application_id() |
+ feed.mr.request.headers['X-Appengine-Inbound-Appid'] = app_id |
+ self.assertRaises(servlet.AlreadySentResponseException, feed.get) |
+ self.assertRaises(servlet.AlreadySentResponseException, feed.post) |
+ |
+ def testSameAppOnly_InternalOnlyCalledExternally(self): |
+ feed = TestableJsonFeed() |
+ feed.CHECK_SAME_APP = True |
+ feed.mr = testing_helpers.MakeMonorailRequest() |
+ # Note that request has no X-Appengine-Inbound-Appid set. |
+ self.assertIsNone(feed.get()) |
+ self.assertFalse(feed.handle_request_called) |
+ self.assertEqual(httplib.FORBIDDEN, feed.response.status) |
+ self.assertIsNone(feed.post()) |
+ self.assertFalse(feed.handle_request_called) |
+ self.assertEqual(httplib.FORBIDDEN, feed.response.status) |
+ |
+ def testSameAppOnly_InternalOnlyCalledFromWrongApp(self): |
+ feed = TestableJsonFeed() |
+ feed.CHECK_SAME_APP = True |
+ feed.mr = testing_helpers.MakeMonorailRequest() |
+ feed.mr.request.headers['X-Appengine-Inbound-Appid'] = 'wrong' |
+ self.assertIsNone(feed.get()) |
+ self.assertFalse(feed.handle_request_called) |
+ self.assertEqual(httplib.FORBIDDEN, feed.response.status) |
+ self.assertIsNone(feed.post()) |
+ self.assertFalse(feed.handle_request_called) |
+ self.assertEqual(httplib.FORBIDDEN, feed.response.status) |
+ |
+ |
+class TestableJsonFeed(jsonfeed.JsonFeed): |
+ |
+ def __init__(self, request=None): |
+ response = testing_helpers.Blank() |
+ super(TestableJsonFeed, self).__init__( |
+ request or 'req', response, services=service_manager.Services()) |
+ |
+ self.response_data = None |
+ self.handle_request_called = False |
+ self.json_data = None |
+ |
+ def HandleRequest(self, mr): |
+ self.handle_request_called = True |
+ return {'a': mr.GetParam('a')} |
+ |
+ # The output chain is hard to double so we pass on that phase, |
+ # but save the response data for inspection |
+ def _RenderJsonResponse(self, json_data): |
+ self.json_data = json_data |
+ |
+ |
+if __name__ == '__main__': |
+ unittest.main() |