File: test_schema.py

package info (click to toggle)
pybel 0.15.5-4
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 16,504 kB
  • sloc: python: 29,392; javascript: 246; makefile: 226; sh: 20
file content (161 lines) | stat: -rw-r--r-- 5,992 bytes parent folder | download | duplicates (3)
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# -*- coding: utf-8 -*-

"""Tests for the jsonschema node validation."""

import copy
import json
import os
import unittest

import pybel.dsl
from pybel.schema import is_valid_edge, is_valid_node
from pybel.testing.utils import n

NAMESPACE, NAME, IDENTIFIER = n(), n(), n()

BLANK_ABUNDANCE = {"function": "", "variants": []}

# Abundances
PROTEIN = pybel.dsl.Protein(namespace=NAMESPACE, name=NAME, identifier=IDENTIFIER)
GENE = pybel.dsl.Gene(NAMESPACE, name=NAME, identifier=IDENTIFIER)

# Variants
GENE_MOD = pybel.dsl.GeneModification(NAME, namespace=NAMESPACE, identifier=IDENTIFIER)
PROTEIN_SUB = pybel.dsl.ProteinSubstitution("Ala", 1, "Tyr")
PROTEIN_MOD = pybel.dsl.ProteinModification(NAME, code="Ala", position=1, namespace=NAMESPACE, identifier=IDENTIFIER)
FRAGMENT = pybel.dsl.Fragment(1, 2)


class TestNodeSchema(unittest.TestCase):
    """Tests for the jsonschema node validation."""

    def test_pure_abundances(self):
        """Test validating abundance nodes."""
        self.assertTrue(is_valid_node(PROTEIN))
        self.assertTrue(is_valid_node(GENE))

        abundance = pybel.dsl.Abundance(namespace=NAMESPACE, name=NAME, identifier=IDENTIFIER)
        self.assertTrue(is_valid_node(abundance))

    def test_variant_abundances(self):
        """Test validating abundance nodes with variants."""
        gmod = GENE.with_variants(GENE_MOD)
        self.assertTrue(is_valid_node(gmod))

        psub = PROTEIN.with_variants(PROTEIN_SUB)
        self.assertTrue(is_valid_node(psub))

        pmod = PROTEIN.with_variants(PROTEIN_MOD)
        self.assertTrue(is_valid_node(pmod))

        frag = PROTEIN.with_variants(FRAGMENT)
        self.assertTrue(is_valid_node(frag))

    def test_matching_variants(self):
        """Test catching invalid abundance/variant pairs, e.g. ProteinModification on a Gene."""
        invalid_gmod = PROTEIN.with_variants(GENE_MOD)
        self.assertFalse(is_valid_node(invalid_gmod))

        invalid_psub = GENE.with_variants(PROTEIN_SUB)
        self.assertFalse(is_valid_node(invalid_psub))

        invalid_pmod = GENE.with_variants(PROTEIN_MOD)
        self.assertFalse(is_valid_node(invalid_pmod))

        invalid_frag = GENE.with_variants(FRAGMENT)
        self.assertFalse(is_valid_node(invalid_frag))

    def test_fusions(self):
        """Test validating fusion nodes."""
        protein = pybel.dsl.Protein(namespace=NAMESPACE, name=NAME, identifier=IDENTIFIER)
        enum_fusion_range = pybel.dsl.EnumeratedFusionRange("r", 1, 79)
        missing_fusion_range = pybel.dsl.MissingFusionRange()
        fusion_node = pybel.dsl.FusionBase(protein, protein, range_5p=enum_fusion_range, range_3p=missing_fusion_range)
        self.assertTrue(is_valid_node(fusion_node))

    def test_list_abundances(self):
        """Test validating list abundance nodes."""
        complex_abundance = pybel.dsl.ComplexAbundance(
            [GENE.with_variants(GENE_MOD), PROTEIN.with_variants(PROTEIN_SUB)],
            namespace=NAMESPACE,
            name=NAME,
            identifier=IDENTIFIER,
        )
        composite_abundance = pybel.dsl.CompositeAbundance([PROTEIN, complex_abundance])
        self.assertTrue(is_valid_node(complex_abundance))
        self.assertTrue(is_valid_node(composite_abundance))

    def test_reaction(self):
        """Test validating a reaction node."""
        node = pybel.dsl.Rna(namespace=NAMESPACE, name=NAME, identifier=IDENTIFIER)
        node_list = [node, PROTEIN, GENE]
        rxn = pybel.dsl.Reaction(reactants=node_list, products=node_list)
        self.assertTrue(is_valid_node(rxn))

    def test_invalid_abundances(self):
        """Test that invalid abundances are caught."""
        missing_fn = BLANK_ABUNDANCE.copy()
        missing_fn.pop("function")
        self.assertFalse(is_valid_node(missing_fn))

    def test_invalid_psub(self):
        """Test that invalid protein substitutions are caught."""
        missing_hgvs = dict(PROTEIN_SUB)
        # Remove the required "hgvs" property
        missing_hgvs.pop("hgvs")
        protein = BLANK_ABUNDANCE.copy()
        protein["function"] = "Protein"
        protein["variants"] = [missing_hgvs]
        self.assertFalse(is_valid_node(protein))

    def test_invalid_amino(self):
        """Test that protein variants with invalid amino acid codes are caught."""
        invalid_psub = dict(PROTEIN_SUB)
        invalid_psub["hgvs"] = "p.Aaa0Bbb"
        self.assertFalse(is_valid_node(invalid_psub))

        invalid_pmod = dict(PROTEIN_MOD)
        invalid_pmod["code"] = "Aaa"
        self.assertFalse(is_valid_node(invalid_pmod))


class TestEdgeSchema(unittest.TestCase):
    """Tests for the jsonschema edge validation."""

    @classmethod
    def setUpClass(cls):
        """Load the edge contained in example_edge.json."""
        here = os.path.abspath(os.path.dirname(__file__))
        example_file = os.path.join(here, "example_edge.json")
        with open(example_file) as example_json:
            edge = json.load(example_json)
        cls.example_edge = edge

    def test_predefined_example(self):
        """Test a predefined edge example."""
        edge = self.example_edge
        self.assertTrue(is_valid_edge(edge))

    def test_missing_information(self):
        """Test removing information from the predefined edge."""
        edge = self.example_edge

        missing_source = copy.deepcopy(edge)
        missing_source.pop("source")
        self.assertFalse(is_valid_edge(missing_source))

        missing_relation = copy.deepcopy(edge)
        missing_relation.pop("relation")
        self.assertFalse(is_valid_edge(missing_relation))

        missing_target = copy.deepcopy(edge)
        missing_target.pop("target")
        self.assertFalse(is_valid_edge(missing_target))

        missing_location = copy.deepcopy(edge)
        missing_location["target"]["effect"].pop("fromLoc")
        self.assertFalse(is_valid_edge(missing_location))


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