Unify test setup

Change make the tests follow the same approach
for every possible case. This change is required to
properly introduce configuration parsing from a single
place.

Change-Id: I14fbf71eddd0930ecaa6330955f74ebc8677912b
This commit is contained in:
Tomasz Trębski 2017-08-02 08:51:44 +02:00
parent 2742123297
commit 366c8886f9
18 changed files with 266 additions and 251 deletions

View File

@ -1,5 +1,5 @@
# Copyright 2015 kornicameister@gmail.com
# Copyright 2015 FUJITSU LIMITED
# Copyright 2015-2017 FUJITSU LIMITED
#
# 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
@ -14,6 +14,11 @@
# under the License.
import falcon
from falcon import testing
from oslo_config import cfg
from oslo_config import fixture as oo_cfg
from oslo_context import fixture as oo_ctx
from oslotest import base as oslotest_base
from monasca_api.api.core import request
@ -34,3 +39,46 @@ class MockedAPI(falcon.API):
middleware=None,
router=None
)
class ConfigFixture(oo_cfg.Config):
"""Mocks configuration"""
def __init__(self):
super(ConfigFixture, self).__init__(cfg.CONF)
def setUp(self):
super(ConfigFixture, self).setUp()
class BaseTestCase(oslotest_base.BaseTestCase):
def setUp(self):
super(BaseTestCase, self).setUp()
self.useFixture(ConfigFixture())
self.useFixture(oo_ctx.ClearRequestContext())
@staticmethod
def conf_override(**kw):
"""Override flag variables for a test."""
group = kw.pop('group', None)
for k, v in kw.items():
cfg.CONF.set_override(k, v, group)
@staticmethod
def conf_default(**kw):
"""Override flag variables for a test."""
group = kw.pop('group', None)
for k, v in kw.items():
cfg.CONF.set_default(k, v, group)
class BaseApiTestCase(BaseTestCase, testing.TestBase):
api_class = MockedAPI
@staticmethod
def create_environ(*args, **kwargs):
return testing.create_environ(
*args,
**kwargs
)

View File

@ -19,17 +19,17 @@ import time
import fixtures
from oslo_config import cfg
from oslo_config import fixture as fixture_config
from oslo_db.sqlalchemy.engines import create_engine
import testtools
from monasca_api.tests import base
from sqlalchemy import delete, MetaData, insert, bindparam
from monasca_api.common.repositories.sqla import models
CONF = cfg.CONF
class TestAlarmRepoDB(testtools.TestCase, fixtures.TestWithFixtures):
class TestAlarmRepoDB(base.BaseTestCase):
@classmethod
def setUpClass(cls):
engine = create_engine('sqlite://')
@ -171,10 +171,7 @@ class TestAlarmRepoDB(testtools.TestCase, fixtures.TestWithFixtures):
def setUp(self):
super(TestAlarmRepoDB, self).setUp()
self._fixture_config = self.useFixture(
fixture_config.Config(cfg.CONF))
self._fixture_config.config(connection='sqlite://',
group='database')
self.conf_override(connection='sqlite://', group='database')
from monasca_api.common.repositories.sqla import alarms_repository as ar
self.repo = ar.AlarmsRepository()

View File

