def test_commmand_screen_name_disappeared(self, mock_requests): def fake_post_screen_name_disappeared(*args, **kwargs): data = kwargs["data"] mock_result = Mock() if "screen_name" in data: if (data["screen_name"] == "notatwitteraccounteither,notreallyatwitteraccount"): mock_result.json.return_value = [{ "id": 765, "screen_name": "notatwitteraccounteither", "profile_image_url_https": "https://example.com/b.jpg", }] return mock_result if "user_id" in data: if data["user_id"] == "987": mock_result.json.return_value = [{ "id": 987, "screen_name": "ascreennamewewereunawareof", "profile_image_url_https": "https://example.com/c.jpg", }] return mock_result raise Exception("No Twitter API stub for {} {}".format( args, kwargs)) mock_requests.post.side_effect = fake_post_screen_name_disappeared with capture_output() as (out, err): call_command("twitterbot_update_usernames") self.assertEqual( self.just_screen_name.contact_details.filter( contact_type="twitter").count(), 0, ) self.assertEqual( self.just_screen_name.identifiers.filter(scheme="twitter").count(), 0, ) self.assertEqual( split_output(out), [ "Removing screen name notreallyatwitteraccount for Person " "with just a Twitter screen name as it is not a valid " "Twitter screen name. " "/person/{}/person-with-just-a-twitter-screen-name".format( self.just_screen_name.id), "Correcting the screen name from None to ascreennamewewereunawareof", ], )
def test_commmand_screen_name_was_wrong(self, mock_requests): def fake_post_screen_name_wrong(*args, **kwargs): data = kwargs["data"] mock_result = Mock() if "screen_name" in data: if (data["screen_name"] == "notatwitteraccounteither,notreallyatwitteraccount"): mock_result.json.return_value = [{ "id": 321, "screen_name": "notreallyatwitteraccount", "profile_image_url_https": "https://example.com/a.jpg", }] return mock_result if "user_id" in data: if data["user_id"] == "765,987": mock_result.json.return_value = [ { "id": 987, "screen_name": "ascreennamewewereunawareof", "profile_image_url_https": "https://example.com/c.jpg", }, { "id": 765, "screen_name": "changedscreenname", "profile_image_url_https": "https://example.com/b.jpg", }, ] return mock_result raise Exception("No Twitter API stub for {} {}".format( args, kwargs)) mock_requests.post.side_effect = fake_post_screen_name_wrong with capture_output() as (out, err): call_command("twitterbot_update_usernames") self.assertEqual( self.screen_name_and_user_id.get_single_identifier_value( "twitter_username"), "changedscreenname", ) self.assertEqual( split_output(out), [ "Adding the user ID 321", "Correcting the screen name from None to ascreennamewewereunawareof", "Correcting the screen name from notatwitteraccounteither to changedscreenname", ], )
def test_only_enqueue_files_that_seem_to_be_images(self, mock_twitter_data, mock_requests): mock_twitter_data.return_value.user_id_to_photo_url = { "1001": "https://pbs.twimg.com/profile_images/abc/foo.jpg", "1002": "https://pbs.twimg.com/profile_images/def/bar.jpg", "1003": "https://pbs.twimg.com/profile_images/ghi/baz.jpg", "1005": "https://pbs.twimg.com/profile_images/jkl/quux.jpg", "1006": "https://pbs.twimg.com/profile_images/mno/xyzzy.jpg", } def fake_get(url, *args, **kwargs): if url == "https://pbs.twimg.com/profile_images/abc/foo.jpg": return Mock(content=b"I am not an image.", status_code=200) else: return Mock(content=self.example_image_binary_data, status_code=200) mock_requests.get.side_effect = fake_get with capture_output() as (out, err): call_command("twitterbot_add_images_to_queue") output_lines = split_output(out) self.assertEqual(len(output_lines), 1) self.assertTrue( re.search(r"^Ignoring a non-image file \S+$", output_lines[0])) new_queued_images = QueuedImage.objects.exclude( id__in=self.existing_queued_image_ids) self.assertEqual( mock_requests.get.mock_calls, [ call("https://pbs.twimg.com/profile_images/mno/xyzzy.jpg"), call("https://pbs.twimg.com/profile_images/abc/foo.jpg"), ], ) # Out of the two URLs of images that were downloaded, only one # had a 200 status code: self.assertEqual(new_queued_images.count(), 1) newly_enqueued = new_queued_images.get() self.assertEqual(newly_enqueued.person, self.p_existing_image_but_none_in_queue) self.assertEqual( newly_enqueued.justification_for_use, "Auto imported from Twitter: https://twitter.com/intent/user?user_id=1006", )
def test_command_output(self, mock_twitter_data, mock_requests): mock_twitter_data.return_value.user_id_to_photo_url = { "1002": "https://pbs.twimg.com/profile_images/def/bar.jpg", "1003": "https://pbs.twimg.com/profile_images/ghi/baz.jpg", "1005": "https://pbs.twimg.com/profile_images/jkl/quux.jpg", "1006": "https://pbs.twimg.com/profile_images/mno/xyzzy.jpg", } mock_requests.get.return_value = Mock( content=self.example_image_binary_data, status_code=200) with capture_output() as (out, err): call_command("twitterbot_add_images_to_queue", verbosity=3) self.assertEqual( split_output(out), [ "Considering adding a photo for Person With An Accepted " "Image In The Queue with Twitter user ID: 1005", " That person already had an image in the queue, so skipping.", "Considering adding a photo for Person With An Existing " "Image with Twitter user ID: 1002", " That person already had an image in the queue, so skipping.", "Considering adding a photo for Person With An Existing " "Image But None In The Queue with Twitter user ID: 1006", " Adding that person's Twitter avatar to the moderation " "queue", "Considering adding a photo for Person With Only Rejected " "Images In The Queue with Twitter user ID: 1003", " That person already had an image in the queue, so skipping.", ], ) new_queued_images = QueuedImage.objects.exclude( id__in=self.existing_queued_image_ids) self.assertEqual( mock_requests.get.mock_calls, [call("https://pbs.twimg.com/profile_images/mno/xyzzy.jpg")], ) self.assertEqual(new_queued_images.count(), 1) newly_enqueued = new_queued_images.get() self.assertEqual(newly_enqueued.person, self.p_existing_image_but_none_in_queue) self.assertEqual( newly_enqueued.justification_for_use, "Auto imported from Twitter: https://twitter.com/intent/user?user_id=1006", )
def test_commmand_warns_on_multiple_user_ids(self, mock_requests): self.just_userid.identifiers.create(identifier="765", scheme="twitter") mock_requests.post.side_effect = fake_post_for_username_updater with capture_output() as (out, err): call_command("twitterbot_update_usernames") self.assertIn( "WARNING: Multiple Twitter user IDs found for Person with " "just a Twitter user ID ({}), skipping".format( self.just_userid.id), split_output(out), )
def test_commmand_warns_on_multiple_screen_names(self, mock_requests): self.just_screen_name.contact_details.create( value="notatwitteraccounteither", contact_type="twitter") mock_requests.post.side_effect = fake_post_for_username_updater with capture_output() as (out, err): call_command("twitterbot_update_usernames") self.assertIn( "WARNING: Multiple Twitter screen names found for Person with " "just a Twitter screen name ({}), skipping".format( self.just_screen_name.id), split_output(out), )
def test_commmand_verbose_output(self, mock_requests): mock_requests.post.side_effect = fake_post_for_username_updater with capture_output() as (out, err): call_command("twitterbot_update_usernames", verbosity=3) self.assertEqual( split_output(out), [ "Person with just a Twitter screen name has Twitter screen name (notreallyatwitteraccount) but no user ID", "Adding the user ID 321", "Person with just a Twitter user ID has a Twitter user ID: 987", "Correcting the screen name from None to ascreennamewewereunawareof", "Person with no Twitter details had no Twitter account information", "Someone with a Twitter screen name and user ID has a Twitter user ID: 765", "The screen name (notatwitteraccounteither) was already correct", ], )
def test_commmand_adds_user_id(self, mock_requests): mock_requests.post.side_effect = fake_post_for_username_updater with capture_output() as (out, err): call_command("twitterbot_update_usernames") self.assertEqual( self.just_screen_name.identifiers.get(scheme="twitter").identifier, "321", ) self.assertEqual( split_output(out), [ "Adding the user ID 321", "Correcting the screen name from None to ascreennamewewereunawareof", ], )
def test_commmand_adds_screen_name(self, mock_requests): mock_requests.post.side_effect = fake_post_for_username_updater with capture_output() as (out, err): call_command("twitterbot_update_usernames") self.assertEqual( self.just_userid.contact_details.get(contact_type="twitter").value, "ascreennamewewereunawareof", ) self.assertEqual( split_output(out), [ "Adding the user ID 321", "Correcting the screen name from None to ascreennamewewereunawareof", ], )
def test_commmand_user_id_disappeared(self, mock_requests): def fake_post_user_id_disappeared(*args, **kwargs): data = kwargs["data"] mock_result = Mock() if "screen_name" in data: if (data["screen_name"] == "notatwitteraccounteither,notreallyatwitteraccount"): mock_result.json.return_value = [{ "id": 321, "screen_name": "notreallyatwitteraccount", "profile_image_url_https": "https://example.com/a.jpg", }] return mock_result if "user_id" in data: if data["user_id"] == "765,987": mock_result.json.return_value = { "errors": [{ "code": 17, "message": "No user matches for specified terms.", }] } return mock_result raise Exception("No Twitter API stub for {} {}".format( args, kwargs)) mock_requests.post.side_effect = fake_post_user_id_disappeared self.assertEqual( self.screen_name_and_user_id.get_twitter_username, "notatwitteraccounteither", ) with capture_output() as (out, err): call_command("twitterbot_update_usernames") self.assertIsNone(self.just_userid.get_twitter_username) self.assertEqual(self.just_userid.get_twitter_username, None) # Clear the cached_property for this object del self.screen_name_and_user_id.get_all_idenfitiers self.assertIsNone(self.screen_name_and_user_id.get_twitter_username) self.assertEqual(self.screen_name_and_user_id.get_twitter_username, None) self.assertEqual( split_output(out), [ "Adding the user ID 321", "Removing user ID 987 for Person with just a Twitter user ID " "as it is not a valid Twitter user ID. " "/person/{}/person-with-just-a-twitter-user-id".format( self.just_userid.id), "Removing user ID 765 for Someone with a Twitter screen name " "and user ID as it is not a valid Twitter user ID. " "/person/{}/someone-with-a-twitter-screen-name-and-user-id". format(self.screen_name_and_user_id.id), ], )