コード例 #1
0
    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",
            ],
        )
コード例 #2
0
    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",
            ],
        )
コード例 #3
0
    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",
        )
コード例 #4
0
    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",
        )
コード例 #5
0
    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),
        )
コード例 #6
0
    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),
        )
コード例 #7
0
    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",
            ],
        )
コード例 #8
0
    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",
            ],
        )
コード例 #9
0
    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",
            ],
        )
コード例 #10
0
    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),
            ],
        )