blob: 1ee9374aff3ed7dc277d0ad2b4a8680d77b26d07 [file] [log] [blame]
# -*- coding: utf-8 -*-
#
# Copyright (c) The PyAMF Project.
# See LICENSE.txt for details.
"""
Django gateway tests.
@since: 0.1.0
"""
import unittest
import sys
import os
try:
from django import http
from pyamf.remoting.gateway import django
except ImportError:
django = None
import pyamf
from pyamf import remoting, util
class BaseTestCase(unittest.TestCase):
"""
"""
def setUp(self):
if not django:
self.skipTest("'django' not available")
class DjangoGatewayTestCase(BaseTestCase):
def setUp(self):
BaseTestCase.setUp(self)
import new
self.mod_name = '%s.%s' % (__name__, 'settings')
sys.modules[self.mod_name] = new.module(self.mod_name)
self.old_env = os.environ.get('DJANGO_SETTINGS_MODULE', None)
os.environ['DJANGO_SETTINGS_MODULE'] = self.mod_name
def tearDown(self):
if self.old_env is not None:
os.environ['DJANGO_SETTINGS_MODULE'] = self.old_env
del sys.modules[self.mod_name]
def test_csrf(self):
gw = django.DjangoGateway()
self.assertTrue(gw.csrf_exempt)
def test_settings(self):
from django import conf
settings_mod = sys.modules[self.mod_name]
settings_mod.DEBUG = True
settings_mod.AMF_TIME_OFFSET = 1000
old_settings = conf.settings
conf.settings = conf.Settings(self.mod_name)
gw = django.DjangoGateway()
try:
self.assertTrue(gw.debug)
self.assertEqual(gw.timezone_offset, 1000)
finally:
conf.settings = old_settings
def test_request_method(self):
gw = django.DjangoGateway()
http_request = http.HttpRequest()
http_request.method = 'GET'
http_response = gw(http_request)
self.assertEqual(http_response.status_code, 405)
def test_bad_request(self):
gw = django.DjangoGateway()
request = util.BufferedByteStream()
request.write('Bad request')
request.seek(0, 0)
http_request = http.HttpRequest()
http_request.method = 'POST'
http_request.raw_post_data = request.getvalue()
http_response = gw(http_request)
self.assertEqual(http_response.status_code, 400)
def test_unknown_request(self):
gw = django.DjangoGateway()
request = util.BufferedByteStream()
request.write('\x00\x00\x00\x00\x00\x01\x00\x09test.test\x00'
'\x02/1\x00\x00\x00\x14\x0a\x00\x00\x00\x01\x08\x00\x00\x00\x00'
'\x00\x01\x61\x02\x00\x01\x61\x00\x00\x09')
request.seek(0, 0)
http_request = http.HttpRequest()
http_request.method = 'POST'
http_request.raw_post_data = request.getvalue()
http_response = gw(http_request)
envelope = remoting.decode(http_response.content)
message = envelope['/1']
self.assertEqual(message.status, remoting.STATUS_ERROR)
body = message.body
self.assertTrue(isinstance(body, remoting.ErrorFault))
self.assertEqual(body.code, 'Service.ResourceNotFound')
def test_expose_request(self):
http_request = http.HttpRequest()
self.executed = False
def test(request):
self.assertEqual(http_request, request)
self.assertTrue(hasattr(request, 'amf_request'))
self.executed = True
gw = django.DjangoGateway({'test.test': test}, expose_request=True)
request = util.BufferedByteStream()
request.write('\x00\x00\x00\x00\x00\x01\x00\x09test.test\x00'
'\x02/1\x00\x00\x00\x05\x0a\x00\x00\x00\x00')
request.seek(0, 0)
http_request.method = 'POST'
http_request.raw_post_data = request.getvalue()
gw(http_request)
self.assertTrue(self.executed)
def _raiseException(self, e, *args, **kwargs):
raise e()
def test_really_bad_decode(self):
self.old_method = remoting.decode
remoting.decode = lambda *args, **kwargs: self._raiseException(Exception, *args, **kwargs)
http_request = http.HttpRequest()
http_request.method = 'POST'
http_request.raw_post_data = ''
gw = django.DjangoGateway()
try:
http_response = gw(http_request)
except:
remoting.decode = self.old_method
raise
remoting.decode = self.old_method
self.assertTrue(isinstance(http_response, http.HttpResponseServerError))
self.assertEqual(http_response.status_code, 500)
self.assertEqual(http_response.content, '500 Internal Server Error\n\nAn unexpected error occurred.')
def test_expected_exceptions_decode(self):
self.old_method = remoting.decode
gw = django.DjangoGateway()
http_request = http.HttpRequest()
http_request.method = 'POST'
http_request.raw_post_data = ''
try:
for x in (KeyboardInterrupt, SystemExit):
remoting.decode = lambda *args, **kwargs: self._raiseException(x, *args, **kwargs)
self.assertRaises(x, gw, http_request)
except:
remoting.decode = self.old_method
raise
remoting.decode = self.old_method
def test_timezone(self):
import datetime
http_request = http.HttpRequest()
self.executed = False
td = datetime.timedelta(hours=-5)
now = datetime.datetime.utcnow()
def echo(d):
self.assertEqual(d, now + td)
self.executed = True
return d
gw = django.DjangoGateway({'test.test': echo}, timezone_offset=-18000,
expose_request=False)
msg = remoting.Envelope(amfVersion=pyamf.AMF0)
msg['/1'] = remoting.Request(target='test.test', body=[now])
http_request.method = 'POST'
http_request.raw_post_data = remoting.encode(msg).getvalue()
res = remoting.decode(gw(http_request).content)
self.assertTrue(self.executed)
self.assertEqual(res['/1'].body, now)