def test_Controller_on_file_download_Submission(homedir, config, mocker): """ If the handler is passed a submission, check the download_submission function is the one called against the API. Using the `config` fixture to ensure the config is written to disk. """ mock_gui = mocker.MagicMock() mock_session = mocker.MagicMock() co = Controller('http://localhost', mock_gui, mock_session, homedir) co.call_api = mocker.MagicMock() co.api = mocker.MagicMock() source = factory.Source() file_ = db.File(source=source, uuid='uuid', size=1234, filename='1-myfile.doc.gpg', download_url='http://myserver/myfile', is_downloaded=False) submission_sdk_object = mocker.MagicMock() mock_submission = mocker.patch('sdclientapi.Submission') mock_submission.return_value = submission_sdk_object co.on_file_download(source, file_) co.call_api.assert_called_once_with( co.api.download_submission, co.on_file_download_success, co.on_file_download_failure, submission_sdk_object, co.data_dir, current_object=file_, )
def test_delete_single_submission_or_reply_single_file_no_folder( homedir, mocker): """ This test checks that calling the delete_single_submission_or_reply method deletes the file even if its not in a per-document folder. """ source = factory.Source(journalist_designation="dissolved-steak") file_server_filename = "1-dissolved-steak-msg.gpg" test_obj = db.File( source=source, uuid="test", size=123, filename=file_server_filename, download_url="http://test/test", ) original_location = test_obj.location test_obj.location = mocker.MagicMock(side_effect=[ os.path.join(homedir, file_server_filename), original_location(homedir) ]) add_test_file_to_temp_dir(homedir, file_server_filename) delete_single_submission_or_reply_on_disk(test_obj, homedir) with pytest.raises(FileNotFoundError): open(os.path.join(homedir, file_server_filename), "r")
def test_delete_single_submission_or_reply_single_file(homedir, mocker): """ This test checks that calling the delete_single_submission_or_reply method deletes the file as well as the folder it's inside. """ source = factory.Source(journalist_designation="dissolved-steak") file_server_filename = "1-dissolved-steak-msg.gpg" test_obj = db.File( source=source, uuid="test", size=123, filename=file_server_filename, download_url="http://test/test", ) source_directory = os.path.dirname(test_obj.location(homedir)) add_test_file_to_temp_dir(source_directory, file_server_filename) delete_single_submission_or_reply_on_disk(test_obj, homedir) # Ensure both file and its containing folder are gone. with pytest.raises(FileNotFoundError): open(os.path.join(source_directory, file_server_filename), "r") with pytest.raises(FileNotFoundError): open(source_directory, "r")
def File(**attrs): global FILE_COUNT FILE_COUNT += 1 defaults = dict( uuid='source-uuid-{}'.format(FILE_COUNT), filename='{}-reply.gpg'.format(FILE_COUNT), size=123, download_url='http://wat.onion/abc', is_decrypted=True, is_downloaded=True, ) defaults.update(attrs) return db.File(**defaults)
def File(**attrs): global FILE_COUNT FILE_COUNT += 1 defaults = dict( uuid="file-uuid-{}".format(FILE_COUNT), filename="{}-doc.gz.gpg".format(FILE_COUNT), size=123, download_url="http://wat.onion/abc", is_decrypted=True, is_downloaded=True, ) defaults.update(attrs) return db.File(**defaults)
def test_Controller_on_file_download_user_not_signed_in( homedir, config, mocker): """ If a user clicks the download button but is not logged in, an error should appear. Using the `config` fixture to ensure the config is written to disk. """ mock_gui = mocker.MagicMock() mock_session = mocker.MagicMock() co = Controller('http://localhost', mock_gui, mock_session, homedir) source = factory.Source() file_ = db.File(source=source, uuid='uuid', size=1234, filename='1-myfile.doc.gpg', download_url='http://myserver/myfile', is_downloaded=False) co.on_action_requiring_login = mocker.MagicMock() co.api = None submission_sdk_object = mocker.MagicMock() mock_submission = mocker.patch('sdclientapi.Submission') mock_submission.return_value = submission_sdk_object co.on_file_download(source, file_) co.on_action_requiring_login.assert_called_once_with()
def test_update_sources_deletes_files_associated_with_the_source( homedir, mocker, session_maker): """ Check that: * Sources are deleted on disk after sync. """ mock_session = mocker.MagicMock() # Test scenario: one source locally, no sources on server. remote_sources = [] # A local source object. To ensure that all submissions/replies from # various stages of processing are cleaned up, we'll add several filenames # associated with each message, document, and reply for each stage of processing. # This simulates if a step failed. msg_server_filename = "1-pericardial-surfacing-msg.gpg" msg_local_filename_decrypted = "1-pericardial-surfacing-msg" file_server_filename = "1-pericardial-surfacing-doc.gz.gpg" file_local_filename_decompressed = "1-pericardial-surfacing-doc" file_local_filename_decrypted = "1-pericardial-surfacing-doc.gz" reply_server_filename = "1-pericardial-surfacing-reply.gpg" reply_local_filename_decrypted = "1-pericardial-surfacing-reply" # Here we're not mocking out the models use so that we can use the collection attribute. local_source = factory.Source(journalist_designation="beep_boop") file_submission = db.File( source=local_source, uuid="test", size=123, filename=file_server_filename, download_url="http://test/test", ) msg_submission = db.File( source=local_source, uuid="test", size=123, filename=msg_server_filename, download_url="http://test/test", ) user = db.User(username="******") reply = db.Reply(source=local_source, journalist=user, filename=reply_server_filename, size=1234, uuid="test") local_source.submissions = [file_submission, msg_submission] local_source.replies = [reply] # Make the test files on disk in tmpdir so we can check they get deleted. test_filename_absolute_paths = [] sourcedir = os.path.join(homedir, local_source.journalist_filename) for test_filename in [ msg_server_filename, msg_local_filename_decrypted, file_server_filename, file_local_filename_decompressed, file_local_filename_decrypted, reply_server_filename, reply_local_filename_decrypted, ]: abs_server_filename = add_test_file_to_temp_dir( sourcedir, test_filename) test_filename_absolute_paths.append(abs_server_filename) local_sources = [local_source] update_sources(remote_sources, local_sources, mock_session, homedir) # Ensure the files associated with the reply are deleted on disk. for test_filename in test_filename_absolute_paths: assert not os.path.exists(test_filename) # Ensure the record for the local source is gone, along with its # related files. mock_session.delete.assert_called_with(local_source) # Session is committed to database. assert mock_session.commit.call_count == 1