Skip to content

Commit c8ca597

Browse files
committed
add tests
1 parent da5c43b commit c8ca597

2 files changed

Lines changed: 109 additions & 25 deletions

File tree

tom_dataservices/dataservices.py

Lines changed: 49 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,17 @@ class BaseDataService(ABC):
2121
# Class variable that can store query results if necessary
2222
query_results = {}
2323

24-
@abstractmethod
25-
def pre_query_validation(self, query_parameters):
26-
"""Same thing as query_service, but a dry run"""
27-
2824
@abstractmethod
2925
def query_service(self, query_parameters):
3026
"""takes in the serialized data from the query form and actually submits the query to the service"""
3127

32-
@abstractmethod
28+
def pre_query_validation(self, query_parameters):
29+
"""Same thing as query_service, but a dry run"""
30+
raise NotImplementedError
31+
3332
def get_form_class(self):
3433
"""Returns the full form class for querying this service"""
34+
raise NotImplementedError
3535

3636
def get_additional_context_data(self):
3737
"""
@@ -67,14 +67,53 @@ def query_targets(self, query_parameters):
6767
"""Set up and run a specialized query for retrieving targets from a DataService."""
6868
return self.query_service(query_parameters)
6969

70-
def to_data_product(self, query_results):
70+
def to_data_product(self, query_results=None, **kwargs):
71+
"""
72+
Upper level function to create a new DataProduct from the query results
73+
Can take either new query results, or use stored results form a recent `query_service()`
74+
:param query_results: Query results from the DataService
75+
:returns: Target object
76+
"""
77+
query_results = query_results or self.query_results
78+
if not query_results:
79+
raise MissingDataException('No query results. Did you call query_service()?')
80+
else:
81+
return self.create_data_product_from_query(query_results, **kwargs)
82+
83+
def create_data_product_from_query(self, query_results=None, **kwargs):
7184
"""Create a new DataProduct from the query results"""
7285
raise NotImplementedError
7386

74-
def to_reduced_datums(self, query_results):
75-
"""Create a new ReducedDatum of the appropriate type from the query results"""
87+
def to_reduced_datums(self, query_results=None, **kwargs):
88+
"""
89+
Upper level function to create a new ReducedDatum from the query results
90+
Can take either new query results, or use stored results form a recent `query_service()`
91+
:param query_results: Query results from the DataService
92+
:returns: Target object
93+
"""
94+
query_results = query_results or self.query_results
95+
if not query_results:
96+
raise MissingDataException('No query results. Did you call query_service()?')
97+
else:
98+
return self.create_reduced_datums_from_query(query_results, **kwargs)
99+
100+
def create_reduced_datums_from_query(self, query_results=None, **kwargs):
101+
"""Create a new reduced_datum of the appropriate type from the query results"""
76102
raise NotImplementedError
77103

78-
def to_target(self, query_results):
104+
def to_target(self, query_results=None, **kwargs):
105+
"""
106+
Upper level function to create a new target from the query results
107+
Can take either new query results, or use stored results form a recent `query_service()`
108+
:param query_results: Query results from the DataService
109+
:returns: Target object
110+
"""
111+
target_parameters = query_results or self.query_results
112+
if not target_parameters:
113+
raise MissingDataException('No query results. Did you call query_service()?')
114+
else:
115+
return self.create_target_from_query(target_parameters, **kwargs)
116+
117+
def create_target_from_query(self, query_results, **kwargs):
79118
"""Create a new target from the query results"""
80-
raise NotImplementedError
119+
raise NotImplementedError

tom_dataservices/tests/tests.py

Lines changed: 60 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
1+
from abc import ABC
2+
13
from django import forms
24
from django.test import TestCase
35

46
from tom_dataservices.dataservices import BaseDataService, MissingDataException
57
from tom_dataservices.forms import BaseQueryForm
8+
from tom_targets.models import Target
69

710

811
test_query_results = {'ra': 24, 'dec': 77, 'name': 'faketarget', 'type': 'SIDEREAL'}
912

1013

1114
class TestDataServiceForm(BaseQueryForm):
12-
""" All brokers must have a form which will be used to construct and save queries
13-
to the broker. They should subclass `BaseQueryForm` which includes some required
14-
fields and contains logic for serializing and persisting the query parameters to the
15-
database. This test form will only have one field.
15+
""" A DataService must implement a form in order to be displayed in a TOM.
16+
They should subclass `BaseQueryForm`. This test form will only have one field.
1617
"""
1718
name = forms.CharField(required=True)
1819

