import httplib
from unittest import TestCase

from ckan.config.middleware import make_app
from paste.deploy import appconfig
import paste.fixture
from ckan.tests import conf_dir, url_for, CreateTestData

from mockgoogleanalytics import runmockserver
from ckanext.googleanalytics.commands import LoadAnalytics
from ckanext.googleanalytics.commands import InitDB
from ckanext.googleanalytics import dbutil
from ckanext.googleanalytics.gasnippet import gacode


class MockClient(httplib.HTTPConnection):
    def request(self, http_request):
        filters = http_request.uri.query.get('filters')
        path = http_request.uri.path
        if filters:
            if "package" in filters:
                path += "/package"
            else:
                path += "/download"
        httplib.HTTPConnection.request(self,
                                       http_request.method,
                                       path)
        resp = self.getresponse()
        return resp


class TestConfig(TestCase):
    def test_config(self):
        config = appconfig('config:test.ini', relative_to=conf_dir)
        config.local_conf['ckan.plugins'] = 'googleanalytics'
        config.local_conf['googleanalytics.id'] = ''
        command = LoadAnalytics("loadanalytics")
        command.CONFIG = config.local_conf
        self.assertRaises(Exception, command.run, [])


class TestLoadCommand(TestCase):
    @classmethod
    def setup_class(cls):
        config = appconfig('config:test.ini', relative_to=conf_dir)
        config.local_conf['ckan.plugins'] = 'googleanalytics'
        config.local_conf['googleanalytics.username'] \
                              = 'borf'
        config.local_conf['googleanalytics.password'] \
                              = 'borf'
        config.local_conf['googleanalytics.id'] \
                              = 'UA-borf-1'
        config.local_conf['googleanalytics.show_downloads'] \
                              = 'true'
        cls.config = config.local_conf
        wsgiapp = make_app(config.global_conf, **config.local_conf)
        env = {'HTTP_ACCEPT': ('text/html;q=0.9,text/plain;'
                               'q=0.8,image/png,*/*;q=0.5')}
        cls.app = paste.fixture.TestApp(wsgiapp, extra_environ=env)
        CreateTestData.create()
        runmockserver()

    @classmethod
    def teardown_class(cls):
        CreateTestData.delete()
        conn = httplib.HTTPConnection("localhost:%d" % 6969)
        conn.request("QUIT", "/")
        conn.getresponse()

    def test_analytics_snippet(self):
        response = self.app.get(url_for(controller='tag'))
        code = gacode % (self.config['googleanalytics.id'],
                         'auto')
        assert code in response.body

    def test_top_packages(self):
        InitDB("initdb").run([]) # set up database tables
        command = LoadAnalytics("loadanalytics")
        command.TEST_HOST = MockClient('localhost', 6969)
        command.CONFIG = self.config
        command.run([])
        packages = dbutil.get_top_packages()
        resources = dbutil.get_top_resources()
        self.assertEquals(packages[0][1], 2)
        self.assertEquals(resources[0][1], 4)

    def test_download_count_inserted(self):
        InitDB("initdb").run([]) # set up database tables
        command = LoadAnalytics("loadanalytics")
        command.TEST_HOST = MockClient('localhost', 6969)
        command.CONFIG = self.config
        command.run([])
        response = self.app.get(url_for(controller='package',
                                        action='read',
                                        id='annakarenina'))
        assert "(downloaded 4 times)" in response.body, response.body

@@ -1625,40 +1625,8 @@
 me'%5D
- %5C%0A                             
  = '
@@ -1688,40 +1688,8 @@
 rd'%5D
- %5C%0A                             
  = '
@@ -1745,40 +1745,8 @@
 id'%5D
- %5C%0A                             
  = '
@@ -1819,40 +1819,8 @@
 ds'%5D
- %5C%0A                             
  = '
@@ -2474,16 +2474,32 @@
 er='tag'
+, action='index'
 ))%0A     
@@ -2556,33 +2556,8 @@
 d'%5D,
-%0A                        
  'au

update test_analytics_snippet test for latest CKAN master changes (setting map.explicit to true)