@ -1,5 +1,5 @@
# Copyright 2015 Cray
# Copyright 2016 FUJITSU LIMITED
# Copyright 2016-2017 FUJITSU LIMITED
# (C) Copyright 2016-2017 Hewlett Packard Enterprise Development LP
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@ -18,15 +18,14 @@ 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, select, func
import testtools
from monasca_api.common.repositories import exceptions
from monasca_api.common.repositories.model import sub_alarm_definition
from monasca_api.common.repositories.sqla import models
from monasca_api.expression_parser import alarm_expr_parser
from monasca_api.tests import base
CONF = cfg.CONF
ALARM_DEF_123_FIELDS = {'actions_enabled': False,
@ -43,12 +42,11 @@ ALARM_DEF_123_FIELDS = {'actions_enabled': False,
TENANT_ID = 'bob'
class TestAlarmDefinitionRepoDB(testtools.TestCase, fixtures.TestWithFixtures):
class TestAlarmDefinitionRepoDB(base.BaseTestCase):
@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()
@ -59,69 +57,65 @@ class TestAlarmDefinitionRepoDB(testtools.TestCase, fixtures.TestWithFixtures):
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.aa = models.create_aa_model(metadata)
cls._delete_aa_query = delete(cls.aa)
cls._insert_aa_query = (insert(cls.aa)
.values(
alarm_definition_id=bindparam('alarm_definition_id'),
alarm_state=bindparam('alarm_state'),
action_id=bindparam('action_id')))
cls._insert_aa_query = (insert(cls.aa).values(
alarm_definition_id=bindparam('alarm_definition_id'),
alarm_state=bindparam('alarm_state'),
action_id=bindparam('action_id')))
cls.ad = models.create_ad_model(metadata)
cls._delete_ad_query = delete(cls.ad)
cls._insert_ad_query = (insert(cls.ad)
.values(
id=bindparam('id'),
tenant_id=bindparam('tenant_id'),
name=bindparam('name'),
severity=bindparam('severity'),
expression=bindparam('expression'),
match_by=bindparam('match_by'),
actions_enabled=bindparam('actions_enabled'),
created_at=bindparam('created_at'),
updated_at=bindparam('updated_at'),
deleted_at=bindparam('deleted_at')))
cls._insert_ad_query = (insert(cls.ad).values(
id=bindparam('id'),
tenant_id=bindparam('tenant_id'),
name=bindparam('name'),
severity=bindparam('severity'),
expression=bindparam('expression'),
match_by=bindparam('match_by'),
actions_enabled=bindparam('actions_enabled'),
created_at=bindparam('created_at'),
updated_at=bindparam('updated_at'),
deleted_at=bindparam('deleted_at')))
cls.sad = models.create_sad_model(metadata)
cls._delete_sad_query = delete(cls.sad)
cls._insert_sad_query = (insert(cls.sad)
.values(
id=bindparam('id'),
alarm_definition_id=bindparam('alarm_definition_id'),
function=bindparam('function'),
metric_name=bindparam('metric_name'),
operator=bindparam('operator'),
threshold=bindparam('threshold'),
period=bindparam('period'),
periods=bindparam('periods'),
is_deterministic=bindparam('is_deterministic'),
created_at=bindparam('created_at'),
updated_at=bindparam('updated_at')))
cls._insert_sad_query = (insert(cls.sad).values(
id=bindparam('id'),
alarm_definition_id=bindparam('alarm_definition_id'),
function=bindparam('function'),
metric_name=bindparam('metric_name'),
operator=bindparam('operator'),
threshold=bindparam('threshold'),
period=bindparam('period'),
periods=bindparam('periods'),
is_deterministic=bindparam('is_deterministic'),
created_at=bindparam('created_at'),
updated_at=bindparam('updated_at')))
cls.sadd = models.create_sadd_model(metadata)
cls._delete_sadd_query = delete(cls.sadd)
cls._insert_sadd_query = (insert(cls.sadd)
.values(
sub_alarm_definition_id=bindparam('sub_alarm_definition_id'),
dimension_name=bindparam('dimension_name'),
value=bindparam('value')))
cls._insert_sadd_query = (insert(cls.sadd).values(
sub_alarm_definition_id=bindparam('sub_alarm_definition_id'),
dimension_name=bindparam('dimension_name'),
value=bindparam('value')))
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'),
created_at=bindparam('created_at'),
updated_at=bindparam('updated_at')))
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'),
created_at=bindparam('created_at'),
updated_at=bindparam('updated_at')))
@classmethod
def tearDownClass(cls):
@ -129,11 +123,7 @@ class TestAlarmDefinitionRepoDB(testtools.TestCase, fixtures.TestWithFixtures):
def setUp(self):
super(TestAlarmDefinitionRepoDB, self).setUp()
self._fixture_config = self.useFixture(
fixture_config.Config(cfg.CONF))
self._fixture_config.config(connection='sqlite://',
group='database')
self.conf_default(connection='sqlite://', group='database')
from monasca_api.common.repositories.sqla import alarm_definitions_repository as adr
self.repo = adr.AlarmDefinitionsRepository()

View File

@ -1,4 +1,5 @@
# (C) Copyright 2016-2017 Hewlett Packard Enterprise Development LP
# Copyright 2017 Fujitsu LIMITED
#
# 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
@ -13,12 +14,12 @@
# under the License.
import pyparsing
import unittest
from monasca_api.expression_parser import alarm_expr_parser
from monasca_api.tests import base
class TestAlarmExpression(unittest.TestCase):
class TestAlarmExpression(base.BaseTestCase):
good_simple_expression = "max(cpu.idle_perc{hostname=fred}, 60) > 10 times 4"

View File

