# -*- 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'])