Skip to content

Commit

Permalink
Some tests
Browse files Browse the repository at this point in the history
not nearly enough: need to cover interaction with allows and condreq
  • Loading branch information
justanr committed May 15, 2018
1 parent 335ff7a commit 0c21b04
Show file tree
Hide file tree
Showing 4 changed files with 105 additions and 2 deletions.
1 change: 1 addition & 0 deletions .coveragerc
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ exclude_lines =
if False:
if __name__ == .__main__.:
@abstractmethod
return NotImplemented

fail_under = 80
precision = 2
Expand Down
4 changes: 4 additions & 0 deletions src/flask_allows/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from .allows import Allows, allows # noqa
from .overrides import Override, OverrideManager, overrides # noqa
from .permission import Permission # noqa
from .requirements import (And, C, ConditionalRequirement, Not, Or,
Requirement, wants_request) # noqa
Expand All @@ -12,6 +13,9 @@
'ConditionalRequirement',
'Not',
'Or',
'Override',
'OverrideManager',
'overrides'
'Permission',
'PermissionedMethodView',
'PermissionedView'
Expand Down
4 changes: 2 additions & 2 deletions src/flask_allows/overrides.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ def current(self):
return None

@contextmanager
def override(self, requirement, *requirements, use_parent=False):
self.push(Override(requirement, *requirements), use_parent)
def override(self, override, use_parent=False):
self.push(override, use_parent)
yield self
self.pop()
98 changes: 98 additions & 0 deletions test/test_override.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
import pytest
from flask_allows.overrides import (Override, OverrideManager,
_override_ctx_stack, overrides)
from flask_allows.requirements import Requirement


def some_requirement(user):
return True


def some_other_requirement(user):
return False


class AClassRequirement(Requirement):

def __init__(self, the_value):
self.the_value = the_value

def fulfill(self, user):
return True

def __hash__(self):
return hash(self.the_value)

def __eq__(self, other):
return isinstance(
other, AClassRequirement
) and self.the_value == other.the_value


class TestOverride(object):

def test_shows_if_requirement_is_overridden(self):
override = Override(some_requirement)
assert override.is_overridden(some_requirement)
assert some_requirement in override

def test_can_add_two_overrides_together(self):
override_1 = Override(some_requirement)
override_2 = Override(some_other_requirement)
added_override = override_1 + override_2
assert some_requirement in added_override
assert some_other_requirement in added_override

def test_can_inplace_add_two_overrides(self):
override_1 = Override(some_requirement)
override_1 += Override(some_other_requirement)
assert some_requirement in override_1
assert some_other_requirement in override_1

def test_can_take_the_difference_of_two_overrides(self):
override_1 = Override(some_requirement, some_other_requirement)
override_2 = Override(some_other_requirement)
subbed_override = override_1 - override_2
assert some_requirement in subbed_override
assert some_other_requirement not in subbed_override

def test_can_take_the_difference_of_two_overrides_in_place(self):
override_1 = Override(some_other_requirement, some_requirement)
override_1 -= Override(some_other_requirement)
assert some_requirement in override_1
assert some_other_requirement not in override_1

def test_can_add_single_requirement_to_override(self):
override = Override()
override.add(some_requirement)
assert some_requirement in override

def test_can_remove_a_requirement_from_override(self):
override = Override(some_requirement)
override.remove(some_requirement)
assert some_requirement not in override


class TestOverrideManager(object):

def test_override_manager_populates_overrides_local(self):
manager = OverrideManager()
override = Override(some_requirement)
manager.push(override)
assert some_requirement in overrides

def test_manager_throws_if_different_context_popped(self):
assert _override_ctx_stack.top is None
manager = OverrideManager()
manager.push(Override())
manager2 = OverrideManager()

with pytest.raises(RuntimeError) as excinfo:
manager2.pop()

assert 'popped wrong override context' in str(excinfo.value)

@pytest.mark.fixture(autouse=True)
def pop_til_you_stop(self):
while _override_ctx_stack.top is not None:
_override_ctx_stack.pop()

0 comments on commit 0c21b04

Please sign in to comment.