@@ -25,27 +26,71 @@ def query_service(self, term):
2526
if term == 'notfound':
2627
raise MissingDataException
2728
self.query_results = test_query_results
29+
return
2830

2931
def get_form_class(self):
3032
return TestDataServiceForm
3133

32-
def pre_query_validation(self, query_parameters):
33-
pass
34+
def create_target_from_query(self, query_results, **kwargs):
35+
return Target(**query_results)
36+
37+
38+
class EmptyTestDataService(BaseDataService):
39+
name = 'TEST'
40+
service_notes = "This is a test DataService."
3441

35-
def to_target(self, query_results):
36-
target = super().to_target(query_results)
37-
target.name = query_results['name']
38-
target.type = query_results['type']
39-
target.ra = query_results['ra']
40-
target.dec = query_results['dec']
41-
return target
42+
def query_service(self, term):
43+
if term == 'notfound':
44+
raise MissingDataException
45+
self.query_results = test_query_results
46+
return
4247

4348

4449
class TestDataServiceClass(TestCase):
4550
"""
46-
Test the functionality of the TestDataService.
51+
Test the functionality of the DataService class via the TestDataService.
4752
"""
53+
def test_query_service(self):
54+
new_test_query = TestDataService()
55+
self.assertEqual(new_test_query.query_results,{})
56+
new_test_query.query_service('mytarget')
57+
self.assertEqual(new_test_query.query_results, test_query_results)
4858

4959
def test_to_target(self):
50-
target = TestDataService.to_target(self, test_query_results)
60+
new_test_query = TestDataService()
61+
# Show to_target() returns error with no query_results
62+
with self.assertRaises(MissingDataException):
63+
new_test_query.to_target()
64+
# Show to_target() works with the default query_results
65+
new_test_query.query_targets('mytarget')
66+
target = new_test_query.to_target()
5167
self.assertEqual(target.name, test_query_results['name'])
68+
# Show to_target() works independently of the query.
69+
new_test_query_results = test_query_results.copy()
70+
new_test_query_results['name'] = 'target2'
71+
target2 = new_test_query.to_target(new_test_query_results)
72+
self.assertEqual(target2.name, 'target2')
73+
74+
75+
class TestUnimplementedDataServiceClass(TestCase):
76+
"""
77+
Test the functionality of a DataService with unimplemented methods.
78+
"""
79+
80+
def test_no_create_data_product_from_query(self):
81+
new_test_query = EmptyTestDataService()
82+
# Show to_data_product() returns error when create_data_product_from_query undefined
83+
with self.assertRaises(NotImplementedError):
84+
new_test_query.to_data_product(test_query_results)
85+
86+
def test_no_create_target_from_query(self):
87+
new_test_query = EmptyTestDataService()
88+
# Show to_data_product() returns error when create_data_product_from_query undefined
89+
with self.assertRaises(NotImplementedError):
90+
new_test_query.to_target(test_query_results)
91+
92+
def test_no_create_reduced_datums_from_query(self):
93+
new_test_query = EmptyTestDataService()
94+
# Show to_data_product() returns error when create_data_product_from_query undefined
95+
with self.assertRaises(NotImplementedError):
96+
new_test_query.to_reduced_datums(test_query_results)

0 commit comments

Comments
 (0)