1
1
import unittest
2
2
import responses
3
3
from 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
38
5
39
6
class UnitTestDataApiClient (unittest .TestCase ):
40
7
"""
41
8
Tests to ensure that the Data API client functions correctly.
42
9
"""
43
10
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
+
44
46
@responses .activate
45
47
def test_request (self ):
46
48
"""
47
49
Verify that `request` sends a request after it has been signed
48
50
"""
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 )
51
53
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
56
58
assert 'signature' in responses .calls [0 ].request .body
57
59
58
60
@responses .activate
59
61
def test_request_iter (self ):
60
62
"""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 )
63
65
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 )
66
68
results = []
67
69
for page in pages :
68
70
results .append (page )
@@ -74,13 +76,47 @@ def test_request_iter(self):
74
76
@responses .activate
75
77
def test_results_iter (self ):
76
78
"""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 )
79
82
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 )
82
85
results = list (result_iter )
83
86
84
87
assert len (results ) == 2
85
88
assert results [0 ]['id' ] == 'a'
86
89
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