def test_content_subreddit_from_name(reddit, terminal): name = '/r/python' content = SubredditContent.from_name(reddit, name, terminal.loader) assert content.name == '/r/python' assert content.order is None # Can submit without the /r/ and with the order in the name name = 'python/top/' content = SubredditContent.from_name(reddit, name, terminal.loader) assert content.name == '/r/python' assert content.order == 'top' # Explicit order trumps implicit name = '/r/python/top' content = SubredditContent.from_name( reddit, name, terminal.loader, order='new') assert content.name == '/r/python' assert content.order == 'new' # Invalid order raises an exception name = '/r/python/fake' with terminal.loader(): SubredditContent.from_name(reddit, name, terminal.loader) assert isinstance(terminal.loader.exception, exceptions.SubredditError) # Front page alias name = '/r/front/rising' content = SubredditContent.from_name(reddit, name, terminal.loader) assert content.name == '/r/front' assert content.order == 'rising' # Queries SubredditContent.from_name(reddit, 'front', terminal.loader, query='pea') SubredditContent.from_name(reddit, 'python', terminal.loader, query='pea')
def test_content_subreddit_from_name_invalid(prompt, reddit, terminal): with terminal.loader(): SubredditContent.from_name(reddit, prompt, terminal.loader) assert isinstance(terminal.loader.exception, praw.errors.InvalidSubreddit) # Must always have an argument because it gets displayed assert terminal.loader.exception.args[0]
def test_content_subreddit_multireddit(reddit, terminal): name = '/r/python+linux' content = SubredditContent.from_name(reddit, name, terminal.loader) assert content.name == '/r/python+linux' # Invalid multireddit name = '/r/a+b' with terminal.loader(): SubredditContent.from_name(reddit, name, terminal.loader) assert isinstance(terminal.loader.exception, praw.errors.NotFound)
def test_content_subreddit_saved(reddit, oauth, refresh_token, terminal): # Not logged in with terminal.loader(): SubredditContent.from_name(reddit, '/u/saved', terminal.loader) assert isinstance(terminal.loader.exception, exceptions.AccountError) # Logged in oauth.config.refresh_token = refresh_token oauth.authorize() with terminal.loader(): SubredditContent.from_name(reddit, '/u/saved', terminal.loader)
def test_content_subreddit_from_name_authenticated( prompt, name, order, reddit, terminal, oauth, refresh_token): with pytest.raises(exceptions.AccountError): SubredditContent.from_name(reddit, prompt, terminal.loader) # Login and try again oauth.config.refresh_token = refresh_token oauth.authorize() content = SubredditContent.from_name(reddit, prompt, terminal.loader) assert content.name == name assert content.order == order
def test_content_subreddit_load_more(reddit, terminal): submissions = reddit.get_front_page(limit=None) content = SubredditContent('front', submissions, terminal.loader) assert content.get(50)['type'] == 'Submission' assert len(content._submission_data) == 51 for data in islice(content.iterate(0, 1), 0, 50): assert all(k in data for k in ('object', 'n_rows', 'offset', 'type', 'index', 'title', 'split_title')) # All text should be converted to unicode by this point for val in data.values(): assert not isinstance(val, six.binary_type)
def test_content_subreddit_me(reddit, oauth, refresh_token, terminal): # Not logged in with terminal.loader(): SubredditContent.from_name(reddit, '/r/me', terminal.loader) assert isinstance(terminal.loader.exception, exceptions.AccountError) # Logged in oauth.config.refresh_token = refresh_token oauth.authorize() with terminal.loader(): SubredditContent.from_name(reddit, 'me', terminal.loader) # If there is no submitted content, an error should be raised if terminal.loader.exception: assert isinstance(terminal.loader.exception, exceptions.SubredditError)
def test_content_subreddit_me(reddit, oauth, refresh_token, terminal): # Not logged in with terminal.loader(): SubredditContent.from_name(reddit, '/u/me', terminal.loader) assert isinstance(terminal.loader.exception, exceptions.AccountError) # Logged in oauth.config.refresh_token = refresh_token oauth.authorize() with terminal.loader(): SubredditContent.from_name(reddit, '/u/me', terminal.loader) # If there is no submitted content, an error should be raised if terminal.loader.exception: assert isinstance(terminal.loader.exception, exceptions.SubredditError)
def test_content_subreddit_initialize(reddit, terminal): submissions = reddit.get_subreddit('python').get_top(limit=None) content = SubredditContent('python', submissions, terminal.loader, 'top') assert content.name == 'python' assert content.order == 'top' assert len(content._submission_data) == 1
def test_content_subreddit_from_name_order(reddit, terminal): # Explicit order trumps implicit name = '/r/python/top' content = SubredditContent.from_name( reddit, name, terminal.loader, order='new') assert content.name == '/r/python' assert content.order == 'new'
def test_content_subreddit_nsfw_filter(reddit, oauth, refresh_token, terminal): # NSFW subreddits should load if not logged in name = '/r/ImGoingToHellForThis' SubredditContent.from_name(reddit, name, terminal.loader) # Log in oauth.config.refresh_token = refresh_token oauth.authorize() # Make sure the API parameter hasn't changed assert reddit.user.over_18 is not None # Turn on safe search reddit.user.over_18 = False # Should refuse to load this subreddit with pytest.raises(exceptions.SubredditError): name = '/r/ImGoingToHellForThis' SubredditContent.from_name(reddit, name, terminal.loader) # Should filter out all of the nsfw posts name = '/r/ImGoingToHellForThis+python' content = SubredditContent.from_name(reddit, name, terminal.loader) for data in islice(content.iterate(0, 1), 50): assert data['object'].over_18 is False # Turn off safe search reddit.user.over_18 = True # The NSFW subreddit should load now name = '/r/ImGoingToHellForThis' SubredditContent.from_name(reddit, name, terminal.loader)
def test_content_subreddit_load_more(reddit, terminal): submissions = reddit.get_front_page(limit=None) content = SubredditContent('front', submissions, terminal.loader) assert content.get(50)['type'] == 'Submission' assert content.range == (0, 50) for i, data in enumerate(islice(content.iterate(0, 1), 0, 50)): assert all(k in data for k in ('object', 'n_rows', 'h_offset', 'type', 'index', 'title', 'split_title')) # All text should be converted to unicode by this point for val in data.values(): assert not isinstance(val, six.binary_type) # Index be appended to each title, starting at "1." and incrementing assert data['index'] == i + 1 assert data['title'].startswith(six.text_type(i + 1))
def test_content_subreddit_load_more(reddit, terminal): submissions = reddit.get_front_page(limit=None) content = SubredditContent('front', submissions, terminal.loader) assert content.get(50)['type'] == 'Submission' assert content.range == (0, 50) for i, data in enumerate(islice(content.iterate(0, 1), 0, 50)): assert all(k in data for k in ('object', 'n_rows', 'offset', 'type', 'index', 'title', 'split_title')) # All text should be converted to unicode by this point for val in data.values(): assert not isinstance(val, six.binary_type) # Index be appended to each title, starting at "1." and incrementing assert data['index'] == i + 1 assert data['title'].startswith(six.text_type(i + 1))
def test_content_subreddit(reddit, terminal): submissions = reddit.get_front_page(limit=5) content = SubredditContent('front', submissions, terminal.loader) # Submissions are loaded on demand, excluding for the first one assert len(content._submission_data) == 1 assert content.get(0)['type'] == 'Submission' for data in content.iterate(0, 1): assert all(k in data for k in ('object', 'n_rows', 'offset', 'type', 'index', 'title', 'split_title')) # All text should be converted to unicode by this point for val in data.values(): assert not isinstance(val, six.binary_type) # Out of bounds with pytest.raises(IndexError): content.get(-1) with pytest.raises(IndexError): content.get(5)
def test_content_subreddit_from_name_query(prompt, query, reddit, terminal): SubredditContent.from_name(reddit, prompt, terminal.loader, query=query)
def test_content_subreddit_random(reddit, terminal): name = '/r/random' content = SubredditContent.from_name(reddit, name, terminal.loader) assert content.name.startswith('/r/') assert content.name != name
def test_content_subreddit_gilded(reddit, terminal): name = '/r/python/gilded' content = SubredditContent.from_name(reddit, name, terminal.loader) assert content.order == 'gilded' assert content.get(0)['object'].gilded
def test_content_subreddit_from_name_invalid(prompt, reddit, terminal): with terminal.loader(): SubredditContent.from_name(reddit, prompt, terminal.loader) assert isinstance(terminal.loader.exception, praw.errors.InvalidSubreddit)
def test_content_subreddit_from_name(prompt, name, order, reddit, terminal): content = SubredditContent.from_name(reddit, prompt, terminal.loader) assert content.name == name assert content.order == order
def test_content_subreddit_initialize_invalid(reddit, terminal): submissions = reddit.get_subreddit('invalidsubreddit7').get_top(limit=None) with terminal.loader(): SubredditContent('python', submissions, terminal.loader, 'top') assert isinstance(terminal.loader.exception, praw.errors.InvalidSubreddit)