11import unittest
22import responses
33from learnosity_sdk .request import DataApi
4-
5- # This test uses the consumer key and secret for the demos consumer
6- # this is the only consumer with publicly available keys
7- security = {
8- 'consumer_key' : 'yis0TYCu7U9V4o7M' ,
9- 'domain' : 'demos.learnosity.com'
10- }
11- # WARNING: Normally the consumer secret should not be committed to a public
12- # repository like this one. Only this specific key is publically available.
13- consumer_secret = '74c5fd430cf1242a527f6223aebd42d30464be22'
14- request = {
15- # These items should already exist for the demos consumer
16- 'references' : ['item_2' , 'item_3' ],
17- 'limit' : 1
18- }
19- action = 'get'
20- endpoint = 'https://data.learnosity.com/v1/itembank/items'
21- dummy_responses = [{
22- 'meta' : {
23- 'status' : True ,
24- 'timestamp' : 1514874527 ,
25- 'records' : 2 ,
26- 'next' : '1'
27- },
28- 'data' : [{'id' : 'a' }]
29- }, {
30- 'meta' : {
31- 'status' : True ,
32- 'timestamp' : 1514874527 ,
33- 'records' : 2
34- },
35- 'data' : [{'id' : 'b' }]
36- }]
37-
4+ from learnosity_sdk .exceptions import DataApiException
385
396class UnitTestDataApiClient (unittest .TestCase ):
407 """
418 Tests to ensure that the Data API client functions correctly.
429 """
4310
11+ def setUp (self ):
12+ # This test uses the consumer key and secret for the demos consumer
13+ # this is the only consumer with publicly available keys
14+ self .security = {
15+ 'consumer_key' : 'yis0TYCu7U9V4o7M' ,
16+ 'domain' : 'demos.learnosity.com'
17+ }
18+ # WARNING: Normally the consumer secret should not be committed to a public
19+ # repository like this one. Only this specific key is publically available.
20+ self .consumer_secret = '74c5fd430cf1242a527f6223aebd42d30464be22'
21+ self .request = {
22+ # These items should already exist for the demos consumer
23+ 'references' : ['item_2' , 'item_3' ],
24+ 'limit' : 1
25+ }
26+ self .action = 'get'
27+ self .endpoint = 'https://data.learnosity.com/v1/itembank/items'
28+ self .dummy_responses = [{
29+ 'meta' : {
30+ 'status' : True ,
31+ 'timestamp' : 1514874527 ,
32+ 'records' : 2 ,
33+ 'next' : '1'
34+ },
35+ 'data' : [{'id' : 'a' }]
36+ }, {
37+ 'meta' : {
38+ 'status' : True ,
39+ 'timestamp' : 1514874527 ,
40+ 'records' : 2
41+ },
42+ 'data' : [{'id' : 'b' }]
43+ }]
44+ self .invalid_json = "This is not valid JSON!"
45+
4446 @responses .activate
4547 def test_request (self ):
4648 """
4749 Verify that `request` sends a request after it has been signed
4850 """
49- for dummy in dummy_responses :
50- responses .add (responses .POST , endpoint , json = dummy )
51+ for dummy in self . dummy_responses :
52+ responses .add (responses .POST , self . endpoint , json = dummy )
5153 client = DataApi ()
52- res = client .request (endpoint , security , consumer_secret , request ,
53- action )
54- assert res .json () == dummy_responses [0 ]
55- assert responses .calls [0 ].request .url == endpoint
54+ res = client .request (self . endpoint , self . security , self . consumer_secret , self . request ,
55+ self . action )
56+ assert res .json () == self . dummy_responses [0 ]
57+ assert responses .calls [0 ].request .url == self . endpoint
5658 assert 'signature' in responses .calls [0 ].request .body
5759
5860 @responses .activate
5961 def test_request_iter (self ):
6062 """Verify that `request_iter` returns an iterator of pages"""
61- for dummy in dummy_responses :
62- responses .add (responses .POST , endpoint , json = dummy )
63+ for dummy in self . dummy_responses :
64+ responses .add (responses .POST , self . endpoint , json = dummy )
6365 client = DataApi ()
64- pages = client .request_iter (endpoint , security , consumer_secret ,
65- request , action )
66+ pages = client .request_iter (self . endpoint , self . security , self . consumer_secret ,
67+ self . request , self . action )
6668 results = []
6769 for page in pages :
6870 results .append (page )
@@ -74,13 +76,47 @@ def test_request_iter(self):
7476 @responses .activate
7577 def test_results_iter (self ):
7678 """Verify that `result_iter` returns an iterator of results"""
77- for dummy in dummy_responses :
78- responses .add (responses .POST , endpoint , json = dummy )
79+ self .dummy_responses [1 ]['data' ] = {'id' : 'b' }
80+ for dummy in self .dummy_responses :
81+ responses .add (responses .POST , self .endpoint , json = dummy )
7982 client = DataApi ()
80- result_iter = client .results_iter (endpoint , security , consumer_secret ,
81- request , action )
83+ result_iter = client .results_iter (self . endpoint , self . security , self . consumer_secret ,
84+ self . request , self . action )
8285 results = list (result_iter )
8386
8487 assert len (results ) == 2
8588 assert results [0 ]['id' ] == 'a'
8689 assert results [1 ]['id' ] == 'b'
90+
91+ @responses .activate
92+ def test_results_iter_error_status (self ):
93+ """Verify that a DataApiException is raised http status is not ok"""
94+ for dummy in self .dummy_responses :
95+ responses .add (responses .POST , self .endpoint , json = {}, status = 500 )
96+ client = DataApi ()
97+ with self .assertRaisesRegex (DataApiException , "server returned HTTP status 500" ):
98+ list (client .results_iter (self .endpoint , self .security , self .consumer_secret ,
99+ self .request , self .action ))
100+
101+ @responses .activate
102+ def test_results_iter_no_meta_status (self ):
103+ """Verify that a DataApiException is raised when 'meta' 'status' is None"""
104+ for response in self .dummy_responses :
105+ response ['meta' ]['status' ] = None
106+
107+ for dummy in self .dummy_responses :
108+ responses .add (responses .POST , self .endpoint , json = dummy )
109+ client = DataApi ()
110+ with self .assertRaisesRegex (DataApiException , "server returned unsuccessful status:" ):
111+ list (client .results_iter (self .endpoint , self .security , self .consumer_secret ,
112+ self .request , self .action ))
113+
114+ @responses .activate
115+ def test_results_iter_invalid_response_data (self ):
116+ """Verify that a DataApiException is raised response data isn't valid JSON"""
117+ for dummy in self .dummy_responses :
118+ responses .add (responses .POST , self .endpoint , json = None )
119+ client = DataApi ()
120+ with self .assertRaisesRegex (DataApiException , "server returned invalid json: " ):
121+ list (client .results_iter (self .endpoint , self .security , self .consumer_secret ,
122+ self .request , self .action ))
0 commit comments