fix: add "is false or null" grid filter, for nullable bool columns
This commit is contained in:
parent
a9caf3f970
commit
f68fe26ada
2 changed files with 82 additions and 7 deletions
|
@ -328,9 +328,15 @@ class TestBooleanAlchemyFilter(WebTestCase):
|
|||
|
||||
model = self.app.model
|
||||
self.sample_data = [
|
||||
{'username': 'alice', 'active': True},
|
||||
{'username': 'bob', 'active': True},
|
||||
{'username': 'charlie', 'active': False},
|
||||
{'username': 'alice',
|
||||
'prevent_edit': False,
|
||||
'active': True},
|
||||
{'username': 'bob',
|
||||
'prevent_edit': True,
|
||||
'active': True},
|
||||
{'username': 'charlie',
|
||||
'active': False,
|
||||
'prevent_edit': None},
|
||||
]
|
||||
for user in self.sample_data:
|
||||
user = model.User(**user)
|
||||
|
@ -343,6 +349,34 @@ class TestBooleanAlchemyFilter(WebTestCase):
|
|||
kwargs['model_property'] = model_property
|
||||
return factory(self.request, model_property.key, **kwargs)
|
||||
|
||||
def test_get_verbs(self):
|
||||
model = self.app.model
|
||||
|
||||
# bool field, not nullable
|
||||
filtr = self.make_filter(model.User.active,
|
||||
factory=mod.BooleanAlchemyFilter,
|
||||
nullable=False)
|
||||
self.assertFalse(hasattr(filtr, 'verbs'))
|
||||
self.assertEqual(filtr.default_verbs, ['is_true', 'is_false'])
|
||||
|
||||
# by default, returns default verbs (plus 'is_any')
|
||||
self.assertEqual(filtr.get_verbs(), ['is_true', 'is_false', 'is_any'])
|
||||
|
||||
# default verbs can be a callable
|
||||
filtr.default_verbs = lambda: ['foo', 'bar']
|
||||
self.assertEqual(filtr.get_verbs(), ['foo', 'bar', 'is_any'])
|
||||
|
||||
# bool field, *nullable*
|
||||
filtr = self.make_filter(model.User.active,
|
||||
factory=mod.BooleanAlchemyFilter,
|
||||
nullable=True)
|
||||
self.assertFalse(hasattr(filtr, 'verbs'))
|
||||
self.assertEqual(filtr.default_verbs, ['is_true', 'is_false'])
|
||||
|
||||
# effective verbs also include is_false_null
|
||||
self.assertEqual(filtr.get_verbs(), ['is_true', 'is_false', 'is_false_null',
|
||||
'is_null', 'is_not_null', 'is_any'])
|
||||
|
||||
def test_coerce_value(self):
|
||||
model = self.app.model
|
||||
filtr = self.make_filter(model.User.active)
|
||||
|
@ -377,6 +411,16 @@ class TestBooleanAlchemyFilter(WebTestCase):
|
|||
self.assertIsNot(filtered_query, self.sample_query)
|
||||
self.assertEqual(filtered_query.count(), 1)
|
||||
|
||||
def test_filter_is_false_null(self):
|
||||
model = self.app.model
|
||||
filtr = self.make_filter(model.User.prevent_edit)
|
||||
self.assertEqual(self.sample_query.count(), 3)
|
||||
|
||||
# nb. only one account is marked with "prevent edit"
|
||||
filtered_query = filtr.filter_is_false_null(self.sample_query, None)
|
||||
self.assertIsNot(filtered_query, self.sample_query)
|
||||
self.assertEqual(filtered_query.count(), 2)
|
||||
|
||||
|
||||
class TestVerbNotSupported(TestCase):
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue