Пример #1
0
 def test_allowed_suffix_json(self):
     """Check that json files are allowed for ingestion."""
     service = ftp.FTPFeedingService()
     self.assertFalse(service._is_allowed('foo.jpg'))
     self.assertTrue(service._is_allowed('foo.xml'))
     self.assertTrue(service._is_allowed('foo.json'))
     self.assertTrue(service._is_allowed('foo.JSON'))
     self.assertFalse(service._is_allowed('foojson'))
     self.assertFalse(service._is_allowed('foo.json.tar.gz'))
Пример #2
0
 def test_allowed_suffix_json(self):
     """Check that json files are allowed for ingestion."""
     service = ftp.FTPFeedingService()
     allowed = ftp.FTPFeedingService.ALLOWED_EXT_DEFAULT
     self.assertFalse(service._is_allowed('foo.jpg', allowed))
     self.assertTrue(service._is_allowed('foo.xml', allowed))
     self.assertTrue(service._is_allowed('foo.json', allowed))
     self.assertTrue(service._is_allowed('foo.JSON', allowed))
     self.assertFalse(service._is_allowed('foojson', allowed))
     self.assertFalse(service._is_allowed('foo.json.tar.gz', allowed))
Пример #3
0
    def test_move_ingested(self, ftp_connect):
        """Check that ingested file is moved if "move" is set

        feature requested in SDESK-468
        """
        provider = PROVIDER.copy()
        service = ftp.FTPFeedingService()
        service._update(provider, {})
        mock_ftp = ftp_connect.return_value.__enter__.return_value
        mock_ftp.rename.assert_called_once_with('filename.xml', 'dest_move/filename.xml')
Пример #4
0
    def test_move_error(self, ftp_connect):
        """Check that error on ingestion moves item if "move_path_error" is set

        feature requested in SDESK-1452
        """
        provider = PROVIDER.copy()
        service = ftp.FTPFeedingService()
        service._update(provider, {})
        mock_ftp = ftp_connect.return_value.__enter__.return_value
        mock_ftp.rename.assert_called_once_with('filename.xml', 'error/filename.xml')
Пример #5
0
    def test_move_ingested_no_move(self, ftp_connect):
        """Check that ingested file is not moved if "move" is not set

        feature requested in SDESK-468
        """
        provider = copy.deepcopy(PROVIDER)
        provider['config']['move'] = False
        service = ftp.FTPFeedingService()
        service._update(provider, {})
        mock_ftp = ftp_connect.return_value.__enter__.return_value
        mock_ftp.rename.assert_not_called()
    def test_move_error_default(self, ftp_connect):
        """Check that error on ingestion use default path if "move_path_error" is empty string

        feature requested in SDESK-1452
        """
        provider = PROVIDER.copy()
        provider['config']['move_path_error'] = ""
        service = ftp.FTPFeedingService()
        service._update(provider, {})
        mock_ftp = ftp_connect.return_value.__enter__.return_value
        dest_path = os.path.join(ftp.DEFAULT_FAILURE_PATH, "filename.xml")
        mock_ftp.rename.assert_called_once_with('filename.xml', dest_path)
Пример #7
0
    def test_move_ingested_error(self, ftp_connect, *args):
        """Check that ingested file is moved to error path if ingest fails"""
        provider = copy.deepcopy(PROVIDER)
        provider["config"]["ftp_move_path"] = ""
        service = ftp.FTPFeedingService()
        service._is_empty = mock.MagicMock(return_value=False)
        ingest_items(service.update(provider, {}), False)
        mock_ftp = ftp_connect.return_value.__enter__.return_value

        self.assertEqual(mock_ftp.rename.call_count, len(FakeFTP.files))
        for i, call in enumerate(mock_ftp.rename.call_args_list):
            self.assertEqual(call[0], (FakeFTP.files[i][0], "{}/{}".format("error", FakeFTP.files[i][0])))
Пример #8
0
    def test_move_error(self, ftp_connect):
        """Check that error on ingestion moves item if "move_path_error" is set

        feature requested in SDESK-1452
        """
        provider = copy.deepcopy(PROVIDER)
        service = ftp.FTPFeedingService()
        service._is_empty = mock.MagicMock(return_value=False)
        ingest_items(service.update(provider, {}))
        mock_ftp = ftp_connect.return_value.__enter__.return_value

        self.assertEqual(mock_ftp.rename.call_count, len(FakeFTP.files))
        for i, call in enumerate(mock_ftp.rename.call_args_list):
            self.assertEqual(call[0], (FakeFTP.files[i][0], "error/{}".format(FakeFTP.files[i][0])))
