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 import ckanext.googleanalytics.gasnippet as gasnippet class MockClient(httplib.HTTPConnection): def request(self, http_request): filters = http_request.uri.query.get('filters') path = http_request.uri.path if filters: if "dataset" in filters: path += "/dataset" 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): InitDB("initdb").run([]) # set up database tables 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', action='index')) code = gasnippet.header_code % (self.config['googleanalytics.id'], 'auto') assert code in response.body def test_top_packages(self): 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): 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 def test_js_inserted_resource_view(self): from nose import SkipTest raise SkipTest("Test won't work until CKAN 1.5.2") from ckan.logic.action import get from ckan import model context = {'model': model, 'ignore_auth': True} data = {'id': 'annakarenina'} pkg = get.package_show(context, data) resource_id = pkg['resources'][0]['id'] command = LoadAnalytics("loadanalytics") command.TEST_HOST = MockClient('localhost', 6969) command.CONFIG = self.config command.run([]) response = self.app.get(url_for( controller='package', action='resource_read', id='annakarenina', resource_id=resource_id )) assert 'onclick="javascript: _gaq.push(' in response.body