tricircle/tricircle/tests/unit/api/controllers/test_root.py

151 lines
5.7 KiB
Python

# Copyright 2015 Huawei Technologies Co., Ltd.
# All Rights Reserved
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import mock
from mock import patch
import unittest
import pecan
import tricircle.api.controllers.root as root_controller
from tricircle.common import context
from tricircle.db import client
from tricircle.db import core
from tricircle.db import models
class ControllerTest(unittest.TestCase):
def setUp(self):
core.initialize()
core.ModelBase.metadata.create_all(core.get_engine())
self.context = context.Context()
self.context.is_admin = True
root_controller._get_environment = mock.Mock(return_value={})
root_controller._extract_context_from_environ = mock.Mock(
return_value=self.context)
pecan.abort = mock.Mock()
pecan.response = mock.Mock()
def tearDown(self):
core.ModelBase.metadata.drop_all(core.get_engine())
class SitesControllerTest(ControllerTest):
def setUp(self):
super(SitesControllerTest, self).setUp()
self.controller = root_controller.SitesController()
def test_post_top_site(self):
kw = {'name': 'TopSite', 'top': True}
site_id = self.controller.post(**kw)['site']['site_id']
site = models.get_site(self.context, site_id)
self.assertEqual(site['site_name'], 'TopSite')
self.assertEqual(site['az_id'], '')
@patch.object(client.Client, 'create_resources')
def test_post_bottom_site(self, mock_method):
kw = {'name': 'BottomSite'}
site_id = self.controller.post(**kw)['site']['site_id']
site = models.get_site(self.context, site_id)
self.assertEqual(site['site_name'], 'BottomSite')
self.assertEqual(site['az_id'], 'az_BottomSite')
mock_method.assert_called_once_with('aggregate', self.context,
'ag_BottomSite', 'az_BottomSite')
def test_post_site_name_missing(self):
kw = {'top': True}
self.controller.post(**kw)
pecan.abort.assert_called_once_with(400, 'Name of site required')
def test_post_conflict(self):
kw = {'name': 'TopSite', 'top': True}
self.controller.post(**kw)
self.controller.post(**kw)
pecan.abort.assert_called_once_with(409,
'Site with name TopSite exists')
def test_post_not_admin(self):
self.context.is_admin = False
kw = {'name': 'TopSite', 'top': True}
self.controller.post(**kw)
pecan.abort.assert_called_once_with(
400, 'Admin role required to create sites')
@patch.object(client.Client, 'create_resources')
def test_post_decide_top(self, mock_method):
# 'top' default to False
# top site
kw = {'name': 'Site1', 'top': True}
self.controller.post(**kw)
# bottom site
kw = {'name': 'Site2', 'top': False}
self.controller.post(**kw)
kw = {'name': 'Site3'}
self.controller.post(**kw)
calls = [mock.call('aggregate', self.context, 'ag_Site%d' % i,
'az_Site%d' % i) for i in xrange(2, 4)]
mock_method.assert_has_calls(calls)
@patch.object(models, 'create_site')
def test_post_create_site_exception(self, mock_method):
mock_method.side_effect = Exception
kw = {'name': 'BottomSite'}
self.controller.post(**kw)
pecan.abort.assert_called_once_with(500, 'Fail to create site')
@patch.object(client.Client, 'create_resources')
def test_post_create_aggregate_exception(self, mock_method):
mock_method.side_effect = Exception
kw = {'name': 'BottomSite'}
self.controller.post(**kw)
pecan.abort.assert_called_once_with(500, 'Fail to create aggregate')
# make sure site is deleted
site_filter = [{'key': 'site_name',
'comparator': 'eq',
'value': 'BottomSite'}]
sites = models.list_sites(self.context, site_filter)
self.assertEqual(len(sites), 0)
def test_get_one(self):
kw = {'name': 'TopSite', 'top': True}
site_id = self.controller.post(**kw)['site']['site_id']
return_site = self.controller.get_one(site_id)['site']
self.assertEqual(return_site, {'site_id': site_id,
'site_name': 'TopSite',
'az_id': ''})
def test_get_one_not_found(self):
self.controller.get_one('fake_id')
pecan.abort.assert_called_once_with(404,
'Site with id fake_id not found')
@patch.object(client.Client, 'create_resources', new=mock.Mock)
def test_get_all(self):
kw1 = {'name': 'TopSite', 'top': True}
kw2 = {'name': 'BottomSite'}
self.controller.post(**kw1)
self.controller.post(**kw2)
sites = self.controller.get_all()
actual_result = [(site['site_name'],
site['az_id']) for site in sites['sites']]
expect_result = [('BottomSite', 'az_BottomSite'), ('TopSite', '')]
self.assertItemsEqual(actual_result, expect_result)
def tearDown(self):
core.ModelBase.metadata.drop_all(core.get_engine())