Ejemplo n.º 1
0
def test_run_02(error, info):
    """It handles a timeout error."""
    args = {'assembler': 'my_assembler', 'timeout': 10}

    asm = BaseAssembler(args, 'cxn')
    asm.assemble = MagicMock(side_effect=TimeoutError())

    with pytest.raises(TimeoutError) as timeout_error:
        asm.run()

    error_msg = str(timeout_error.value)
    if error_msg[-1] != '.':
        error_msg += '.'
    assert error_msg == (
        'Time ran out for the assembler after 0:00:10 (HH:MM:SS).')

    expect = 'Assembling shards with {}: iteration {}'.format(
        args['assembler'], asm.state['iteration'])
    info.assert_called_once_with(expect)

    # Python 3.6 formats exceptions differently so we need to do this
    assert error.call_count == 1
    regex = re.compile(
        r'Time ran out for the assembler after 0:00:10 \(HH:MM:SS\)')
    assert regex.match(error.call_args[0][0])
Ejemplo n.º 2
0
    def test_initialize_iteration(self, blast_db, query_file, iteration):
        output_files = [
            'prefix/dir/' + f for f in [
                'output.fasta', 'paired_1.fasta', 'paired_2.fasta',
                'single_1.fasta', 'single_2.fasta', 'single_any.fasta'
            ]
        ]
        assembler = BaseAssembler('args', 'db_conn')
        assembler.iter_file = MagicMock(side_effect=output_files)

        assembler.initialize_iteration(blast_db, query_file, iteration)

        assert blast_db == assembler.state['blast_db']
        assert query_file == assembler.state['query_file']
        assert iteration == assembler.state['iteration']
        assert assembler.file['long_reads'] == ''
        assert output_files[0] == assembler.file['output']
        assert output_files[1] == assembler.file['paired_1']
        assert output_files[2] == assembler.file['paired_2']
        assert output_files[3] == assembler.file['single_1']
        assert output_files[4] == assembler.file['single_2']
        assert output_files[5] == assembler.file['single_any']
        assert assembler.file['paired_count'] == 0
        assert assembler.file['single_1_count'] == 0
        assert assembler.file['single_2_count'] == 0
        assert assembler.file['single_any_count'] == 0
Ejemplo n.º 3
0
def test_run_02(error, info):
    """It handles a timeout error."""
    args = {'assembler': 'my_assembler', 'timeout': 10}

    asm = BaseAssembler(args, 'cxn')
    asm.assemble = MagicMock(side_effect=TimeoutError())

    with pytest.raises(TimeoutError) as timeout_error:
        asm.run()

    error_msg = str(timeout_error.value)
    if error_msg[-1] != '.':
        error_msg += '.'
    assert error_msg == (
        'Time ran out for the assembler after 0:00:10 (HH:MM:SS).')

    expect = 'Assembling shards with {}: iteration {}'.format(
        args['assembler'], asm.state['iteration'])
    info.assert_called_once_with(expect)

    # Python 3.6 formats exceptions differently so we need to do this
    assert error.call_count == 1
    regex = re.compile(
        r'Time ran out for the assembler after 0:00:10 \(HH:MM:SS\)')
    assert regex.match(error.call_args[0][0])
Ejemplo n.º 4
0
    def test_no_blast_hits_false(self, sra_blast_hits_count, info):
        assembler = BaseAssembler('args', 'db_conn')
        assembler.set_state('blast_db', 'query_file', 99)

        sra_blast_hits_count.return_value = 1

        assert not assembler.no_blast_hits()

        info.assert_not_called()
Ejemplo n.º 5
0
    def test_no_blast_hits_true(self, sra_blast_hits_count, info):
        assembler = BaseAssembler('args', 'db_conn')
        assembler.set_state('blast_db', 'query_file', 99)

        sra_blast_hits_count.return_value = 0

        assert assembler.no_blast_hits()

        info.assert_called_once_with('No blast hits in iteration {}'.format(
            assembler.state['iteration']))
Ejemplo n.º 6
0
 def build_assembler(self):
     args = {'bit_score': 44, 'contig_length': 55}
     state = {
         'blast_db': 'my_blast_db',
         'query_file': 'my_query_file',
         'query_target': 'my_query_name',
         'iteration': 99
     }
     assembler = BaseAssembler(args, 'my_db_conn')
     assembler.set_state(state['blast_db'], state['query_file'],
                         state['iteration'])
     return assembler
Ejemplo n.º 7
0
    def test_iter_dir(self, args, blast_db, query_file, iteration):
        assume(re.search(r'\w', query_file))
        assembler = BaseAssembler(args, 'db_conn')
        assembler.set_state(blast_db, query_file, iteration)

        base_blast_db = basename(blast_db)
        base_query_file = basename(query_file) if iteration == 1 else ''

        dir_name = '{}_{}_{:02d}'.format(base_blast_db, base_query_file,
                                         iteration)

        expect = join(args['temp_dir'], dir_name)
        assert expect == assembler.iter_dir()