Пример #9
0
    def test_move_error_default(self, ftp_connect):
        """Check that error on ingestion use default path if "move_path_error" is empty string

        feature requested in SDESK-1452
        """
        provider = copy.deepcopy(PROVIDER)
        provider['config']['move_path_error'] = ""
        service = ftp.FTPFeedingService()
        service._update(provider, {})
        mock_ftp = ftp_connect.return_value.__enter__.return_value

        self.assertEqual(mock_ftp.rename.call_count, len(FakeFTP.files))
        for i, call in enumerate(mock_ftp.rename.call_args_list):
            self.assertEqual(call[0], (FakeFTP.files[i][0], '{}/{}'.format(
                ftp.DEFAULT_FAILURE_PATH, FakeFTP.files[i][0])))
Пример #10
0
    def test_move_ingested(self, ftp_connect):
        """Check that ingested file is moved if "move" is set

        feature requested in SDESK-468
        """
        provider = copy.deepcopy(PROVIDER)
        service = ftp.FTPFeedingService()
        service._update(provider, {})
        mock_ftp = ftp_connect.return_value.__enter__.return_value

        self.assertEqual(mock_ftp.rename.call_count, len(FakeFTP.files))
        for i, call in enumerate(mock_ftp.rename.call_args_list):
            self.assertEqual(call[0],
                             (FakeFTP.files[i][0], 'dest_move/{}'.format(
                                 FakeFTP.files[i][0])))
Пример #11
0
    def test_move_backstop(self, ftp_connect):
        """Check that failing file is not moved if it's more recent thant INGEST_OLD_CONTENT_MINUTES"""
        provider = copy.deepcopy(PROVIDER)
        service = ftp.FTPFeedingService()
        service._is_empty = mock.MagicMock(return_value=False)
        ingest_items(service.update(provider, {}))
        mock_ftp = ftp_connect.return_value.__enter__.return_value

        # recent_file must not have been ingested
        self.assertEqual(mock_ftp.rename.call_count, len(FakeFTPRecentFiles.files) - 1)
        for i, call in enumerate(mock_ftp.rename.call_args_list):
            self.assertNotEqual(
                call[0][0],
                "recent_file.xml",
            )
Пример #12
0
    def test_move_ingested_default(self, ftp_connect, *args):
        """Check that ingested file is moved to default path if "move" is empty string

        feature requested in SDESK-1452
        """
        provider = copy.deepcopy(PROVIDER)
        provider['config']['ftp_move_path'] = ""
        service = ftp.FTPFeedingService()
        ingest_items(service.update(provider, {}))
        mock_ftp = ftp_connect.return_value.__enter__.return_value

        self.assertEqual(mock_ftp.rename.call_count, len(FakeFTP.files))
        for i, call in enumerate(mock_ftp.rename.call_args_list):
            self.assertEqual(call[0], (FakeFTP.files[i][0], '{}/{}'.format(
                ftp.DEFAULT_SUCCESS_PATH, FakeFTP.files[i][0])))
Пример #13
0
    def test_it_can_connect(self):
        service = ftp.FTPFeedingService()

        if 'FTP_URL' not in os.environ:
            return

        config = service.config_from_url(os.environ['FTP_URL'])
        self.assertEqual('test', config['path'])
        self.assertEqual('localhost', config['host'])

        config['dest_path'] = tempfile.mkdtemp(prefix=PREFIX)
        provider = {'config': config}

        items = service._update(provider, {})
        self.assertEqual(266, len(items))

        provider['last_updated'] = utcnow()
        self.assertEqual(0, len(service._update(provider, {})))

        self.assertTrue(os.path.isdir(provider['config']['dest_path']))
        self.assertEqual(266, len(os.listdir(provider['config']['dest_path'])))
