PageRenderTime 48ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/ptah/manage/tests/test_sqla.py

https://github.com/ptahproject/ptah
Python | 457 lines | 427 code | 30 blank | 0 comment | 2 complexity | 3eef51d7740adfb23741e188f4fa7bc8 MD5 | raw file
  1. import sqlalchemy as sqla
  2. from webob.multidict import MultiDict
  3. from pyramid.testing import DummyRequest
  4. from pyramid.compat import text_type
  5. from pyramid.httpexceptions import HTTPFound
  6. from pyramid.view import render_view_to_response
  7. import ptah
  8. from ptah.testing import PtahTestCase
  9. TestSqlaModuleContent = None
  10. class TestSqlaModuleTable(ptah.get_base()):
  11. __tablename__ = 'test_sqla_table'
  12. __table_args__ = {'extend_existing': True}
  13. id = sqla.Column('id', sqla.Integer, primary_key=True)
  14. name = sqla.Column(sqla.Unicode(255))
  15. class TestSqlaModuleBase(ptah.get_base()):
  16. __tablename__ = 'ptah_nodes'
  17. __table_args__ = {'extend_existing': True}
  18. __mapper_args__ = {'polymorphic_identity': 'node'}
  19. id = sqla.Column(sqla.Integer(), primary_key=True)
  20. name = sqla.Column(sqla.Unicode(), default=text_type('123'))
  21. class TestSqlaModule(PtahTestCase):
  22. def setUp(self):
  23. global TestSqlaModuleContent
  24. Base = ptah.get_base()
  25. ptah.get_session()
  26. @ptah.tinfo('Test')
  27. class TestSqlaModuleContent(TestSqlaModuleBase):
  28. __tablename__ = 'test_sqla_content'
  29. __table_args__ = {'extend_existing': True}
  30. __mapper_args__ = {'polymorphic_identity': 'content'}
  31. id = sqla.Column(
  32. sqla.Integer(),
  33. sqla.ForeignKey('ptah_nodes.id'), primary_key=True)
  34. title = sqla.Column(sqla.Unicode())
  35. super(TestSqlaModule, self).setUp()
  36. def test_sqla_module(self):
  37. from ptah.manage.manage import PtahManageRoute
  38. from ptah.manage.sqla import SQLAModule, Table
  39. request = DummyRequest()
  40. cfg = ptah.get_settings(ptah.CFG_ID_PTAH, self.registry)
  41. cfg['managers'] = ['*']
  42. mr = PtahManageRoute(request)
  43. mod = mr['sqla']
  44. self.assertIsInstance(mod, SQLAModule)
  45. self.assertRaises(KeyError, mod.__getitem__, 'psqla-unknown')
  46. self.assertRaises(KeyError, mod.__getitem__, 'unknown')
  47. table = mod['psqla-ptah_tokens']
  48. self.assertIsInstance(table, Table)
  49. def test_sqla_traverse(self):
  50. from ptah.manage.sqla import SQLAModule, Table
  51. request = DummyRequest()
  52. mod = SQLAModule(None, request)
  53. table = mod['psqla-ptah_nodes']
  54. self.assertIsInstance(table, Table)
  55. self.assertRaises(KeyError, mod.__getitem__, 'unknown')
  56. def test_sqla_view(self):
  57. from ptah.manage.sqla import SQLAModule
  58. request = self.make_request()
  59. mod = SQLAModule(None, request)
  60. res = render_view_to_response(mod, request, '', False)
  61. self.assertEqual(res.status, '200 OK')
  62. def test_sqla_table_view(self):
  63. from ptah.manage.sqla import SQLAModule
  64. request = self.make_request()
  65. mod = SQLAModule(None, request)
  66. table = mod['psqla-ptah_tokens']
  67. res = render_view_to_response(table, request, '', False)
  68. self.assertEqual(res.status, '200 OK')
  69. self.assertIn('form.buttons.add', res.text)
  70. def test_sqla_table_view_model(self):
  71. from ptah.manage.sqla import SQLAModule
  72. ptah.get_session().add(TestSqlaModuleContent(title='test'))
  73. request = self.make_request()
  74. mod = SQLAModule(None, request)
  75. table = mod['psqla-test_sqla_content']
  76. res = render_view_to_response(table, request, '', False).text
  77. self.assertIn('Inherits from:', res)
  78. self.assertIn('ptah_node', res)
  79. self.assertNotIn('form.buttons.add', res)
  80. def test_sqla_table_view_model_nodes(self):
  81. from ptah.manage.sqla import SQLAModule
  82. rec = TestSqlaModuleContent(title='test')
  83. ptah.get_session().add(rec)
  84. ptah.get_session().flush()
  85. #uri = rec.__uri__
  86. #type_uri = rec.__type__.__uri__
  87. request = DummyRequest(params={'batch': 1})
  88. mod = SQLAModule(None, request)
  89. table = mod['psqla-ptah_nodes']
  90. render_view_to_response(table, request, '', False).text
  91. #self.assertIn(url_quote_plus(uri), res)
  92. #self.assertIn(url_quote_plus(type_uri), res)
  93. request = DummyRequest(params={'batch': 'unknown'})
  94. render_view_to_response(table, request, '', False).text
  95. #self.assertIn(url_quote_plus(uri), res)
  96. request = DummyRequest(params={'batch': '0'})
  97. render_view_to_response(table, request, '', False).text
  98. #self.assertIn(url_quote_plus(uri), res)
  99. def test_sqla_table_view_inheritance(self):
  100. from ptah.manage.sqla import SQLAModule
  101. request = self.make_request()
  102. mod = SQLAModule(None, request)
  103. table = mod['psqla-ptah_tokens']
  104. res = render_view_to_response(table, request, '', False)
  105. self.assertEqual(res.status, '200 OK')
  106. def test_sqla_table_traverse(self):
  107. from ptah.manage.sqla import SQLAModule, Record
  108. from ptah.settings import SettingRecord
  109. inst = SettingRecord(name='test', value='12345')
  110. ptah.get_session().add(inst)
  111. ptah.get_session().flush()
  112. mod = SQLAModule(None, DummyRequest())
  113. table = mod['psqla-ptah_settings']
  114. rec = table[str(inst.name)]
  115. self.assertIsInstance(rec, Record)
  116. self.assertEqual(rec.pname, 'name')
  117. self.assertIsNotNone(rec.pcolumn)
  118. self.assertIsNotNone(rec.data)
  119. self.assertRaises(KeyError, table.__getitem__, 'add.html')
  120. self.assertRaises(KeyError, table.__getitem__, 'unknown')
  121. def test_sqla_table_addrec_basics(self):
  122. from ptah.manage.sqla import SQLAModule, AddRecord
  123. request = self.make_request()
  124. mod = SQLAModule(None, request)
  125. table = mod['psqla-test_sqla_table']
  126. form = AddRecord(table, request)
  127. form.update()
  128. self.assertEqual(form.label, 'test_sqla_table: new record')
  129. request = DummyRequest(
  130. POST={'form.buttons.back': 'Back'})
  131. form = AddRecord(table, request)
  132. res = form()
  133. self.assertIsInstance(res, HTTPFound)
  134. self.assertEqual(res.headers['location'], '.')
  135. def test_sqla_table_addrec_create(self):
  136. from ptah.manage.sqla import SQLAModule, AddRecord
  137. request = self.make_request()
  138. mod = SQLAModule(None, request)
  139. table = mod['psqla-test_sqla_table']
  140. request = self.make_request(
  141. POST={'form.buttons.create': 'Create'})
  142. form = AddRecord(table, request)
  143. form.csrf = False
  144. form.update_form()
  145. self.assertIn('Please fix indicated errors',
  146. request.render_messages())
  147. request = self.make_request(
  148. POST={'form.buttons.create': 'Create',
  149. 'name': 'Test'})
  150. form = AddRecord(table, request)
  151. form.csrf = False
  152. res = form()
  153. self.assertIn('Table record has been created.',
  154. request.render_messages())
  155. self.assertIsInstance(res, HTTPFound)
  156. rec = ptah.get_session().query(TestSqlaModuleTable).first()
  157. self.assertEqual(rec.name, 'Test')
  158. def test_sqla_table_addrec_create_multi(self):
  159. from ptah.manage.sqla import SQLAModule, AddRecord
  160. request = self.make_request()
  161. mod = SQLAModule(None, request)
  162. table = mod['psqla-test_sqla_table']
  163. request = self.make_request(
  164. POST={'form.buttons.createmulti': 'Create'})
  165. form = AddRecord(table, request)
  166. form.csrf = False
  167. form.update_form()
  168. self.assertIn('Please fix indicated errors',
  169. request.render_messages())
  170. request = self.make_request(
  171. POST={'form.buttons.createmulti': 'Create',
  172. 'name': 'Test multi'})
  173. form = AddRecord(table, request)
  174. form.csrf = False
  175. form.update_form()
  176. self.assertIn('Table record has been created.',
  177. request.render_messages())
  178. rec = ptah.get_session().query(TestSqlaModuleTable).first()
  179. self.assertEqual(rec.name, 'Test multi')
  180. def test_sqla_table_editrec_basics(self):
  181. from ptah.manage.sqla import SQLAModule, EditRecord
  182. rec = TestSqlaModuleTable()
  183. rec.name = 'Test record'
  184. ptah.get_session().add(rec)
  185. ptah.get_session().flush()
  186. rec_id = rec.id
  187. request = self.make_request()
  188. mod = SQLAModule(None, request)
  189. table = mod['psqla-test_sqla_table']
  190. rec = table[rec_id]
  191. form = EditRecord(rec, request)
  192. form.update_form()
  193. self.assertEqual(form.label, 'record 1')
  194. self.assertEqual(form.form_content(),
  195. {'name': 'Test record'})
  196. request = DummyRequest(
  197. POST={'form.buttons.cancel': 'Cancel'})
  198. form = EditRecord(rec, request)
  199. res = form()
  200. self.assertIsInstance(res, HTTPFound)
  201. self.assertEqual(res.headers['location'], '..')
  202. def test_sqla_table_editrec_modify(self):
  203. from ptah.manage.sqla import SQLAModule, EditRecord
  204. rec = TestSqlaModuleTable()
  205. rec.name = 'Test record'
  206. ptah.get_session().add(rec)
  207. ptah.get_session().flush()
  208. rec_id = rec.id
  209. mod = SQLAModule(None, DummyRequest())
  210. table = mod['psqla-test_sqla_table']
  211. rec = table[rec_id]
  212. request = self.make_request(
  213. POST={'form.buttons.modify': 'Modify'})
  214. form = EditRecord(rec, request)
  215. form.csrf = False
  216. form.update_form()
  217. self.assertIn('Please fix indicated errors',
  218. request.render_messages())
  219. request = self.make_request(
  220. POST={'form.buttons.modify': 'Modify',
  221. 'name': 'Record modified'})
  222. form = EditRecord(rec, request)
  223. form.csrf = False
  224. res = form()
  225. self.assertIn('Table record has been modified.',
  226. request.render_messages())
  227. self.assertIsInstance(res, HTTPFound)
  228. self.assertEqual(res.headers['location'], '..')
  229. rec = ptah.get_session().query(TestSqlaModuleTable).filter(
  230. TestSqlaModuleTable.id == rec_id).first()
  231. self.assertEqual(rec.name, 'Record modified')
  232. def test_sqla_table_editrec_remove(self):
  233. from ptah.manage.sqla import SQLAModule, EditRecord
  234. rec = TestSqlaModuleTable()
  235. rec.name = 'Test record'
  236. ptah.get_session().add(rec)
  237. ptah.get_session().flush()
  238. rec_id = rec.id
  239. mod = SQLAModule(None, DummyRequest())
  240. table = mod['psqla-test_sqla_table']
  241. rec = table[rec_id]
  242. request = self.make_request(
  243. POST={'form.buttons.remove': 'Remove'})
  244. form = EditRecord(rec, request)
  245. form.csrf = False
  246. res = form()
  247. self.assertIn('Table record has been removed.',
  248. request.render_messages())
  249. self.assertIsInstance(res, HTTPFound)
  250. self.assertEqual(res.headers['location'], '..')
  251. rec = ptah.get_session().query(TestSqlaModuleTable).filter(
  252. TestSqlaModuleTable.id == rec_id).first()
  253. self.assertIsNone(rec, None)
  254. def test_sqla_table_add(self):
  255. from ptah.manage.sqla import SQLAModule, TableView
  256. mod = SQLAModule(None, DummyRequest())
  257. table = mod['psqla-test_sqla_table']
  258. request = DummyRequest(
  259. POST={'form.buttons.add': 'Add'})
  260. form = TableView(table, request)
  261. res = form()
  262. self.assertIsInstance(res, HTTPFound)
  263. self.assertEqual(res.headers['location'], 'add.html')
  264. def test_sqla_table_remove(self):
  265. from ptah.manage.sqla import SQLAModule, TableView
  266. rec = TestSqlaModuleTable()
  267. rec.name = 'Test record'
  268. ptah.get_session().add(rec)
  269. ptah.get_session().flush()
  270. rec_id = rec.id
  271. request = self.make_request()
  272. mod = SQLAModule(None, request)
  273. table = mod['psqla-test_sqla_table']
  274. request = self.make_request(
  275. POST=MultiDict([('form.buttons.remove', 'Remove')]))
  276. form = TableView(table, request)
  277. form.csrf = False
  278. form.update_form()
  279. self.assertIn('lease select records for removing.',
  280. request.render_messages())
  281. request = self.make_request(
  282. POST=MultiDict([('form.buttons.remove', 'Remove'),
  283. ('rowid', 'wrong')]))
  284. form = TableView(table, request)
  285. form.csrf = False
  286. form.update_form()
  287. #self.assertIn('Please select records for removing.',
  288. # request.render_messages())
  289. request = self.make_request(
  290. POST=MultiDict([('form.buttons.remove', 'Remove'),
  291. ('rowid', rec_id),
  292. ('csrf-token',
  293. self.request.session.get_csrf_token())]))
  294. form = TableView(table, request)
  295. form.csrf = True
  296. form.update_form()
  297. self.assertIn('Select records have been removed.',
  298. request.render_messages())
  299. rec = ptah.get_session().query(TestSqlaModuleTable).filter(
  300. TestSqlaModuleTable.id == rec_id).first()
  301. self.assertIsNone(rec, None)
  302. def test_sqla_table_no_remove_for_edit_model(self):
  303. from ptah.manage.sqla import SQLAModule, EditRecord
  304. rec = TestSqlaModuleContent()
  305. rec.name = 'Test record'
  306. ptah.get_session().add(rec)
  307. ptah.get_session().flush()
  308. rec_id = rec.id
  309. mod = SQLAModule(None, DummyRequest())
  310. table = mod['psqla-test_sqla_content']
  311. rec = table[rec_id]
  312. form = EditRecord(rec, self.make_request())
  313. form.update()
  314. self.assertNotIn('form.buttons.remove', form.render())