from . import fixture_accounts from . import fixture_submissions from . import fixture_comments from . import util from files.__main__ import db_session from files.classes import Submission, Comment import json def assert_comment_visibility(post, comment_body, clients): for client_name, (client, should_see) in clients.items(): response = client.get(f'/post/{post.id}') if should_see: assert comment_body in response.text, f'{client_name} should see comment' else: assert comment_body not in response.text, f'{client_name} should not see comment' @util.no_rate_limit def test_submission_comment_count(accounts, submissions, comments): """ Scenario: 1. There is a submission 2. Bob the badpoaster poasts a comment on the submission 3. submission.comment_count goes up by 1. Everyone can see the comment. 4. Alice the admin removes the comment 5. submission.comment_count goes down by 1. Only Bob and admins can see the comment. """ db = db_session() alice_client, alice = accounts.client_and_user_for_account('Alice') alice.admin_level = 2 db.add(alice) db.commit() bob_client, bob = accounts.client_and_user_for_account('Bob') carol_client, carol = accounts.client_and_user_for_account('Carol') logged_off_client = accounts.logged_off() post = submissions.submission_for_client(alice_client, { 'title': 'Weekly Takes', 'body': 'Post your takes. Bad takes will be removed', }) post_id = post.id post = db.query(Submission).filter_by(id=post_id).first() assert 0 == post.comment_count comment_body = 'The sun is a social construct.' comment = comments.comment_for_client(bob_client, post.id, { 'body': comment_body, }) post = db.query(Submission).filter_by(id=post_id).first() assert 1 == post.comment_count assert_comment_visibility(post, comment_body, { 'alice': (alice_client, True), 'bob': (bob_client, True), 'carol': (carol_client, True), 'guest': (logged_off_client, True), }) alice_formkey = util.formkey_from(alice_client.get(f'/post/{post.id}').text) response = alice_client.post( '/admin/update_filter_status', data=json.dumps({ 'comment_id': comment.id, 'new_status': 'removed', "formkey": alice_formkey, }), content_type='application/json' ) assert 200 == response.status_code post = db.query(Submission).filter_by(id=post_id).first() assert_comment_visibility(post, comment_body, { # Alice should see the comment because she is an admin, level >= 2 'alice': (alice_client, True), # Bob should see the comment because he wrote the comment 'bob': (bob_client, True), # Other users, and guests, should NOT see the comment, since it has been removed 'carol': (carol_client, False), 'guest': (logged_off_client, False), }) assert 0 == post.comment_count @util.no_rate_limit def test_comment_descendant_count(accounts, submissions, comments): """ Here is a contentious top-level comment You're wrong, this isn't contentious no u Good poast """ db = db_session() alice_client, alice = accounts.client_and_user_for_account('Alice') post = submissions.submission_for_client(alice_client, { 'title': 'Discussion', 'body': 'Discuss stuff', }) post_id = post.id root = comments.comment_for_client(alice_client, post.id, { 'body': 'Here is a contentious top-level comment', }) assert 0 == db.query(Comment).filter_by(id=root.id).first().descendant_count reply1 = comments.comment_for_client(alice_client, post.id, { 'body': 'You\'re wrong, this isn\'t contentious', 'parent_fullname': f't3_{root.id}', 'parent_level': root.level, }) rereply1 = comments.comment_for_client(alice_client, post.id, { 'body': 'no u', 'parent_fullname': f't3_{reply1.id}', 'parent_level': reply1.level, }) reply2 = comments.comment_for_client(alice_client, post.id, { 'body': 'Good poast', 'parent_fullname': f't3_{root.id}', 'parent_level': root.level, }) assert 3 == db.query(Comment).filter_by(id=root.id).first().descendant_count assert 1 == db.query(Comment).filter_by(id=reply1.id).first().descendant_count assert 0 == db.query(Comment).filter_by(id=reply2.id).first().descendant_count assert 0 == db.query(Comment).filter_by(id=rereply1.id).first().descendant_count @util.no_rate_limit def test_more_button_label_in_deep_thrreads(accounts, submissions, comments): db = db_session() alice_client, alice = accounts.client_and_user_for_account('Alice') post = submissions.submission_for_client(alice_client, { 'title': 'Counting thread', 'body': 'Count to 25', }) post_id = post.id c = comments.comment_for_client(alice_client, post.id, { 'body': '1', }) for i in range(1, 25 + 1): c = comments.comment_for_client(alice_client, post.id, { 'body': str(i), 'parent_fullname': f't3_{c.id}', 'parent_level': c.level, }) if i % 5 == 0: # only look every 5 posts to make this test not _too_ unbearably slow view_post_response = alice_client.get(f'/post/{post.id}') assert 200 == view_post_response.status_code if i <= 8: assert f'More comments ({i - 8})' not in view_post_response.text else: assert f'More comments ({i - 8})' in view_post_response.text