Пример #14
0
    def test_it_can_connect(self):
        service = ftp.FTPFeedingService()

        if "FTP_URL" not in os.environ:
            return

        config = service.config_from_url(os.environ["FTP_URL"])
        self.assertEqual("test", config["path"])
        self.assertEqual("localhost", config["host"])

        config["dest_path"] = tempfile.mkdtemp(prefix=PREFIX)
        provider = {"config": config}

        items = service.update(provider, {})
        self.assertEqual(266, len(items))

        provider["last_updated"] = utcnow()
        self.assertEqual(0, len(service.update(provider, {})))

        self.assertTrue(os.path.isdir(provider["config"]["dest_path"]))
        self.assertEqual(266, len(os.listdir(provider["config"]["dest_path"])))
Пример #15
0
    def test_files_limit_no_move(self, *mocks):
        """Test file limits when move is off

        feature requested in SDESK-3815
        """
        update = {}
        self.app.config["FTP_INGEST_FILES_LIST_LIMIT"] = 3

        retrieve_and_parse, ftp_connect = mocks
        provider = copy.deepcopy(PROVIDER)
        provider["config"]["move"] = False
        service = ftp.FTPFeedingService()
        service._is_empty = mock.MagicMock(return_value=False)
        mock_ftp = ftp_connect.return_value.__enter__.return_value

        ingest_items(service.update(provider, update))
        provider.update(update)
        self.assertEqual(retrieve_and_parse.call_count, 3)
        self.assertEqual(
            provider["private"]["last_processed_file_modify"],
            datetime.datetime.strptime("20170517164739", "%Y%m%d%H%M%S").replace(tzinfo=utc),
        )

        ingest_items(service.update(provider, update))
        provider.update(update)
        self.assertEqual(retrieve_and_parse.call_count, 8)
        self.assertEqual(
            provider["private"]["last_processed_file_modify"],
            datetime.datetime.strptime("20170517164745", "%Y%m%d%H%M%S").replace(tzinfo=utc),
        )

        ingest_items(service.update(provider, update))
        provider.update(update)
        self.assertEqual(retrieve_and_parse.call_count, 13)
        self.assertEqual(
            provider["private"]["last_processed_file_modify"],
            datetime.datetime.strptime("20170517164746", "%Y%m%d%H%M%S").replace(tzinfo=utc),
        )

        ingest_items(service.update(provider, update))
        provider.update(update)
        self.assertEqual(retrieve_and_parse.call_count, 16)
        self.assertEqual(
            provider["private"]["last_processed_file_modify"],
            datetime.datetime.strptime("20170517164748", "%Y%m%d%H%M%S").replace(tzinfo=utc),
        )

        ingest_items(service.update(provider, update))
        provider.update(update)
        self.assertEqual(retrieve_and_parse.call_count, 22)
        self.assertEqual(
            provider["private"]["last_processed_file_modify"],
            datetime.datetime.strptime("20170517164755", "%Y%m%d%H%M%S").replace(tzinfo=utc),
        )

        ingest_items(service.update(provider, update))
        provider.update(update)
        self.assertEqual(retrieve_and_parse.call_count, 24)
        self.assertEqual(
            provider["private"]["last_processed_file_modify"],
            datetime.datetime.strptime("20170517164756", "%Y%m%d%H%M%S").replace(tzinfo=utc),
        )

        self.assertEqual(mock_ftp.rename.call_count, 0)
