f4c810c747142ebf44a87d0e5396adb3e4329fe3
[htsworkflow.git] / htsworkflow / frontend / samples / tests.py
1 import datetime
2 import unittest
3
4 try:
5     import json
6 except ImportError, e:
7     import simplejson as json
8     
9 from django.test import TestCase
10
11 from htsworkflow.frontend.samples.models import \
12         Affiliation, \
13         ExperimentType, \
14         Species, \
15         Library
16
17 from htsworkflow.frontend.samples.views import \
18      library_dict, \
19      library_json
20
21 from htsworkflow.frontend.auth import apidata
22 from htsworkflow.util.conversion import unicode_or_none
23
24
25 class LibraryTestCase(TestCase):
26     def setUp(self):
27         create_db(self)
28                
29     def testOrganism(self):
30         self.assertEquals(self.library_10001.organism(), 'human')
31
32     def testAffiliations(self):
33         self.library_10001.affiliations.add(self.affiliation_alice)
34         self.library_10002.affiliations.add(
35                 self.affiliation_alice, 
36                 self.affiliation_bob
37         )
38         self.failUnless(len(self.library_10001.affiliations.all()), 1)
39         self.failUnless(self.library_10001.affiliation(), 'Alice')
40
41         self.failUnless(len(self.library_10002.affiliations.all()), 2)
42         self.failUnless(self.library_10001.affiliation(), 'Alice, Bob')
43
44
45 class SampleWebTestCase(TestCase):
46     """
47     Test returning data from our database in rest like ways.
48     (like returning json objects)
49     """
50     fixtures = ['test_samples.json']
51
52     def test_library_info(self):
53
54         for lib in Library.objects.all():
55             lib_dict = library_dict(lib.id)
56             url = '/samples/library/%s/json' % (lib.id,)
57             lib_response = self.client.get(url, apidata)
58             self.failUnlessEqual(lib_response.status_code, 200)
59             lib_json = json.loads(lib_response.content)
60
61             for d in [lib_dict, lib_json]:
62                 # amplified_from_sample is a link to the library table,
63                 # I want to use the "id" for the data lookups not
64                 # the embedded primary key.
65                 # It gets slightly confusing on how to implement sending the right id
66                 # since amplified_from_sample can be null
67                 #self.failUnlessEqual(d['amplified_from_sample'], lib.amplified_from_sample)
68                 self.failUnlessEqual(d['antibody_id'], lib.antibody_id)
69                 self.failUnlessEqual(d['cell_line_id'], lib.cell_line_id)
70                 self.failUnlessEqual(d['cell_line'], unicode_or_none(lib.cell_line))
71                 self.failUnlessEqual(d['experiment_type'], lib.experiment_type.name)
72                 self.failUnlessEqual(d['experiment_type_id'], lib.experiment_type_id)
73                 self.failUnlessEqual(d['gel_cut_size'], lib.gel_cut_size)
74                 self.failUnlessEqual(d['hidden'], lib.hidden)
75                 self.failUnlessEqual(d['id'], lib.id)
76                 self.failUnlessEqual(d['insert_size'], lib.insert_size)
77                 self.failUnlessEqual(d['library_name'], lib.library_name)
78                 self.failUnlessEqual(d['library_species'], lib.library_species.scientific_name)
79                 self.failUnlessEqual(d['library_species_id'], lib.library_species_id)
80                 self.failUnlessEqual(d['library_type_id'], lib.library_type_id)
81                 if lib.library_type_id is not None:
82                     self.failUnlessEqual(d['library_type'], lib.library_type.name)
83                 else:
84                     self.failUnlessEqual(d['library_type'], None)
85                     self.failUnlessEqual(d['made_for'], lib.made_for)
86                     self.failUnlessEqual(d['made_by'], lib.made_by)
87                     self.failUnlessEqual(d['notes'], lib.notes)
88                     self.failUnlessEqual(d['replicate'], lib.replicate)
89                     self.failUnlessEqual(d['stopping_point'], lib.stopping_point)
90                     self.failUnlessEqual(d['successful_pM'], lib.successful_pM)
91                     self.failUnlessEqual(d['undiluted_concentration'],
92                                          unicode(lib.undiluted_concentration))
93                 # some specific tests
94                 if lib.id == '10981':
95                     # test a case where there is no known status
96                     lane_set = {u'status': u'Unknown', u'paired_end': True, u'read_length': 75, u'lane_number': 1, u'flowcell': u'303TUAAXX', u'status_code': None}
97                     self.failUnlessEqual(len(d['lane_set']), 1)
98                     self.failUnlessEqual(d['lane_set'][0], lane_set)
99                 elif lib.id == '11016':
100                     # test a case where there is a status
101                     lane_set = {u'status': 'Good', u'paired_end': True, u'read_length': 75, u'lane_number': 5, u'flowcell': u'303TUAAXX', u'status_code': 2}
102                     self.failUnlessEqual(len(d['lane_set']), 1)
103                     self.failUnlessEqual(d['lane_set'][0], lane_set)
104
105     def test_invalid_library(self):
106         """
107         Make sure we get a 404 if we request an invalid library id
108         """
109         response = self.client.get('/samples/library/nottheone/json', apidata)
110         self.failUnlessEqual(response.status_code, 404)
111
112             
113     def test_library_no_key(self):
114         """
115         Make sure we get a 302 if we're not logged in
116         """
117         response = self.client.get('/samples/library/10981/json')
118         self.failUnlessEqual(response.status_code, 403)
119         response = self.client.get('/samples/library/10981/json', apidata)
120         self.failUnlessEqual(response.status_code, 200)
121
122 # The django test runner flushes the database between test suites not cases,
123 # so to be more compatible with running via nose we flush the database tables
124 # of interest before creating our sample data.
125 def create_db(obj):
126     Species.objects.all().delete()
127     obj.species_human = Species(
128         scientific_name = 'Homo Sapeins',
129         common_name = 'human',
130     )
131     obj.species_human.save()
132     obj.species_worm = Species(
133         scientific_name = 'C. Elegans',
134         common_name = 'worm',
135     )
136     obj.species_worm.save()
137     obj.species_phix = Species(
138         scientific_name = 'PhiX',
139         common_name = 'PhiX'
140     )
141     obj.species_phix.save()
142
143     ExperimentType.objects.all().delete()
144     obj.experiment_de_novo = ExperimentType(
145         name = 'De Novo',
146     )
147     obj.experiment_de_novo.save()
148     obj.experiment_chip_seq = ExperimentType(
149         name = 'ChIP-Seq'
150     )
151     obj.experiment_chip_seq.save()
152     obj.experiment_rna_seq = ExperimentType(
153         name = 'RNA-Seq'
154     )
155     obj.experiment_rna_seq.save()
156
157     Affiliation.objects.all().delete()
158     obj.affiliation_alice = Affiliation(
159         name = 'Alice',
160         contact = 'Lab Boss',
161         email = 'alice@some.where.else.'
162     )
163     obj.affiliation_alice.save()
164     obj.affiliation_bob = Affiliation(
165         name = 'Bob',
166         contact = 'Other Lab Boss',
167         email = 'bob@some.where.else',
168     )
169     obj.affiliation_bob.save()
170
171     Library.objects.all().delete()
172     obj.library_10001 = Library(
173         id = "10001",
174         library_name = 'C2C12 named poorly',
175         library_species = obj.species_human,
176         experiment_type = obj.experiment_rna_seq,
177         creation_date = datetime.datetime.now(),
178         made_for = 'scientist unit 2007',
179         made_by = 'microfludics system 7321',
180         stopping_point = '2A',
181         undiluted_concentration = '5.01',
182         hidden = False,
183     )
184     obj.library_10001.save()
185     obj.library_10002 = Library(
186         id = "10002",
187         library_name = 'Worm named poorly',
188         library_species = obj.species_human,
189         experiment_type = obj.experiment_rna_seq,
190         creation_date = datetime.datetime.now(),
191         made_for = 'scientist unit 2007',
192         made_by = 'microfludics system 7321',
193         stopping_point = '2A',
194         undiluted_concentration = '5.01',
195         hidden = False,
196     )
197     obj.library_10002.save()
198