/pyramidapp/pyramidapp/tests.py

https://github.com/disko/pyramid_formalchemy · Python · 269 lines · 162 code · 69 blank · 38 comment · 0 complexity · bfbcb4bec13dd2d1c731c3980477f447 MD5 · raw file

  1. import unittest2 as unittest
  2. from pyramid.config import Configurator
  3. from pyramid import testing
  4. from sqlalchemy.orm import scoped_session
  5. from sqlalchemy.orm import sessionmaker
  6. from zope.sqlalchemy import ZopeTransactionExtension
  7. import os
  8. import shutil
  9. import tempfile
  10. from webtest import TestApp
  11. from pyramidapp import main
  12. from pyramidapp import models
  13. from paste.deploy import loadapp
  14. dirname = os.path.abspath(__file__)
  15. dirname = os.path.dirname(dirname)
  16. dirname = os.path.dirname(dirname)
  17. class Test_1_UI(unittest.TestCase):
  18. config = os.path.join(dirname, 'test.ini')
  19. extra_environ = {}
  20. def setUp(self):
  21. app = loadapp('config:%s' % self.config, global_conf={'db':'sqlite://'})
  22. self.app = TestApp(app, extra_environ=self.extra_environ)
  23. self.config = Configurator(autocommit=True)
  24. self.config.begin()
  25. def test_index(self):
  26. resp = self.app.get('/')
  27. def test_1_crud(self):
  28. # index
  29. resp = self.app.get('/admin')
  30. self.assertEqual(resp.status_int, 302)
  31. assert '/admin/' in resp.location, resp
  32. resp = self.app.get('/admin/')
  33. resp.mustcontain('/admin/Foo')
  34. resp = resp.click('Foo')
  35. ## Simple model
  36. # add page
  37. resp.mustcontain('/admin/Foo/new')
  38. resp = resp.click(linkid='new')
  39. resp.mustcontain('/admin/Foo"')
  40. form = resp.forms[0]
  41. form['Foo--bar'] = 'value'
  42. resp = form.submit()
  43. assert resp.headers['location'] == 'http://localhost/admin/Foo', resp
  44. # model index
  45. resp = resp.follow()
  46. resp.mustcontain('<td>value</td>')
  47. form = resp.forms[0]
  48. resp = form.submit()
  49. # edit page
  50. form = resp.forms[0]
  51. form['Foo-1-bar'] = 'new value'
  52. #form['_method'] = 'PUT'
  53. resp = form.submit()
  54. resp = resp.follow()
  55. # model index
  56. resp.mustcontain('<td>new value</td>')
  57. # delete
  58. resp = self.app.get('/admin/Foo')
  59. resp.mustcontain('<td>new value</td>')
  60. resp = resp.forms[1].submit()
  61. resp = resp.follow()
  62. assert 'new value' not in resp, resp
  63. def test_2_model(self):
  64. # index
  65. resp = self.app.get('/foo')
  66. self.assertEqual(resp.status_int, 302)
  67. assert '/' in resp.location, resp
  68. ## Simple model
  69. resp = self.app.get('/foo/')
  70. # add page
  71. resp.mustcontain('/foo/new')
  72. resp = resp.click(linkid='new')
  73. resp.mustcontain('/foo')
  74. form = resp.forms[0]
  75. form['Foo--bar'] = 'value'
  76. resp = form.submit()
  77. assert resp.headers['location'] == 'http://localhost/foo/', resp
  78. # model index
  79. resp = resp.follow()
  80. resp.mustcontain('<td>value</td>')
  81. form = resp.forms[0]
  82. resp = form.submit()
  83. # edit page
  84. form = resp.forms[0]
  85. form['Foo-1-bar'] = 'new value'
  86. #form['_method'] = 'PUT'
  87. resp = form.submit()
  88. resp = resp.follow()
  89. # model index
  90. resp.mustcontain('<td>new value</td>')
  91. # delete
  92. resp = self.app.get('/foo/')
  93. resp.mustcontain('<td>new value</td>')
  94. resp = resp.forms[1].submit()
  95. resp = resp.follow()
  96. assert 'new value' not in resp, resp
  97. def test_3_json(self):
  98. # index
  99. response = self.app.get('/admin/json')
  100. response.mustcontain('{"models": {', '"Foo": "http://localhost/admin/Foo/json"')
  101. ## Simple model
  102. # add page
  103. response = self.app.post('/admin/Foo/json',
  104. {'bar': 'value'})
  105. data = response.json
  106. id = data['absolute_url'].split('/')[-1]
  107. response.mustcontain('"bar": "value"')
  108. # get data
  109. response = self.app.get(str(data['absolute_url']))
  110. response.mustcontain('"bar": "value"')
  111. # edit page
  112. response = self.app.post(str(data['absolute_url']), {'bar': 'new value'})
  113. response.mustcontain('"bar": "new value"')
  114. # delete
  115. response = self.app.delete(str(data['absolute_url']))
  116. self.assert_(response.json['id'] > 0)
  117. def test_4_json_prefix(self):
  118. # index
  119. response = self.app.get('/admin/json')
  120. response.mustcontain('{"models": {', '"Foo": "http://localhost/admin/Foo/json"')
  121. ## Simple model
  122. # add page
  123. response = self.app.post('/admin/Foo/json?with_prefix=True',
  124. {'Foo--bar': 'value', 'with_prefix': 'true'})
  125. data = response.json
  126. id = data['absolute_url'].split('/')[-1]
  127. response.mustcontain('"Foo-%s-bar": "value"' % id)
  128. # get data
  129. response = self.app.get(str(data['absolute_url'])+'?with_prefix=True')
  130. response.mustcontain('"Foo-%s-bar": "value"' % id)
  131. # edit page
  132. response = self.app.post(str(data['absolute_url']+'?with_prefix=True'), {'Foo-%s-bar' % id: 'new value', 'with_prefix': 'true'})
  133. response.mustcontain('"Foo-%s-bar": "new value"' % id)
  134. # delete
  135. response = self.app.delete(str(data['absolute_url']+'?with_prefix=True'))
  136. self.assert_(response.json['id'] > 0)
  137. def test_5_xhr(self):
  138. # add page
  139. resp = self.app.post('/admin/Foo/', {'Foo--bar':'value'}, extra_environ={'HTTP_X_REQUESTED_WITH':'XMLHttpRequest'})
  140. self.assertEqual(resp.content_type, 'text/plain')
  141. resp = self.app.post('/admin/Foo/1', {'Foo-1-bar':'value'}, extra_environ={'HTTP_X_REQUESTED_WITH':'XMLHttpRequest'})
  142. self.assertEqual(resp.content_type, 'text/plain')
  143. # assume all are deleted
  144. response = self.app.delete('/admin/Foo/1', extra_environ={'HTTP_X_REQUESTED_WITH':'XMLHttpRequest'})
  145. self.assertEqual(resp.content_type, 'text/plain')
  146. class Test_2_Security(Test_1_UI):
  147. config = os.path.join(dirname, 'security.ini')
  148. extra_environ = {'REMOTE_USER': 'admin'}
  149. def test_model_security(self):
  150. resp = self.app.get('/admin/', extra_environ={'REMOTE_USER': 'editor'})
  151. self.assertEqual(resp.status_int, 200)
  152. resp = self.app.get('/admin/Foo', extra_environ={'REMOTE_USER': 'editor'})
  153. self.assertEqual(resp.status_int, 200)
  154. resp = self.app.get('/admin/Foo/new', status=403, extra_environ={'REMOTE_USER': 'editor'})
  155. self.assertEqual(resp.status_int, 403)
  156. resp = self.app.get('/admin/Bar', status=403, extra_environ={'REMOTE_USER': 'editor'})
  157. self.assertEqual(resp.status_int, 403)
  158. resp = self.app.get('/admin/Bar', extra_environ={'REMOTE_USER': 'bar_manager'})
  159. self.assertEqual(resp.status_int, 200)
  160. resp = self.app.post('/admin/Bar', {'Bar--foo':'bar'}, extra_environ={'REMOTE_USER': 'bar_manager'})
  161. resp = self.app.get('/admin/Bar/1/edit', extra_environ={'REMOTE_USER': 'admin'})
  162. self.assertEqual(resp.status_int, 200)
  163. resp.mustcontain('Delete')
  164. resp = self.app.get('/admin/Bar/1/edit', extra_environ={'REMOTE_USER': 'bar_manager'})
  165. self.assertEqual(resp.status_int, 200)
  166. assert 'Delete' not in resp.body, resp.body
  167. def test_2_model(self):
  168. pass
  169. class Test_3_JQuery(Test_1_UI):
  170. config = os.path.join(dirname, 'jquery.ini')
  171. def test_1_crud(self):
  172. # index
  173. resp = self.app.get('/admin/')
  174. resp.mustcontain('/admin/Foo')
  175. resp = resp.click('Foo')
  176. ## Simple model
  177. # add page
  178. resp.mustcontain('/admin/Foo/new')
  179. resp = resp.click(linkid='new')
  180. resp.mustcontain('/admin/Foo"')
  181. form = resp.forms[0]
  182. form['Foo--bar'] = 'value'
  183. resp = form.submit()
  184. assert resp.headers['location'] == 'http://localhost/admin/Foo', resp
  185. # model index
  186. resp = resp.follow()
  187. # edit page
  188. resp = self.app.get('/admin/Foo/1/edit')
  189. form = resp.forms[0]
  190. form['Foo-1-bar'] = 'new value'
  191. #form['_method'] = 'PUT'
  192. resp = form.submit()
  193. resp = resp.follow()
  194. # model index
  195. resp.mustcontain('<td>new value</td>')
  196. # delete
  197. resp = self.app.get('/admin/Foo')
  198. resp.mustcontain('jQuery')
  199. def test_2_model(self):
  200. pass