import unittest from model import model from config import config from urls.admin import urls as app from tests.utils import cleanup try: from xml.etree.ElementTree import fromstring, tostring except: from elementtree.ElementTree import fromstring, tostring from StringIO import StringIO from urllib import urlencode import os ATOM = "http://www.w3.org/2005/Atom" XHTML = "http://www.w3.org/1999/xhtml" class APP(unittest.TestCase): def setUp(self): cleanup() """Add an entry to start.""" # Load the test configuration config.read('tests/test_comments.ini') def add(self, headers = {}): request_body = file('tests/bad.png', 'r+b') environ = { 'PATH_INFO': '/service/media/', 'REQUEST_METHOD': 'POST', 'HTTP_HOST': 'bitworking.org', 'REQUEST_URI': '/service/media/', 'wsgi.input': request_body, 'wsgi.url_scheme': 'http' } environ.update(headers) self.body = app(environ, self.start_response) def start_response(self, status, headers): self.status = status self.headers = headers def test_add(self): self.add() body = self.body # Confirm the template gets filled in properly # and that the response is right body = fromstring("".join(body)) title = body.find(".//{%s}title" % ATOM) self.assertEqual(None, title.text) self.assertEqual("201 Created", self.status) headers = dict(self.headers) self.assertTrue('etag' in headers) self.assertTrue('location' in headers) self.assertTrue('content-location' in dict(self.headers)) self.assertTrue("1-.png" in os.listdir(config.get('media', 'media_dir'))) def test_add_with_slug(self): self.add(dict(HTTP_SLUG="this is bad")) body = self.body # Confirm the template gets filled in properly # and that the response is right body = fromstring("".join(body)) title = body.find(".//{%s}title" % ATOM) self.assertEqual("this is bad", title.text) self.assertEqual("201 Created", self.status) headers = dict(self.headers) self.assertTrue('etag' in headers) self.assertTrue('location' in headers) self.assertTrue('content-location' in dict(self.headers)) self.assertTrue("1-this-is-bad.png" in os.listdir(config.get('media', 'media_dir'))) def test_get_media(self): self.add() environ = { 'PATH_INFO': '/service/media/1/;media', 'REQUEST_METHOD': 'GET', 'HTTP_HOST': 'bitworking.org', 'REQUEST_URI': '/service/media/1/;media', 'wsgi.url_scheme': 'http' } self.body = app(environ, self.start_response) self.assertEqual(self.status, "200 Ok") headers = dict(self.headers) self.assertTrue('etag' in headers) etag = headers['etag'] body = file(os.path.join(config.get('media', 'media_dir'), "1-.png"), "rb").read() self.assertEqual(body, "".join(self.body)) environ = { 'PATH_INFO': '/service/media/1/;media', 'REQUEST_METHOD': 'GET', 'HTTP_HOST': 'bitworking.org', 'REQUEST_URI': '/service/media/1/;media', 'HTTP_IF_NONE_MATCH': etag, 'wsgi.url_scheme': 'http' } self.body = app(environ, self.start_response) self.assertEqual(self.status, "304 Not Modified") def test_get_entry(self): self.add() environ = { 'PATH_INFO': '/service/media/1/', 'REQUEST_METHOD': 'GET', 'HTTP_HOST': 'bitworking.org', 'REQUEST_URI': '/service/media/1/', 'wsgi.url_scheme': 'http' } body = app(environ, self.start_response) body = fromstring("".join(body)) content = body.find(".//{%s}content" % ATOM) # Make sure content/@src is present self.assertTrue(content.attrib['src'].startswith("http:")) self.assertEqual(self.status, "200 Ok") headers = dict(self.headers) self.assertTrue('etag' in headers) def test_update_entry(self): self.add() environ = { 'PATH_INFO': '/service/media/1/', 'REQUEST_METHOD': 'GET', 'HTTP_HOST': 'bitworking.org', 'REQUEST_URI': '/service/media/1/', 'wsgi.url_scheme': 'http' } body = app(environ, self.start_response) body = fromstring("".join(body)) content = body.find(".//{%s}content" % ATOM) # Make sure content/@src is present self.assertTrue(content.attrib['src'].startswith("http:")) self.assertEqual(self.status, "200 Ok") headers = dict(self.headers) etag = headers['etag'] summary = body.find(".//{%s}summary/{%s}div" % (ATOM, XHTML)) self.assertEqual(summary.text, " Created with The GIMP") summary.text = "Shot on Canon PowerShot A70" # Now update request_body = StringIO(tostring(body)) environ = { 'PATH_INFO': '/service/media/1/', 'REQUEST_METHOD': 'PUT', 'HTTP_HOST': 'bitworking.org', 'REQUEST_URI': '/service/media/1/', 'HTTP_IF_MATCH': etag, 'wsgi.input': request_body, 'wsgi.url_scheme': 'http' } body = app(environ, self.start_response) self.assertEqual(self.status, "200 Ok") # Do a GET and confirm the change was saved environ = { 'PATH_INFO': '/service/media/1/', 'REQUEST_METHOD': 'GET', 'HTTP_HOST': 'bitworking.org', 'REQUEST_URI': '/service/media/1/', 'wsgi.url_scheme': 'http' } body = app(environ, self.start_response) body = fromstring("".join(body)) self.assertEqual(self.status, "200 Ok") summary = body.find(".//{%s}summary/{%s}div" % (ATOM, XHTML)) self.assertEqual(summary.text, "Shot on Canon PowerShot A70") #summary.text = "Shot on Canon PowerShot A70" def test_update_media(self): self.add() request_body = file('tests/good.png', 'r+b') environ = { 'PATH_INFO': '/service/media/1/;media', 'REQUEST_METHOD': 'PUT', 'HTTP_HOST': 'bitworking.org', 'REQUEST_URI': '/service/media/1/;media', 'HTTP_IF_MATCH': '"*"', 'wsgi.input': request_body, 'wsgi.url_scheme': 'http' } body = app(environ, self.start_response) self.assertEqual(self.status, "200 Ok") environ = { 'PATH_INFO': '/service/media/1/;media', 'REQUEST_METHOD': 'GET', 'HTTP_HOST': 'bitworking.org', 'REQUEST_URI': '/service/media/1/;media', 'wsgi.url_scheme': 'http' } self.body = app(environ, self.start_response) self.assertEqual(self.status, "200 Ok") headers = dict(self.headers) self.assertTrue('etag' in headers) etag = headers['etag'] body = file('tests/good.png', "rb").read() self.assertEqual(body, "".join(self.body)) def test_delete_entry(self): self.add() self.assertTrue("1-.png" in os.listdir(config.get('media', 'media_dir'))) environ = { 'PATH_INFO': '/service/media/1/', 'REQUEST_METHOD': 'DELETE', 'HTTP_HOST': 'bitworking.org', 'REQUEST_URI': '/service/media/1/', 'wsgi.url_scheme': 'http' } self.body = app(environ, self.start_response) self.assertEqual(self.status, "200 Ok") self.assertFalse("1-.png" in os.listdir(config.get('media', 'media_dir'))) def test_delete_media(self): self.add() environ = { 'PATH_INFO': '/service/media/1/;media', 'REQUEST_METHOD': 'DELETE', 'HTTP_HOST': 'bitworking.org', 'REQUEST_URI': '/service/media/1/;media', 'wsgi.url_scheme': 'http' } self.body = app(environ, self.start_response) self.assertEqual(self.status, "405 Method Not Allowed") self.assertTrue("1-.png" in os.listdir(config.get('media', 'media_dir')))