From 366c8886f95fe7adcf3acd54f3877755d9f7f8d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Tr=C4=99bski?= Date: Wed, 2 Aug 2017 08:51:44 +0200 Subject: [PATCH] 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 --- monasca_api/tests/base.py | 50 ++++++++- monasca_api/tests/test_a_repository.py | 11 +- monasca_api/tests/test_ad_repository.py | 100 ++++++++---------- monasca_api/tests/test_alarm_expression.py | 5 +- monasca_api/tests/test_alarms.py | 69 ++++++------ .../tests/test_alarms_db_health_check.py | 10 +- monasca_api/tests/test_healthchecks.py | 8 +- monasca_api/tests/test_kafka_health_check.py | 6 +- monasca_api/tests/test_keystone_protocol.py | 2 +- .../tests/test_metrics_db_health_check.py | 34 +++--- monasca_api/tests/test_models_repository.py | 38 +++---- monasca_api/tests/test_nm_repository.py | 6 +- monasca_api/tests/test_query_helpers.py | 10 +- monasca_api/tests/test_repositories.py | 54 +++++----- monasca_api/tests/test_request.py | 23 ++-- monasca_api/tests/test_validation.py | 84 ++++++++------- monasca_api/tests/test_versions.py | 5 +- tox.ini | 2 +- 18 files changed, 266 insertions(+), 251 deletions(-) diff --git a/monasca_api/tests/base.py b/monasca_api/tests/base.py index dc2a2d5e8..51963b385 100644 --- a/monasca_api/tests/base.py +++ b/monasca_api/tests/base.py @@ -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 + ) diff --git a/monasca_api/tests/test_a_repository.py b/monasca_api/tests/test_a_repository.py index ee104bab0..7fc268292 100644 --- a/monasca_api/tests/test_a_repository.py +++ b/monasca_api/tests/test_a_repository.py @@ -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() diff --git a/monasca_api/tests/test_ad_repository.py b/monasca_api/tests/test_ad_repository.py index 6db9bfff9..084594bda 100644 --- a/monasca_api/tests/test_ad_repository.py +++ b/monasca_api/tests/test_ad_repository.py @@ -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() diff --git a/monasca_api/tests/test_alarm_expression.py b/monasca_api/tests/test_alarm_expression.py index 0a8848c18..388491e3b 100644 --- a/monasca_api/tests/test_alarm_expression.py +++ b/monasca_api/tests/test_alarm_expression.py @@ -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" diff --git a/monasca_api/tests/test_alarms.py b/monasca_api/tests/test_alarms.py index 65e0d77ad..58c9b3fc4 100644 --- a/monasca_api/tests/test_alarms.py +++ b/monasca_api/tests/test_alarms.py @@ -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() diff --git a/monasca_api/tests/test_alarms_db_health_check.py b/monasca_api/tests/test_alarms_db_health_check.py index 9c4611661..d98c64450 100644 --- a/monasca_api/tests/test_alarms_db_health_check.py +++ b/monasca_api/tests/test_alarms_db_health_check.py @@ -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') diff --git a/monasca_api/tests/test_healthchecks.py b/monasca_api/tests/test_healthchecks.py index fd0afb7df..60503c111 100644 --- a/monasca_api/tests/test_healthchecks.py +++ b/monasca_api/tests/test_healthchecks.py @@ -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() diff --git a/monasca_api/tests/test_kafka_health_check.py b/monasca_api/tests/test_kafka_health_check.py index 64f60a42e..a66c5eaaa 100644 --- a/monasca_api/tests/test_kafka_health_check.py +++ b/monasca_api/tests/test_kafka_health_check.py @@ -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): diff --git a/monasca_api/tests/test_keystone_protocol.py b/monasca_api/tests/test_keystone_protocol.py index 71294d214..27cf2ddfd 100644 --- a/monasca_api/tests/test_keystone_protocol.py +++ b/monasca_api/tests/test_keystone_protocol.py @@ -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 = {} diff --git a/monasca_api/tests/test_metrics_db_health_check.py b/monasca_api/tests/test_metrics_db_health_check.py index c8fdf4c1b..8f2d2a552 100644 --- a/monasca_api/tests/test_metrics_db_health_check.py +++ b/monasca_api/tests/test_metrics_db_health_check.py @@ -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() diff --git a/monasca_api/tests/test_models_repository.py b/monasca_api/tests/test_models_repository.py index 483109ace..02739692d 100644 --- a/monasca_api/tests/test_models_repository.py +++ b/monasca_api/tests/test_models_repository.py @@ -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 diff --git a/monasca_api/tests/test_nm_repository.py b/monasca_api/tests/test_nm_repository.py index a9285d727..709c38542 100644 --- a/monasca_api/tests/test_nm_repository.py +++ b/monasca_api/tests/test_nm_repository.py @@ -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://') diff --git a/monasca_api/tests/test_query_helpers.py b/monasca_api/tests/test_query_helpers.py index 9de82acb7..5dca8db11 100644 --- a/monasca_api/tests/test_query_helpers.py +++ b/monasca_api/tests/test_query_helpers.py @@ -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() diff --git a/monasca_api/tests/test_repositories.py b/monasca_api/tests/test_repositories.py index 99cdae580..6ef39eb21 100644 --- a/monasca_api/tests/test_repositories.py +++ b/monasca_api/tests/test_repositories.py @@ -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, ' diff --git a/monasca_api/tests/test_request.py b/monasca_api/tests/test_request.py index 666958acd..b16f92050 100644 --- a/monasca_api/tests/test_request.py +++ b/monasca_api/tests/test_request.py @@ -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', diff --git a/monasca_api/tests/test_validation.py b/monasca_api/tests/test_validation.py index 784dbb992..547d57d11 100644 --- a/monasca_api/tests/test_validation.py +++ b/monasca_api/tests/test_validation.py @@ -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", diff --git a/monasca_api/tests/test_versions.py b/monasca_api/tests/test_versions.py index c934c8c1a..953bbe12c 100644 --- a/monasca_api/tests/test_versions.py +++ b/monasca_api/tests/test_versions.py @@ -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() diff --git a/tox.ini b/tox.ini index f615b4a39..d7724e48f 100644 --- a/tox.ini +++ b/tox.ini @@ -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