@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
# Copyright 2015 Cray Inc.
# (C) Copyright 2015,2017 Hewlett Packard Enterprise Development LP
# Copyright 2016 FUJITSU LIMITED
# Copyright 2016-2017 FUJITSU LIMITED
#
# 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
@ -25,15 +25,14 @@ import testtools.matchers as matchers
from mock import Mock
import oslo_config.fixture
import six
from monasca_api.common.repositories.model import sub_alarm_definition
from monasca_api.tests import base
from monasca_api.v2.reference import alarm_definitions
from monasca_api.v2.reference import alarms
import oslo_config.fixture
import oslotest.base as oslotest
import six
CONF = oslo_config.cfg.CONF
TENANT_ID = u"fedcba9876543210fedcba9876543210"
@ -81,32 +80,6 @@ ALARM_HISTORY = OrderedDict((
))
class MonascaApiConfigFixture(oslo_config.fixture.Config):
def setUp(self):
super(MonascaApiConfigFixture, self).setUp()
# [messaging]
self.conf.set_override(
'driver',
'monasca_api.common.messaging.kafka_publisher:KafkaPublisher',
group='messaging')
# [repositories]
self.conf.set_override(
'alarms_driver',
'monasca_api.common.repositories.sqla.alarms_repository:AlarmsRepository',
group='repositories')
self.conf.set_override(
'alarm_definitions_driver',
'monasca_api.common.repositories.alarm_definitions_repository:AlarmDefinitionsRepository',
group='repositories')
self.conf.set_override(
'metrics_driver',
'monasca_api.common.repositories.influxdb.metrics_repository:MetricsRepository',
group='repositories')
class InfluxClientAlarmHistoryResponseFixture(fixtures.MockPatch):
def _build_series(self, name, column_dict):
@ -160,9 +133,7 @@ class RESTResponseEquals(object):
return matchers.Equals(self.expected_data).match(response_data)
class AlarmTestBase(falcon.testing.TestBase, oslotest.BaseTestCase):
api_class = base.MockedAPI
class AlarmTestBase(base.BaseApiTestCase):
def setUp(self):
super(AlarmTestBase, self).setUp()
@ -170,7 +141,26 @@ class AlarmTestBase(falcon.testing.TestBase, oslotest.BaseTestCase):
self.useFixture(fixtures.MockPatch(
'monasca_api.common.messaging.kafka_publisher.KafkaPublisher'))
self.CONF = self.useFixture(MonascaApiConfigFixture(CONF)).conf
# [messaging]
self.conf_override(
driver='monasca_api.common.messaging.'
'kafka_publisher:KafkaPublisher',
group='messaging')
# [repositories]
self.conf_override(
alarms_driver='monasca_api.common.repositories.sqla.'
'alarms_repository:AlarmsRepository',
group='repositories')
self.conf_override(
alarm_definitions_driver='monasca_api.common.repositories.'
'alarm_definitions_repository:'
'AlarmDefinitionsRepository',
group='repositories')
self.conf_override(
metrics_driver='monasca_api.common.repositories.influxdb.'
'metrics_repository:MetricsRepository',
group='repositories')
class TestAlarmsStateHistory(AlarmTestBase):
@ -179,9 +169,11 @@ class TestAlarmsStateHistory(AlarmTestBase):
super(TestAlarmsStateHistory, self).setUp()
self.useFixture(InfluxClientAlarmHistoryResponseFixture(
'monasca_api.common.repositories.influxdb.metrics_repository.client.InfluxDBClient'))
'monasca_api.common.repositories.influxdb.'
'metrics_repository.client.InfluxDBClient'))
self.useFixture(fixtures.MockPatch(
'monasca_api.common.repositories.sqla.alarms_repository.AlarmsRepository'))
'monasca_api.common.repositories.sqla.'
'alarms_repository.AlarmsRepository'))
self.alarms_resource = alarms.AlarmsStateHistory()
self.api.add_route(
@ -210,7 +202,8 @@ class TestAlarmDefinition(AlarmTestBase):
super(TestAlarmDefinition, self).setUp()
self.alarm_def_repo_mock = self.useFixture(fixtures.MockPatch(
'monasca_api.common.repositories.alarm_definitions_repository.AlarmDefinitionsRepository'
'monasca_api.common.repositories.'
'alarm_definitions_repository.AlarmDefinitionsRepository'
)).mock
self.alarm_definition_resource = alarm_definitions.AlarmDefinitions()

View File

@ -13,10 +13,9 @@
# under the License.
import mock
from oslo_config import fixture as oo_cfg
from oslotest import base
from monasca_api.healthcheck import alarms_db_check as rdc
from monasca_api.tests import base
from monasca_api.v2.reference import cfg
CONF = cfg.CONF
@ -29,14 +28,9 @@ class TestMetricsDbHealthCheckLogic(base.BaseTestCase):
'connection': db_connection
}
def __init__(self, *args, **kwargs):
super(TestMetricsDbHealthCheckLogic, self).__init__(*args, **kwargs)
self._conf = None
def setUp(self):
super(TestMetricsDbHealthCheckLogic, self).setUp()
self._conf = self.useFixture(oo_cfg.Config(CONF))
self._conf.config(group='database', **self.mocked_config)
self.conf_default(group='database', **self.mocked_config)
@mock.patch('monasca_api.healthcheck.alarms_db_check.'
'sql_repository.get_engine')

View File

@ -13,12 +13,11 @@
# under the License.
import falcon
from falcon import testing
import mock
from oslo_config import fixture as oo_cfg
from monasca_api.healthcheck import base
from monasca_api import healthchecks
from monasca_api.tests import base as test_base
from monasca_api.v2.reference import cfg
from monasca_common.rest import utils
@ -26,10 +25,7 @@ CONF = cfg.CONF
ENDPOINT = '/healthcheck'
class TestHealthChecks(testing.TestBase):
def setUp(self):
super(TestHealthChecks, self).setUp()
self.conf = self.useFixture(oo_cfg.Config(CONF))
class TestHealthChecks(test_base.BaseApiTestCase):
def set_route(self):
self.resources = healthchecks.HealthChecks()

View File

@ -13,12 +13,11 @@
# under the License.
import mock
from oslo_config import fixture as oo_cfg
from oslotest import base
from monasca_common.kafka_lib import client
from monasca_api.healthcheck import kafka_check as kc
from monasca_api.tests import base
from monasca_api.v2.reference import cfg
CONF = cfg.CONF
@ -43,8 +42,7 @@ class TestKafkaHealthCheckLogic(base.BaseTestCase):
def setUp(self):
super(TestKafkaHealthCheckLogic, self).setUp()
self._conf = self.useFixture(oo_cfg.Config(CONF))
self._conf.config(group='kafka', **self.mocked_config)
self.conf_default(group='kafka', **self.mocked_config)
@mock.patch('monasca_api.healthcheck.kafka_check.client.KafkaClient')
def test_should_fail_kafka_unavailable(self, kafka_client):

