def test_create_place_errors(db): user, token = generate_user() with session_scope() as session: create_community(session, 0, 2, "Root node", [user], [], None) with pages_session(token) as api: with pytest.raises(grpc.RpcError) as e: api.CreatePlace( pages_pb2.CreatePlaceReq( title=None, content="dummy content", address="dummy address", location=pages_pb2.Coordinate( lat=1, lng=1, ), )) assert e.value.code() == grpc.StatusCode.INVALID_ARGUMENT assert e.value.details() == errors.MISSING_PAGE_TITLE with pages_session(token) as api: with pytest.raises(grpc.RpcError) as e: api.CreatePlace( pages_pb2.CreatePlaceReq( title="dummy title", content=None, address="dummy address", location=pages_pb2.Coordinate( lat=1, lng=1, ), )) assert e.value.code() == grpc.StatusCode.INVALID_ARGUMENT assert e.value.details() == errors.MISSING_PAGE_CONTENT with pages_session(token) as api: with pytest.raises(grpc.RpcError) as e: api.CreatePlace( pages_pb2.CreatePlaceReq( title="dummy title", content="dummy content", address=None, location=pages_pb2.Coordinate( lat=1, lng=1, ), )) assert e.value.code() == grpc.StatusCode.INVALID_ARGUMENT assert e.value.details() == errors.MISSING_PAGE_ADDRESS with pages_session(token) as api: with pytest.raises(grpc.RpcError) as e: api.CreatePlace( pages_pb2.CreatePlaceReq( title="dummy title", content="dummy content", address="dummy address", )) assert e.value.code() == grpc.StatusCode.INVALID_ARGUMENT assert e.value.details() == errors.MISSING_PAGE_LOCATION
def test_list_other_user_guides(db): user1, token1 = generate_user() user2, token2 = generate_user() with session_scope() as session: c_id = create_community(session, 0, 2, "Root node", [user1], [], None).id with pages_session(token1) as api: guide1_id = api.CreateGuide( pages_pb2.CreateGuideReq( title="dummy title", content="dummy content", address="dummy address", location=pages_pb2.Coordinate( lat=1, lng=1, ), parent_community_id=c_id, )).page_id guide2_id = api.CreateGuide( pages_pb2.CreateGuideReq( title="dummy title 2", content="dummy content 2", address="dummy address 2", location=pages_pb2.Coordinate( lat=1, lng=1, ), parent_community_id=c_id, )).page_id with pages_session(token2) as api: res = api.ListUserGuides(pages_pb2.ListUserGuidesReq(user_id=user1.id)) assert [p.page_id for p in res.guides] == [guide1_id, guide2_id]
def test_list_user_places(db): user1, token1 = generate_user() with session_scope() as session: c_id = create_community(session, 0, 2, "Root node", [user1], [], None).id with pages_session(token1) as api: place1_id = api.CreatePlace( pages_pb2.CreatePlaceReq( title="dummy title", content="dummy content", address="dummy address", location=pages_pb2.Coordinate( lat=1, lng=1, ), )).page_id place2_id = api.CreatePlace( pages_pb2.CreatePlaceReq( title="dummy title 2", content="dummy content 2", address="dummy address 2", location=pages_pb2.Coordinate( lat=1, lng=1, ), )).page_id with pages_session(token1) as api: res = api.ListUserPlaces(pages_pb2.ListUserPlacesReq()) assert [p.page_id for p in res.places] == [place1_id, place2_id]
def test_owner_not_moderator(db): """ You can be the owner of content yet not have moderation rights """ user1, token1 = generate_user() user2, token2 = generate_user() with session_scope() as session: c_id = create_community(session, 0, 2, "Root node", [user1], [], None).id # user2 makes page, is owner but not moderator, so can edit, not moderate with pages_session(token2) as api: res = api.CreatePlace( pages_pb2.CreatePlaceReq( title="dummy title", content="dummy content", address="dummy address", location=pages_pb2.Coordinate( lat=1, lng=1, ), )) assert res.title == "dummy title" assert res.content == "dummy content" assert res.address == "dummy address" assert res.location.lat == 1 assert res.location.lng == 1 assert res.slug == "dummy-title" assert res.last_editor_user_id == user2.id assert res.creator_user_id == user2.id assert res.owner_user_id == user2.id assert not res.owner_community_id assert not res.owner_group_id assert res.editor_user_ids == [user2.id] assert res.can_edit assert not res.can_moderate page_id = res.page_id # user1 is not owner so can't edit but can moderate with pages_session(token1) as api: res = api.GetPage(pages_pb2.GetPageReq(page_id=page_id)) assert res.title == "dummy title" assert res.content == "dummy content" assert res.address == "dummy address" assert res.location.lat == 1 assert res.location.lng == 1 assert res.slug == "dummy-title" assert res.last_editor_user_id == user2.id assert res.creator_user_id == user2.id assert res.owner_user_id == user2.id assert not res.owner_community_id assert not res.owner_group_id assert res.editor_user_ids == [user2.id] assert not res.can_edit assert res.can_moderate
def test_LeaveGroup_regression(db): # see test_LeaveCommunity_regression # admin user1, token1 = generate_user(username="******", geom=create_1d_point(200), geom_radius=0.1) # joiner/leaver user2, token2 = generate_user(username="******", geom=create_1d_point(201), geom_radius=0.1) with session_scope() as session: c0 = create_community(session, 0, 100, "Community 0", [user1], [], None) g1 = create_group(session, "Group 1", [user1], [], c0) g2 = create_group(session, "Group 2", [user1], [], c0) g1_id = g1.id g2_id = g2.id enforce_community_memberships() with groups_session(token1) as api: assert api.GetGroup(groups_pb2.GetGroupReq(group_id=g1_id)).member assert api.GetGroup(groups_pb2.GetGroupReq(group_id=g2_id)).member with groups_session(token2) as api: # first check we're not in any groups assert not api.GetGroup(groups_pb2.GetGroupReq(group_id=g1_id)).member assert not api.GetGroup(groups_pb2.GetGroupReq(group_id=g2_id)).member # join some groups api.JoinGroup(groups_pb2.JoinGroupReq(group_id=g1_id)) api.JoinGroup(groups_pb2.JoinGroupReq(group_id=g2_id)) # check memberships assert api.GetGroup(groups_pb2.GetGroupReq(group_id=g1_id)).member assert api.GetGroup(groups_pb2.GetGroupReq(group_id=g2_id)).member # leave just g2 api.LeaveGroup(groups_pb2.LeaveGroupReq(group_id=g2_id)) # check memberships assert api.GetGroup(groups_pb2.GetGroupReq(group_id=g1_id)).member assert not api.GetGroup(groups_pb2.GetGroupReq(group_id=g2_id)).member
def test_update_page_errors(db): user, token = generate_user() with session_scope() as session: c_id = create_community(session, 0, 2, "Root node", [user], [], None).id with pages_session(token) as api: page_id = api.CreatePlace( pages_pb2.CreatePlaceReq( title="dummy title", content="dummy content", address="dummy address", location=pages_pb2.Coordinate( lat=1, lng=1, ), )).page_id with pytest.raises(grpc.RpcError) as e: api.UpdatePage( pages_pb2.UpdatePageReq( page_id=page_id, title=wrappers_pb2.StringValue(value=""), )) assert e.value.code() == grpc.StatusCode.INVALID_ARGUMENT assert e.value.details() == errors.MISSING_PAGE_TITLE with pytest.raises(grpc.RpcError) as e: api.UpdatePage( pages_pb2.UpdatePageReq( page_id=page_id, content=wrappers_pb2.StringValue(value=""), )) assert e.value.code() == grpc.StatusCode.INVALID_ARGUMENT assert e.value.details() == errors.MISSING_PAGE_CONTENT with pytest.raises(grpc.RpcError) as e: api.UpdatePage( pages_pb2.UpdatePageReq( page_id=page_id, address=wrappers_pb2.StringValue(value=""), )) assert e.value.code() == grpc.StatusCode.INVALID_ARGUMENT assert e.value.details() == errors.MISSING_PAGE_ADDRESS
def test_get_page(db): user1, token1 = generate_user() user2, token2 = generate_user() with session_scope() as session: c_id = create_community(session, 0, 2, "Root node", [user1], [], None).id with pages_session(token1) as api: time_before_create = now() page_id = api.CreatePlace( pages_pb2.CreatePlaceReq( title="dummy title", content="dummy content", address="dummy address", location=pages_pb2.Coordinate( lat=1, lng=1, ), )).page_id with pages_session(token2) as api: time_before_get = now() res = api.GetPage(pages_pb2.GetPageReq(page_id=page_id)) assert res.title == "dummy title" assert res.content == "dummy content" assert res.address == "dummy address" assert res.location.lat == 1 assert res.location.lng == 1 assert res.slug == "dummy-title" assert time_before_create < to_aware_datetime( res.created) < time_before_get assert time_before_create < to_aware_datetime( res.last_edited) < time_before_get assert res.last_editor_user_id == user1.id assert res.creator_user_id == user1.id assert res.owner_user_id == user1.id assert not res.owner_community_id assert not res.owner_group_id assert res.editor_user_ids == [user1.id] assert not res.can_edit assert not res.can_moderate
def test_create_page_place(db): user, token = generate_user() with session_scope() as session: c_id = create_community(session, 0, 2, "Root node", [user], [], None).id with pages_session(token) as api: time_before = now() res = api.CreatePlace( pages_pb2.CreatePlaceReq( title="dummy !#¤%&/-*' title", content="dummy content", address="dummy address", location=pages_pb2.Coordinate( lat=1, lng=1, ), )) assert res.title == "dummy !#¤%&/-*' title" assert res.type == pages_pb2.PAGE_TYPE_PLACE assert res.content == "dummy content" assert res.address == "dummy address" assert res.location.lat == 1 assert res.location.lng == 1 assert res.slug == "dummy-title" assert time_before < to_aware_datetime(res.created) < now() assert time_before < to_aware_datetime(res.last_edited) < now() assert res.last_editor_user_id == user.id assert res.creator_user_id == user.id assert res.owner_user_id == user.id assert not res.owner_community_id assert not res.owner_group_id assert res.editor_user_ids == [user.id] assert res.can_edit assert res.can_moderate
def test_page_constraints(db): user, token = generate_user() with session_scope() as session: c_id = create_community(session, 0, 2, "Root node", [user], [], None).id # check we can't create a page without an owner with pytest.raises(IntegrityError) as e: with session_scope() as session: page = Page( parent_node_id=c_id, # note no owner creator_user_id=user.id, type=PageType.guide, thread=Thread(), ) session.add(page) session.add( PageVersion( page=page, editor_user_id=user.id, title=f"Title", content="Content", )) assert "violates check constraint" in str(e.value) assert "one_owner" in str(e.value) with session_scope() as session: node = Node(geom=to_multi( create_polygon_lat_lng([[0, 0], [0, 2], [2, 2], [2, 0], [0, 0]]))) session.add(node) cluster = Cluster( name=f"Testing Community", description=f"Description for testing community", parent_node=node, ) session.add(cluster) session.flush() cluster_parent_id = cluster.parent_node_id cluster_id = cluster.id # check we can't create a page with two owners with pytest.raises(IntegrityError) as e: with session_scope() as session: page = Page( parent_node_id=cluster_parent_id, creator_user_id=user.id, owner_cluster_id=cluster_id, owner_user_id=user.id, type=PageType.guide, thread=Thread(), ) session.add(page) session.add( PageVersion( page=page, editor_user_id=user.id, title=f"Title", content="Content", )) assert "violates check constraint" in str(e.value) assert "one_owner" in str(e.value) # main page must be owned by the right cluster with pytest.raises(IntegrityError) as e: with session_scope() as session: main_page = Page( parent_node_id=cluster_parent_id, # note owner is not cluster creator_user_id=user.id, owner_user_id=user.id, type=PageType.main_page, thread=Thread(), ) session.add(main_page) session.add( PageVersion( page=main_page, editor_user_id=user.id, title=f"Main page for the testing community", content="Empty.", )) assert "violates check constraint" in str(e.value) assert "main_page_owned_by_cluster" in str(e.value) # can only have one main page with pytest.raises(IntegrityError) as e: with session_scope() as session: main_page1 = Page( parent_node_id=cluster_parent_id, creator_user_id=user.id, owner_cluster_id=cluster_id, type=PageType.main_page, thread=Thread(), ) session.add(main_page1) session.add( PageVersion( page=main_page1, editor_user_id=user.id, title=f"Main page 1 for the testing community", content="Empty.", )) main_page2 = Page( parent_node_id=cluster_parent_id, creator_user_id=user.id, owner_cluster_id=cluster_id, type=PageType.main_page, thread=Thread(), ) session.add(main_page2) session.add( PageVersion( page=main_page2, editor_user_id=user.id, title=f"Main page 2 for the testing community", content="Empty.", )) assert "violates unique constraint" in str(e.value) assert "ix_pages_owner_cluster_id_type" in str(e.value)
def test_create_guide_errors(db): user, token = generate_user() with session_scope() as session: c_id = create_community(session, 0, 2, "Root node", [user], [], None).id with pages_session(token) as api: with pytest.raises(grpc.RpcError) as e: api.CreateGuide( pages_pb2.CreateGuideReq( title=None, content="dummy content", parent_community_id=c_id, )) assert e.value.code() == grpc.StatusCode.INVALID_ARGUMENT assert e.value.details() == errors.MISSING_PAGE_TITLE with pages_session(token) as api: with pytest.raises(grpc.RpcError) as e: api.CreateGuide( pages_pb2.CreateGuideReq( title="dummy title", content=None, parent_community_id=c_id, )) assert e.value.code() == grpc.StatusCode.INVALID_ARGUMENT assert e.value.details() == errors.MISSING_PAGE_CONTENT with pages_session(token) as api: with pytest.raises(grpc.RpcError) as e: api.CreateGuide( pages_pb2.CreateGuideReq( title="dummy title", content="dummy content", )) assert e.value.code() == grpc.StatusCode.INVALID_ARGUMENT assert e.value.details() == errors.MISSING_PAGE_PARENT with pages_session(token) as api: with pytest.raises(grpc.RpcError) as e: api.CreateGuide( pages_pb2.CreateGuideReq( title="dummy title", content="dummy content", parent_community_id=9999, )) assert e.value.code() == grpc.StatusCode.INVALID_ARGUMENT assert e.value.details() == errors.COMMUNITY_NOT_FOUND with pages_session(token) as api: with pytest.raises(grpc.RpcError) as e: api.CreateGuide( pages_pb2.CreateGuideReq( title="dummy title", content="dummy content", address="dummy address", parent_community_id=c_id, )) assert e.value.code() == grpc.StatusCode.INVALID_ARGUMENT assert e.value.details() == errors.INVALID_GUIDE_LOCATION with pages_session(token) as api: with pytest.raises(grpc.RpcError) as e: api.CreateGuide( pages_pb2.CreateGuideReq( title="dummy title", content="dummy content", location=pages_pb2.Coordinate( lat=1, lng=1, ), parent_community_id=c_id, )) assert e.value.code() == grpc.StatusCode.INVALID_ARGUMENT assert e.value.details() == errors.INVALID_GUIDE_LOCATION
def test_page_photo(db): user, token = generate_user() with session_scope() as session: c_id = create_community(session, 0, 2, "Root node", [user], [], None).id with pages_session(token) as api: key1 = random_hex(32) filename1 = random_hex(32) with session_scope() as session: session.add( Upload( key=key1, filename=filename1, creator_user_id=user.id, )) res = api.CreatePlace( pages_pb2.CreatePlaceReq( title="dummy title", content="dummy content", photo_key=key1, address="dummy address", location=pages_pb2.Coordinate( lat=1, lng=1, ), )) assert filename1 in res.photo_url # can't create with non-existent photo with pytest.raises(grpc.RpcError) as e: api.CreatePlace( pages_pb2.CreatePlaceReq( title="dummy title", content="dummy content", photo_key="nonexisten", address="dummy address", location=pages_pb2.Coordinate( lat=1, lng=1, ), )) assert e.value.code() == grpc.StatusCode.INVALID_ARGUMENT assert e.value.details() == errors.PHOTO_NOT_FOUND # can create page with no photo res = api.CreatePlace( pages_pb2.CreatePlaceReq( title="dummy title", content="dummy content", address="dummy address", location=pages_pb2.Coordinate( lat=1, lng=1, ), )) assert res.photo_url == "" page_id = res.page_id # can't set it to non-existent stuff with pytest.raises(grpc.RpcError) as e: api.UpdatePage( pages_pb2.UpdatePageReq( page_id=page_id, photo_key=wrappers_pb2.StringValue( value="non-existent id"), )) assert e.value.code() == grpc.StatusCode.INVALID_ARGUMENT assert e.value.details() == errors.PHOTO_NOT_FOUND key2 = random_hex(32) filename2 = random_hex(32) with session_scope() as session: session.add( Upload( key=key2, filename=filename2, creator_user_id=user.id, )) res = api.UpdatePage( pages_pb2.UpdatePageReq( page_id=page_id, photo_key=wrappers_pb2.StringValue(value=key2), )) assert filename2 in res.photo_url # can unset it res = api.UpdatePage( pages_pb2.UpdatePageReq( page_id=page_id, photo_key=wrappers_pb2.StringValue(value=""), )) assert res.photo_url == ""
def test_update_page(db): user, token = generate_user() with session_scope() as session: c_id = create_community(session, 0, 2, "Root node", [user], [], None).id with pages_session(token) as api: time_before_create = now() page_id = api.CreatePlace( pages_pb2.CreatePlaceReq( title="dummy title", content="dummy content", address="dummy address", location=pages_pb2.Coordinate( lat=1, lng=1, ), )).page_id time_before_update = now() api.UpdatePage( pages_pb2.UpdatePageReq( page_id=page_id, title=wrappers_pb2.StringValue(value="test title"), )) time_before_get = now() res = api.GetPage(pages_pb2.GetPageReq(page_id=page_id)) assert res.title == "test title" assert res.content == "dummy content" assert res.address == "dummy address" assert res.location.lat == 1 assert res.location.lng == 1 assert res.slug == "test-title" assert time_before_create < to_aware_datetime( res.created) < time_before_update assert time_before_update < to_aware_datetime( res.last_edited) < time_before_get assert to_aware_datetime(res.created) < to_aware_datetime( res.last_edited) assert res.last_editor_user_id == user.id assert res.creator_user_id == user.id assert res.owner_user_id == user.id assert not res.owner_community_id assert not res.owner_group_id assert res.editor_user_ids == [user.id] assert res.can_edit assert res.can_moderate time_before_second_update = now() api.UpdatePage( pages_pb2.UpdatePageReq( page_id=page_id, content=wrappers_pb2.StringValue(value="test content"), )) time_before_second_get = now() res = api.GetPage(pages_pb2.GetPageReq(page_id=page_id)) assert res.title == "test title" assert res.content == "test content" assert res.address == "dummy address" assert res.location.lat == 1 assert res.location.lng == 1 assert res.slug == "test-title" assert time_before_create < to_aware_datetime( res.created) < time_before_update assert time_before_second_update < to_aware_datetime( res.last_edited) < time_before_second_get assert to_aware_datetime(res.created) < to_aware_datetime( res.last_edited) assert res.last_editor_user_id == user.id assert res.creator_user_id == user.id assert res.owner_user_id == user.id assert not res.owner_community_id assert not res.owner_group_id assert res.editor_user_ids == [user.id] assert res.can_edit assert res.can_moderate time_before_third_update = now() api.UpdatePage( pages_pb2.UpdatePageReq( page_id=page_id, address=wrappers_pb2.StringValue(value="test address"), )) time_before_third_get = now() res = api.GetPage(pages_pb2.GetPageReq(page_id=page_id)) assert res.title == "test title" assert res.content == "test content" assert res.address == "test address" assert res.location.lat == 1 assert res.location.lng == 1 assert res.slug == "test-title" assert time_before_create < to_aware_datetime( res.created) < time_before_update assert time_before_third_update < to_aware_datetime( res.last_edited) < time_before_third_get assert to_aware_datetime(res.created) < to_aware_datetime( res.last_edited) assert res.last_editor_user_id == user.id assert res.creator_user_id == user.id assert res.owner_user_id == user.id assert not res.owner_community_id assert not res.owner_group_id assert res.editor_user_ids == [user.id] assert res.can_edit assert res.can_moderate time_before_fourth_update = now() api.UpdatePage( pages_pb2.UpdatePageReq( page_id=page_id, location=pages_pb2.Coordinate( lat=3, lng=1.222, ), )) time_before_fourth_get = now() res = api.GetPage(pages_pb2.GetPageReq(page_id=page_id)) assert res.title == "test title" assert res.content == "test content" assert res.address == "test address" assert res.location.lat == 3 assert res.location.lng == 1.222 assert res.slug == "test-title" assert time_before_create < to_aware_datetime( res.created) < time_before_update assert time_before_fourth_update < to_aware_datetime( res.last_edited) < time_before_fourth_get assert to_aware_datetime(res.created) < to_aware_datetime( res.last_edited) assert res.last_editor_user_id == user.id assert res.creator_user_id == user.id assert res.owner_user_id == user.id assert not res.owner_community_id assert not res.owner_group_id assert res.editor_user_ids == [user.id] assert res.can_edit assert res.can_moderate
def test_create_and_get_discussion(db): generate_user() user, token = generate_user() user2, token2 = generate_user() generate_user() generate_user() with session_scope() as session: community = create_community(session, 0, 1, "Testing Community", [user2], [], None) group_id = create_group(session, "Testing Group", [user2], [], community).id community_id = community.id with discussions_session(token) as api: time_before_create = now() res = api.CreateDiscussion( discussions_pb2.CreateDiscussionReq( title="dummy title", content="dummy content", owner_community_id=community_id, )) time_after_create = now() assert res.title == "dummy title" assert res.content == "dummy content" assert res.slug == "dummy-title" assert time_before_create <= to_aware_datetime( res.created) <= time_after_create assert res.creator_user_id == user.id assert res.owner_community_id == community_id discussion_id = res.discussion_id with discussions_session(token) as api: res = api.GetDiscussion( discussions_pb2.GetDiscussionReq(discussion_id=discussion_id, )) assert res.title == "dummy title" assert res.content == "dummy content" assert res.slug == "dummy-title" assert time_before_create <= to_aware_datetime( res.created) <= time_after_create assert res.creator_user_id == user.id assert res.owner_community_id == community_id with discussions_session(token) as api: time_before_create = now() res = api.CreateDiscussion( discussions_pb2.CreateDiscussionReq( title="dummy title", content="dummy content", owner_group_id=group_id, )) time_after_create = now() assert res.title == "dummy title" assert res.content == "dummy content" assert res.slug == "dummy-title" assert time_before_create <= to_aware_datetime( res.created) <= time_after_create assert res.creator_user_id == user.id assert res.owner_group_id == group_id discussion_id = res.discussion_id with discussions_session(token) as api: res = api.GetDiscussion( discussions_pb2.GetDiscussionReq(discussion_id=discussion_id, )) assert res.title == "dummy title" assert res.content == "dummy content" assert res.slug == "dummy-title" assert time_before_create <= to_aware_datetime( res.created) <= time_after_create assert res.creator_user_id == user.id assert res.owner_group_id == group_id