File: test_reference.py

package info (click to toggle)
python-ihm 2.7-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 3,368 kB
  • sloc: python: 30,422; ansic: 5,990; sh: 24; makefile: 20
file content (120 lines) | stat: -rw-r--r-- 5,057 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import utils
import os
import unittest
import urllib.request

TOPDIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
utils.set_search_paths(TOPDIR)
import ihm.reference


class Tests(unittest.TestCase):

    def test_reference(self):
        """Test Reference base class"""
        _ = ihm.reference.Reference()  # noop

    def test_sequence(self):
        """Test Sequence class"""
        s = ihm.reference.Sequence(
            db_name='testdb', db_code='testcode', accession='testacc',
            sequence='CCCG', details='foo')
        s.alignments.append(ihm.reference.Alignment(
            db_begin=10, db_end=30, entity_begin=20, entity_end=40))
        self.assertEqual(s.db_name, 'testdb')
        self.assertEqual(s.db_code, 'testcode')
        self.assertEqual(s.accession, 'testacc')
        self.assertEqual(s.sequence, 'CCCG')
        self.assertEqual(s.details, 'foo')
        a, = s._get_alignments()
        self.assertEqual(a.db_begin, 10)
        self.assertEqual(a.db_end, 30)
        self.assertEqual(a.entity_begin, 20)
        self.assertEqual(a.entity_end, 40)
        self.assertEqual(a.seq_dif, [])

    def test_sequence_default_alignment(self):
        """Test Sequence class with default Alignment"""
        s = ihm.reference.Sequence(
            db_name='testdb', db_code='testcode',
            accession='testacc', sequence='CCCG', details='foo')
        self.assertEqual(s.db_name, 'testdb')
        self.assertEqual(s.db_code, 'testcode')
        self.assertEqual(s.accession, 'testacc')
        self.assertEqual(s.sequence, 'CCCG')
        self.assertEqual(s.details, 'foo')
        a1, = s._get_alignments()
        a1a, = s._get_alignments()
        # should get same default alignment each time (get cache 2nd time)
        self.assertEqual(id(a1), id(a1a))
        self.assertEqual(a1.db_begin, 1)
        self.assertIsNone(a1.db_end)
        self.assertEqual(a1.entity_begin, 1)
        self.assertIsNone(a1.entity_end)
        self.assertEqual(a1.seq_dif, [])

    def test_uniprot_sequence(self):
        """Test UniProtSequence class"""
        lpep = ihm.LPeptideAlphabet()
        sd = ihm.reference.SeqDif(seq_id=1, db_monomer=lpep['C'],
                                  monomer=lpep['W'], details='Test mutation')
        s = ihm.reference.UniProtSequence(
            db_code='testcode', accession='testacc', sequence='CCCG')
        s.alignments.append(ihm.reference.Alignment(seq_dif=[sd]))
        self.assertEqual(s.db_name, 'UNP')
        self.assertEqual(s.db_code, 'testcode')
        self.assertEqual(s.accession, 'testacc')
        self.assertEqual(s.sequence, 'CCCG')
        self.assertIsNone(s.details)
        a, = s.alignments
        self.assertEqual(len(a.seq_dif), 1)
        self.assertEqual(a.seq_dif[0].seq_id, 1)
        self.assertEqual(a.seq_dif[0].db_monomer.id, 'CYS')
        self.assertEqual(a.seq_dif[0].monomer.id, 'TRP')
        self.assertEqual(a.seq_dif[0].details, 'Test mutation')

    def _get_from_uniprot_accession(self, fasta_fname):
        def mock_urlopen(url):
            self.assertTrue(url.endswith('/testacc.fasta'))
            fname = utils.get_input_file_name(TOPDIR, fasta_fname)
            return open(fname, 'rb')
        # Need to mock out urllib.request so we don't hit the network
        # (expensive) every time we test
        try:
            orig_urlopen = urllib.request.urlopen
            urllib.request.urlopen = mock_urlopen
            return ihm.reference.UniProtSequence.from_accession('testacc')
        finally:
            urllib.request.urlopen = orig_urlopen

    def test_uniprot_sequence_from_accession(self):
        """Test UniProtSequence.from_accession()"""
        r = self._get_from_uniprot_accession('P52891.fasta')
        self.assertIsInstance(r, ihm.reference.UniProtSequence)
        self.assertEqual(r.db_code, 'NUP84_YEAST')
        self.assertEqual(r.accession, 'testacc')
        self.assertEqual(len(r.sequence), 726)
        self.assertEqual(r.sequence[:20], 'MELSPTYQTERFTKFSDTLK')
        self.assertEqual(
            r.details,
            'Nucleoporin NUP84 OS=Saccharomyces cerevisiae (strain ATCC '
            '204508 / S288c) OX=559292 GN=NUP84 PE=1 SV=1')

    def test_uniprot_sequence_from_accession_bad_header(self):
        """Test UniProtSequence.from_accession() with bad header"""
        self.assertRaises(ValueError, self._get_from_uniprot_accession,
                          'uniprot_bad_header.fasta')

    def test_uniprot_sequence_from_accession_no_details(self):
        """Test UniProtSequence.from_accession() with no details"""
        r = self._get_from_uniprot_accession('uniprot_no_details.fasta')
        self.assertIsInstance(r, ihm.reference.UniProtSequence)
        self.assertEqual(r.db_code, 'NUP84_YEAST')
        self.assertEqual(r.accession, 'testacc')
        self.assertEqual(len(r.sequence), 726)
        self.assertEqual(r.sequence[:20], 'MELSPTYQTERFTKFSDTLK')
        self.assertIsNone(r.details)


if __name__ == '__main__':
    unittest.main()