5483f6f325dbcc03452279d202940141d8892f23
[htsworkflow.git] / htsworkflow / submission / test / test_encoded.py
1 import json
2 import os
3 from pprint import pprint
4 from unittest2 import TestCase, TestSuite, defaultTestLoader, skip
5
6 from htsworkflow.submission.encoded import (ENCODED,
7      ENCODED_CONTEXT,
8      ENCODED_NAMESPACES
9 )
10
11 class TestEncoded(TestCase):
12     def test_prepare_url(self):
13         encode = ENCODED('test.encodedcc.edu')
14
15         tests = [
16             ('/experiments', 'http://test.encodedcc.edu/experiments'),
17             ('/experiments/ENCLB045ZZZ',
18              'http://test.encodedcc.edu/experiments/ENCLB045ZZZ'),
19             ('http://submit.encodedcc.edu/experiments/ENCLB045ZZZ',
20              'http://submit.encodedcc.edu/experiments/ENCLB045ZZZ'),
21         ]
22         for url, result in tests:
23             self.assertEqual(encode.prepare_url(url), result)
24
25     def test_validate(self):
26         """Test validation
27         """
28         schema_file = os.path.join(os.path.dirname(__file__), 'library.json')
29         schema = json.loads(open(schema_file, 'r').read())
30
31         obj = {u'@id': u'/libraries/ENCLB045ZZZ/',
32                u'@type': [u'library', u'item'],
33                u'accession': u'ENCLB045ZZZ',
34                u'aliases': [],
35                u'alternate_accessions': [],
36                u'award': u'/awards/U54HG006998/',
37                u'biosample': u'/biosamples/ENCBS089RNA/',
38                u'date_created': u'2014-01-14T19:44:51.061770+00:00',
39                u'depleted_in_term_id': [],
40                u'depleted_in_term_name': [],
41                u'documents': [],
42                u'extraction_method': u'Ambion mirVana',
43                u'fragmentation_method': u'Illumina/Nextera tagmentation',
44                u'lab': u'/labs/barbara-wold/',
45                u'library_size_selection_method': u'SPRI beads',
46                u'lysis_method': u'Ambion mirVana',
47                u'nucleic_acid_term_id': u'SO:0000871',
48                u'nucleic_acid_term_name': u'polyadenylated mRNA',
49                u'paired_ended': False,
50                u'schema_version': u'2',
51                u'size_range': u'>200',
52                u'status': u'CURRENT',
53                u'strand_specificity': False,
54                u'submitted_by': u'/users/0e3dde9b-aaf9-42dd-87f7-975a85072ed2/',
55                u'treatments': [],
56                u'uuid': u'42c46028-708f-4347-a3df-2c82dfb021c4'}
57         encode = ENCODED('submit.encodedcc.org')
58         encode.schemas[u'library'] = schema
59         encode.validate(obj)
60         self.assertTrue('@id' in obj)
61
62     def test_create_context(self):
63         linked_id = {'@type': '@id'}
64         library = { '@id': '/libraries/1234', '@type': ['library', 'item'] }
65
66         encode = ENCODED('test.encodedcc.org')
67         url = encode.prepare_url(library['@id'])
68         context = encode.create_jsonld_context(library, url)
69         self.assertEqual(context['@vocab'], 'http://test.encodedcc.org/profiles/library.json#')
70         self.assertEqual(context['award'], linked_id )
71         self._verify_context(context, 'library')
72         # namespaces not added yet.
73         self.assertRaises(AssertionError, self._verify_namespaces, context)
74         encode.add_jsonld_namespaces(context)
75         self._verify_namespaces(context)
76
77     def test_add_context(self):
78         """Checking to make sure nested @base and @vocab urls are set correctly
79         """
80         obj = {
81             "nucleic_acid_term_name": "RNA",
82             "accession": "ENCLB044ZZZ",
83             "@id": "/libraries/ENCLB044ZZZ/",
84             "schema_version": "1",
85             "@type": [
86                 "library",
87                 "item"
88             ],
89             "lysis_method": "Ambion mirVana",
90             "nucleic_acid_term_id": "SO:0000356",
91             "biosample": {
92                 "biosample_term_name": "GM12878",
93                 "description": "B-lymphocyte, lymphoblastoid, International HapMap Project - CEPH/Utah - European Caucasion, Epstein-Barr Virus",
94                 "accession": "ENCBS090RNA",
95                 "date_created": "2013-10-29T21:15:29.144260+00:00",
96                 "@id": "/biosamples/ENCBS090RNA/",
97                 "aliases": [
98                 "brenton-graveley:GM12878-2",
99                 "thomas-gingeras:191WC"
100                 ],
101                 "organism": "/organisms/human/",
102                 "@type": [
103                 "biosample",
104                 "item"
105                 ]
106             },
107         }
108
109         encode = ENCODED('test.encodedcc.org')
110         bio_base = encode.prepare_url(obj['biosample']['@id'])
111
112         url = encode.prepare_url('/libraries/ENCLB044ZZZ/?format=json&embed=False')
113         schema_url = encode.get_schema_url(obj)
114         encode.add_jsonld_context(obj, url)
115
116         self.assertEqual(obj['biosample']['@context']['@base'], bio_base)
117         self.assertEqual(obj['@context']['@vocab'], schema_url)
118         self._verify_context(obj['@context'], 'library')
119         self._verify_namespaces(obj['@context'])
120         self._verify_context(obj['biosample']['@context'], 'biosample')
121         self.assertEqual(obj['@context']['rdf'], 'http://www.w3.org/1999/02/22-rdf-syntax-ns#')
122         self.assertEqual(obj['@context']['OBO'], 'http://purl.obolibrary.org/obo/')
123
124
125     def _verify_context(self, context, obj_type):
126         for context_key in [None, obj_type]:
127             for k in ENCODED_CONTEXT[context_key]:
128                 self.assertIn(k, context)
129                 self.assertEqual(ENCODED_CONTEXT[context_key][k], context[k])
130
131     def _verify_namespaces(self, context):
132         for k in ENCODED_NAMESPACES:
133             self.assertIn(k, context)
134             self.assertEqual(ENCODED_NAMESPACES[k], context[k])
135
136 def suite():
137     suite = TestSuite()
138     suite.addTests(
139         defaultTestLoader.loadTestsFromTestCase(TestEncoded))
140     return suite
141
142 if __name__ == "__main__":
143     from unittest2 import main
144     main(defaultTest='suite')