コード例 #1
0
ファイル: test_backend.py プロジェクト: aisopuro/restservice
class TestBackend():
    '''A unittest class for nosetests. Tests backend and database functionality.
    '''
    def setUp(self):
        log.basicConfig(level=log.DEBUG)
        self.backend = Backend()

    def tearDown(self):
        self.backend = None

    def test_init(self):
        pass

    def test_get_root(self):
        try:
            self.backend.get_root()
        except:
            assert False

    def test_connection(self):
        try:
            obj = self.backend.db.products.find_one()
            log.info(obj)
            assert type(obj) is DictType
        except:
            assert False

    def test_parse_args(self):
        args = ImmutableMultiDict()
        # No args should return base dictionary
        assert self.backend.parse_args(args) == BASE_ARGS
        # Incorrect args should return base dict
        args = ImmutableMultiDict([('dfdd', 'frefrf'), (342, 4334)])
        assert self.backend.parse_args(args) == BASE_ARGS

    def test_get_categories(self):
        categories = set([
            'electronics',
            'books',
            'movies',
            'comics',
            'games'
        ])

        assert categories == set(self.backend.get_categories())

    def test_parse_args_limit(self):
        # Correct arg should return dict with arg as key
        args = ImmutableMultiDict([
            ('limit', 20),
            ('limit', 15)
        ])
        val = self.backend.parse_args(args)
        assert 'limit' in val
        # value should be the last passed parameter
        assert val['limit'] == 15

    def test_parse_args_field(self):
        # giving a field argument should return dict with fields as key
        args = ImmutableMultiDict([
            ('field', 'price'),
            ('notfield', 'description')
        ])
        val = self.backend.parse_args(args)
        assert 'fields' in val
        # Should be dict
        assert type(val['fields']) is dict
        assert 'price' not in val['fields']
        assert not val['fields']['description']

    def test_parse_args_field_id(self):
        # giving a field argument should return dict with fields as key
        args = ImmutableMultiDict([
            ('field', '_id'),
            ('notfield', 'description')
        ])
        val = self.backend.parse_args(args)
        assert 'fields' in val
        # Should be dict
        assert type(val['fields']) is dict
        # _id should be false
        assert not val['fields']['_id']
        assert not val['fields']['description']

    def test_parse_args_category(self):
        args = ImmutableMultiDict([
            ('category', 'electronics'),
            ('notcategory', 'Flim flam')
        ])
        val = self.backend.parse_args(args)
        assert 'spec' in val
        assert 'electronics' in val['spec']['category']['$in']
        assert 'flim flam' in val['spec']['category']['$nin']

    def test_parse_args_price(self):
        args = ImmutableMultiDict([
            ('maxprice', 50),
            ('maxprice', 200)
        ])
        val = self.backend.parse_args(args)
        assert 'price' in val['spec']
        assert '$lt' in val['spec']['price']
        assert val['spec']['price']['$lt'] == 200

    def test_parse_args_subcategory(self):
        args = ImmutableMultiDict([
            ('subcategory', 'computers'),
            ('subcategory', 'strips'),
            ('notsubcategory', 'thriller')
        ])
        val = self.backend.parse_args(args)

        assert 'spec' in val
        assert 'computers' in val['spec']['subcategory']['$in']
        assert 'strips' in val['spec']['subcategory']['$in']
        assert 'thriller' in val['spec']['subcategory']['$nin']

    def test_parse_args_sort(self):
        args = ImmutableMultiDict([
            ('sort', 'category'),
            ('sort', 'subcategory'),
            ('dsort', 'price')
        ])
        val = self.backend.parse_args(args)

        assert 'sort' in val
        for field, direction in val['sort']:
            if field in ['category', 'subcategory']:
                assert direction > 0
            elif field == 'price':
                assert direction < 0
            else:
                assert False

    def test_parse_args_amount(self):
        args = ImmutableMultiDict([
            ('minamount', 0),
            ('minamount', 10),
            ('minamount', 5)
        ])
        val = self.backend.parse_args(args)

        assert 'spec' in val
        assert val['spec']['amount']['$gte'] == 5

    def test_search(self):
        args = {
            'limit': 10,
            'spec': {
                'category': {
                    '$in': ['electronics']
                }
            }
        }
        val = self.backend.search(self.backend.db.products, args)
        assert len(val) == 10
        for doc in val:
            #pprint(doc)
            assert doc['category'] == 'electronics'

    def test_get_products(self):
        args = ImmutableMultiDict([
            ('limit', 10),
            ('category', 'electronics'),
            ('category', 'books'),
            ('subcategory', 'romance'),
            ('subcategory', 'tablet'),
            ('maxprice', 500)
        ])
        val = self.backend.get_products(args)
        assert len(val) == 10
        for doc in val:
            assert doc['category'] in [
                'electronics',
                'books'
            ] and doc['subcategory'] in [
                'romance',
                'tablet'
            ] and doc['price'] <= 500