def test_get_all_when_file_moved(self):
        self.source.start()
        block_until_synchronised_files_data_source_started(self.source)

        move_semaphore = Semaphore(0)
        deleted = False

        def on_change(change: FileSystemChange):
            nonlocal deleted
            if change == FileSystemChange.DELETE:
                move_semaphore.release()
                deleted = True
            if deleted and change == FileSystemChange.CREATE:
                move_semaphore.release()

        self.source.add_listener(on_change)

        to_move_file_path = glob.glob("%s/*" % self.temp_directory)[0]
        move_to = "%s_moved" % to_move_file_path
        shutil.move(to_move_file_path, move_to)

        move_semaphore.acquire()
        move_semaphore.acquire()

        self.assertCountEqual(self.source.get_all(), self.data)
    def test_get_all_when_file_deleted(self):
        self.source.start()
        block_until_synchronised_files_data_source_started(self.source)

        change_lock = Lock()
        change_lock.acquire()

        def on_change(change: FileSystemChange):
            if change == FileSystemChange.DELETE:
                change_lock.release()

        self.source.add_listener(on_change)

        to_delete_file_path = glob.glob("%s/*" % self.temp_directory)[0]
        deleted_data = extract_data_from_file(to_delete_file_path, parser=lambda data: int(data), separator='\n')
        os.remove(to_delete_file_path)

        change_lock.acquire()

        self.assertCountEqual(self.source.get_all(), [x for x in self.data if x not in deleted_data])
    def test_get_all_when_folder_containing_files_is_deleted(self):
        nested_directory_path = self._add_more_data_in_nested_directory()[0]

        self.source.start()
        block_until_synchronised_files_data_source_started(self.source)

        change_lock = Lock()
        change_lock.acquire()

        def on_change(change: FileSystemChange):
            if change == FileSystemChange.DELETE:
                change_lock.release()

        self.source.add_listener(on_change)

        shutil.rmtree(nested_directory_path)

        change_lock.acquire()

        self.assertCountEqual(self.source.get_all(), self.data)
    def test_get_all_when_file_modified(self):
        self.source.start()
        block_until_synchronised_files_data_source_started(self.source)

        change_lock = Lock()
        change_lock.acquire()

        def on_change(change: FileSystemChange):
            if change == FileSystemChange.MODIFY:
                change_lock.release()

        self.source.add_listener(on_change)

        to_modify_file_path = glob.glob("%s/*" % self.temp_directory)[0]
        to_modify = extract_data_from_file(to_modify_file_path, parser=lambda data: int(data), separator='\n')
        modified = to_modify[0: -1]
        with open(to_modify_file_path, 'w') as file:
            file.write('\n'.join([str(x) for x in modified]))

        change_lock.acquire()

        self.assertCountEqual(self.source.get_all(), [x for x in self.data if x not in to_modify] + modified)
    def test_get_all_when_file_created(self):
        self.source.start()
        block_until_synchronised_files_data_source_started(self.source)

        change_trigger = Semaphore(0)

        def on_change(change: FileSystemChange):
            if change == FileSystemChange.CREATE:
                change_trigger.release()

        self.source.add_listener(on_change)

        more_data = [i for i in range(50)]
        write_data_to_files_in_temp_directory(more_data, 10, dir=self.temp_directory,
                                              file_prefix=TestSynchronisedFilesDataSource._FILE_PREFIX)
        even_more_data = self._add_more_data_in_nested_directory(10)[1]

        triggers = 0
        while triggers != 20:
            change_trigger.acquire()
            triggers += 1

        logging.debug(self.source._origin_mapped_data)
        self.assertCountEqual(self.source.get_all(), self.data + more_data + even_more_data)