View File

@ -13,9 +13,9 @@
# under the License.
import mock
from oslotest import base
from monasca_api.healthcheck import keystone_protocol
from monasca_api.tests import base
_CONF = {}

View File

@ -17,11 +17,10 @@ from cassandra import cluster as cl
import requests
import mock
from oslo_config import fixture as oo_cfg
from oslotest import base
from monasca_api.common.repositories import exceptions
from monasca_api.healthcheck import metrics_db_check as tdc
from monasca_api.tests import base
from monasca_api.v2.reference import cfg
CONF = cfg.CONF
@ -39,8 +38,7 @@ class TestMetricsDbHealthCheck(base.BaseTestCase):
def setUp(self):
super(TestMetricsDbHealthCheck, self).setUp()
self._conf = self.useFixture(oo_cfg.Config(CONF))
self._conf.config(group='cassandra', **self.cassandra_conf)
self.conf_default(group='cassandra', **self.cassandra_conf)
def test_should_detect_influxdb_db(self):
db_health = tdc.MetricsDbCheck()
@ -75,8 +73,8 @@ class TestMetricsDbHealthCheck(base.BaseTestCase):
messaging_conf = {
'metrics_driver': 'influxdb.metrics_repository:MetricsRepository'
}
self._conf.config(group='repositories', **messaging_conf)
self._conf.config(group='influxdb', **influxdb_conf)
self.conf_override(group='repositories', **messaging_conf)
self.conf_override(group='influxdb', **influxdb_conf)
db_health = tdc.MetricsDbCheck()
result = db_health.health_check()
@ -97,8 +95,8 @@ class TestMetricsDbHealthCheck(base.BaseTestCase):
messaging_conf = {
'metrics_driver': 'influxdb.metrics_repository:MetricsRepository'
}
self._conf.config(group='repositories', **messaging_conf)
self._conf.config(group='influxdb', **influxdb_conf)
self.conf_override(group='repositories', **messaging_conf)
self.conf_override(group='influxdb', **influxdb_conf)
db_health = tdc.MetricsDbCheck()
result = db_health.health_check()
@ -118,8 +116,8 @@ class TestMetricsDbHealthCheck(base.BaseTestCase):
messaging_conf = {
'metrics_driver': 'influxdb.metrics_repository:MetricsRepository'
}
self._conf.config(group='repositories', **messaging_conf)
self._conf.config(group='influxdb', **influxdb_conf)
self.conf_override(group='repositories', **messaging_conf)
self.conf_override(group='influxdb', **influxdb_conf)
db_health = tdc.MetricsDbCheck()
result = db_health.health_check()
@ -139,8 +137,8 @@ class TestMetricsDbHealthCheck(base.BaseTestCase):
messaging_conf = {
'metrics_driver': 'influxdb.metrics_repository:MetricsRepository'
}
self._conf.config(group='repositories', **messaging_conf)
self._conf.config(group='influxdb', **influxdb_conf)
self.conf_override(group='repositories', **messaging_conf)
self.conf_override(group='influxdb', **influxdb_conf)
db_health = tdc.MetricsDbCheck()
result = db_health.health_check()
@ -157,8 +155,8 @@ class TestMetricsDbHealthCheck(base.BaseTestCase):
'cluster_ip_addresses': 'localhost',
'keyspace': 'test'
}
self._conf.config(group='repositories', **messaging_conf)
self._conf.config(group='cassandra', **cassandra_conf)
self.conf_override(group='repositories', **messaging_conf)
self.conf_override(group='cassandra', **cassandra_conf)
cluster = mock.Mock()
cas_mock = mock.Mock()
@ -181,8 +179,8 @@ class TestMetricsDbHealthCheck(base.BaseTestCase):
'cluster_ip_addresses': 'localhost',
'keyspace': 'test'
}
self._conf.config(group='repositories', **messaging_conf)
self._conf.config(group='cassandra', **cassandra_conf)
self.conf_override(group='repositories', **messaging_conf)
self.conf_override(group='cassandra', **cassandra_conf)
# Simulate cassandra driver not available
try_import.return_value = None
@ -202,8 +200,8 @@ class TestMetricsDbHealthCheck(base.BaseTestCase):
'cluster_ip_addresses': 'localhost',
'keyspace': 'test'
}
self._conf.config(group='repositories', **messaging_conf)
self._conf.config(group='cassandra', **cassandra_conf)
self.conf_override(group='repositories', **messaging_conf)
self.conf_override(group='cassandra', **cassandra_conf)
db_health = tdc.MetricsDbCheck()
result = db_health.health_check()

View File

