예제 #1
0
    def setUp(self):
        """
        Set up the test environments.
        """
        super(LibrariesioConsumerTests, self).setUp()

        self.client = LibrariesioConsumer()
예제 #2
0
 def test_new_project_configured_off(self):
     """libraries.io events shouldn't create projects if the configuration is off."""
     consumer = LibrariesioConsumer(self.mock_hub)
     with mock.patch.dict(config.config,
                          {'LIBRARIESIO_PLATFORM_WHITELIST': []}):
         consumer.consume(self.supported_fedmsg)
     self.assertEqual(0, self.session.query(Project).count())
 def test_new_project_failure(self, mock_create, mock_log):
     """Assert failures to create projects are logged as errors."""
     mock_create.side_effect = AnityaException("boop")
     consumer = LibrariesioConsumer(self.mock_hub)
     with mock.patch.dict(config.config, {'LIBRARIESIO_PLATFORM_WHITELIST': ['pypi']}):
         consumer.consume(self.supported_fedmsg)
     self.assertEqual(0, self.session.query(Project).count())
     mock_log.error.assert_called_once_with(
         'A new project was discovered via libraries.io, %r, but we failed with "%s"',
         None, 'boop')
 def test_new_project_configured_on(self):
     """Assert that a libraries.io event about an unknown project creates that project"""
     consumer = LibrariesioConsumer(self.mock_hub)
     with mock.patch.dict(config.config, {'LIBRARIESIO_PLATFORM_WHITELIST': ['pypi']}):
         consumer.consume(self.supported_fedmsg)
     self.assertEqual(1, self.session.query(Project).count())
     project = self.session.query(Project).first()
     self.assertEqual('ImageMetaTag', project.name)
     self.assertEqual('pypi', project.ecosystem_name)
     self.assertEqual('0.6.9', project.latest_version)
예제 #5
0
 def test_no_ecosystem(self, mock_log):
     """Assert that messages about platforms we don't support are handled gracefully"""
     consumer = LibrariesioConsumer(self.mock_hub)
     unsupported_fedmsg = {
         'body': {
             'username': '******',
             'i': 211,
             'timestamp': 1488560762,
             'msg_id': '2017-a7dbddc2-8ce5-4291-9986-c8584ec97fdd',
             'topic': 'org.fedoraproject.dev.sse2fedmsg.librariesio',
             'msg': {
                 'retry': 500,
                 'data': {
                     'name':
                     'GreatProject',
                     'project': {
                         'status': None,
                         'repository_url': None,
                         'latest_release_published_at':
                         '2017-03-03 00:00:00 UTC',
                         'description':
                         'A great description of the project',
                         'language': None,
                         'platform': 'GREAT',
                         'package_manager_url':
                         'https://example.com/GreatProject.git',
                         'latest_release_number': '1.5.0',
                         'rank': 0,
                         'stars': 0,
                         'keywords': [],
                         'normalized_licenses': ['GPL-3.0+'],
                         'forks': 0,
                         'homepage': 'http://example.com/GreatProject',
                         'name': 'GreatProject',
                     },
                     'platform':
                     'GREAT',
                     'published_at':
                     '2017-03-03 00:00:00 UTC',
                     'version':
                     '1.5.0',
                     'package_manager_url':
                     'https://example.com/GreatProject.git',
                 },
                 'event': 'event',
                 'id': None,
             }
         }
     }
     self.assertEqual(0, self.session.query(Project).count())
     consumer.consume(unsupported_fedmsg)
     self.assertEqual(0, self.session.query(Project).count())
     self.assertTrue('Dropped librariesio update' in
                     mock_log.debug.call_args_list[0][0][0])
예제 #6
0
 def test_no_ecosystem(self, mock_log):
     """Assert that messages about platforms we don't support are handled gracefully"""
     consumer = LibrariesioConsumer(self.mock_hub)
     unsupported_fedmsg = {
         "body": {
             "username": "******",
             "i": 211,
             "timestamp": 1488560762,
             "msg_id": "2017-a7dbddc2-8ce5-4291-9986-c8584ec97fdd",
             "topic": "org.fedoraproject.dev.sse2fedmsg.librariesio",
             "msg": {
                 "retry": 500,
                 "data": {
                     "name":
                     "GreatProject",
                     "project": {
                         "status": None,
                         "repository_url": None,
                         "latest_release_published_at":
                         "2017-03-03 00:00:00 UTC",
                         "description":
                         "A great description of the project",
                         "language": None,
                         "platform": "GREAT",
                         "package_manager_url":
                         "https://example.com/GreatProject.git",
                         "latest_release_number": "1.5.0",
                         "rank": 0,
                         "stars": 0,
                         "keywords": [],
                         "normalized_licenses": ["GPL-3.0+"],
                         "forks": 0,
                         "homepage": "https://example.com/GreatProject",
                         "name": "GreatProject",
                     },
                     "platform":
                     "GREAT",
                     "published_at":
                     "2017-03-03 00:00:00 UTC",
                     "version":
                     "1.5.0",
                     "package_manager_url":
                     "https://example.com/GreatProject.git",
                 },
                 "event": "event",
                 "id": None,
             },
         }
     }
     self.assertEqual(0, self.session.query(Project).count())
     consumer.consume(unsupported_fedmsg)
     self.assertEqual(0, self.session.query(Project).count())
     self.assertTrue("Dropped librariesio update" in
                     mock_log.debug.call_args_list[0][0][0])