Ejemplo n.º 8
0
def build_assembler():
    """Build a generic assembler."""
    args = {
        'bit_score': 44,
        'contig_length': 55,
        'temp_dir': 'my_temp_dir',
        'assembler': 'my_assembler'}
    asm = BaseAssembler(args, 'my_db_conn')
    asm.state = {
        'blast_db': 'my_blast_db',
        'query_file': 'my_query_file.seq',
        'query_target': 'my_query_name',
        'iter_dir': 'my_iter_dir',
        'iteration': 99,
        'cxn': 'my_cxn'}
    return asm
Ejemplo n.º 9
0
def build_assembler():
    """Build a generic assembler."""
    args = {
        'bit_score': 44,
        'contig_length': 55,
        'temp_dir': 'my_temp_dir',
        'assembler': 'my_assembler'
    }
    asm = BaseAssembler(args, 'my_db_conn')
    asm.state = {
        'blast_db': 'my_blast_db',
        'query_file': 'my_query_file.seq',
        'query_target': 'my_query_name',
        'iter_dir': 'my_iter_dir',
        'iteration': 99,
        'cxn': 'my_cxn'
    }
    return asm
Ejemplo n.º 10
0
 def setUp(self):
     self.db_conn = 'db_conn'
     self.args = {
         'query': ['query_file_1', 'query_file_2'],
         'blast_db': ['blast_db_1', 'blast_db_2'],
         'iterations': 1,
         'log_file': 'log_file_1',
         'temp_dir': 'temp_dir_1'}
     self.assembler = BaseAssembler(self.args, self.db_conn)
Ejemplo n.º 11
0
def set_up():
    """Setup a generic assembler."""
    cxn = 'cxn'
    args = {
        'query': ['query_file_1', 'query_file_2'],
        'blast_db': ['blast_db_1', 'blast_db_2'],
        'iterations': 1,
        'log_file': 'log_file_1',
        'temp_dir': 'temp_dir_1'
    }
    assembler = BaseAssembler(args, cxn)
    return args, cxn, assembler
Ejemplo n.º 12
0
    def test_nothing_assembled_false(self, info):
        assembler = BaseAssembler('args', 'db_conn')
        assembler.set_state('blast_db', 'query_file', 99)
        assembler.file['output'] = 'tests/data/load_seq1.txt'

        assert not assembler.nothing_assembled()

        info.assert_not_called()
Ejemplo n.º 13
0
    def test_nothing_assembled_empty(self, info):
        assembler = BaseAssembler('args', 'db_conn')
        assembler.set_state('blast_db', 'query_file', 99)
        assembler.file['output'] = 'tests/data/empty_file.txt'

        assert assembler.nothing_assembled()

        expect = 'No new assemblies in iteration {}'.format(
            assembler.state['iteration'])
        info.assert_called_once_with(expect)
Ejemplo n.º 14
0
    def test_init(self, args, db_conn):
        assembler = BaseAssembler(args, db_conn)

        assert args == assembler.args
        assert assembler.blast_only is False
        assert [] == assembler.steps
        assert {} == assembler.file

        expected = {
            'iteration': 0,
            'query_target': '',
            'query_file': '',
            'blast_db': '',
            'db_conn': db_conn
        }
        assert expected == assembler.state
Ejemplo n.º 15
0
    def test_run_ok(self, info):
        args = {'assembler': 'my_assembler', 'timeout': 10}

        assembler = BaseAssembler(args, 'db_conn')
        assembler.set_state('blast_db', 'query_file', 99)

        assembler.assemble = MagicMock()

        assembler.run()

        info.assert_called_once_with('Assembling shards with {}: '
                                     'iteration {}'.format(
                                         args['assembler'],
                                         assembler.state['iteration']))
Ejemplo n.º 16
0
def test_init_01():
    """It initializes an assembler object."""
    asm = BaseAssembler('args', 'cxn')

    assert asm.args == 'args'
    assert asm.blast_only is False
    assert asm.steps == []
    assert asm.file == {}
    expected = {
        'iteration': 0,
        'query_target': '',
        'query_file': '',
        'blast_db': '',
        'iter_dir': '',
        'cxn': 'cxn'
    }
    assert asm.state == expected
Ejemplo n.º 17
0
    def test_run_called_process_error(self, error, info):
        args = {'assembler': 'my_assembler', 'timeout': 10}
        error_code = 88
        cmd = 'my command'
        error = subprocess.CalledProcessError(error_code, cmd)

        assembler = BaseAssembler(args, 'db_conn')
        assembler.set_state('blast_db', 'query_file', 99)

        assembler.assemble = MagicMock(side_effect=error)

        with pytest.raises(RuntimeError) as runtime_error:
            assembler.run()

        error_msg = str(runtime_error.value)
        if error_msg[-1] != '.':
            error_msg += '.'
        assert error_msg == (
            "The assembler failed with error: Command 'my command' "
            "returned non-zero exit status 88.")

        expect = 'Assembling shards with {}: iteration {}'.format(
            args['assembler'], assembler.state['iteration'])
        info.assert_called_once_with(expect)
Ejemplo n.º 18
0
    def test_work_path(self):
        iter_dir = 'whatever'
        assembler = BaseAssembler('args', 'db_conn')
        assembler.iter_dir = MagicMock(return_value=iter_dir)

        assert iter_dir == assembler.work_path()