@ -1,5 +1,5 @@
# Copyright 2015 Cray
# Copyright 2016 FUJITSU LIMITED
# Copyright 2016-2017 FUJITSU LIMITED
#
# 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
@ -13,37 +13,37 @@
# License for the specific language governing permissions and limitations
# under the License.
import fixtures
import testtools
from sqlalchemy import select, MetaData, text, asc
from monasca_api.common.repositories.sqla import models
from monasca_api.tests import base
class TestModelsDB(testtools.TestCase, fixtures.TestWithFixtures):
@classmethod
def setUpClass(cls):
class TestModelsDB(base.BaseTestCase):
def setUp(self):
super(TestModelsDB, self).setUp()
metadata = MetaData()
md = models.create_md_model(metadata)
gc_columns = [md.c.name + text("'='") + md.c.value]
cls.group_concat_md = (select([md.c.dimension_set_id,
self.group_concat_md = (select([md.c.dimension_set_id,
models.group_concat(gc_columns).label('dimensions')])
.select_from(md)
.group_by(md.c.dimension_set_id))
.select_from(md)
.group_by(md.c.dimension_set_id))
cls.group_concat_md_order = (select([md.c.dimension_set_id,
self.group_concat_md_order = (select([md.c.dimension_set_id,
models.group_concat(gc_columns,
order_by=[md.c.name.asc()]).label('dimensions')])
.select_from(md)
.group_by(md.c.dimension_set_id))
.select_from(md)
.group_by(md.c.dimension_set_id))
cls.order_by_field = (select([md.c.dimension_set_id])
.select_from(md)
.order_by(asc(models.field_sort(md.c.dimension_set_id, map(text,
["'A'",
"'B'",
"'C'"])))))
self.order_by_field = (select([md.c.dimension_set_id])
.select_from(md)
.order_by(asc(models.field_sort(md.c.dimension_set_id, map(text,
["'A'",
"'B'",
"'C'"])))))
def test_oracle(self):
from sqlalchemy.dialects import oracle

View File

@ -1,5 +1,5 @@
# Copyright 2015 Cray
# Copyright 2016 FUJITSU LIMITED
# Copyright 2016-2017 FUJITSU LIMITED
# (C) Copyright 2016 Hewlett Packard Enterprise Development Company LP
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
@ -21,14 +21,14 @@ 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
from monasca_api.tests import base
CONF = cfg.CONF
class TestNotificationMethodRepoDB(testtools.TestCase, fixtures.TestWithFixtures):
class TestNotificationMethodRepoDB(base.BaseTestCase):
@classmethod
def setUpClass(cls):
engine = create_engine('sqlite://')

View File

@ -1,5 +1,6 @@
# Copyright 2015 Cray Inc. All Rights Reserved.
# Copyright 2016 Hewlett Packard Enterprise Development Company, L.P.
# Copyright 2017 Fujitsu LIMITED
#
# 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
@ -13,14 +14,13 @@
# License for the specific language governing permissions and limitations
# under the License.
import unittest
from mock import Mock
import monasca_api.v2.reference.helpers as helpers
from monasca_api.tests import base
from monasca_api.v2.reference import helpers
class TestGetQueryDimension(unittest.TestCase):
class TestGetQueryDimension(base.BaseTestCase):
def test_no_dimensions(self):
req = Mock()
@ -110,7 +110,7 @@ class TestGetQueryDimension(unittest.TestCase):
self.assertEqual(result, {})
class TestGetOldQueryParams(unittest.TestCase):
class TestGetOldQueryParams(base.BaseTestCase):
def test_old_query_params(self):
uri = Mock()

View File

@ -1,5 +1,6 @@
# Copyright 2015 Cray Inc. All Rights Reserved.
# (C) Copyright 2016-2017 Hewlett Packard Enterprise Development LP
# Copyright 2017 Fujitsu LIMITED
#
# 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
@ -16,27 +17,25 @@
import binascii
from collections import namedtuple
from datetime import datetime
import unittest
from mock import patch
import monasca_api.common.repositories.cassandra.metrics_repository as cassandra_repo
import monasca_api.common.repositories.influxdb.metrics_repository as influxdb_repo
from oslo_config import cfg
from oslo_config import fixture as fixture_config
from oslo_utils import timeutils
import testtools
from monasca_api.common.repositories.cassandra import metrics_repository \
as cassandra_repo
from monasca_api.common.repositories.influxdb import metrics_repository \
as influxdb_repo
from monasca_api.tests import base
CONF = cfg.CONF
class TestRepoMetricsInfluxDB(unittest.TestCase):
class TestRepoMetricsInfluxDB(base.BaseTestCase):
def setUp(self):
super(TestRepoMetricsInfluxDB, self).setUp()
@patch("monasca_api.common.repositories.influxdb.metrics_repository.client.InfluxDBClient")
@patch("monasca_api.common.repositories.influxdb."
"metrics_repository.client.InfluxDBClient")
def test_measurement_list(self, influxdb_client_mock):
mock_client = influxdb_client_mock.return_value
mock_client.query.return_value.raw = {
@ -82,7 +81,8 @@ class TestRepoMetricsInfluxDB(unittest.TestCase):
measurements
)
@patch("monasca_api.common.repositories.influxdb.metrics_repository.client.InfluxDBClient")
@patch("monasca_api.common.repositories.influxdb."
"metrics_repository.client.InfluxDBClient")
def test_list_metrics(self, influxdb_client_mock):
mock_client = influxdb_client_mock.return_value
mock_client.query.return_value.raw = {
@ -130,7 +130,8 @@ class TestRepoMetricsInfluxDB(unittest.TestCase):
},
}])
@patch("monasca_api.common.repositories.influxdb.metrics_repository.client.InfluxDBClient")
@patch("monasca_api.common.repositories.influxdb."
"metrics_repository.client.InfluxDBClient")
def test_list_dimension_values(self, influxdb_client_mock):
mock_client = influxdb_client_mock.return_value
mock_client.query.return_value.raw = {
@ -158,7 +159,8 @@ class TestRepoMetricsInfluxDB(unittest.TestCase):
' where _tenant_id = \'38dc2a2549f94d2e9a4fa1cc45a4970c\''
' and _region = \'useast\' ')
@patch("monasca_api.common.repositories.influxdb.metrics_repository.client.InfluxDBClient")
@patch("monasca_api.common.repositories.influxdb."
"metrics_repository.client.InfluxDBClient")
def test_list_dimension_names(self, influxdb_client_mock):
mock_client = influxdb_client_mock.return_value
mock_client.query.return_value.raw = {
@ -184,17 +186,15 @@ class TestRepoMetricsInfluxDB(unittest.TestCase):
])
class TestRepoMetricsCassandra(testtools.TestCase):
class TestRepoMetricsCassandra(base.BaseTestCase):
def setUp(self):
super(TestRepoMetricsCassandra, self).setUp()
self.conf_default(cluster_ip_addresses='127.0.0.1',
group='cassandra')
self._fixture_config = self.useFixture(
fixture_config.Config(cfg.CONF))
self._fixture_config.config(cluster_ip_addresses='127.0.0.1',
group='cassandra')
@patch("monasca_api.common.repositories.cassandra.metrics_repository.Cluster.connect")
@patch("monasca_api.common.repositories.cassandra."
"metrics_repository.Cluster.connect")
def test_list_metrics(self, cassandra_connect_mock):
cassandra_session_mock = cassandra_connect_mock.return_value
cassandra_session_mock.execute.return_value = [[
@ -234,7 +234,8 @@ class TestRepoMetricsCassandra(testtools.TestCase):
u'hosttype': u'native'
}}], result)
@patch("monasca_api.common.repositories.cassandra.metrics_repository.Cluster.connect")
@patch("monasca_api.common.repositories.cassandra."
"metrics_repository.Cluster.connect")
def test_list_metric_names(self, cassandra_connect_mock):
Metric_map = namedtuple('Metric_map', 'metric_map')
@ -278,7 +279,8 @@ class TestRepoMetricsCassandra(testtools.TestCase):
}
], result)
@patch("monasca_api.common.repositories.cassandra.metrics_repository.Cluster.connect")
@patch("monasca_api.common.repositories.cassandra."
"metrics_repository.Cluster.connect")
def test_measurement_list(self, cassandra_connect_mock):
Measurement = namedtuple('Measurement', 'time_stamp value value_meta')
@ -335,7 +337,8 @@ class TestRepoMetricsCassandra(testtools.TestCase):
measurements
)
@patch("monasca_api.common.repositories.cassandra.metrics_repository.Cluster.connect")
@patch("monasca_api.common.repositories.cassandra."
"metrics_repository.Cluster.connect")
def test_metrics_statistics(self, cassandra_connect_mock):
Measurement = namedtuple('Measurement', 'time_stamp value value_meta')
@ -390,7 +393,8 @@ class TestRepoMetricsCassandra(testtools.TestCase):
}
], result)
@patch("monasca_api.common.repositories.cassandra.metrics_repository.Cluster.connect")
@patch("monasca_api.common.repositories.cassandra."
"metrics_repository.Cluster.connect")
def test_alarm_history(self, cassandra_connect_mock):
AlarmHistory = namedtuple('AlarmHistory', 'alarm_id, time_stamp, metrics, '

View File

@ -1,4 +1,4 @@
# Copyright 2016 FUJITSU LIMITED
# Copyright 2016-2017 FUJITSU LIMITED
#
# 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
@ -13,20 +13,17 @@
# under the License.
from mock import mock
from oslo_config import fixture as oo_cfg
from oslo_context import fixture as oo_ctx
from falcon import testing
from monasca_api.api.core import request
from monasca_api.tests import base
from monasca_api.v2.common import exceptions
class TestRequest(testing.TestBase):
class TestRequest(base.BaseApiTestCase):
def test_use_context_from_request(self):
req = request.Request(
testing.create_environ(
self.create_environ(
path='/',
headers={
'X_AUTH_TOKEN': '111',
@ -43,16 +40,12 @@ class TestRequest(testing.TestBase):
self.assertEqual(['terminator', 'predator'], req.roles)
class TestRequestLimit(testing.TestBase):
def setUp(self):
super(TestRequestLimit, self).setUp()
self.useFixture(oo_cfg.Config())
self.useFixture(oo_ctx.ClearRequestContext())
class TestRequestLimit(base.BaseApiTestCase):
def test_valid_limit(self):
expected_limit = 10
req = request.Request(
testing.create_environ(
self.create_environ(
path='/',
query_string='limit=%d' % expected_limit,
headers={
@ -67,7 +60,7 @@ class TestRequestLimit(testing.TestBase):
def test_invalid_limit(self):
req = request.Request(
testing.create_environ(
self.create_environ(
path='/',
query_string='limit=abc',
headers={
@ -92,7 +85,7 @@ class TestRequestLimit(testing.TestBase):
@mock.patch('monasca_api.common.repositories.constants.PAGE_LIMIT')
def test_default_limit(self, page_limit):
req = request.Request(
testing.create_environ(
self.create_environ(
path='/',
headers={
'X_AUTH_TOKEN': '111',

View File

@ -1,5 +1,6 @@
# (C) Copyright 2015-2017 Hewlett Packard Enterprise Development LP
# Copyright 2015 Cray Inc. All Rights Reserved.
# Copyright 2017 Fujitsu LIMITED
#
# 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
@ -13,11 +14,10 @@
# License for the specific language governing permissions and limitations
# under the License.
import unittest
import falcon
import mock
from monasca_api.tests import base
import monasca_api.v2.common.exceptions as common_exceptions
import monasca_api.v2.common.schemas.alarm_definition_request_body_schema as schemas_alarm_defs
import monasca_api.v2.common.schemas.exceptions as schemas_exceptions
@ -26,7 +26,7 @@ import monasca_api.v2.common.validation as validation
import monasca_api.v2.reference.helpers as helpers
class TestStateValidation(unittest.TestCase):
class TestStateValidation(base.BaseTestCase):
VALID_STATES = "OK", "ALARM", "UNDETERMINED"
@ -43,7 +43,7 @@ class TestStateValidation(unittest.TestCase):
validation.validate_alarm_state, 'BOGUS')
class TestSeverityValidation(unittest.TestCase):
class TestSeverityValidation(base.BaseTestCase):
VALID_SEVERITIES = "LOW", "MEDIUM", "HIGH", "CRITICAL"
@ -71,7 +71,7 @@ class TestSeverityValidation(unittest.TestCase):
'|'.join([self.VALID_SEVERITIES[0], 'BOGUS']))
class TestRoleValidation(unittest.TestCase):
class TestRoleValidation(base.BaseTestCase):
def test_role_valid(self):
req_roles = 'role0', 'rOlE1'
@ -116,7 +116,7 @@ class TestRoleValidation(unittest.TestCase):
helpers.validate_authorization, req, authorized_roles)
class TestTimestampsValidation(unittest.TestCase):
class TestTimestampsValidation(base.BaseTestCase):
def test_valid_timestamps(self):
start_time = '2015-01-01T00:00:00Z'
@ -153,7 +153,7 @@ class TestTimestampsValidation(unittest.TestCase):
start_timestamp, end_timestamp)
class TestConvertTimeString(unittest.TestCase):
class TestConvertTimeString(base.BaseTestCase):
def test_valid_date_time_string(self):
date_time_string = '2015-01-01T00:00:00Z'
@ -183,7 +183,7 @@ class TestConvertTimeString(unittest.TestCase):
valid_periods = [0, 60]
class TestNotificationValidation(unittest.TestCase):
class TestNotificationValidation(base.BaseTestCase):
def test_validation_for_email(self):
notification = {"name": "MyEmail", "type": "EMAIL", "address": "name@domain.com"}
@ -194,16 +194,16 @@ class TestNotificationValidation(unittest.TestCase):
def test_validation_exception_for_invalid_email_address(self):
notification = {"name": "MyEmail", "type": "EMAIL", "address": "name@"}
with self.assertRaises(schemas_exceptions.ValidationException) as ve:
schemas_notifications.parse_and_validate(notification, valid_periods)
ex = ve.exception
self.assertEqual("Address name@ is not of correct format", ex.message)
ex = self.assertRaises(schemas_exceptions.ValidationException,
schemas_notifications.parse_and_validate,
notification, valid_periods)
self.assertEqual("Address name@ is not of correct format", str(ex))
def test_validation_exception_for_invalid_period_for_email(self):
notification = {"name": "MyEmail", "type": "EMAIL", "address": "name@domain.com", "period": "60"}
with self.assertRaises(schemas_exceptions.ValidationException) as ve:
schemas_notifications.parse_and_validate(notification, valid_periods)
ex = ve.exception
ex = self.assertRaises(schemas_exceptions.ValidationException,
schemas_notifications.parse_and_validate,
notification, valid_periods)
self.assertEqual("Period can only be set with webhooks", ex.message)
def test_validation_for_webhook(self):
@ -223,31 +223,31 @@ class TestNotificationValidation(unittest.TestCase):
def test_validation_exception_for_webhook_no_scheme(self):
notification = {"name": "MyWebhook", "type": "WEBHOOK", "address": "//somedomain.com"}
with self.assertRaises(schemas_exceptions.ValidationException) as ve:
schemas_notifications.parse_and_validate(notification, valid_periods)
ex = ve.exception
ex = self.assertRaises(schemas_exceptions.ValidationException,
schemas_notifications.parse_and_validate,
notification, valid_periods)
self.assertEqual("Address //somedomain.com does not have URL scheme", ex.message)
def test_validation_exception_for_webhook_no_netloc(self):
notification = {"name": "MyWebhook", "type": "WEBHOOK", "address": "http://"}
with self.assertRaises(schemas_exceptions.ValidationException) as ve:
schemas_notifications.parse_and_validate(notification, valid_periods)
ex = ve.exception
ex = self.assertRaises(schemas_exceptions.ValidationException,
schemas_notifications.parse_and_validate,
notification, valid_periods)
self.assertEqual("Address http:// does not have network location", ex.message)
def test_validation_exception_for_webhook_invalid_scheme(self):
notification = {"name": "MyWebhook", "type": "WEBHOOK", "address": "ftp://somedomain.com"}
with self.assertRaises(schemas_exceptions.ValidationException) as ve:
schemas_notifications.parse_and_validate(notification, valid_periods)
ex = ve.exception
ex = self.assertRaises(schemas_exceptions.ValidationException,
schemas_notifications.parse_and_validate,
notification, valid_periods)
self.assertEqual("Address ftp://somedomain.com scheme is not in ['http', 'https']", ex.message)
def test_validation_exception_for_webhook_invalid_period(self):
notification = {"name": "MyWebhook", "type": "WEBHOOK", "address": "//somedomain.com",
"period": "10"}
with self.assertRaises(schemas_exceptions.ValidationException) as ve:
schemas_notifications.parse_and_validate(notification, valid_periods)
ex = ve.exception
ex = self.assertRaises(schemas_exceptions.ValidationException,
schemas_notifications.parse_and_validate,
notification, valid_periods)
self.assertEqual("10 is not a valid period, not in [0, 60]", ex.message)
def test_validation_for_pagerduty(self):
@ -261,9 +261,9 @@ class TestNotificationValidation(unittest.TestCase):
def test_validation_exception_for_invalid_period_for_pagerduty(self):
notification = {"name": "MyPagerduty", "type": "PAGERDUTY",
"address": "nzH2LVRdMzun11HNC2oD", "period": 60}
with self.assertRaises(schemas_exceptions.ValidationException) as ve:
schemas_notifications.parse_and_validate(notification, valid_periods)
ex = ve.exception
ex = self.assertRaises(schemas_exceptions.ValidationException,
schemas_notifications.parse_and_validate,
notification, valid_periods)
self.assertEqual("Period can only be set with webhooks", ex.message)
def test_validation_for_max_name_address(self):
@ -283,7 +283,8 @@ class TestNotificationValidation(unittest.TestCase):
notification = {"name": name, "type": "WEBHOOK", "address": "http://somedomain.com"}
self.assertRaises(
schemas_exceptions.ValidationException,
schemas_notifications.parse_and_validate, notification, valid_periods)
schemas_notifications.parse_and_validate,
notification, valid_periods)
def test_validation_exception_for_exceeded_address_length(self):
address = "http://" + "A" * 503 + ".io"
@ -296,30 +297,31 @@ class TestNotificationValidation(unittest.TestCase):
def test_validation_exception_for_invalid_period_float(self):
notification = {"name": "MyWebhook", "type": "WEBHOOK", "address": "//somedomain.com",
"period": 1.2}
with self.assertRaises(schemas_exceptions.ValidationException) as ve:
schemas_notifications.parse_and_validate(notification, valid_periods)
ex = ve.exception
ex = self.assertRaises(schemas_exceptions.ValidationException,
schemas_notifications.parse_and_validate,
notification, valid_periods)
self.assertEqual("expected int for dictionary value @ data['period']", ex.message)
def test_validation_exception_for_invalid_period_non_int(self):
notification = {"name": "MyWebhook", "type": "WEBHOOK", "address": "//somedomain.com",
"period": "zero"}
with self.assertRaises(schemas_exceptions.ValidationException) as ve:
schemas_notifications.parse_and_validate(notification, valid_periods)
ex = ve.exception
ex = self.assertRaises(schemas_exceptions.ValidationException,
schemas_notifications.parse_and_validate,
notification, valid_periods)
self.assertEqual("Period zero must be a valid integer", ex.message)
def test_validation_exception_for_missing_period(self):
notification = {"name": "MyEmail", "type": "EMAIL", "address": "name@domain."}
with self.assertRaises(schemas_exceptions.ValidationException) as ve:
schemas_notifications.parse_and_validate(notification, valid_periods, require_all=True)
ex = ve.exception
ex = self.assertRaises(schemas_exceptions.ValidationException,
schemas_notifications.parse_and_validate,
notification, valid_periods, require_all=True)
self.assertEqual("Period is required", ex.message)
class TestAlarmDefinitionValidation(unittest.TestCase):
class TestAlarmDefinitionValidation(base.BaseTestCase):
def setUp(self):
super(TestAlarmDefinitionValidation, self).setUp()
self.full_alarm_definition = (
{"name": self._create_string_of_length(255),
"expression": "min(cpu.idle_perc) < 10",

View File

@ -1,4 +1,5 @@
# Copyright 2015 Hewlett-Packard
# Copyright 2017 Fujitsu LIMITED
#
# 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
@ -16,12 +17,12 @@ import datetime
import json
import falcon
import falcon.testing as testing
from monasca_api.tests import base
from monasca_api.v2.reference import versions
class TestVersions(testing.TestBase):
class TestVersions(base.BaseApiTestCase):
def before(self):
self.versions_resource = versions.Versions()

View File

@ -50,7 +50,7 @@ skip_install = True
usedevelop = False
commands =
{[testenv]commands}
flake8 monasca_api monasca_tempest_tests --statistics
flake8 monasca_api monasca_tempest_tests
[testenv:bandit]
skip_install = True