view test.py @ 16:aa2e7f3731c1

test suite now uses a test db instead of a fake one
author Atul Varma <varmaa@toolness.com>
date Wed, 23 Dec 2009 21:25:29 -0800
parents 07974aeffefe
children 5e68520b8d1f
line wrap: on
line source

import unittest
import StringIO
import copy

import simplejson as json
import pymongo
import bzapi

FAKE_CONFIG = {'product': {}}

class FakeOpenUrl(object):
    def __init__(self):
        self._responses = {}

    def set(self, url, query_args, response):
        if not isinstance(response, basestring):
            response = json.dumps(response)
        self._responses[url + json.dumps(query_args)] = response

    def __call__(self, url, headers, query_args=None):
        response = self._responses[url + json.dumps(query_args)]
        return StringIO.StringIO(response)

class FakeRequest(object):
    def __init__(self, url):
        self.url = url

    def add_header(self, name, value):
        pass

class FakeUrllib2(object):
    def __init__(self):
        self._responses = {}

    def Request(self, url):
        return FakeRequest(url)

    def set_url(self, url, response):
        if not isinstance(response, basestring):
            response = json.dumps(response)
        self._responses[url] = response

    def urlopen(self, request):
        return StringIO.StringIO(self._responses[request.url])

connection = pymongo.Connection('localhost', 27017)
testdb = connection.bzapi_testing_db

class TimestampTests(unittest.TestCase):
    def test_datetime_from_iso(self):
        date = bzapi.datetime_from_iso('2009-06-11T22:31:24Z')
        self.assertEqual(str(date), '2009-06-11 22:31:24')

    def test_datetime_from_rfc1123(self):
        date = bzapi.datetime_from_rfc1123('Wed, 23 Dec 2009 20:42:59 GMT')
        self.assertEqual(str(date), '2009-12-23 20:42:59')

class OpenUrlTests(unittest.TestCase):
    def test_open_url_works_without_query_args(self):
        urllib2 = FakeUrllib2()
        urllib2.set_url('http://foo/', 'boo')
        self.assertEqual(
            bzapi.open_url(url='http://foo/',
                           headers={'Content-Type': 'text/plain'},
                           urllib2=urllib2).read(),
            'boo'
            )

    def test_open_url_works_with_query_args(self):
        urllib2 = FakeUrllib2()
        urllib2.set_url('http://foo/?blah=hi+there', 'meh')
        self.assertEqual(
            bzapi.open_url(url='http://foo/',
                           query_args={'blah': 'hi there'},
                           headers={'Content-Type': 'text/plain'},
                           urllib2=urllib2).read(),
            'meh'
            )

class ApiTests(unittest.TestCase):
    _collections = ['api', 'bugs']

    def _reset_collections(self):
        for name in self._collections:
            testdb[name].remove({})

    def setUp(self):
        self._reset_collections()

    def tearDown(self):
        self._reset_collections()

    def _get_basic_fake_api(self, config=FAKE_CONFIG, **kwargs):
        opener = FakeOpenUrl()
        opener.set('http://foo/latest/configuration', kwargs,
                   config)
        api = bzapi.BugzillaApi('http://foo/latest', testdb.api,
                                open_url=opener, **kwargs)
        return api

    def test_bzapi_uses_username_and_password(self):
        api = self._get_basic_fake_api(username='foo',
                                       password='bar')
        api._open_url.set('http://foo/latest/stuff',
                          {'username': 'foo',
                           'password': 'bar'},
                          {})
        api.get('/stuff')

    def test_bzapi_raises_err_on_bad_component(self):
        config = copy.deepcopy(FAKE_CONFIG)
        config['product']['Mozilla Labs'] = {'component': {'Jetpack': {}}}
        api = self._get_basic_fake_api(config=config)
        self.assertRaises(ValueError,
                          api.get,
                          '/blah',
                          product='Mozilla Labs',
                          component='nonexistent')

    def test_bzapi_raises_err_on_bad_product(self):
        api = self._get_basic_fake_api()
        self.assertRaises(ValueError,
                          api.get,
                          '/blah',
                          product='nonexistent')

    def test_bzapi_validates_product_and_component(self):
        config = copy.deepcopy(FAKE_CONFIG)
        config['product']['Mozilla Labs'] = {'component': {'Jetpack': {}}}
        api = self._get_basic_fake_api(config=config)
        api._open_url.set('http://foo/latest/stuff',
                          {'product': 'Mozilla Labs',
                           'component': 'Jetpack'},
                          {})
        api.get('/stuff', product='Mozilla Labs', component='Jetpack')

    def test_bzapi_removes_dots_from_config(self):
        config = copy.deepcopy(FAKE_CONFIG)
        config['product']['addons.mozilla.org'] = {}
        api = self._get_basic_fake_api(config=config)
        self.assertTrue('addons_DOT_mozilla_DOT_org' in api.config['product'])

if __name__ == '__main__':
    unittest.main()