feat: add basic support for wutta-continuum
and i mean *basic* - so far.. eventually will expose version history for viewing etc. unfortunately got carried away and reorganized the api docs a little while i was at it..
This commit is contained in:
parent
24f5ee1dcc
commit
71728718d8
53 changed files with 308 additions and 76 deletions
0
tests/db/__init__.py
Normal file
0
tests/db/__init__.py
Normal file
38
tests/db/test_continuum.py
Normal file
38
tests/db/test_continuum.py
Normal file
|
@ -0,0 +1,38 @@
|
|||
# -*- coding: utf-8; -*-
|
||||
|
||||
from unittest.mock import patch, MagicMock
|
||||
|
||||
import pytest
|
||||
|
||||
from tests.util import WebTestCase
|
||||
|
||||
from wuttaweb.db import continuum as mod
|
||||
|
||||
|
||||
class TestWuttaWebContinuumPlugin(WebTestCase):
|
||||
|
||||
def setUp(self):
|
||||
if not hasattr(mod, 'WuttaWebContinuumPlugin'):
|
||||
pytest.skip("test not relevant without sqlalchemy-continuum")
|
||||
self.setup_web()
|
||||
|
||||
def make_plugin(self):
|
||||
return mod.WuttaWebContinuumPlugin()
|
||||
|
||||
def test_get_remote_addr(self):
|
||||
plugin = self.make_plugin()
|
||||
|
||||
with patch.object(mod, 'get_current_request', return_value=None):
|
||||
self.assertIsNone(plugin.get_remote_addr(None, self.session))
|
||||
|
||||
self.request.client_addr = '127.0.0.1'
|
||||
self.assertEqual(plugin.get_remote_addr(None, self.session), '127.0.0.1')
|
||||
|
||||
def test_get_user_id(self):
|
||||
plugin = self.make_plugin()
|
||||
|
||||
with patch.object(mod, 'get_current_request', return_value=None):
|
||||
self.assertIsNone(plugin.get_user_id(None, self.session))
|
||||
|
||||
self.request.user = MagicMock(uuid='some-random-uuid')
|
||||
self.assertEqual(plugin.get_user_id(None, self.session), 'some-random-uuid')
|
|
@ -19,6 +19,9 @@ class TestObjectRefWidget(WebTestCase):
|
|||
kwargs.setdefault('renderer', deform.Form.default_renderer)
|
||||
return deform.Field(node, **kwargs)
|
||||
|
||||
def make_widget(self, **kwargs):
|
||||
return mod.ObjectRefWidget(self.request, **kwargs)
|
||||
|
||||
def test_serialize(self):
|
||||
model = self.app.model
|
||||
person = model.Person(full_name="Betty Boop")
|
||||
|
@ -27,7 +30,7 @@ class TestObjectRefWidget(WebTestCase):
|
|||
|
||||
# standard (editable)
|
||||
node = colander.SchemaNode(PersonRef(self.request, session=self.session))
|
||||
widget = mod.ObjectRefWidget(self.request)
|
||||
widget = self.make_widget()
|
||||
field = self.make_field(node)
|
||||
html = widget.serialize(field, person.uuid)
|
||||
self.assertIn('<b-select ', html)
|
||||
|
@ -35,7 +38,7 @@ class TestObjectRefWidget(WebTestCase):
|
|||
# readonly
|
||||
node = colander.SchemaNode(PersonRef(self.request, session=self.session))
|
||||
node.model_instance = person
|
||||
widget = mod.ObjectRefWidget(self.request)
|
||||
widget = self.make_widget()
|
||||
field = self.make_field(node)
|
||||
html = widget.serialize(field, person.uuid, readonly=True)
|
||||
self.assertIn('Betty Boop', html)
|
||||
|
@ -44,13 +47,26 @@ class TestObjectRefWidget(WebTestCase):
|
|||
# with hyperlink
|
||||
node = colander.SchemaNode(PersonRef(self.request, session=self.session))
|
||||
node.model_instance = person
|
||||
widget = mod.ObjectRefWidget(self.request, url=lambda p: '/foo')
|
||||
widget = self.make_widget(url=lambda p: '/foo')
|
||||
field = self.make_field(node)
|
||||
html = widget.serialize(field, person.uuid, readonly=True)
|
||||
self.assertIn('Betty Boop', html)
|
||||
self.assertIn('<a', html)
|
||||
self.assertIn('href="/foo"', html)
|
||||
|
||||
def test_get_template_values(self):
|
||||
model = self.app.model
|
||||
person = model.Person(full_name="Betty Boop")
|
||||
self.session.add(person)
|
||||
self.session.commit()
|
||||
|
||||
node = colander.SchemaNode(PersonRef(self.request, session=self.session))
|
||||
widget = self.make_widget()
|
||||
field = self.make_field(node)
|
||||
values = widget.get_template_values(field, person.uuid, {})
|
||||
self.assertIn('cstruct', values)
|
||||
self.assertNotIn('url', values)
|
||||
|
||||
|
||||
class TestFileDownloadWidget(WebTestCase):
|
||||
|
||||
|
|
|
@ -480,6 +480,27 @@ class TestGetModelFields(TestCase):
|
|||
fields = mod.get_model_fields(self.config, model.Setting)
|
||||
self.assertEqual(fields, ['name', 'value'])
|
||||
|
||||
def test_avoid_versions(self):
|
||||
model = self.app.model
|
||||
|
||||
mapper = MagicMock(iterate_properties = [
|
||||
MagicMock(key='uuid'),
|
||||
MagicMock(key='full_name'),
|
||||
MagicMock(key='first_name'),
|
||||
MagicMock(key='middle_name'),
|
||||
MagicMock(key='last_name'),
|
||||
MagicMock(key='versions'),
|
||||
])
|
||||
|
||||
with patch.object(mod, 'sa') as sa:
|
||||
sa.inspect.return_value = mapper
|
||||
|
||||
with patch.object(self.app, 'continuum_is_enabled', return_value=True):
|
||||
fields = mod.get_model_fields(self.config, model.Person)
|
||||
# nb. no versions field
|
||||
self.assertEqual(set(fields), set(['uuid', 'full_name', 'first_name',
|
||||
'middle_name', 'last_name']))
|
||||
|
||||
|
||||
class TestGetCsrfToken(TestCase):
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue