Skip to content

Commit 21a248c

Browse files
Merge pull request #85 from watson-developer-cloud/unittest
R&R and conversation unit tests
2 parents 6149667 + 85eff0f commit 21a248c

File tree

2 files changed

+318
-0
lines changed

2 files changed

+318
-0
lines changed

test/test_conversation_v1.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import responses
2+
import watson_developer_cloud
3+
4+
@responses.activate
5+
def test_message():
6+
7+
# Ranker endpoints
8+
conversation = watson_developer_cloud.ConversationV1(username="username",
9+
password="password",
10+
version='2016-07-11')
11+
12+
workspace_id = 'f8fdbc65-e0bd-4e43-b9f8-2975a366d4ec'
13+
message_url = 'https://gateway.watsonplatform.net/conversation/api/v1/workspaces/%s/message' % workspace_id
14+
message_url1 = 'https://gateway.watsonplatform.net/conversation/api/v1/workspaces/%s/message?version=2016-07-11' % workspace_id
15+
message_response = '{"context":{"conversation_id":"1b7b67c0-90ed-45dc-8508-9488bc483d5b","system":{"dialog_stack":["root"],"dialog_turn_counter":1,"dialog_request_counter":1}},"intents":[],"entities":[],"input":{}}'
16+
17+
responses.add(responses.POST, message_url,
18+
body=message_response, status=200,
19+
content_type='application/json')
20+
21+
message = conversation.message(workspace_id=workspace_id, message_input={'text': 'Turn on the lights'}, context=None)
22+
23+
assert message is not None
24+
assert responses.calls[0].request.url == message_url1
25+
assert responses.calls[0].response.text == message_response
26+
27+
28+
# test context
29+
responses.add(responses.POST, message_url,
30+
body=message_response, status=200,
31+
content_type='application/json')
32+
33+
message = conversation.message(workspace_id=workspace_id, message_input={'text': 'Turn on the lights'}, context={'context': {'conversation_id':'1b7b67c0-90ed-45dc-8508-9488bc483d5b', 'system': {'dialog_stack':['root'], 'dialog_turn_counter':2, 'dialog_request_counter':1}}})
34+
35+
assert message is not None
36+
assert responses.calls[1].request.url == message_url1
37+
assert responses.calls[1].response.text == message_response
38+
39+
assert len(responses.calls) == 2

test/test_retrieve_and_rank_v1.py

