def test_read_if_already_a_member_renders_template(share_group_request, renderers): """It should render the "Share this group" template.""" views.read(share_group_request) assert renderers.render_to_response.call_args[1]['renderer_name'] == ( 'h:templates/groups/share.html.jinja2')
def test_read_decodes_hashid(hashids): request = _mock_request(matchdict={"hashid": "abc", "slug": "slug"}) views.read(request) hashids.decode.assert_called_once_with( request, "h.groups", "abc")
def test_read_duplicate_documents_are_removed(Group, search, renderers, uri, presenters): """ If the group has multiple annotations whose uris all normalize to the same uri, only the document_link of the first one of these annotations should be sent to the template. """ presenters.AnnotationHTMLPresenter = MockAnnotationHTMLPresenter request = mock.Mock(matchdict=_matchdict()) g = Group.get_by_pubid.return_value = mock.Mock(slug=mock.sentinel.slug) user = request.authenticated_user = mock.Mock() user.groups = [g] # The user is a member of the group. annotations = [{'uri': 'uri_1'}, {'uri': 'uri_2'}, {'uri': 'uri_3'}] search.search.return_value = {'rows': annotations, 'total': 3} def normalize(uri): # All annotations' URIs normalize to the same URI. return "normalized" uri.normalize.side_effect = normalize views.read(request) assert ( renderers.render_to_response.call_args[1]['value']['document_links'] == ["document_link_1"])
def test_read_if_not_logged_in_passes_group(Group, renderers): """It should pass the group to the template.""" g = Group.get_by_pubid.return_value = mock.Mock(slug=mock.sentinel.slug) request = _mock_request(authenticated_userid=None, matchdict=_matchdict()) views.read(request) assert renderers.render_to_response.call_args[1]['value']['group'] == g
def test_redirects_if_slug_incorrect(self, pyramid_request): group = FakeGroup('abc123', 'some-slug') pyramid_request.matchdict['slug'] = 'another-slug' with pytest.raises(HTTPMovedPermanently) as exc: views.read(group, pyramid_request) assert exc.value.location == '/g/abc123/some-slug'
def test_read_decodes_hashid(hashids): matchdict = _matchdict() request = _mock_request(matchdict=matchdict) views.read(request) hashids.decode.assert_called_once_with( request, "h.groups", matchdict["hashid"])
def test_read_if_not_logged_in_renders_share_group_page(Group, renderers): """If not logged in should render the "Login to join this group" page.""" Group.get_by_pubid.return_value = mock.Mock(slug=mock.sentinel.slug) request = _mock_request(authenticated_userid=None, matchdict=_matchdict()) views.read(request) assert renderers.render_to_response.call_args[1]["renderer_name"] == ("h:groups/templates/join.html.jinja2")
def test_read_if_already_a_member_passes_group_to_template(share_group_request, Group, renderers): """It passes the group to the template.""" views.read(share_group_request) assert renderers.render_to_response.call_args[1]['value']['group'] == ( Group.get_by_pubid.return_value)
def test_read_if_not_logged_in_renders_share_group_page(Group, renderers): """If not logged in should render the "Login to join this group" page.""" Group.get_by_pubid.return_value = mock.Mock(slug=mock.sentinel.slug) request = _mock_request(authenticated_userid=None, matchdict=_matchdict()) views.read(request) assert renderers.render_to_response.call_args[1]['renderer_name'] == ( 'h:templates/groups/join.html.jinja2')
def test_read_if_already_a_member_gets_group_url(Group, share_group_request): share_group_request.route_url = mock.Mock() views.read(share_group_request) share_group_request.route_url.assert_called_once_with( 'group_read', pubid=Group.get_by_pubid.return_value.pubid, slug=Group.get_by_pubid.return_value.slug)
def test_read_if_already_a_member_passes_group_url_to_template( share_group_request, renderers): share_group_request.route_url = mock.Mock() views.read(share_group_request) assert renderers.render_to_response.call_args[1]['value']['group_url'] == ( share_group_request.route_url.return_value)
def test_read_if_already_a_member_renders_template(Group, renderers): """It should render the "Share this group" template.""" request = _mock_request(matchdict=_matchdict()) g = Group.get_by_pubid.return_value = mock.Mock(slug=mock.sentinel.slug) user = request.authenticated_user = mock.Mock() user.groups = [g] # The user is a member of the group. views.read(request) assert renderers.render_to_response.call_args[1]["renderer_name"] == ("h:groups/templates/share.html.jinja2")
def test_read_if_already_a_member_renders_template(Group, renderers): """It should render the "Share this group" template.""" request = _mock_request(matchdict=_matchdict()) g = Group.get_by_pubid.return_value = mock.Mock(slug=mock.sentinel.slug) user = request.authenticated_user = mock.Mock() user.groups = [g] # The user is a member of the group. views.read(request) assert renderers.render_to_response.call_args[1]['renderer_name'] == ( 'h:templates/groups/share.html.jinja2')
def test_read_if_already_a_member_passes_group(Group, renderers): """It passes the group to the template.""" request = _mock_request(matchdict=_matchdict()) g = Group.get_by_pubid.return_value = mock.Mock(slug=mock.sentinel.slug) user = request.authenticated_user = mock.Mock() user.groups = [g] # The user is a member of the group. views.read(request) assert renderers.render_to_response.call_args[1]['value']['group'] == g
def test_read_if_not_a_member_passes_group_to_template(Group, renderers): """It should get the join URL and pass it to the template.""" request = _mock_request(matchdict=_matchdict()) g = Group.get_by_pubid.return_value = mock.Mock(slug=mock.sentinel.slug) user = request.authenticated_user = mock.Mock() user.groups = [] # The user isn't a member of the group. views.read(request) assert renderers.render_to_response.call_args[1]['value']['group'] == g
def test_read_if_not_a_member_renders_template(Group, renderers): """It should render the "Join this group" template.""" request = _mock_request(matchdict=_matchdict()) Group.get_by_pubid.return_value = mock.Mock(slug=mock.sentinel.slug) user = request.authenticated_user = mock.Mock() user.groups = [] # The user isn't a member of the group. views.read(request) assert renderers.render_to_response.call_args[1]['renderer_name'] == ( 'h:templates/groups/join.html.jinja2')
def test_read_calls_search_correctly(Group, search, renderers): """It should call search() with the right args to get the annotations.""" request = _mock_request(matchdict=_matchdict()) g = Group.get_by_pubid.return_value = mock.Mock(slug=mock.sentinel.slug) user = request.authenticated_user = mock.Mock() user.groups = [g] # The user is a member of the group. renderers.render_to_response.return_value = mock.sentinel.response views.read(request) search.search.assert_called_once_with(request, private=False, params={"group": g.pubid, "limit": 1000})
def test_read_if_already_a_member_when_group_has_no_annotated_documents( Group, share_group_request, presenters, renderers): Group.get_by_pubid.return_value.documents.return_value = [] views.read(share_group_request) assert not presenters.DocumentHTMLPresenter.called assert renderers.render_to_response.call_args[1]['value']['document_links'] == []
def test_read_calls_search_correctly(Group, search, renderers): """It should call search() with the right args to get the annotations.""" request = _mock_request(matchdict=_matchdict()) g = Group.get_by_pubid.return_value = mock.Mock(slug=mock.sentinel.slug) user = request.authenticated_user = mock.Mock() user.groups = [g] # The user is a member of the group. renderers.render_to_response.return_value = mock.sentinel.response views.read(request) search.search.assert_called_once_with( request, private=False, params={"group": g.pubid, "limit": 1000})
def test_read_if_not_a_member_renders_template( Group, User, renderers): """It should render the "Join this group" template.""" request = _mock_request(matchdict=_matchdict()) Group.get_by_id.return_value = mock.Mock(slug=mock.sentinel.slug) user = User.get_by_userid.return_value = mock.Mock() user.groups = [] # The user isn't a member of the group. views.read(request) assert renderers.render_to_response.call_args[1]['renderer_name'] == ( 'h:groups/templates/join.html.jinja2')
def test_read_if_not_a_member_passes_join_url_to_template( Group, User, renderers): """It should get the join URL and pass it to the template.""" request = _mock_request(matchdict=_matchdict()) request.route_url.return_value = mock.sentinel.join_url Group.get_by_id.return_value = mock.Mock(slug=mock.sentinel.slug) user = User.get_by_userid.return_value = mock.Mock() user.groups = [] # The user isn't a member of the group. views.read(request) assert renderers.render_to_response.call_args[1]['value']['join_url'] == ( mock.sentinel.join_url)
def test_read_if_not_a_member_passes_join_url_to_template( Group, User, renderers): """It should get the join URL and pass it to the template.""" request = _mock_request(matchdict=_matchdict()) request.route_url.return_value = mock.sentinel.join_url Group.get_by_hashid.return_value = mock.Mock(slug=mock.sentinel.slug) user = User.get_by_userid.return_value = mock.Mock() user.groups = [] # The user isn't a member of the group. views.read(request) assert renderers.render_to_response.call_args[1]['value']['join_url'] == ( mock.sentinel.join_url)
def test_read_if_already_a_member_passes_group_url( Group, User, logic, renderers): """It gets the url from url_for_group() and passes it to the template.""" request = _mock_request(matchdict=_matchdict()) group = Group.get_by_id.return_value = mock.Mock(slug=mock.sentinel.slug) user = User.get_by_userid.return_value = mock.Mock() user.groups = [group] # The user is a member of the group. logic.url_for_group.return_value = mock.sentinel.group_url views.read(request) logic.url_for_group.assert_called_once_with(request, group) assert renderers.render_to_response.call_args[1]['value']['group_url'] == ( mock.sentinel.group_url)
def test_read_if_already_a_member_passes_document_links_to_template( Group, share_group_request, presenters, renderers): """It should pass the document links to the template.""" document_1 = mock.Mock() document_2 = mock.Mock() document_3 = mock.Mock() Group.get_by_pubid.return_value.documents.return_value = [ document_1, document_2, document_3] views.read(share_group_request) assert renderers.render_to_response.call_args[1]['value']['document_links'] == [ 'document_link_1', 'document_link_2', 'document_link_3']
def test_read_if_not_a_member_encodes_hashid_from_groupid( Group, User, hashids): """It should encode the hashid from the groupid. And use it to get the join URL from route_url(). """ request = _mock_request(matchdict=_matchdict()) group = Group.get_by_id.return_value = mock.Mock(slug=mock.sentinel.slug) user = User.get_by_userid.return_value = mock.Mock() user.groups = [] # The user isn't a member of the group. hashids.encode.return_value = mock.sentinel.hashid views.read(request) assert hashids.encode.call_args[1]['number'] == group.id assert request.route_url.call_args[1]['hashid'] == mock.sentinel.hashid
def test_read_returns_the_group(Group): group = Group.get_by_id.return_value group.slug = 'slug' template_data = views.read(_mock_request( matchdict={"hashid": "1", "slug": "slug"})) assert template_data["group"] == group
def test_read_returns_document_links(Group, search, renderers, uri, presenters): """It should return the list of document links.""" presenters.AnnotationHTMLPresenter = MockAnnotationHTMLPresenter request = mock.Mock(matchdict=_matchdict()) g = Group.get_by_pubid.return_value = mock.Mock(slug=mock.sentinel.slug) user = request.authenticated_user = mock.Mock() user.groups = [g] # The user is a member of the group. annotations = [{'uri': 'uri_1'}, {'uri': 'uri_2'}, {'uri': 'uri_3'}] search.search.return_value = {'rows': annotations, 'total': 3} def normalize(uri): return uri + "_normalized" uri.normalize.side_effect = normalize views.read(request) assert (renderers.render_to_response.call_args[1]['value']['document_links'] == ["document_link_1", "document_link_2", "document_link_3"])
def test_read_if_already_a_member_presents_documents(Group, share_group_request, presenters): """It should call DocumentHTMLPresenter with each annotation.""" document_1 = mock.Mock() document_2 = mock.Mock() document_3 = mock.Mock() Group.get_by_pubid.return_value.documents.return_value = [ document_1, document_2, document_3] views.read(share_group_request) presenters.DocumentHTMLPresenter.assert_has_calls( [mock.call(document_1), mock.call(document_2), mock.call(document_3)], any_order=True )
def test_read_if_not_logged_in_returns_response(Group, renderers): """It should return the response from render_to_response().""" Group.get_by_pubid.return_value = mock.Mock(slug=mock.sentinel.slug) request = _mock_request(authenticated_userid=None, matchdict=_matchdict()) renderers.render_to_response.return_value = mock.sentinel.response response = views.read(request) assert response == mock.sentinel.response
def test_read_if_not_a_member_returns_response(Group, User, renderers): """It should return the response from render_to_response().""" request = _mock_request(matchdict=_matchdict()) Group.get_by_id.return_value = mock.Mock(slug=mock.sentinel.slug) user = User.get_by_userid.return_value = mock.Mock() user.groups = [] # The user isn't a member of the group. renderers.render_to_response.return_value = mock.sentinel.response assert views.read(request) == mock.sentinel.response
def test_read_with_wrong_slug_redirects(Group): """/groups/<pubid>/<wrong> should redirect to /groups/<pubid>/<slug>.""" group = Group.get_by_pubid.return_value = mock.Mock(slug="my-group") matchdict = {"pubid": "1", "slug": "my-gro"} # Wrong slug. request = _mock_request(matchdict=matchdict) result = views.read(request) assert isinstance(result, httpexceptions.HTTPRedirection)
def test_read_if_already_a_member_returns_response(Group, renderers): """It should return the response from render_to_response().""" request = _mock_request(matchdict=_matchdict()) g = Group.get_by_pubid.return_value = mock.Mock(slug=mock.sentinel.slug) user = request.authenticated_user = mock.Mock() user.groups = [g] # The user is a member of the group. renderers.render_to_response.return_value = mock.sentinel.response assert views.read(request) == mock.sentinel.response
def test_read_if_not_a_member_returns_response(Group, User, renderers): """It should return the response from render_to_response().""" request = _mock_request(matchdict=_matchdict()) Group.get_by_hashid.return_value = mock.Mock(slug=mock.sentinel.slug) user = User.get_by_userid.return_value = mock.Mock() user.groups = [] # The user isn't a member of the group. renderers.render_to_response.return_value = mock.sentinel.response assert views.read(request) == mock.sentinel.response
def test_read_without_slug_redirects(Group): """/groups/<hashid> should redirect to /groups/<hashid>/<slug>.""" group = Group.get_by_hashid.return_value = mock.Mock() matchdict = {"hashid": "1"} # No slug. request = _mock_request(matchdict=matchdict) result = views.read(request) assert isinstance(result, httpexceptions.HTTPRedirection)
def test_read_with_wrong_slug_redirects(Group, logic): """/groups/<hashid>/<wrong> should redirect to /groups/<hashid>/<slug>.""" group = Group.get_by_id.return_value = mock.Mock(slug="my-group") matchdict = {"hashid": "1", "slug": "my-gro"} # Wrong slug. request = _mock_request(matchdict=matchdict) logic.url_for_group.return_value = "/1/my-group" redirect = views.read(request) logic.url_for_group.assert_called_once_with(request, group) assert redirect.location == "/1/my-group"
def test_renders_join_template_if_not_member(self, pyramid_config, pyramid_request): group = FakeGroup('abc123', 'some-slug') pyramid_config.testing_securitypolicy('bohus', permissive=False) pyramid_request.matchdict['slug'] = 'some-slug' result = views.read(group, pyramid_request) assert 'join.html' in pyramid_request.override_renderer assert result == {'group': group}
def test_read_documents_are_truncated(Group, search, renderers, uri, presenters): """It should send at most 25 document links to the template.""" presenters.AnnotationHTMLPresenter = MockAnnotationHTMLPresenter request = mock.Mock(matchdict=_matchdict()) g = Group.get_by_pubid.return_value = mock.Mock(slug=mock.sentinel.slug) user = request.authenticated_user = mock.Mock() user.groups = [g] # The user is a member of the group. annotations = [{'uri': 'uri_{n}'.format(n=n)} for n in range(50)] search.search.return_value = {'rows': annotations, 'total': 50} def normalize(uri): return uri + "_normalized" uri.normalize.side_effect = normalize views.read(request) assert (len( renderers.render_to_response.call_args[1]['value']['document_links']) == 25)
def test_returns_template_context(self, patch, pyramid_request): group = FakeGroup('abc123', 'some-slug') group.documents = lambda: ['d1', 'd2'] link = patch('h.presenters.DocumentHTMLPresenter.link', autospec=None, new_callable=mock.PropertyMock) link.side_effect = ['link1', 'link2'] pyramid_request.matchdict['slug'] = 'some-slug' result = views.read(group, pyramid_request) assert result['group'] == group assert result['document_links'] == ['link1', 'link2']
def test_read_with_wrong_slug_redirects(Group): """/groups/<hashid>/<wrong> should redirect to /groups/<hashid>/<slug>.""" Group.return_value = mock.Mock(slug="my-group") matchdict = {"hashid": "1", "slug": "my-gro"} request = _mock_request( matchdict=matchdict, route_url=mock.Mock(return_value="/1/my-group")) redirect = views.read(request) assert request.route_url.called_with( "group_read", hashid="1", slug="my-group") assert redirect.location == "/1/my-group"
def test_read_404s_if_groups_feature_is_off(): with pytest.raises(httpexceptions.HTTPNotFound): views.read(_mock_request(feature=lambda feature: False))
def test_read_gets_group_by_id(Group, hashids): hashids.decode.return_value = 1 views.read(_mock_request(matchdict=_matchdict())) Group.get_by_id.assert_called_once_with(1)
def test_read_gets_group_by_pubid(Group): views.read(_mock_request(matchdict={'pubid': 'abc', 'slug': 'snail'})) Group.get_by_pubid.assert_called_once_with('abc')
def test_read_404s_when_group_does_not_exist(Group): Group.get_by_pubid.return_value = None with pytest.raises(httpexceptions.HTTPNotFound): views.read(_mock_request(matchdict=_matchdict()))