Пример #16
0
    def test_files_limit_no_move(self, *mocks):
        """Test file limits when move is off

        feature requested in SDESK-3815
        """
        update = {}
        self.app.config['FTP_INGEST_FILES_LIST_LIMIT'] = 3

        retrieve_and_parse, ftp_connect = mocks
        provider = copy.deepcopy(PROVIDER)
        provider['config']['move'] = False
        service = ftp.FTPFeedingService()
        mock_ftp = ftp_connect.return_value.__enter__.return_value

        service._update(provider, update)
        provider.update(update)
        self.assertEqual(retrieve_and_parse.call_count, 3)
        self.assertEqual(
            provider['private']['last_processed_file_modify'],
            datetime.datetime.strptime('20170517164739',
                                       '%Y%m%d%H%M%S').replace(tzinfo=utc))

        service._update(provider, update)
        provider.update(update)
        self.assertEqual(retrieve_and_parse.call_count, 8)
        self.assertEqual(
            provider['private']['last_processed_file_modify'],
            datetime.datetime.strptime('20170517164745',
                                       '%Y%m%d%H%M%S').replace(tzinfo=utc))

        service._update(provider, update)
        provider.update(update)
        self.assertEqual(retrieve_and_parse.call_count, 13)
        self.assertEqual(
            provider['private']['last_processed_file_modify'],
            datetime.datetime.strptime('20170517164746',
                                       '%Y%m%d%H%M%S').replace(tzinfo=utc))

        service._update(provider, update)
        provider.update(update)
        self.assertEqual(retrieve_and_parse.call_count, 16)
        self.assertEqual(
            provider['private']['last_processed_file_modify'],
            datetime.datetime.strptime('20170517164748',
                                       '%Y%m%d%H%M%S').replace(tzinfo=utc))

        service._update(provider, update)
        provider.update(update)
        self.assertEqual(retrieve_and_parse.call_count, 22)
        self.assertEqual(
            provider['private']['last_processed_file_modify'],
            datetime.datetime.strptime('20170517164755',
                                       '%Y%m%d%H%M%S').replace(tzinfo=utc))

        service._update(provider, update)
        provider.update(update)
        self.assertEqual(retrieve_and_parse.call_count, 24)
        self.assertEqual(
            provider['private']['last_processed_file_modify'],
            datetime.datetime.strptime('20170517164756',
                                       '%Y%m%d%H%M%S').replace(tzinfo=utc))

        self.assertEqual(mock_ftp.rename.call_count, 0)
Пример #17
0
    def test_files_limit_move(self, *mocks):
        """Test file limits when move is on

        feature requested in SDESK-3815
        """
        update = {}
        self.app.config['FTP_INGEST_FILES_LIST_LIMIT'] = 3

        retrieve_and_parse, ftp_connect = mocks
        provider = copy.deepcopy(PROVIDER)
        service = ftp.FTPFeedingService()
        mock_ftp = ftp_connect.return_value.__enter__.return_value

        service._update(provider, update)
        provider.update(update)
        # emulate moving files by reducing list
        ftp_connect().__enter__().mlsd = mock.Mock()
        ftp_connect().__enter__().mlsd.return_value = iter(FakeFTP.files[3:])

        self.assertEqual(retrieve_and_parse.call_count, 3)
        self.assertEqual(
            provider['private']['last_processed_file_modify'],
            datetime.datetime.strptime('20170517164739',
                                       '%Y%m%d%H%M%S').replace(tzinfo=utc))

        service._update(provider, update)
        provider.update(update)
        # emulate moving files by reducing list
        ftp_connect().__enter__().mlsd = mock.Mock()
        ftp_connect().__enter__().mlsd.return_value = iter(FakeFTP.files[6:])

        self.assertEqual(retrieve_and_parse.call_count, 6)
        self.assertEqual(
            provider['private']['last_processed_file_modify'],
            datetime.datetime.strptime('20170517164745',
                                       '%Y%m%d%H%M%S').replace(tzinfo=utc))

        service._update(provider, update)
        provider.update(update)
        # emulate moving files by reducing list
        ftp_connect().__enter__().mlsd = mock.Mock()
        ftp_connect().__enter__().mlsd.return_value = iter(FakeFTP.files[9:])

        self.assertEqual(retrieve_and_parse.call_count, 9)
        self.assertEqual(
            provider['private']['last_processed_file_modify'],
            datetime.datetime.strptime('20170517164746',
                                       '%Y%m%d%H%M%S').replace(tzinfo=utc))

        service._update(provider, update)
        provider.update(update)
        # emulate moving files by reducing list
        ftp_connect().__enter__().mlsd = mock.Mock()
        ftp_connect().__enter__().mlsd.return_value = iter(FakeFTP.files[12:])

        self.assertEqual(retrieve_and_parse.call_count, 12)
        self.assertEqual(
            provider['private']['last_processed_file_modify'],
            datetime.datetime.strptime('20170517164748',
                                       '%Y%m%d%H%M%S').replace(tzinfo=utc))

        service._update(provider, update)
        provider.update(update)
        # emulate moving files by reducing list
        ftp_connect().__enter__().mlsd = mock.Mock()
        ftp_connect().__enter__().mlsd.return_value = iter(FakeFTP.files[15:])

        self.assertEqual(retrieve_and_parse.call_count, 15)
        self.assertEqual(
            provider['private']['last_processed_file_modify'],
            datetime.datetime.strptime('20170517164755',
                                       '%Y%m%d%H%M%S').replace(tzinfo=utc))

        service._update(provider, update)
        provider.update(update)
        # emulate moving files by reducing list
        ftp_connect().__enter__().mlsd = mock.Mock()
        ftp_connect().__enter__().mlsd.return_value = iter(FakeFTP.files[16:])

        self.assertEqual(retrieve_and_parse.call_count, 16)
        self.assertEqual(
            provider['private']['last_processed_file_modify'],
            datetime.datetime.strptime('20170517164756',
                                       '%Y%m%d%H%M%S').replace(tzinfo=utc))

        self.assertEqual(mock_ftp.rename.call_count, 16)
