Пример #1
0
def test_make_log_dir(rsync_api: RsyncAPI, ticket_number: int, caplog):
    """Test generating the directory for logging"""
    caplog.set_level(logging.INFO)

    # WHEN the log directory is created
    rsync_api.set_log_dir(folder_prefix=str(ticket_number))
    rsync_api.create_log_dir(dry_run=True)

    # THEN the path is not created since it is a dry run
    assert "Would have created path" in caplog.text

    # THEN the created path is
    assert str(rsync_api.log_dir).startswith(f"/another/path/{ticket_number}")
Пример #2
0
def test_set_log_dir(rsync_api: RsyncAPI, ticket_number: int, caplog):
    """Test function to set log dir for path"""

    caplog.set_level(logging.INFO)

    # GIVEN an RsyncAPI, with its base path as its log dir
    base_path: Path = rsync_api.log_dir

    # WHEN setting the log directory
    rsync_api.set_log_dir(folder_prefix=str(ticket_number))

    # THEN the log dir should set to a new path, different from the base path
    assert base_path.as_posix() != rsync_api.log_dir.as_posix()
    assert "Setting log dir to:" in caplog.text
Пример #3
0
def test_get_source_path_no_case(rsync_api: RsyncAPI, ticket_number: int,
                                 mocker, helpers, caplog):
    """Test generating the source path before rsync when there is no case"""
    caplog.set_level(logging.WARNING)

    # GIVEN file exists
    mocker.patch.object(RsyncAPI, "get_all_cases_from_ticket")
    RsyncAPI.get_all_cases_from_ticket.return_value = None

    with pytest.raises(CgError):
        # WHEN the source path is collected
        rsync_api.get_source_and_destination_paths(ticket_id=ticket_number)

        # THEN the source path ends with a customer id, followed by "inbox" and a ticket id
        assert "Could not find any cases for ticket_id" in caplog.text
Пример #4
0
def test_run_rsync_on_slurm(microsalt_case: models.Family, rsync_api: RsyncAPI,
                            ticket_number: int, caplog, mocker, helpers):
    """Test for running rsync on slurm"""
    caplog.set_level(logging.INFO)

    # GIVEN a valid microsalt case
    case: models.Family = microsalt_case

    # GIVEN paths needed to run rsync
    mocker.patch.object(RsyncAPI, "get_source_and_destination_paths")
    RsyncAPI.get_source_and_destination_paths.return_value = {
        "delivery_source_path": Path("/path/to/source"),
        "rsync_destination_path": Path("/path/to/destination"),
    }

    mocker.patch.object(RsyncAPI, "get_all_cases_from_ticket")
    RsyncAPI.get_all_cases_from_ticket.return_value = [case]

    # WHEN the destination path is created
    sbatch_number: int = rsync_api.run_rsync_on_slurm(ticket_id=ticket_number,
                                                      dry_run=True)

    # THEN check that SARS-COV-2 analysis is not delivered
    assert "Delivering report for SARS-COV-2 analysis" not in caplog.text

    # THEN check that an integer was returned as sbatch number
    assert isinstance(sbatch_number, int)
Пример #5
0
def test_slurm_rsync_single_case(microsalt_case: models.Family,
                                 rsync_api: RsyncAPI, caplog, mocker, helpers,
                                 ticket_number: int):
    """Test for running rsync on a single case on slurm"""
    caplog.set_level(logging.INFO)

    # GIVEN a valid microsalt case
    case: models.Family = microsalt_case

    # GIVEN paths needed to run rsync
    mocker.patch.object(RsyncAPI, "get_source_and_destination_paths")
    RsyncAPI.get_source_and_destination_paths.return_value = {
        "delivery_source_path": Path("/path/to/source"),
        "rsync_destination_path": Path("/path/to/destination"),
    }

    mocker.patch.object(Store, "get_ticket_from_case")
    Store.get_ticket_from_case.return_value = ticket_number

    # WHEN the destination path is created
    sbatch_number: int = rsync_api.slurm_rsync_single_case(
        case_id=case.internal_id, case_files_present=True, dry_run=True)

    # THEN check that an integer was returned as sbatch number
    assert isinstance(sbatch_number, int)
Пример #6
0
def test_concatenate_rsync_commands(analysis_family: dict, analysis_store_trio,
                                    project_dir, customer_id, ticket_nr):
    """Tests the function to concatenate rsync commands for transferring multiple files"""
    # GIVEN a list with a case and a sample name
    folder_list: List[str] = [
        analysis_family["name"], analysis_family["samples"][0]["name"]
    ]
    source_and_destination_paths = {
        "delivery_source_path": project_dir / customer_id / str(ticket_nr),
        "rsync_destination_path": project_dir / customer_id,
    }
    # WHEN then commands are generated
    commands: str = RsyncAPI.concatenate_rsync_commands(
        folder_list=folder_list,
        source_and_destination_paths=source_and_destination_paths,
        ticket_id=ticket_nr,
    )
    # THEN the correct folder should be added to the source path
    assert (" ".join([
        str(source_and_destination_paths["delivery_source_path"] /
            analysis_family["name"]),
        str(source_and_destination_paths["delivery_source_path"]),
    ]) in commands)
    assert (" ".join([
        str(source_and_destination_paths["delivery_source_path"] /
            analysis_family["samples"][0]["name"]),
        str(source_and_destination_paths["delivery_source_path"]),
    ]) in commands)
Пример #7
0
def test_get_folders_to_deliver(analysis_family: dict, analysis_store_trio,
                                rsync_api: RsyncAPI, case_id: str):
    """Tests the ability for the rsync api to get case and sample names"""
    # GIVEN a case

    # WHEN the function gets the folders
    folder_list: List[str] = rsync_api.get_folders_to_deliver(
        case_id=case_id, sample_files_present=True, case_files_present=True)

    # THEN it the list should contain the case name and all the samples
    assert folder_list == [
        analysis_family["samples"][0]["name"],
        analysis_family["samples"][1]["name"],
        analysis_family["samples"][2]["name"],
        analysis_family["name"],
    ]
Пример #8
0
def test_get_source_and_destination_paths(mutant_case: models.Family,
                                          rsync_api: RsyncAPI,
                                          ticket_number: int, mocker):
    """Test generating the source path before rsync"""

    # GIVEN a valid Sars-cov-2 case
    case = mutant_case

    # GIVEN file exists
    mocker.patch.object(RsyncAPI, "get_all_cases_from_ticket")
    RsyncAPI.get_all_cases_from_ticket.return_value = [case]

    # WHEN the source path is created
    source_and_destination_paths = rsync_api.get_source_and_destination_paths(
        ticket_id=ticket_number)

    # THEN the source path ends with a customer id, followed by "inbox" and a ticket id
    assert (source_and_destination_paths["delivery_source_path"].as_posix().
            endswith(f"/cust000/inbox/{ticket_number}"))
    # THEN the destination path is in the format server.name.se:/path/cust_id/path/ticket_id/
    assert (source_and_destination_paths["rsync_destination_path"].as_posix()
            == "server.name.se:/some/cust000/inbox")
Пример #9
0
def fixture_rsync_api(cg_context: CGConfig) -> RsyncAPI:
    """RsyncAPI fixture"""
    _rsync_api: RsyncAPI = RsyncAPI(config=cg_context)
    return _rsync_api