import unittest
import json
import urllib.request

import util.location

class location(unittest.TestCase):
    def setUp(self):
        patcher = unittest.mock.patch('util.location.urllib.request')
        self.addCleanup(patcher.stop)
        self.request = patcher.start()
        util.location.reset()

        self.primary = {
            'country': 'Middle Earth',
            'longitude': '10.0',
            'latitude': '20.5',
            'ip': '127.0.0.1',
        }
        self.secondary = {
            'country_name': 'Rivia',
            'longitude': '-10.0',
            'latitude': '-23',
            'ip': '127.0.0.6',
        }

    def test_primary_provider(self):
        self.request.urlopen.return_value.read.return_value = json.dumps(self.primary)
        util.location.country()
        self.assertEqual(self.primary['country'], util.location.country())
        self.assertEqual((self.primary['latitude'], self.primary['longitude']), util.location.coordinates())
        self.assertEqual(self.primary['ip'], util.location.public_ip())

    def test_secondary_provider(self):
        urlopen = unittest.mock.MagicMock()
        urlopen.read.return_value = json.dumps(self.secondary)
        self.request.urlopen.side_effect = [ RuntimeError(), urlopen ]

        self.assertEqual(self.secondary['country_name'], util.location.country())
        self.assertEqual((self.secondary['latitude'], self.secondary['longitude']), util.location.coordinates())
        self.assertEqual(self.secondary['ip'], util.location.public_ip())

# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4