Esempio n. 1
0
class TestBridgeWorker(BaseServersTest):
    def test_init(self):
        self.worker = EdrDataBridge(config)
        self.assertEqual(self.worker.delay, 15)
        self.assertEqual(self.worker.sleep_change_value.time_between_requests,
                         0)

        # check clients
        self.assertTrue(
            isinstance(self.worker.tenders_sync_client, TendersClientSync))
        self.assertTrue(isinstance(self.worker.client, TendersClient))
        self.assertTrue(isinstance(self.worker.proxyClient, ProxyClient))
        self.assertTrue(
            isinstance(self.worker.doc_service_client, DocServiceClient))
        self.assertFalse(self.worker.initialization_event.is_set())
        self.assertEqual(self.worker.process_tracker.processing_items, {})

    @patch('openprocurement.bot.identification.databridge.bridge.ProxyClient')
    @patch(
        'openprocurement.bot.identification.databridge.bridge.DocServiceClient'
    )
    @patch(
        'openprocurement.bot.identification.databridge.bridge.TendersClientSync'
    )
    @patch('openprocurement.bot.identification.databridge.bridge.TendersClient'
           )
    def test_tender_sync_clients(self, sync_client, client, doc_service_client,
                                 proxy_client):
        self.worker = EdrDataBridge(config)
        # check client config
        self.assertEqual(client.call_args[0], ('', ))
        self.assertEqual(
            client.call_args[1], {
                'host_url': config['main']['public_tenders_api_server'],
                'api_version': config['main']['tenders_api_version']
            })

        # check sync client config
        self.assertEqual(sync_client.call_args[0],
                         (config['main']['api_token'], ))
        self.assertEqual(
            sync_client.call_args[1], {
                'host_url': config['main']['tenders_api_server'],
                'api_version': config['main']['tenders_api_version']
            })

        # check doc_service_client config
        self.assertEqual(
            doc_service_client.call_args[1], {
                'host': config['main']['doc_service_server'],
                'port': config['main']['doc_service_port'],
                'user': config['main']['doc_service_user'],
                'password': config['main']['doc_service_password']
            })
        # check proxy_client config
        self.assertEqual(
            proxy_client.call_args[1], {
                'host': config['main']['proxy_server'],
                'port': config['main']['proxy_port'],
                'user': config['main']['proxy_user'],
                'password': config['main']['proxy_password'],
                'version': config['main']['proxy_version']
            })

    def test_start_jobs(self):
        self.worker = EdrDataBridge(config)

        scanner, filter_tender, edr_handler, upload_file = [
            MagicMock(return_value=i) for i in range(4)
        ]
        self.worker.scanner = scanner
        self.worker.filter_tender = filter_tender
        self.worker.edr_handler = edr_handler
        self.worker.upload_file = upload_file

        self.worker._start_jobs()
        # check that all jobs were started
        self.assertTrue(scanner.called)
        self.assertTrue(filter_tender.called)
        self.assertTrue(edr_handler.called)
        self.assertTrue(upload_file.called)

        self.assertEqual(self.worker.jobs['scanner'], 0)
        self.assertEqual(self.worker.jobs['filter_tender'], 1)
        self.assertEqual(self.worker.jobs['edr_handler'], 2)
        self.assertEqual(self.worker.jobs['upload_file'], 3)

    @patch('gevent.sleep')
    def test_run(self, sleep):
        self.worker = EdrDataBridge(config)
        # create mocks
        scanner, filter_tender, edr_handler, upload_file = [
            MagicMock() for i in range(4)
        ]
        self.worker.scanner = scanner
        self.worker.filter_tender = filter_tender
        self.worker.edr_handler = edr_handler
        self.worker.upload_file = upload_file
        with patch('__builtin__.True', AlmostAlwaysTrue(100)):
            self.worker.run()
        self.assertEqual(self.worker.scanner.call_count, 1)
        self.assertEqual(self.worker.filter_tender.call_count, 1)
        self.assertEqual(self.worker.edr_handler.call_count, 1)
        self.assertEqual(self.worker.upload_file.call_count, 1)

    def test_proxy_server(self):
        self.worker = EdrDataBridge(config)
        self.worker.sandbox_mode = "True"
        self.proxy_server.stop()
        with self.assertRaises(RequestException):
            self.worker.check_proxy()
        self.proxy_server.start()
        self.assertTrue(self.worker.check_proxy())

    def test_proxy_server_mock(self):
        self.worker = EdrDataBridge(config)
        self.worker.proxyClient = MagicMock(health=MagicMock(
            side_effect=RequestError()))
        with self.assertRaises(RequestError):
            self.worker.check_proxy()
        self.worker.proxyClient = MagicMock(return_value=True)
        self.assertTrue(self.worker.check_proxy())

    def test_proxy_server_success(self):
        self.worker = EdrDataBridge(config)
        self.worker.sandbox_mode = "True"
        self.assertTrue(self.worker.check_proxy())

    def test_proxy_sandmox_mismatch(self):
        self.worker = EdrDataBridge(config)
        self.worker.sandbox_mode = "False"
        with self.assertRaises(RequestException):
            self.worker.check_proxy()
        self.worker.sandbox_mode = "True"
        self.assertTrue(self.worker.check_proxy())

    def test_doc_service(self):
        self.doc_server.stop()
        self.worker = EdrDataBridge(config)
        with self.assertRaises(RequestError):
            self.worker.check_doc_service()
        self.doc_server.start()
        self.assertTrue(self.worker.check_doc_service())

    def test_doc_service_mock(self):
        self.worker = EdrDataBridge(config)
        with patch(
                "openprocurement.bot.identification.databridge.bridge.request",
                side_effect=RequestError()):
            with self.assertRaises(RequestError):
                self.worker.check_doc_service()
        with patch(
                "openprocurement.bot.identification.databridge.bridge.request",
                return_value=True):
            self.assertTrue(self.worker.check_doc_service())

    def test_openprocurement_api_failure(self):
        self.worker = EdrDataBridge(config)
        self.api_server.stop()
        with self.assertRaises(RequestError):
            self.worker.check_openprocurement_api()
        self.api_server.start()
        self.assertTrue(self.worker.check_openprocurement_api())

    def test_openprocurement_api_mock(self):
        self.worker = EdrDataBridge(config)
        self.worker.client = MagicMock(head=MagicMock(
            side_effect=RequestError()))
        with self.assertRaises(RequestError):
            self.worker.check_openprocurement_api()
        self.worker.client = MagicMock()
        self.assertTrue(self.worker.check_openprocurement_api())

    def test_check_services(self):
        t = os.environ.get("SANDBOX_MODE", "False")
        os.environ["SANDBOX_MODE"] = "True"
        self.worker = EdrDataBridge(config)
        self.worker.services_not_available = MagicMock(set=MagicMock(),
                                                       clear=MagicMock())
        self.proxy_server.stop()
        self.worker.check_services()
        self.assertTrue(self.worker.services_not_available.clear.called)
        self.proxy_server.start()
        self.worker.check_services()
        self.assertTrue(self.worker.services_not_available.set.called)
        os.environ["SANDBOX_MODE"] = t

    def test_check_services_mock(self):
        self.worker = EdrDataBridge(config)
        self.worker.check_proxy = self.worker.check_openprocurement_api = self.worker.check_doc_service = MagicMock(
        )
        self.worker.set_wake_up = MagicMock()
        self.worker.set_sleep = MagicMock()
        self.worker.check_services()
        self.assertTrue(self.worker.set_wake_up.called)
        self.worker.check_doc_service = MagicMock(side_effect=RequestError())
        self.worker.check_services()
        self.assertTrue(self.worker.set_sleep.called)

    @patch("gevent.sleep")
    def test_check_log(self, gevent_sleep):
        gevent_sleep = custom_sleep
        self.worker = EdrDataBridge(config)
        self.worker.edrpou_codes_queue = MagicMock(qsize=MagicMock(
            side_effect=Exception()))
        self.worker.check_services = MagicMock(return_value=True)
        self.worker.run()
        self.assertTrue(self.worker.edrpou_codes_queue.qsize.called)