Lines changed: 279 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,279 @@
1+
import os
2+
import responses
3+
import watson_developer_cloud
4+
5+
CLUSTER_ID = 'sc0747112c_f978_4e1f_b97e_0e3a8101ac5b'
6+
URL_CLUSTERS = 'https://gateway.watsonplatform.net/retrieve-and-rank/api/v1/solr_clusters'
7+
URL_CLUSTER = URL_CLUSTERS + '/' + CLUSTER_ID
8+
9+
RANKER_ID = '3b140ax14-rank-10383'
10+
URL_RANKERS = 'https://gateway.watsonplatform.net/retrieve-and-rank/api/v1/rankers'
11+
URL_RANKER = URL_RANKERS + '/' + RANKER_ID
12+
13+
retrieve_and_rank = watson_developer_cloud.RetrieveAndRankV1(username="username",
14+
password="password")
15+
16+
@responses.activate
17+
def test_list_rankers():
18+
19+
listrank_response = '{"rankers":[{"ranker_id":"3b140ax14-rank-10383","name":"pythonRank"}]}'
20+
21+
responses.add(responses.GET, URL_RANKERS,
22+
match_querystring=True,
23+
body=listrank_response, status=200,
24+
content_type='application/json')
25+
26+
ranker_list = retrieve_and_rank.list_rankers()
27+
28+
assert ranker_list is not None
29+
assert len(ranker_list['rankers']) == 1
30+
assert responses.calls[0].request.url == URL_RANKERS
31+
assert responses.calls[0].response.text == listrank_response
32+
33+
34+
@responses.activate
35+
def test_ranker_status():
36+
37+
statusrank_response = '{"ranker_id":"3b140ax14-rank-10383","name":"pythonRank","status":"Available"}'
38+
39+
responses.add(responses.GET, URL_RANKER,
40+
match_querystring=True,
41+
body=statusrank_response, status=200,
42+
content_type='application/json')
43+
44+
ranker_status = retrieve_and_rank.get_ranker_status(RANKER_ID)
45+
46+
assert ranker_status is not None
47+
assert ranker_status['status'] is not None
48+
assert responses.calls[0].request.url == URL_RANKER
49+
assert responses.calls[0].response.text == statusrank_response
50+
51+
52+
@responses.activate
53+
def test_rank():
54+
55+
rank_url = URL_RANKER + '/rank'
56+
rank_response = '{"ranker_id":"3b140ax14-rank-10383",' \
57+
'"top_answer":"30965a00-5415-4ef5-8e4a-bb21a7aeab44", "answers":[' \
58+
'{"answer_id":"30965a00-5415-4ef5-8e4a-bb21a7aeab44","score":180.0,"confidence":0.2636349925008873},' \
59+
'{"answer_id":"30965a00-5415-4ef5-8e4a-bb21a7aeab44","score":178.0,"confidence":0.25972667610243827}]}'
60+
61+
responses.add(responses.POST, rank_url,
62+
match_querystring=True,
63+
body=rank_response, status=200,
64+
content_type='application/json')
65+
66+
ranker_answer = None
67+
68+
with open(os.path.join(os.path.dirname(__file__), '../resources/ranker_answer_data.csv'), 'rb') as answer_data:
69+
ranker_answer = retrieve_and_rank.rank('3b140ax14-rank-10383', answer_data=answer_data, top_answers=3)
70+
71+
assert ranker_answer is not None
72+
assert responses.calls[0].request.url == rank_url
73+
assert responses.calls[0].response.text == rank_response
74+
75+
76+
@responses.activate
77+
def test_create_ranker():
78+
79+
createrank_response = '{"ranker_id":"3b140ax14-rank-10383","name":"pythonRank","status":"Training"}'
80+
81+
responses.add(responses.POST, URL_RANKERS,
82+
match_querystring=True,
83+
body=createrank_response, status=200,
84+
content_type='application/json')
85+
86+
ranker = None
87+
with open(os.path.join(os.path.dirname(__file__), '../resources/ranker_training_data.csv'), 'rb') as training_data:
88+
ranker = retrieve_and_rank.create_ranker(training_data=training_data, name='pythonRank')
89+
90+
assert ranker is not None
91+
assert ranker['ranker_id'] == RANKER_ID
92+
assert ranker['name'] == 'pythonRank'
93+
assert responses.calls[0].request.url == URL_RANKERS
94+
assert responses.calls[0].response.text == createrank_response
95+
96+
97+
@responses.activate
98+
def test_delete_ranker():
99+
removerank_response = '{}'
100+
101+
responses.add(responses.DELETE, URL_RANKER,
102+
match_querystring=True,
103+
body=removerank_response, status=200,
104+
content_type='application/json')
105+
106+
retrieve_and_rank.delete_ranker(RANKER_ID)
107+
108+
assert responses.calls[0].request.url == URL_RANKER
109+
assert responses.calls[0].response.text == removerank_response
110+
111+
@responses.activate
112+
def test_list_cluster():
113+
listcluster_response = '{"clusters":[{"solr_cluster_id":"sc0747112c_f978_4e1f_b97e_0e3a8101ac5b","cluster_name":"","cluster_size":"","solr_cluster_status":"READY"}]}'
114+
115+
responses.add(responses.GET, URL_CLUSTERS,
116+
match_querystring=True,
117+
body=listcluster_response, status=200,
118+
content_type='application/json')
119+
120+
clusters = retrieve_and_rank.list_solr_clusters()
121+
122+
assert clusters is not None
123+
assert responses.calls[0].request.url == URL_CLUSTERS
124+
assert responses.calls[0].response.text == listcluster_response
125+
126+
@responses.activate
127+
def test_create_cluster():
128+
createcluster_response = '{"solr_cluster_id":"sc0747112c_f978_4e1f_b97e_0e3a8101ac5b","cluster_name":"","cluster_size":"","solr_cluster_status":"NOT_AVAILABLE"}'
129+
130+
responses.add(responses.POST, URL_CLUSTERS,
131+
match_querystring=True,
132+
body=createcluster_response, status=200,
133+
content_type='application/json')
134+
135+
retrieve_and_rank.create_solr_cluster(cluster_name='pythonCluster', cluster_size=None)
136+
137+
assert responses.calls[0].request.url == URL_CLUSTERS
138+
assert responses.calls[0].response.text == createcluster_response
139+
140+
@responses.activate
141+
def test_delete_cluster():
142+
removecluster_response = '{"message":"WRRCSR023: Successfully deleted Solr cluster [sc0747112c_f978_4e1f_b97e_0e3a8101ac5b].","statusCode":200}'
143+
144+
responses.add(responses.DELETE, URL_CLUSTER,
145+
body=removecluster_response, status=200,
146+
match_querystring=True,
147+
content_type='application/json')
148+
149+
retrieve_and_rank.delete_solr_cluster(CLUSTER_ID)
150+
151+
assert responses.calls[0].request.url == URL_CLUSTER
152+
assert responses.calls[0].response.text == removecluster_response
153+
154+
@responses.activate
155+
def test_cluster_status():
156+
statuscluster_response = '{"solr_cluster_id":"sc0747112c_f978_4e1f_b97e_0e3a8101ac5b","cluster_name":"","cluster_size":"","solr_cluster_status":"READY"}'
157+
158+
responses.add(responses.GET, URL_CLUSTER,
159+
body=statuscluster_response, status=200,
160+
match_querystring=True,
161+
content_type='application/json')
162+
163+
cluster_status = retrieve_and_rank.get_solr_cluster_status(CLUSTER_ID)
164+
165+
assert cluster_status is not None
166+
assert responses.calls[0].request.url == URL_CLUSTER
167+
assert responses.calls[0].response.text == statuscluster_response
168+
169+
@responses.activate
170+
def test_list_config():
171+
listconfigs_url = URL_CLUSTER + '/config'
172+
listconfigs_response = '{"solr_configs":[]}'
173+
174+
responses.add(responses.GET, listconfigs_url,
175+
body=listconfigs_response, status=200,
176+
match_querystring=True,
177+
content_type='application/json')
178+
179+
config_list = retrieve_and_rank.list_configs(CLUSTER_ID)
180+
181+
assert config_list is not None
182+
assert responses.calls[0].request.url == listconfigs_url
183+
assert responses.calls[0].response.text == listconfigs_response
184+
185+
@responses.activate
186+
def test_create_config():
187+
createconfig_url = URL_CLUSTER + '/config/exampleconfig'
188+
createconfig_response = '{"message":"WRRCSR026: Successfully uploaded named config [example-config] for Solr cluster [sc0747112c_f978_4e1f_b97e_0e3a8101ac5b].","statusCode":200}'
189+
190+
responses.add(responses.POST, createconfig_url,
191+
body=createconfig_response, status=200,
192+
match_querystring=True,
193+
content_type='application/json')
194+
195+
with open(os.path.join(os.path.dirname(__file__), '../resources/solr_config.zip'), 'rb') as config_data:
196+
config = retrieve_and_rank.create_config(CLUSTER_ID, 'exampleconfig', config=config_data)
197+
198+
assert config is not None
199+
assert responses.calls[00].request.url == createconfig_url
200+
assert responses.calls[00].response.text == createconfig_response
201+
202+
@responses.activate
203+
def test_delete_config():
204+
removeconfig_url = URL_CLUSTER + '/config/exampleconfig'
205+
removeconfig_response = '{"message":"WRRCSR025: Successfully deleted named config [example-config] for Solr cluster [sc0747112c_f978_4e1f_b97e_0e3a8101ac5b]].","statusCode":200}'
206+
207+
responses.add(responses.DELETE, removeconfig_url,
208+
body=removeconfig_response, status=200,
209+
match_querystring=True,
210+
content_type='application/json')
211+
212+
response = retrieve_and_rank.delete_config(CLUSTER_ID, 'exampleconfig')
213+
214+
assert response is not None
215+
assert responses.calls[0].request.url == removeconfig_url
216+
assert responses.calls[0].response.text == removeconfig_response
217+
218+
@responses.activate
219+
def test_get_config():
220+
getconfig_url = URL_CLUSTER + '/config/exampleconfig'
221+
getconfig_response = '{}'
222+
223+
responses.add(responses.GET, getconfig_url,
224+
match_querystring=True,
225+
body=getconfig_response, status=200)
226+
227+
retrieve_and_rank.get_config(CLUSTER_ID, 'exampleconfig')
228+
229+
assert responses.calls[0].request.url == getconfig_url
230+
assert responses.calls[0].response.text == getconfig_response
231+
232+
@responses.activate
233+
def test_list_collections():
234+
listcollection_url = URL_CLUSTER + '/solr/admin/collections?action=LIST&wt=json'
235+
236+
listcollection_response = '{"responseHeader":{"status":0,"QTime":0},"collections":["examplecollection"]}'
237+
238+
responses.add(responses.GET, listcollection_url,
239+
match_querystring=True,
240+
body=listcollection_response, status=200,
241+
content_type='application/json')
242+
243+
retrieve_and_rank.list_collections(CLUSTER_ID)
244+
245+
assert responses.calls[0].response.text == listcollection_response
246+
247+
@responses.activate
248+
def test_create_collection():
249+
createcollection_url = URL_CLUSTER + '/solr/admin/collections?action=CREATE&wt=json&collection.configName=exampleconfig&name=examplecollection'
250+
createcollection_response = '{}'
251+
252+
responses.add(responses.POST, createcollection_url,
253+
match_querystring=True,
254+
body=createcollection_response, status=200,
255+
content_type='application/json')
256+
257+
collection = retrieve_and_rank.create_collection(CLUSTER_ID, 'examplecollection', 'exampleconfig')
258+
259+
assert collection is not None
260+
assert responses.calls[0].response.text == createcollection_response
261+
262+
@responses.activate
263+
def test_delete_collection():
264+
deletecollection_url = URL_CLUSTER + '/solr/admin/collections?action=DELETE&wt=json&name=examplecollection'
265+
deletecollection_response = '{}'
266+
267+
responses.add(responses.POST, deletecollection_url,
268+
body=deletecollection_response, status=200,
269+
match_querystring=True,
270+
content_type='application/json')
271+
272+
retrieve_and_rank.delete_collection(CLUSTER_ID, 'examplecollection', None)
273+
274+
assert responses.calls[0].response.text == deletecollection_response
275+
276+
@responses.activate
277+
def test_get_solr_client():
278+
solr_client = retrieve_and_rank.get_pysolr_client(CLUSTER_ID, 'examplecollection')
279+
assert solr_client is not None

0 commit comments

Comments
 (0)