class BatchDownloaderDownloadingTestCase(unittest.TestCase):

    GET_NUM_FILES = 5

    def setUp(self):
        self.linkser = LinksRetriever(THREAD_URL)
        #self.destination_directory = os.path.expanduser('~/Downloads/TestDownloadThread/')
        self.thread_dir = TemporaryDirectory(dir=TMP_DIRECTORY)
        self.destination_directory = self.thread_dir.name
        self.downloader = BatchDownloader(self.linkser, self.destination_directory)
        self.download_files()

    def download_files(self):
        for url in self.linkser.get_all_file_links()[:self.GET_NUM_FILES]:
            download_path = utilities.download_file(url, self.downloader.destination_folder)
            assert os.path.exists(download_path)

    def test_files_downloaded(self):
        downloaded = self.downloader.get_files_downloaded()
        self.assertEqual(len(downloaded), self.GET_NUM_FILES)

    def test_files_not_downloaded_gen(self):
        not_downloaded = self.downloader.links_not_downloaded()
        self.assertIsNotNone(not_downloaded)
        not_downloaded_tuple = tuple(not_downloaded)
        self.assertEqual(len(not_downloaded_tuple), len(self.downloader.files_to_download) - len(self.downloader.get_files_downloaded()))

    def test_compare_downloaded(self):
        not_downloaded = tuple(self.downloader.get_links_not_downloaded())
        self.assertEqual(len(not_downloaded), len(self.linkser.get_all_file_links()) - self.GET_NUM_FILES)
class ThreadDownloaderWithIgnoreFilteringTestCase(unittest.TestCase):

    def setUp(self):
        self.downloader = BatchDownloader(LinksRetriever(TEST_THREAD_FILENAME), TMP_DIRECTORY)
        self.downloader.ifilter = IgnoreFilter(SOME_THREAD_FILE_URLS)    # Just a normal one, without regular expressions

    def test_get_links(self):
        all_links = self.downloader.links_retriever.get_all_file_links()
        downloaded = self.downloader.get_files_downloaded()
        ignored = self.downloader.ifilter.filter_list

        file_links = tuple(self.downloader.get_links())  # implied filtered=True (default)
        self.assertEqual(len(file_links), len(all_links) - len(downloaded) - len(ignored))

    def test_get_links_filtered_false(self):
        all_links = self.downloader.links_retriever.get_all_file_links()
        downloaded = self.downloader.get_files_downloaded()
        ignored = self.downloader.ifilter.filter_list

        file_links = self.downloader.get_links(filtered=False)  # do not use ifilter.filter()
        self.assertEqual(len(file_links), len(all_links) - len(downloaded))