예제 #7
0
 def test_existing_project_check_failure(self, mock_check):
     """Assert that when an existing project fails a version check nothing happens"""
     consumer = LibrariesioConsumer(self.mock_hub)
     mock_check.side_effect = AnityaPluginException()
     project = Project(
         name='ImageMetaTag',
         homepage='https://pypi.python.org/pypi/ImageMetaTag',
         ecosystem_name='pypi',
         backend='PyPI',
     )
     self.session.add(project)
     self.session.commit()
     self.assertEqual(1, self.session.query(Project).count())
     consumer.consume(self.supported_fedmsg)
     self.assertEqual(1, self.session.query(Project).count())
     project = self.session.query(Project).first()
     self.assertIs(project.latest_version, None)
예제 #8
0
    def test_dev_environment_topics(self):
        """Assert when the environment is set to dev, the dev topic is used."""
        mock_hub = mock.Mock(config={
            "environment": "dev",
            "topic_prefix": "anitya"
        })
        consumer = LibrariesioConsumer(mock_hub)

        self.assertEqual(["anitya.dev.sse2fedmsg.librariesio"], consumer.topic)
예제 #9
0
    def test_dev_environment_topics(self):
        """Assert when the environment is set to dev, both dev and prod topic is used."""
        expected_topics = [
            'org.fedoraproject.prod.sse2fedmsg.librariesio',
            'anitya.dev.sse2fedmsg.librariesio',
        ]
        consumer = LibrariesioConsumer(self.mock_hub)

        self.assertEqual(expected_topics, consumer.topic)
예제 #10
0
 def test_mismatched_versions(self, mock_log):
     """Assert when libraries.io and Anitya disagree on version, it's logged"""
     consumer = LibrariesioConsumer(self.mock_hub)
     project = Project(
         name='ImageMetaTag',
         homepage='https://pypi.org/project/ImageMetaTag/',
         ecosystem_name='pypi',
         backend='PyPI',
     )
     self.session.add(project)
     self.session.commit()
     self.supported_fedmsg['body']['msg']['data']['version'] = '0.6.11'
     consumer.consume(self.supported_fedmsg)
     project = self.session.query(Project).first()
     self.assertEqual('0.6.9', project.latest_version)
     self.assertIn(
         'libraries.io has found an update (version %s) for project %r',
         mock_log.info.call_args_list[1][0],
     )
예제 #11
0
    def test_existing_project(self):
        """Assert that a libraries.io event about an existing project updates that project"""
        project = Project(
            name='ImageMetaTag',
            homepage='https://pypi.org/project/ImageMetaTag/',
            ecosystem_name='pypi',
            backend='PyPI',
        )
        self.session.add(project)
        self.session.commit()
        consumer = LibrariesioConsumer(self.mock_hub)

        self.assertEqual(1, self.session.query(Project).count())
        consumer.consume(self.supported_fedmsg)
        self.assertEqual(1, self.session.query(Project).count())
        project = self.session.query(Project).first()
        self.assertEqual('ImageMetaTag', project.name)
        self.assertEqual('pypi', project.ecosystem_name)
        self.assertEqual('0.6.9', project.latest_version)
예제 #12
0
    def test_prod_environment_topics(self):
        """Assert when the environment is set to prod, only the prod topic is used."""
        mock_hub = mock.Mock(config={
            "environment": "prod",
            "topic_prefix": "anitya"
        })
        consumer = LibrariesioConsumer(mock_hub)

        self.assertEqual(["anitya.prod.sse2fedmsg.librariesio"],
                         consumer.topic)
