blob: be501de6f5d6fe2faf478773cc1f969057aee72b [file] [log] [blame]
# -*- coding: utf-8 -*-
#
# Copyright (c) The PyAMF Project.
# See LICENSE.txt for details.
"""
Google Web App gateway tests.
@since: 0.3.1
"""
import unittest
import os
from StringIO import StringIO
try:
from google.appengine.ext import webapp
from pyamf.remoting.gateway import google as google
except ImportError:
webapp = None
if os.environ.get('SERVER_SOFTWARE', None) is None:
# we're not being run in appengine environment (at one that we are known to
# work in)
webapp = None
import pyamf
from pyamf import remoting
class BaseTestCase(unittest.TestCase):
"""
"""
def setUp(self):
if not webapp:
self.skipTest("'google' is not available")
class WebAppGatewayTestCase(BaseTestCase):
def setUp(self):
BaseTestCase.setUp(self)
self.gw = google.WebAppGateway()
self.environ = {
'wsgi.input': StringIO(),
'wsgi.output': StringIO()
}
self.request = webapp.Request(self.environ)
self.response = webapp.Response()
self.gw.initialize(self.request, self.response)
def test_get(self):
self.gw.get()
self.assertEqual(self.response.__dict__['_Response__status'][0], 405)
def test_bad_request(self):
self.environ['wsgi.input'].write('Bad request')
self.environ['wsgi.input'].seek(0, 0)
self.gw.post()
self.assertEqual(self.response.__dict__['_Response__status'][0], 400)
def test_unknown_request(self):
self.environ['wsgi.input'].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')
self.environ['wsgi.input'].seek(0, 0)
self.gw.post()
self.assertEqual(self.response.__dict__['_Response__status'][0], 200)
envelope = remoting.decode(self.response.out.getvalue())
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):
self.executed = False
def test(request):
self.assertEqual(self.request, request)
self.assertTrue(hasattr(self.request, 'amf_request'))
self.executed = True
self.gw.expose_request = True
self.gw.addService(test, 'test.test')
self.environ['wsgi.input'].write('\x00\x00\x00\x00\x00\x01\x00\x09'
'test.test\x00\x02/1\x00\x00\x00\x05\x0a\x00\x00\x00\x00')
self.environ['wsgi.input'].seek(0, 0)
self.gw.post()
self.assertTrue(self.executed)
def test_timezone(self):
import datetime
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
self.gw.addService(echo)
self.gw.timezone_offset = -18000
msg = remoting.Envelope(amfVersion=pyamf.AMF0)
msg['/1'] = remoting.Request(target='echo', body=[now])
stream = remoting.encode(msg)
self.environ['wsgi.input'] = stream
self.gw.post()
envelope = remoting.decode(self.response.out.getvalue())
message = envelope['/1']
self.assertEqual(message.body, now)
self.assertTrue(self.executed)