diff --git a/Tests/smoke/ConnectionSmoke_test.py b/Tests/smoke/ConnectionSmoke_test.py new file mode 100644 index 00000000..c777dcb7 --- /dev/null +++ b/Tests/smoke/ConnectionSmoke_test.py @@ -0,0 +1,17 @@ +from .SmokeTestBase import SmokeTestBase + + +class TestConnectionSmoke(SmokeTestBase): + + def test_tm1_connection(self): + tm1_version = self.tm1.configuration.get_product_version() + self.assertEqual(tm1_version, self.mocked_server_version) + + def test_tm1_server_name(self): + self.mock_server_name("Tm1pyMockedDatabase") + server_name = self.tm1.configuration.get_server_name() + self.assertEqual(server_name, "Tm1pyMockedDatabase") + + def test_is_connected(self): + self.mock_server_name("Tm1pyMockedDatabase") + self.assertTrue(self.tm1.connection.is_connected()) diff --git a/Tests/smoke/DimensionSmoke_test.py b/Tests/smoke/DimensionSmoke_test.py new file mode 100644 index 00000000..ca357aa7 --- /dev/null +++ b/Tests/smoke/DimensionSmoke_test.py @@ -0,0 +1,38 @@ +import responses + +from .SmokeTestBase import SmokeTestBase + + +class TestDimensionSmoke(SmokeTestBase): + + def test_dimension_metadata(self): + + self.rsps.add( + responses.GET, + f"{self.base_url}/Dimensions", + json={ + "@odata.context": "$metadata#Dimensions", + "value": [ + { + "@odata.etag": 'W/"0a8190dd72c21841bda16b3fd8492f171df98aa7"', + "Name": "}Clients", + "UniqueName": "[}Clients]", + "AllLeavesHierarchyName": "", + "Attributes": {"Caption": "}Clients"}, + }, + { + "@odata.etag": 'W/"e4bd6cb79066cc3936a5af517dece606b3f5f3d5"', + "Name": "}Groups", + "UniqueName": "[}Groups]", + "AllLeavesHierarchyName": "", + "Attributes": {"Caption": "}Groups"}, + }, + ], + }, + status=200, + ) + + names = self.tm1.dimensions.get_all_names() + + self.assertIn("}Clients", names) + self.assertIn("}Groups", names) diff --git a/Tests/smoke/SmokeTestBase.py b/Tests/smoke/SmokeTestBase.py new file mode 100644 index 00000000..4a34fe58 --- /dev/null +++ b/Tests/smoke/SmokeTestBase.py @@ -0,0 +1,60 @@ +import unittest + +import responses + +from TM1py.Services import TM1Service + +DEFAULT_VERSION = "11.0.0" + + +class SmokeTestBase(unittest.TestCase): + address = "tm1server" + port = 8000 + protocol = "https" + mocked_server_version = DEFAULT_VERSION + + def setUp(self): + self.base_url = f"{self.protocol}://{self.address}:{self.port}/api/v1" + self.rsps = responses.RequestsMock(assert_all_requests_are_fired=True) + self.rsps.start() + + # Always stub ProductVersion before constructing TM1Service + self.mock_bootstrap_version(self.mocked_server_version) + + # Construct service while mock is active + self.tm1 = TM1Service(**self.get_tm1_kwargs()) + + def tearDown(self): + self.rsps.stop() + self.rsps.reset() + + def get_tm1_kwargs(self): + # Subclasses can override to tweak auth/args + return { + "address": self.address, + "port": self.port, + "user": "admin", + "password": "apple", + "ssl": True, + } + + # Helpers for common stubs + def mock_bootstrap_version(self, version: str = DEFAULT_VERSION): + self.rsps.add( + responses.GET, + f"{self.base_url}/Configuration/ProductVersion/$value", + body=version, + status=200, + ) + + def mock_server_name(self, name: str): + self.rsps.add( + responses.GET, + f"{self.base_url}/Configuration/ServerName/$value", + body=name, + status=200, + ) + + def mock_get(self, path: str, body: str, status: int = 200): + # Generic helper if you need other endpoints + self.rsps.add(responses.GET, f"{self.base_url}{path}", body=body, status=200) diff --git a/Tests/smoke/__init__.py b/Tests/smoke/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/setup.py b/setup.py index 53968b9d..1b75dc73 100644 --- a/setup.py +++ b/setup.py @@ -45,6 +45,7 @@ "dev": [ "pytest", "pytest-xdist", + "responses", "python-dateutil", "black", "ruff",