예제 #13
0
 def test_mismatched_versions(self, mock_log):
     """Assert when libraries.io and Anitya disagree on version, it's logged"""
     consumer = LibrariesioConsumer(self.mock_hub)
     project = Project(
         name="ImageMetaTag",
         homepage="https://pypi.org/project/ImageMetaTag/",
         ecosystem_name="pypi",
         backend="PyPI",
     )
     self.session.add(project)
     self.session.commit()
     self.supported_fedmsg["body"]["msg"]["data"]["version"] = "0.6.11"
     consumer.consume(self.supported_fedmsg)
     project = self.session.query(Project).first()
     self.assertEqual("0.6.9", project.latest_version)
     self.assertIn(
         "libraries.io has found an update (version %s) for project %r",
         mock_log.info.call_args_list[1][0],
     )
예제 #14
0
    def test_prod_environment_topics(self):
        """Assert when the environment is set to prod, only the prod topic is used."""
        mock_hub = mock.Mock(config={
            'environment': 'prod',
            'topic_prefix': 'anitya'
        })
        consumer = LibrariesioConsumer(mock_hub)

        self.assertEqual(['org.fedoraproject.prod.sse2fedmsg.librariesio'],
                         consumer.topic)
예제 #15
0
    def test_dev_environment_topics(self):
        """Assert when the environment is set to dev, the dev topic is used."""
        mock_hub = mock.Mock(config={
            'environment': 'dev',
            'topic_prefix': 'anitya'
        })
        consumer = LibrariesioConsumer(mock_hub)

        self.assertEqual([u'anitya.dev.sse2fedmsg.librariesio'],
                         consumer.topic)
예제 #16
0
    def test_prefix_setup(self):
        """Assert that topic_prefix is changed after initialization."""
        mock_hub = mock.Mock(config={
            "environment": "dev",
            "topic_prefix": "anitya"
        })
        self.assertEqual(mock_hub.config["topic_prefix"], "anitya")
        LibrariesioConsumer(mock_hub)

        self.assertEqual(mock_hub.config["topic_prefix"],
                         "org.release-monitoring")
예제 #17
0
    def test_prefix_setup(self):
        """Assert that topic_prefix is changed after initialization."""
        mock_hub = mock.Mock(config={
            'environment': 'dev',
            'topic_prefix': 'anitya'
        })
        self.assertEqual(mock_hub.config['topic_prefix'], 'anitya')
        LibrariesioConsumer(mock_hub)

        self.assertEqual(mock_hub.config['topic_prefix'],
                         'org.release-monitoring')