class TestBridgeWorker(BaseServersTest):
    __test__ = True

    def test_init(self):
        self.worker = EdrDataBridge(config)
        self.assertEqual(self.worker.delay, config['main']['delay'])
        self.assertEqual(self.worker.sleep_change_value.time_between_requests,
                         0)
        self.assertTrue(
            isinstance(self.worker.tenders_sync_client, TendersClientSync))
        self.assertTrue(isinstance(self.worker.client, TendersClient))
        self.assertTrue(isinstance(self.worker.proxy_client, ProxyClient))
        self.assertTrue(
            isinstance(self.worker.doc_service_client, DocServiceClient))
        self.assertFalse(self.worker.initialization_event.is_set())
        self.assertEqual(self.worker.process_tracker.processing_items, {})
        self.assertEqual(self.worker.db._backend, "redis")
        self.assertEqual(self.worker.db._db_name, 0)
        self.assertEqual(self.worker.db._port, "16379")
        self.assertEqual(self.worker.db._host, "127.0.0.1")

    @patch('openprocurement.bot.identification.databridge.bridge.ProxyClient')
    @patch(
        'openprocurement.bot.identification.databridge.bridge.DocServiceClient'
    )
    @patch(
        'openprocurement.bot.identification.databridge.bridge.TendersClientSync'
    )
    @patch('openprocurement.bot.identification.databridge.bridge.TendersClient'
           )
    def test_tender_sync_clients(self, sync_client, client, doc_service_client,
                                 proxy_client):
        self.worker = EdrDataBridge(config)
        # check client config
        self.assertEqual(client.call_args[0], ('', ))
        self.assertEqual(
            client.call_args[1], {
                'host_url': config['main']['public_tenders_api_server'],
                'api_version': config['main']['tenders_api_version']
            })

        # check sync client config
        self.assertEqual(sync_client.call_args[0],
                         (config['main']['api_token'], ))
        self.assertEqual(
            sync_client.call_args[1], {
                'host_url': config['main']['tenders_api_server'],
                'api_version': config['main']['tenders_api_version']
            })

        # check doc_service_client config
        self.assertEqual(
            doc_service_client.call_args[1], {
                'host': config['main']['doc_service_server'],
                'port': config['main']['doc_service_port'],
                'user': config['main']['doc_service_user'],
                'password': config['main']['doc_service_password']
            })
        # check proxy_client config
        self.assertEqual(
            proxy_client.call_args[1], {
                'host': config['main']['proxy_server'],
                'port': config['main']['proxy_port'],
                'user': config['main']['proxy_user'],
                'password': config['main']['proxy_password'],
                'version': config['main']['proxy_version']
            })

    def test_start_jobs(self):
        self.worker = EdrDataBridge(config)

        scanner, filter_tender, edr_handler, upload_file_to_doc_service, upload_file_to_tender = \
            [MagicMock(return_value=i) for i in range(5)]
        self.worker.scanner = scanner
        self.worker.filter_tender = filter_tender
        self.worker.edr_handler = edr_handler
        self.worker.upload_file_to_doc_service = upload_file_to_doc_service
        self.worker.upload_file_to_tender = upload_file_to_tender

        self.worker._start_jobs()
        # check that all jobs were started
        self.assertTrue(scanner.called)
        self.assertTrue(filter_tender.called)
        self.assertTrue(edr_handler.called)
        self.assertTrue(upload_file_to_doc_service.called)
        self.assertTrue(upload_file_to_tender.called)

        self.assertEqual(self.worker.jobs['scanner'], 0)
        self.assertEqual(self.worker.jobs['filter_tender'], 1)
        self.assertEqual(self.worker.jobs['edr_handler'], 2)
        self.assertEqual(self.worker.jobs['upload_file_to_doc_service'], 3)
        self.assertEqual(self.worker.jobs['upload_file_to_tender'], 4)

    @patch('gevent.sleep')
    def test_bridge_run(self, sleep):
        self.worker = EdrDataBridge(config)
        # create mocks
        scanner, filter_tender, edr_handler, upload_file_to_doc_service, upload_file_to_tender = \
            [MagicMock() for _ in range(5)]
        self.worker.scanner = scanner
        self.worker.filter_tender = filter_tender
        self.worker.edr_handler = edr_handler
        self.worker.upload_file_to_doc_service = upload_file_to_doc_service
        self.worker.upload_file_to_tender = upload_file_to_tender
        with patch('__builtin__.True', AlmostAlwaysTrue()):
            self.worker.run()
        self.assertEqual(self.worker.scanner.call_count, 1)
        self.assertEqual(self.worker.filter_tender.call_count, 1)
        self.assertEqual(self.worker.edr_handler.call_count, 1)
        self.assertEqual(self.worker.upload_file_to_doc_service.call_count, 1)
        self.assertEqual(self.worker.upload_file_to_tender.call_count, 1)

    def test_proxy_server(self):
        self.worker = EdrDataBridge(config)
        self.worker.sandbox_mode = "True"
        self.proxy_server.stop()
        with self.assertRaises(RequestException):
            self.worker.check_proxy()
        self.proxy_server.start()
        self.assertTrue(self.worker.check_proxy())

    def test_proxy_server_mock(self):
        self.worker = EdrDataBridge(config)
        self.worker.proxy_client = MagicMock(health=MagicMock(
            side_effect=RequestError()))
        with self.assertRaises(RequestError):
            self.worker.check_proxy()
        self.worker.proxy_client = MagicMock(return_value=True)
        self.assertTrue(self.worker.check_proxy())

    def test_proxy_server_success(self):
        self.worker = EdrDataBridge(config)
        self.worker.sandbox_mode = "True"
        self.assertTrue(self.worker.check_proxy())

    def test_proxy_sandmox_mismatch(self):
        self.worker = EdrDataBridge(config)
        self.worker.sandbox_mode = "False"
        with self.assertRaises(RequestException):
            self.worker.check_proxy()
        self.worker.sandbox_mode = "True"
        self.assertTrue(self.worker.check_proxy())

    def test_doc_service(self):
        self.doc_server.stop()
        self.worker = EdrDataBridge(config)
        with self.assertRaises(RequestError):
            self.worker.check_doc_service()
        self.doc_server.start()
        self.assertTrue(self.worker.check_doc_service())

    def test_doc_service_mock(self):
        self.worker = EdrDataBridge(config)
        with patch(
                "openprocurement.bot.identification.databridge.bridge.request",
                side_effect=RequestError()):
            with self.assertRaises(RequestError):
                self.worker.check_doc_service()
        with patch(
                "openprocurement.bot.identification.databridge.bridge.request",
                return_value=True):
            self.assertTrue(self.worker.check_doc_service())

    def test_openprocurement_api_failure(self):
        self.worker = EdrDataBridge(config)
        self.api_server.stop()
        with self.assertRaises(RequestError):
            self.worker.check_openprocurement_api()
        self.api_server.start()
        self.assertTrue(self.worker.check_openprocurement_api())

    def test_openprocurement_api_mock(self):
        self.worker = EdrDataBridge(config)
        self.worker.client = MagicMock(head=MagicMock(
            side_effect=RequestError()))
        with self.assertRaises(RequestError):
            self.worker.check_openprocurement_api()
        self.worker.client = MagicMock()
        self.assertTrue(self.worker.check_openprocurement_api())

    def test_check_services(self):
        t = os.environ.get("SANDBOX_MODE", "False")
        os.environ["SANDBOX_MODE"] = "True"
        self.worker = EdrDataBridge(config)
        self.worker.services_not_available = MagicMock(set=MagicMock(),
                                                       clear=MagicMock())
        self.proxy_server.stop()
        self.worker.check_services()
        self.assertTrue(self.worker.services_not_available.clear.called)
        self.proxy_server.start()
        self.worker.check_services()
        self.assertTrue(self.worker.services_not_available.set.called)
        os.environ["SANDBOX_MODE"] = t

    def test_check_services_mock(self):
        self.worker = EdrDataBridge(config)
        self.worker.check_proxy = self.worker.check_openprocurement_api = self.worker.check_doc_service = MagicMock(
        )
        self.worker.set_wake_up = MagicMock()
        self.worker.set_sleep = MagicMock()
        self.worker.check_services()
        self.assertTrue(self.worker.set_wake_up.called)
        self.worker.check_doc_service = MagicMock(side_effect=RequestError())
        self.worker.check_services()
        self.assertTrue(self.worker.set_sleep.called)

    @patch("gevent.sleep")
    def test_check_log(self, gevent_sleep):
        gevent_sleep = custom_sleep
        self.worker = EdrDataBridge(config)
        self.worker.edrpou_codes_queue = MagicMock(qsize=MagicMock(
            side_effect=Exception()))
        self.worker.check_services = MagicMock(return_value=True)
        self.worker.run()
        self.assertTrue(self.worker.edrpou_codes_queue.qsize.called)

    @patch("gevent.sleep")
    def test_launch(self, gevent_sleep):
        self.worker = EdrDataBridge(config)
        self.worker.run = MagicMock()
        self.worker.all_available = MagicMock(return_value=True)
        self.worker.launch()
        self.worker.run.assert_called_once()

    @patch("gevent.sleep")
    def test_launch_unavailable(self, gevent_sleep):
        self.worker = EdrDataBridge(config)
        self.worker.all_available = MagicMock(return_value=False)
        with patch('__builtin__.True', AlmostAlwaysTrue()):
            self.worker.launch()
        gevent_sleep.assert_called_once()

    def test_unprocessed_items(self):
        data = Data('1', '2', '123', 'awards', {
            'meta': {
                'id': '333'
            },
            'test_data': 'test_data'
        })
        self.redis.set("unprocessed_{}".format(data.doc_id()), dumps(data))
        self.worker = EdrDataBridge(config)
        self.assertEqual(self.worker.upload_to_doc_service_queue.get(), data)

    def test_check_and_revive_jobs(self):
        self.worker = EdrDataBridge(config)
        self.worker.jobs = {
            "test": MagicMock(dead=MagicMock(return_value=True))
        }
        self.worker.revive_job = MagicMock()
        self.worker.check_and_revive_jobs()
        self.worker.revive_job.assert_called_once_with("test")

    def test_revive_job(self):
        self.worker = EdrDataBridge(config)
        self.worker.test = MagicMock()
        self.worker.jobs = {
            "test": MagicMock(dead=MagicMock(return_value=True))
        }
        self.worker.revive_job("test")
        self.assertEqual(self.worker.jobs['test'].dead, False)