diff options
author | a01200356 <a01200356@itesm.mx> | 2016-02-28 00:47:36 -0600 |
---|---|---|
committer | a01200356 <a01200356@itesm.mx> | 2016-02-28 00:47:36 -0600 |
commit | 4d8996eb4d54a0938ad9dc6ad105de2b850fa033 (patch) | |
tree | c523d6ea02d94c9ba35554b83c625ba06d49147b /tests | |
parent | 4267b11a45b7427bcba91259fcda202bd049f004 (diff) | |
download | searxng-4d8996eb4d54a0938ad9dc6ad105de2b850fa033.tar.gz searxng-4d8996eb4d54a0938ad9dc6ad105de2b850fa033.zip |
[enh] unit tests for wolframalpha
Diffstat (limited to 'tests')
-rw-r--r-- | tests/unit/engines/test_wolframalpha_api.py | 367 | ||||
-rw-r--r-- | tests/unit/engines/test_wolframalpha_noapi.py | 221 |
2 files changed, 330 insertions, 258 deletions
diff --git a/tests/unit/engines/test_wolframalpha_api.py b/tests/unit/engines/test_wolframalpha_api.py index c80775795..9dbe4d860 100644 --- a/tests/unit/engines/test_wolframalpha_api.py +++ b/tests/unit/engines/test_wolframalpha_api.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from collections import defaultdict import mock +from requests import Request from searx.engines import wolframalpha_api from searx.testing import SearxTestCase @@ -9,17 +10,17 @@ class TestWolframAlphaAPIEngine(SearxTestCase): def test_request(self): query = 'test_query' - api_key = 'XXXXXX-XXXXXXXXXX' dicto = defaultdict(dict) - dicto['api_key'] = api_key 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.assertIn('wolframalpha.com', params['url']) + self.assertEqual('https://www.wolframalpha.com/input/?i=test_query', params['headers']['Referer']) - self.assertIn('api_key', params) - self.assertIn(api_key, params['api_key']) + 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) @@ -27,281 +28,137 @@ class TestWolframAlphaAPIEngine(SearxTestCase): 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' /> ''' - # test failure response = mock.Mock(content=xml) self.assertEqual(wolframalpha_api.response(response), []) + # test basic case xml = """<?xml version='1.0' encoding='UTF-8'?> <queryresult success='true' error='false' - numpods='6' - datatypes='' - timedout='' - timedoutpods='' - timing='0.684' - parsetiming='0.138' - parsetimedout='false' - recalculate='' - id='MSPa416020a7966dachc463600000f9c66cc21444cfg' - host='http://www3.wolframalpha.com' - server='6' - related='http://www3.wolframalpha.com/api/v2/relatedQueries.jsp?...' + 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' - position='100' - error='false' - numsubpods='1'> - <subpod title=''> - <plaintext>sqrt(-1)</plaintext> - </subpod> - </pod> - <pod title='Result' - scanner='Simplification' - id='Result' - position='200' - error='false' - numsubpods='1' - primary='true'> - <subpod title=''> - <plaintext></plaintext> - </subpod> - <states count='1'> - <state name='Step-by-step solution' - input='Result__Step-by-step solution' /> - </states> - </pod> - <pod title='Polar coordinates' - scanner='Numeric' - id='PolarCoordinates' - position='300' - error='false' - numsubpods='1'> - <subpod title=''> - <plaintext>r1 (radius), θ90° (angle)</plaintext> - </subpod> - </pod> - <pod title='Position in the complex plane' - scanner='Numeric' - id='PositionInTheComplexPlane' - position='400' - error='false' - numsubpods='1'> - <subpod title=''> - <plaintext></plaintext> - </subpod> - </pod> - <pod title='All 2nd roots of -1' - scanner='RootsOfUnity' - id='' - position='500' - error='false' - numsubpods='2'> - <subpod title=''> - <plaintext> (principal root)</plaintext> - </subpod> - <subpod title=''> - <plaintext>-</plaintext> - </subpod> - </pod> - <pod title='Plot of all roots in the complex plane' - scanner='RootsOfUnity' - id='PlotOfAllRootsInTheComplexPlane' - position='600' - error='false' - numsubpods='1'> - <subpod title=''> - <plaintext></plaintext> - </subpod> - </pod> - </queryresult> - """ - # test private user area char in response - response = mock.Mock(content=xml) - results = wolframalpha_api.response(response) - self.assertEqual(type(results), list) - self.assertEqual(len(results), 2) - self.assertIn('i', results[0]['answer']) - self.assertIn('sqrt(-1) - Wolfram|Alpha', results[1]['title']) - self.assertEquals('http://www.wolframalpha.com/input/?i=sqrt%28-1%29', results[1]['url']) - - xml = """<?xml version='1.0' encoding='UTF-8'?> - <queryresult success='true' - error='false' - numpods='2' - datatypes='' - timedout='' - timedoutpods='' - timing='1.286' - parsetiming='0.255' - parsetimedout='false' - recalculate='' - id='MSPa195222ad740ede5214h30000480ca61h003d3gd6' - host='http://www3.wolframalpha.com' - server='20' - related='http://www3.wolframalpha.com/api/v2/relatedQueries.jsp?id=...' - version='2.6'> - <pod title='Indefinite integral' - scanner='Integral' - id='IndefiniteIntegral' - position='100' - error='false' + <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=''> - <plaintext>∫1/xxlog(x)+constant</plaintext> - </subpod> - <states count='1'> - <state name='Step-by-step solution' - input='IndefiniteIntegral__Step-by-step solution' /> - </states> - <infos count='1'> - <info text='log(x) is the natural logarithm'> - <link url='http://reference.wolfram.com/mathematica/ref/Log.html' - text='Documentation' - title='Mathematica' /> - <link url='http://functions.wolfram.com/ElementaryFunctions/Log' - text='Properties' - title='Wolfram Functions Site' /> - <link url='http://mathworld.wolfram.com/NaturalLogarithm.html' - text='Definition' - title='MathWorld' /> - </info> - </infos> + <subpod title=''> + <img src='result_img_src.gif' + alt='result_img_alt' + title='result_img_title' /> + <plaintext>result_plaintext</plaintext> + </subpod> </pod> - <pod title='Plots of the integral' - scanner='Integral' - id='Plot' - position='200' - error='false' - numsubpods='2'> - <subpod title=''> - <plaintext></plaintext> - <states count='1'> - <statelist count='2' - value='Complex-valued plot' - delimiters=''> - <state name='Complex-valued plot' - input='Plot__1_Complex-valued plot' /> - <state name='Real-valued plot' - input='Plot__1_Real-valued plot' /> - </statelist> - </states> - </subpod> - <subpod title=''> - <plaintext></plaintext> - <states count='1'> - <statelist count='2' - value='Complex-valued plot' - delimiters=''> - <state name='Complex-valued plot' - input='Plot__2_Complex-valued plot' /> - <state name='Real-valued plot' - input='Plot__2_Real-valued plot' /> - </statelist> - </states> - </subpod> + <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> - <assumptions count='1'> - <assumption type='Clash' - word='integral' - template='Assuming "${word}" is ${desc1}. Use as ${desc2} instead' - count='2'> - <value name='IntegralsWord' - desc='an integral' - input='*C.integral-_*IntegralsWord-' /> - <value name='MathematicalFunctionIdentityPropertyClass' - desc='a function property' - input='*C.integral-_*MathematicalFunctionIdentityPropertyClass-' /> - </assumption> - </assumptions> - </queryresult> + </queryresult> """ - # test integral - response = mock.Mock(content=xml) + response = mock.Mock(content=xml, request=request) results = wolframalpha_api.response(response) self.assertEqual(type(results), list) self.assertEqual(len(results), 2) - self.assertIn('log(x)+c', results[0]['answer']) - self.assertIn('∫1/xx - Wolfram|Alpha'.decode('utf-8'), results[1]['title']) - self.assertEquals('http://www.wolframalpha.com/input/?i=%E2%88%AB1%2Fx%EF%9D%8Cx', results[1]['url']) + self.assertIn('input_plaintext', results[0]['infobox']) + + self.assertEqual(len(results[0]['attributes']), 3) + self.assertIn('Input', results[0]['attributes'][0]['label']) + self.assertIn('input_plaintext', results[0]['attributes'][0]['value']) + self.assertIn('Result', results[0]['attributes'][1]['label']) + self.assertIn('result_plaintext', results[0]['attributes'][1]['value']) + self.assertIn('Manipulatives illustration', results[0]['attributes'][2]['label']) + self.assertIn('illustration_img_src.gif', results[0]['attributes'][2]['image']['src']) + self.assertIn('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', results[1]['title']) + + # test calc xml = """<?xml version='1.0' encoding='UTF-8'?> <queryresult success='true' error='false' - numpods='4' - datatypes='Solve' - timedout='' - timedoutpods='' - timing='0.79' - parsetiming='0.338' + numpods='2' + datatypes='' parsetimedout='false' - recalculate='' - id='MSPa7481f7i06d25h3deh2900004810i3a78d9b4fdc' + id='queryresult_id' host='http://www5b.wolframalpha.com' - server='23' - related='http://www5b.wolframalpha.com/api/v2/relatedQueries.jsp?id=...' - version='2.6'> - <pod title='Input interpretation' - scanner='Identity' - id='Input' - position='100' - error='false' - numsubpods='1'> - <subpod title=''> - <plaintext>solve x^2+x0</plaintext> - </subpod> - </pod> - <pod title='Results' - scanner='Solve' - id='Result' - position='200' - error='false' - numsubpods='2' - primary='true'> - <subpod title=''> - <plaintext>x-1</plaintext> - </subpod> - <subpod title=''> - <plaintext>x0</plaintext> - </subpod> - <states count='1'> - <state name='Step-by-step solution' - input='Result__Step-by-step solution' /> - </states> - </pod> - <pod title='Root plot' - scanner='Solve' - id='RootPlot' - position='300' - error='false' - numsubpods='1'> - <subpod title=''> - <plaintext></plaintext> - </subpod> - </pod> - <pod title='Number line' - scanner='Solve' - id='NumberLine' - position='400' - error='false' - numsubpods='1'> - <subpod title=''> - <plaintext></plaintext> - </subpod> - </pod> + 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' + scanner='Plotter' + id='Plot' + error='false' + numsubpods='1'> + <subpod title=''> + <img src='plot.gif' + alt='plot_alt' + title='' /> + <plaintext></plaintext> + </subpod> + </pod> </queryresult> """ - # test ecuation with multiple answers - response = mock.Mock(content=xml) + response = mock.Mock(content=xml, request=request) results = wolframalpha_api.response(response) self.assertEqual(type(results), list) - self.assertEqual(len(results), 3) - self.assertIn('x=-1', results[0]['answer']) - self.assertIn('x=0', results[1]['answer']) - self.assertIn('solve x^2+x0 - Wolfram|Alpha'.decode('utf-8'), results[2]['title']) - self.assertEquals('http://www.wolframalpha.com/input/?i=solve+x%5E2%2Bx%EF%9F%990', results[2]['url']) + self.assertEqual(len(results), 2) + self.assertIn('integral_plaintext', results[0]['infobox']) + + self.assertEqual(len(results[0]['attributes']), 2) + self.assertIn('Indefinite integral', results[0]['attributes'][0]['label']) + self.assertIn('integral_plaintext', results[0]['attributes'][0]['value']) + self.assertIn('Plot', results[0]['attributes'][1]['label']) + self.assertIn('plot.gif', results[0]['attributes'][1]['image']['src']) + self.assertIn('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', results[1]['title']) diff --git a/tests/unit/engines/test_wolframalpha_noapi.py b/tests/unit/engines/test_wolframalpha_noapi.py index 37f3a9059..1129dc8b0 100644 --- a/tests/unit/engines/test_wolframalpha_noapi.py +++ b/tests/unit/engines/test_wolframalpha_noapi.py @@ -1,5 +1,7 @@ # -*- coding: utf-8 -*- from collections import defaultdict +import mock +from requests import Request from searx.engines import wolframalpha_noapi from searx.testing import SearxTestCase @@ -9,15 +11,228 @@ class TestWolframAlphaNoAPIEngine(SearxTestCase): def test_request(self): query = 'test_query' dicto = defaultdict(dict) - dicto['pageno'] = 1 params = wolframalpha_noapi.request(query, dicto) + self.assertIn('url', params) + self.assertIn('https://www.wolframalpha.com/input/json.jsp', params['url']) self.assertIn(query, params['url']) - self.assertIn('wolframalpha.com', params['url']) + self.assertEqual('https://www.wolframalpha.com/input/?i=test_query', params['headers']['Referer']) def test_response(self): self.assertRaises(AttributeError, wolframalpha_noapi.response, None) self.assertRaises(AttributeError, wolframalpha_noapi.response, []) self.assertRaises(AttributeError, wolframalpha_noapi.response, '') self.assertRaises(AttributeError, wolframalpha_noapi.response, '[]') - # TODO + + referer_url = 'referer_url' + request = Request(headers={'Referer': referer_url}) + + # test failure + json = ''' + {"queryresult" : { + "success" : false, + "error" : false, + "numpods" : 0, + "id" : "", + "host" : "https:\/\/www5a.wolframalpha.com", + "didyoumeans" : {} + }} + ''' + response = mock.Mock(text=json, request=request) + self.assertEqual(wolframalpha_noapi.response(response), []) + + # test basic case + json = ''' + {"queryresult" : { + "success" : true, + "error" : false, + "numpods" : 6, + "datatypes" : "Math", + "id" : "queryresult_id", + "host" : "https:\/\/www5b.wolframalpha.com", + "related" : "related_url", + "version" : "2.6", + "pods" : [ + { + "title" : "Input", + "scanners" : [ + "Identity" + ], + "id" : "Input", + "error" : false, + "numsubpods" : 1, + "subpods" : [ + { + "title" : "", + "img" : { + "src" : "input_img_src.gif", + "alt" : "input_img_alt", + "title" : "input_img_title" + }, + "plaintext" : "input_plaintext", + "minput" : "input_minput" + } + ] + }, + { + "title" : "Result", + "scanners" : [ + "Simplification" + ], + "id" : "Result", + "error" : false, + "numsubpods" : 1, + "primary" : true, + "subpods" : [ + { + "title" : "", + "img" : { + "src" : "result_img_src.gif", + "alt" : "result_img_alt", + "title" : "result_img_title" + }, + "plaintext" : "result_plaintext", + "moutput" : "result_moutput" + } + ] + }, + { + "title" : "Manipulatives illustration", + "scanners" : [ + "Arithmetic" + ], + "id" : "Illustration", + "error" : false, + "numsubpods" : 1, + "subpods" : [ + { + "title" : "", + "CDFcontent" : "Resizeable", + "img" : { + "src" : "illustration_img_src.gif", + "alt" : "illustration_img_alt", + "title" : "illustration_img_title" + }, + "plaintext" : "illustration_img_plaintext" + } + ] + } + ] + }} + ''' + response = mock.Mock(text=json, request=request) + results = wolframalpha_noapi.response(response) + self.assertEqual(type(results), list) + self.assertEqual(len(results), 2) + self.assertIn('input_plaintext', results[0]['infobox']) + + self.assertEqual(len(results[0]['attributes']), 3) + self.assertIn('Input', results[0]['attributes'][0]['label']) + self.assertIn('input_plaintext', results[0]['attributes'][0]['value']) + self.assertIn('Result', results[0]['attributes'][1]['label']) + self.assertIn('result_plaintext', results[0]['attributes'][1]['value']) + self.assertIn('Manipulatives illustration', results[0]['attributes'][2]['label']) + self.assertIn('illustration_img_src.gif', results[0]['attributes'][2]['image']['src']) + self.assertIn('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', results[1]['title']) + + # test calc + json = """ + {"queryresult" : { + "success" : true, + "error" : false, + "numpods" : 2, + "datatypes" : "", + "id" : "queryresult_id", + "host" : "https:\/\/www4b.wolframalpha.com", + "related" : "related_url", + "version" : "2.6", + "pods" : [ + { + "title" : "Indefinite integral", + "scanners" : [ + "Integral" + ], + "id" : "IndefiniteIntegral", + "error" : false, + "numsubpods" : 1, + "primary" : true, + "subpods" : [ + { + "title" : "", + "img" : { + "src" : "integral_img_src.gif", + "alt" : "integral_img_alt", + "title" : "integral_img_title" + }, + "plaintext" : "integral_plaintext", + "minput" : "integral_minput", + "moutput" : "integral_moutput" + } + ] + }, + { + "title" : "Plot of the integral", + "scanners" : [ + "Integral" + ], + "id" : "Plot", + "error" : false, + "numsubpods" : 0, + "async" : "invalid_async_url" + } + ] + }} + """ + response = mock.Mock(text=json, request=request) + results = wolframalpha_noapi.response(response) + self.assertEqual(type(results), list) + self.assertEqual(len(results), 2) + self.assertIn('integral_plaintext', results[0]['infobox']) + + self.assertEqual(len(results[0]['attributes']), 1) + self.assertIn('Indefinite integral', results[0]['attributes'][0]['label']) + self.assertIn('integral_plaintext', results[0]['attributes'][0]['value']) + + 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', results[1]['title']) + + def test_parse_async_pod(self): + self.assertRaises(AttributeError, wolframalpha_noapi.parse_async_pod, None) + self.assertRaises(AttributeError, wolframalpha_noapi.parse_async_pod, []) + self.assertRaises(AttributeError, wolframalpha_noapi.parse_async_pod, '') + self.assertRaises(AttributeError, wolframalpha_noapi.parse_async_pod, '[]') + + # test plot + xml = '''<?xml version='1.0' encoding='UTF-8'?> + <pod title='Plot' + scanner='Plot' + id='Plot' + error='false' + numsubpods='1'> + <subpod title=''> + <img src='plot_img_src.gif' + alt='plot_img_alt' + title='plot_img_title' /> + <plaintext>plot_plaintext</plaintext> + <minput>plot_minput</minput> + </subpod> + </pod> + ''' + response = mock.Mock(content=xml) + pod = wolframalpha_noapi.parse_async_pod(response) + self.assertEqual(len(pod['subpods']), 1) + self.assertEqual('', pod['subpods'][0]['title']) + self.assertEqual('plot_plaintext', pod['subpods'][0]['plaintext']) + self.assertEqual('plot_img_src.gif', pod['subpods'][0]['img']['src']) + self.assertEqual('plot_img_alt', pod['subpods'][0]['img']['alt']) |