예제 #18
0
class LibrariesioConsumerTests(DatabaseTestCase):
    """
    Test class for `anitya.librariesio_consumer.LibrariesioConsumer` class.

    Attributes:
        client (`anitya.librariesio_consumer.LibrariesioConsumer``): librariesio SSE client.
    """

    def setUp(self):
        """
        Set up the test environments.
        """
        super(LibrariesioConsumerTests, self).setUp()

        self.client = LibrariesioConsumer()

    def test_init(self):
        """Assert that correct values are initialized."""

        self.assertEqual(self.client.feed, config.config["SSE_FEED"])
        self.assertEqual(
            self.client.whitelist, config.config["LIBRARIESIO_PLATFORM_WHITELIST"]
        )

    @mock.patch("anitya.librariesio_consumer._log")
    def test_invalid_json(self, mock_log):
        """Assert that log message is logged when invalid json is received."""
        event = sseclient.Event(data="Invalid JSON")

        self.client.process_message(event)

        self.assertIn(
            "Dropping librariesio update message. Invalid json 'Invalid JSON'.",
            mock_log.warning.call_args_list[0][0][0],
        )

    @mock.patch("anitya.librariesio_consumer._log")
    def test_unknown_ecosystem(self, mock_log):
        """Assert that log message is logged when unknown ecosystem is received."""
        event = sseclient.Event(
            data="{"
            '"name": "test",'
            '"platform": "unknown",'
            '"version": "1.0",'
            '"package_manager_url": "https://homepage.net"'
            "}"
        )
        self.client.process_message(event)

        self.assertIn(
            "Dropped librariesio update to 1.0 for test (https://homepage.net) since"
            " it is on the unsupported unknown platform",
            mock_log.debug.call_args_list[0][0][0],
        )

    def test_new_project_configured_off(self):
        """libraries.io events shouldn't create projects if the configuration is off."""
        event = sseclient.Event(
            data="{"
            '"name": "test",'
            '"platform": "PyPi",'
            '"version": "1.0",'
            '"package_manager_url": "https://homepage.net"'
            "}"
        )

        with mock.patch.object(self.client, "whitelist", []):
            self.client.process_message(event)
        self.assertEqual(0, self.session.query(Project).count())

    def test_new_project_configured_on(self):
        """Assert that a libraries.io event about an unknown project creates that project"""
        event = sseclient.Event(
            data="{"
            '"name": "ImageMetaTag",'
            '"platform": "PyPi",'
            '"version": "0.6.9",'
            '"package_manager_url": "https://pypi.org/project/ImageMetaTag/"'
            "}"
        )

        with mock.patch.object(self.client, "whitelist", ["pypi"]):
            self.client.process_message(event)
        self.assertEqual(1, self.session.query(Project).count())
        project = self.session.query(Project).first()
        self.assertEqual("ImageMetaTag", project.name)
        self.assertEqual("pypi", project.ecosystem_name)
        self.assertEqual("0.6.9", project.latest_version)

    @mock.patch("anitya.librariesio_consumer._log")
    @mock.patch("anitya.lib.utilities.create_project")
    def test_new_project_failure(self, mock_create, mock_log):
        """Assert failures to create projects are logged as errors."""
        mock_create.side_effect = AnityaException("boop")
        event = sseclient.Event(
            data="{"
            '"name": "ImageMetaTag",'
            '"platform": "PyPi",'
            '"version": "0.6.9",'
            '"package_manager_url": "https://pypi.org/project/ImageMetaTag/"'
            "}"
        )

        with mock.patch.object(self.client, "whitelist", ["pypi"]):
            self.client.process_message(event)
        self.assertEqual(0, self.session.query(Project).count())
        self.assertIn(
            "A new project was discovered via libraries.io, ImageMetaTag,"
            ' but we failed with "boop"',
            mock_log.error.call_args_list[0][0][0],
        )

    def test_existing_project(self):
        """Assert that a libraries.io event about an existing project updates that project"""
        project = Project(
            name="ImageMetaTag",
            homepage="https://pypi.org/project/ImageMetaTag/",
            ecosystem_name="pypi",
            backend="PyPI",
        )
        self.session.add(project)
        self.session.commit()
        event = sseclient.Event(
            data="{"
            '"name": "ImageMetaTag",'
            '"platform": "PyPi",'
            '"version": "0.6.9",'
            '"package_manager_url": "https://pypi.org/project/ImageMetaTag/"'
            "}"
        )

        self.assertEqual(1, self.session.query(Project).count())
        self.client.process_message(event)
        self.assertEqual(1, self.session.query(Project).count())
        project = self.session.query(Project).first()
        self.assertEqual("ImageMetaTag", project.name)
        self.assertEqual("pypi", project.ecosystem_name)
        self.assertEqual("0.6.9", project.latest_version)

    @mock.patch("anitya.librariesio_consumer.utilities.check_project_release")
    def test_existing_project_check_failure(self, mock_check):
        """Assert that when an existing project fails a version check nothing happens"""
        mock_check.side_effect = AnityaPluginException()
        project = Project(
            name="ImageMetaTag",
            homepage="https://pypi.python.org/pypi/ImageMetaTag",
            ecosystem_name="pypi",
            backend="PyPI",
        )
        self.session.add(project)
        self.session.commit()
        event = sseclient.Event(
            data="{"
            '"name": "ImageMetaTag",'
            '"platform": "PyPi",'
            '"version": "0.6.9",'
            '"package_manager_url": "https://pypi.org/project/ImageMetaTag/"'
            "}"
        )

        self.assertEqual(1, self.session.query(Project).count())
        self.client.process_message(event)
        self.assertEqual(1, self.session.query(Project).count())
        project = self.session.query(Project).first()
        self.assertIs(project.latest_version, None)

    @mock.patch("anitya.librariesio_consumer._log")
    def test_mismatched_versions(self, mock_log):
        """Assert when libraries.io and Anitya disagree on version, it's logged"""
        project = Project(
            name="ImageMetaTag",
            homepage="https://pypi.org/project/ImageMetaTag/",
            ecosystem_name="pypi",
            backend="PyPI",
        )
        self.session.add(project)
        self.session.commit()
        event = sseclient.Event(
            data="{"
            '"name": "ImageMetaTag",'
            '"platform": "PyPi",'
            '"version": "0.6.11",'
            '"package_manager_url": "https://pypi.org/project/ImageMetaTag/"'
            "}"
        )
        self.client.process_message(event)
        project = self.session.query(Project).first()
        self.assertEqual("0.6.9", project.latest_version)
        self.assertIn(
            "libraries.io has found an update (version 0.6.11) for project ImageMetaTag",
            mock_log.info.call_args_list[0][0][0],
        )