# -*- coding: utf-8 -*- from collections import defaultdict import mock from requests import Request from searx.engines import wolframalpha_api from searx.testing import SearxTestCase class TestWolframAlphaAPIEngine(SearxTestCase): def test_request(self): query = 'test_query' dicto = defaultdict(dict) params = wolframalpha_api.request(query, dicto) # TODO: test api_key self.assertIn('url', params) self.assertIn('https://api.wolframalpha.com/v2/query?', params['url']) self.assertIn(query, params['url']) self.assertEqual('https://www.wolframalpha.com/input/?i=test_query', params['headers']['Referer']) def test_replace_pua_chars(self): self.assertEqual('i', wolframalpha_api.replace_pua_chars(u'\uf74e')) def test_response(self): self.assertRaises(AttributeError, wolframalpha_api.response, None) self.assertRaises(AttributeError, wolframalpha_api.response, []) self.assertRaises(AttributeError, wolframalpha_api.response, '') self.assertRaises(AttributeError, wolframalpha_api.response, '[]') referer_url = 'referer_url' request = Request(headers={'Referer': referer_url}) # test failure xml = '''<?xml version='1.0' encoding='UTF-8'?> <queryresult success='false' error='false' /> ''' response = mock.Mock(text=xml.encode('utf-8')) self.assertEqual(wolframalpha_api.response(response), []) # test basic case xml = b"""<?xml version='1.0' encoding='UTF-8'?> <queryresult success='true' error='false' numpods='3' datatypes='Math' id='queryresult_id' host='http://www4c.wolframalpha.com' related='related_url' version='2.6'> <pod title='Input' scanner='Identity' id='Input' numsubpods='1'> <subpod title=''> <img src='input_img_src.gif' alt='input_img_alt' title='input_img_title' /> <plaintext>input_plaintext</plaintext> </subpod> </pod> <pod title='Result' scanner='Simplification' id='Result' numsubpods='1' primary='true'> <subpod title=''> <img src='result_img_src.gif' alt='result_img_alt' title='result_img_title' /> <plaintext>result_plaintext</plaintext> </subpod> </pod> <pod title='Manipulatives illustration' scanner='Arithmetic' id='Illustration' numsubpods='1'> <subpod title=''> <img src='illustration_img_src.gif' alt='illustration_img_alt' /> <plaintext>illustration_plaintext</plaintext> </subpod> </pod> </queryresult> """ response = mock.Mock(text=xml, request=request) results = wolframalpha_api.response(response) self.assertEqual(type(results), list) self.assertEqual(len(results), 2) self.assertEqual('input_plaintext', results[0]['infobox']) self.assertEqual(len(results[0]['attributes']), 3) self.assertEqual('Input', results[0]['attributes'][0]['label']) self.assertEqual('input_plaintext', results[0]['attributes'][0]['value']) self.assertEqual('Result', results[0]['attributes'][1]['label']) self.assertEqual('result_plaintext', results[0]['attributes'][1]['value']) self.assertEqual('Manipulatives illustration', results[0]['attributes'][2]['label']) self.assertEqual('illustration_img_src.gif', results[0]['attributes'][2]['image']['src']) self.assertEqual('illustration_img_alt', results[0]['attributes'][2]['image']['alt']) self.assertEqual(len(results[0]['urls']), 1) self.assertEqual(referer_url, results[0]['urls'][0]['url']) self.assertEqual('Wolfram|Alpha', results[0]['urls'][0]['title']) self.assertEqual(referer_url, results[1]['url']) self.assertEqual('Wolfram|Alpha (input_plaintext)', results[1]['title']) self.assertIn('result_plaintext', results[1]['content']) # test calc xml = b"""<?xml version='1.0' encoding='UTF-8'?> <queryresult success='true' error='false' numpods='2' datatypes='' parsetimedout='false' id='queryresult_id' host='http://www5b.wolframalpha.com' related='related_url' version='2.6' > <pod title='Indefinite integral' scanner='Integral' id='IndefiniteIntegral' error='false' numsubpods='1' primary='true'> <subpod title=''> <img src='integral_image.gif' alt='integral_img_alt' title='integral_img_title' /> <plaintext>integral_plaintext</plaintext> </subpod> </pod> <pod title='Plot of the integral' scanner='Integral' id='Plot' error='false' numsubpods='1'> <subpod title=''> <img src='plot.gif' alt='plot_alt' title='' /> <plaintext></plaintext> </subpod> </pod> </queryresult> """ response = mock.Mock(text=xml, request=request) results = wolframalpha_api.response(response) self.assertEqual(type(results), list) self.assertEqual(len(results), 2) self.assertEqual('integral_plaintext', results[0]['infobox']) self.assertEqual(len(results[0]['attributes']), 2) self.assertEqual('Indefinite integral', results[0]['attributes'][0]['label']) self.assertEqual('integral_plaintext', results[0]['attributes'][0]['value']) self.assertEqual('Plot of the integral', results[0]['attributes'][1]['label']) self.assertEqual('plot.gif', results[0]['attributes'][1]['image']['src']) self.assertEqual('plot_alt', results[0]['attributes'][1]['image']['alt']) self.assertEqual(len(results[0]['urls']), 1) self.assertEqual(referer_url, results[0]['urls'][0]['url']) self.assertEqual('Wolfram|Alpha', results[0]['urls'][0]['title']) self.assertEqual(referer_url, results[1]['url']) self.assertEqual('Wolfram|Alpha (integral_plaintext)', results[1]['title']) self.assertIn('integral_plaintext', results[1]['content'])