Пример #18
0
    def test_files_limit_move(self, *mocks):
        """Test file limits when move is on

        feature requested in SDESK-3815
        """
        update = {}
        self.app.config["FTP_INGEST_FILES_LIST_LIMIT"] = 3

        retrieve_and_parse, ftp_connect = mocks
        provider = copy.deepcopy(PROVIDER)
        service = ftp.FTPFeedingService()
        service._is_empty = mock.MagicMock(return_value=False)
        mock_ftp = ftp_connect.return_value.__enter__.return_value

        ingest_items(service.update(provider, update))
        provider.update(update)
        # emulate moving files by reducing list
        ftp_connect().__enter__().mlsd = mock.Mock()
        ftp_connect().__enter__().mlsd.return_value = iter(FakeFTP.files[3:])

        self.assertEqual(retrieve_and_parse.call_count, 3)
        self.assertEqual(
            provider["private"]["last_processed_file_modify"],
            datetime.datetime.strptime("20170517164739", "%Y%m%d%H%M%S").replace(tzinfo=utc),
        )

        ingest_items(service.update(provider, update))
        provider.update(update)
        # emulate moving files by reducing list
        ftp_connect().__enter__().mlsd = mock.Mock()
        ftp_connect().__enter__().mlsd.return_value = iter(FakeFTP.files[6:])

        self.assertEqual(retrieve_and_parse.call_count, 6)
        self.assertEqual(
            provider["private"]["last_processed_file_modify"],
            datetime.datetime.strptime("20170517164745", "%Y%m%d%H%M%S").replace(tzinfo=utc),
        )

        ingest_items(service.update(provider, update))
        provider.update(update)
        # emulate moving files by reducing list
        ftp_connect().__enter__().mlsd = mock.Mock()
        ftp_connect().__enter__().mlsd.return_value = iter(FakeFTP.files[9:])

        self.assertEqual(retrieve_and_parse.call_count, 9)
        self.assertEqual(
            provider["private"]["last_processed_file_modify"],
            datetime.datetime.strptime("20170517164746", "%Y%m%d%H%M%S").replace(tzinfo=utc),
        )

        ingest_items(service.update(provider, update))
        provider.update(update)
        # emulate moving files by reducing list
        ftp_connect().__enter__().mlsd = mock.Mock()
        ftp_connect().__enter__().mlsd.return_value = iter(FakeFTP.files[12:])

        self.assertEqual(retrieve_and_parse.call_count, 12)
        self.assertEqual(
            provider["private"]["last_processed_file_modify"],
            datetime.datetime.strptime("20170517164748", "%Y%m%d%H%M%S").replace(tzinfo=utc),
        )

        ingest_items(service.update(provider, update))
        provider.update(update)
        # emulate moving files by reducing list
        ftp_connect().__enter__().mlsd = mock.Mock()
        ftp_connect().__enter__().mlsd.return_value = iter(FakeFTP.files[15:])

        self.assertEqual(retrieve_and_parse.call_count, 15)
        self.assertEqual(
            provider["private"]["last_processed_file_modify"],
            datetime.datetime.strptime("20170517164755", "%Y%m%d%H%M%S").replace(tzinfo=utc),
        )

        ingest_items(service.update(provider, update))
        provider.update(update)
        # emulate moving files by reducing list
        ftp_connect().__enter__().mlsd = mock.Mock()
        ftp_connect().__enter__().mlsd.return_value = iter(FakeFTP.files[16:])

        self.assertEqual(retrieve_and_parse.call_count, 16)
        self.assertEqual(
            provider["private"]["last_processed_file_modify"],
            datetime.datetime.strptime("20170517164756", "%Y%m%d%H%M%S").replace(tzinfo=utc),
        )

        self.assertEqual(mock_ftp.rename.call_count, 16)