Files
monasca-api/monasca_api/tests/test_nm_repository.py
liyingjun f379d71fcb Use oslo.db for sqla driver
Use create_engine in oslo.db instead of the sqlalchemy one to get
the optimization benefit from oslo.db.

Breaking change would be replacing database.url with
database.connection therefore database.url will be still
supported until Pike is released. database.url
has been marked as deprecated option.

Change-Id: Id3cdafa791a7d2558a5b065022a9afc6ff31e004
Closes-bug: #1640419
2017-03-08 10:08:42 +01:00

205 lines
8.2 KiB
Python

# Copyright 2015 Cray
# Copyright 2016 FUJITSU LIMITED
# (C) Copyright 2016 Hewlett Packard Enterprise Development Company LP
#
# 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 datetime
import fixtures
from oslo_config import cfg
from oslo_config import fixture as fixture_config
from oslo_db.sqlalchemy.engines import create_engine
from sqlalchemy import delete, MetaData, insert, bindparam
import testtools
from monasca_api.common.repositories.sqla import models
CONF = cfg.CONF
class TestNotificationMethodRepoDB(testtools.TestCase, fixtures.TestWithFixtures):
@classmethod
def setUpClass(cls):
engine = create_engine('sqlite://')
qry = open('monasca_api/tests/sqlite_alarm.sql', 'r').read()
sconn = engine.raw_connection()
c = sconn.cursor()
c.executescript(qry)
sconn.commit()
c.close()
cls.engine = engine
def _fake_engine_from_config(*args, **kw):
return cls.engine
cls.fixture = fixtures.MonkeyPatch(
'sqlalchemy.create_engine', _fake_engine_from_config)
cls.fixture.setUp()
metadata = MetaData()
cls.nm = models.create_nm_model(metadata)
cls._delete_nm_query = delete(cls.nm)
cls._insert_nm_query = (insert(cls.nm)
.values(
id=bindparam('id'),
tenant_id=bindparam('tenant_id'),
name=bindparam('name'),
type=bindparam('type'),
address=bindparam('address'),
period=bindparam('period'),
created_at=bindparam('created_at'),
updated_at=bindparam('updated_at')))
@classmethod
def tearDownClass(cls):
cls.fixture.cleanUp()
def setUp(self):
super(TestNotificationMethodRepoDB, self).setUp()
self._fixture_config = self.useFixture(
fixture_config.Config(cfg.CONF))
self._fixture_config.config(connection='sqlite://',
group='database')
from monasca_api.common.repositories.sqla import notifications_repository as nr
self.repo = nr.NotificationsRepository()
self.default_nms = [{'id': '123',
'tenant_id': '444',
'name': 'MyEmail',
'type': 'EMAIL',
'address': 'a@b',
'period': 0,
'created_at': datetime.datetime.now(),
'updated_at': datetime.datetime.now()},
{'id': '124',
'tenant_id': '444',
'name': 'OtherEmail',
'type': 'EMAIL',
'address': 'a@b',
'period': 0,
'created_at': datetime.datetime.now(),
'updated_at': datetime.datetime.now()}]
with self.engine.connect() as conn:
conn.execute(self._delete_nm_query)
conn.execute(self._insert_nm_query, self.default_nms)
def test_fixture_and_setup(self):
class A(object):
def __init__(self):
from sqlalchemy import create_engine
self.engine = create_engine(None)
a = A()
expected_list_tables = ['alarm',
'alarm_action',
'alarm_definition',
'alarm_definition_severity',
'alarm_metric',
'alarm_state',
'metric_definition',
'metric_definition_dimensions',
'metric_dimension',
'notification_method',
'notification_method_type',
'sub_alarm',
'sub_alarm_definition',
'sub_alarm_definition_dimension']
self.assertEqual(self.engine, a.engine)
self.assertEqual(self.engine.table_names(), expected_list_tables)
def test_should_create(self):
from monasca_api.common.repositories import exceptions
nmA = self.repo.create_notification('555',
'MyEmail',
'EMAIL',
'a@b',
0)
nmB = self.repo.list_notification('555', nmA)
self.assertEqual(nmA, nmB['id'])
self.assertRaises(exceptions.AlreadyExistsException,
self.repo.create_notification,
'555',
'MyEmail',
'EMAIL',
'a@b',
0)
def test_should_exists(self):
from monasca_api.common.repositories import exceptions
self.assertTrue(self.repo.list_notification("444", "123"))
self.assertRaises(exceptions.DoesNotExistException,
self.repo.list_notification, "444", "1234")
self.assertRaises(exceptions.DoesNotExistException,
self.repo.list_notification, "333", "123")
def test_should_find_by_id(self):
nm = self.repo.list_notification('444', '123')
self.assertEqual(nm['id'], '123')
self.assertEqual(nm['type'], 'EMAIL')
self.assertEqual(nm['address'], 'a@b')
def test_should_find(self):
nms = self.repo.list_notifications('444', None, None, 1)
self.assertEqual(nms, self.default_nms)
nms = self.repo.list_notifications('444', None, 2, 1)
self.assertEqual(nms, [])
def test_update(self):
import copy
self.repo.update_notification('123', '444', 'Foo', 'EMAIL', 'abc', 0)
nm = self.repo.list_notification('444', '123')
new_nm = copy.deepcopy(self.default_nms[0])
new_nm['name'] = 'Foo'
new_nm['type'] = 'EMAIL'
new_nm['address'] = 'abc'
new_nm['created_at'] = nm['created_at']
new_nm['updated_at'] = nm['updated_at']
self.assertEqual(nm, new_nm)
from monasca_api.common.repositories import exceptions
self.assertRaises(exceptions.DoesNotExistException,
self.repo.update_notification,
'no really id',
'no really tenant',
'',
'',
'',
0)
def test_should_delete(self):
from monasca_api.common.repositories import exceptions
self.repo.delete_notification('444', '123')
self.assertRaises(exceptions.DoesNotExistException,
self.repo.list_notification, '444', '123')
self.assertRaises(exceptions.DoesNotExistException,
self.repo.delete_notification, 'no really tenant', '123')
def test_should_update_duplicate_with_same_values(self):
import copy
self.repo.update_notification('123', '444', 'Foo', 'EMAIL', 'abc', 0)
self.repo.update_notification('123', '444', 'Foo', 'EMAIL', 'abc', 0)
nm = self.repo.list_notification('444', '123')
new_nm = copy.deepcopy(self.default_nms[0])
new_nm['name'] = 'Foo'
new_nm['type'] = 'EMAIL'
new_nm['address'] = 'abc'
new_nm['created_at'] = nm['created_at']
new_nm['updated_at'] = nm['updated_at']
self.assertEqual(nm, new_nm)