From 5297b74262b8de4d9303e0e814380c046aaeff96 Mon Sep 17 00:00:00 2001 From: Ania Misiorek Date: Wed, 30 Aug 2023 17:12:23 -0400 Subject: [PATCH 1/3] implementation + testing --- Makefile | 2 +- linode_api4/objects/linode.py | 1 + test/fixtures/account_transfer.json | 14 ++++ test/fixtures/linode_types.json | 114 +++++++++++++++++++++++++--- test/integration/conftest.py | 2 +- test/unit/linode_client_test.py | 16 ++++ test/unit/objects/linode_test.py | 3 + 7 files changed, 141 insertions(+), 11 deletions(-) create mode 100644 test/fixtures/account_transfer.json diff --git a/Makefile b/Makefile index 7636f219..4cd378b1 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,7 @@ release: build twine upload dist/* @PHONEY: install -install: clean +install: clean requirements python3 -m pip install . @PHONEY: requirements diff --git a/linode_api4/objects/linode.py b/linode_api4/objects/linode.py index 3bc402b0..d928b31b 100644 --- a/linode_api4/objects/linode.py +++ b/linode_api4/objects/linode.py @@ -232,6 +232,7 @@ class Type(Base): "label": Property(), "network_out": Property(), "price": Property(), + "region_prices": Property(), "addons": Property(), "memory": Property(), "transfer": Property(), diff --git a/test/fixtures/account_transfer.json b/test/fixtures/account_transfer.json new file mode 100644 index 00000000..ce4658a6 --- /dev/null +++ b/test/fixtures/account_transfer.json @@ -0,0 +1,14 @@ +{ + "quota": 471, + "used": 737373, + "billable": 0, + + "region_transfers": [ + { + "id": "ap-west", + "used": 1, + "quota": 5010, + "billable": 0 + } + ] +} \ No newline at end of file diff --git a/test/fixtures/linode_types.json b/test/fixtures/linode_types.json index b270da77..c864082e 100644 --- a/test/fixtures/linode_types.json +++ b/test/fixtures/linode_types.json @@ -1,8 +1,8 @@ { -"results": 4, -"pages": 1, -"page": 1, -"data": [ + "results": 4, + "pages": 1, + "page": 1, + "data": [ { "disk": 20480, "memory": 1024, @@ -12,7 +12,19 @@ "price": { "hourly": 0.003, "monthly": 2 - } + }, + "region_prices": [ + { + "id": "ap-west", + "hourly": 0.02, + "monthly": 20 + }, + { + "id": "ap-northeast", + "hourly": 0.02, + "monthly": 20 + } + ] } }, "class": "nanode", @@ -25,6 +37,18 @@ "hourly": 0.0075, "monthly": 5 }, + "region_prices": [ + { + "id": "us-east", + "hourly": 0.02, + "monthly": 20 + }, + { + "id": "ap-northeast", + "hourly": 0.02, + "monthly": 20 + } + ], "successor": null }, { @@ -36,7 +60,19 @@ "price": { "hourly": 0.008, "monthly": 5 - } + }, + "region_prices": [ + { + "id": "ap-west", + "hourly": 0.02, + "monthly": 20 + }, + { + "id": "ap-northeast", + "hourly": 0.02, + "monthly": 20 + } + ] } }, "class": "highmem", @@ -49,6 +85,18 @@ "hourly": 0.09, "monthly": 60 }, + "region_prices": [ + { + "id": "us-east", + "hourly": 0.02, + "monthly": 20 + }, + { + "id": "ap-northeast", + "hourly": 0.02, + "monthly": 20 + } + ], "successor": null }, { @@ -60,7 +108,19 @@ "price": { "hourly": 0.004, "monthly": 2.5 - } + }, + "region_prices": [ + { + "id": "ap-west", + "hourly": 0.02, + "monthly": 20 + }, + { + "id": "ap-northeast", + "hourly": 0.02, + "monthly": 20 + } + ] } }, "class": "standard", @@ -73,6 +133,18 @@ "hourly": 0.015, "monthly": 10 }, + "region_prices": [ + { + "id": "us-east", + "hourly": 0.02, + "monthly": 20 + }, + { + "id": "ap-northeast", + "hourly": 0.02, + "monthly": 20 + } + ], "successor": null }, { @@ -84,7 +156,19 @@ "price": { "hourly": 0.008, "monthly": 5 - } + }, + "region_prices": [ + { + "id": "ap-west", + "hourly": 0.02, + "monthly": 20 + }, + { + "id": "ap-northeast", + "hourly": 0.02, + "monthly": 20 + } + ] } }, "class": "gpu", @@ -97,7 +181,19 @@ "hourly": 0.03, "monthly": 20 }, + "region_prices": [ + { + "id": "us-east", + "hourly": 0.02, + "monthly": 20 + }, + { + "id": "ap-northeast", + "hourly": 0.02, + "monthly": 20 + } + ], "successor": null } ] -} +} \ No newline at end of file diff --git a/test/integration/conftest.py b/test/integration/conftest.py index b3fa15fb..69248b57 100644 --- a/test/integration/conftest.py +++ b/test/integration/conftest.py @@ -3,7 +3,7 @@ import pytest -from linode_api4.linode_client import LinodeClient, LongviewSubscription +from linode_api4.linode_client import LinodeClient ENV_TOKEN_NAME = "LINODE_TOKEN" RUN_LONG_TESTS = "RUN_LONG_TESTS" diff --git a/test/unit/linode_client_test.py b/test/unit/linode_client_test.py index 512449aa..acc689bd 100644 --- a/test/unit/linode_client_test.py +++ b/test/unit/linode_client_test.py @@ -411,6 +411,22 @@ def test_payments(self): self.assertEqual(payment.date, datetime(2015, 1, 1, 5, 1, 2)) self.assertEqual(payment.usd, 1000) + def test_account_transfer(self): + """ + Tests that payments can be retrieved + """ + transfer = self.client.account.transfer() + + self.assertEqual(transfer.quota, 471) + self.assertEqual(transfer.used, 737373) + self.assertEqual(transfer.billable, 0) + + self.assertEqual(len(transfer.region_transfers), 1) + self.assertEqual(transfer.region_transfers[0].id, "ap-west") + self.assertEqual(transfer.region_transfers[0].used, 1) + self.assertEqual(transfer.region_transfers[0].quota, 5010) + self.assertEqual(transfer.region_transfers[0].billable, 0) + class BetaProgramGroupTest(ClientBaseCase): """ diff --git a/test/unit/objects/linode_test.py b/test/unit/objects/linode_test.py index 1f75f8c1..2aa280fe 100644 --- a/test/unit/objects/linode_test.py +++ b/test/unit/objects/linode_test.py @@ -533,6 +533,8 @@ def test_get_types(self): self.assertIsNotNone(t.type_class) self.assertIsNotNone(t.gpus) self.assertIsNone(t.successor) + self.assertIsNotNone(t.region_prices) + self.assertIsNotNone(t.addons.backups.region_prices) def test_get_type_by_id(self): """ @@ -546,6 +548,7 @@ def test_get_type_by_id(self): self.assertEqual(t.label, "Linode 1024") self.assertEqual(t.disk, 20480) self.assertEqual(t.type_class, "nanode") + self.assertEqual(t.region_prices[0].id, "us-east") def test_get_type_gpu(self): """ From 98511ad2326185944ca35376a8f048138779ac92 Mon Sep 17 00:00:00 2001 From: Ania Misiorek Date: Wed, 30 Aug 2023 17:16:27 -0400 Subject: [PATCH 2/3] linting --- test/unit/linode_client_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/linode_client_test.py b/test/unit/linode_client_test.py index b47c64ad..24a6d8ac 100644 --- a/test/unit/linode_client_test.py +++ b/test/unit/linode_client_test.py @@ -470,7 +470,7 @@ def test_account_transfer(self): self.assertEqual(transfer.region_transfers[0].quota, 5010) self.assertEqual(transfer.region_transfers[0].billable, 0) - + class BetaProgramGroupTest(ClientBaseCase): """ Tests methods of the BetaProgramGroup From 182dec6d9ff78a182610cbddd8ac34e58ddd0c93 Mon Sep 17 00:00:00 2001 From: Lena Garber Date: Mon, 25 Sep 2023 10:51:22 -0400 Subject: [PATCH 3/3] Add integration test --- test/integration/conftest.py | 19 ++++++++++++++++++- test/integration/models/test_linode.py | 16 ++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/test/integration/conftest.py b/test/integration/conftest.py index 69248b57..a17a6f84 100644 --- a/test/integration/conftest.py +++ b/test/integration/conftest.py @@ -6,6 +6,8 @@ from linode_api4.linode_client import LinodeClient ENV_TOKEN_NAME = "LINODE_TOKEN" +ENV_API_URL_NAME = "LINODE_API_URL" +ENV_API_CA_NAME = "LINODE_API_CA" RUN_LONG_TESTS = "RUN_LONG_TESTS" @@ -13,6 +15,15 @@ def get_token(): return os.environ.get(ENV_TOKEN_NAME, None) +def get_api_url(): + return os.environ.get(ENV_API_URL_NAME, "https://api.linode.com/v4beta") + + +def get_api_ca_file(): + result = os.environ.get(ENV_API_CA_NAME, None) + return result if result != "" else None + + def run_long_tests(): return os.environ.get(RUN_LONG_TESTS, None) @@ -71,7 +82,13 @@ def ssh_key_gen(): @pytest.fixture(scope="session") def get_client(): token = get_token() - client = LinodeClient(token) + api_url = get_api_url() + api_ca_file = get_api_ca_file() + client = LinodeClient( + token, + base_url=api_url, + ca_path=api_ca_file, + ) return client diff --git a/test/integration/models/test_linode.py b/test/integration/models/test_linode.py index 4427c7d5..22f5709c 100644 --- a/test/integration/models/test_linode.py +++ b/test/integration/models/test_linode.py @@ -398,6 +398,22 @@ def test_get_linode_types(get_client): assert "g6-nanode-1" in ids +def test_get_linode_types_overrides(get_client): + types = get_client.linode.types() + + target_types = [ + v + for v in types + if len(v.region_prices) > 0 and v.region_prices[0].hourly > 0 + ] + + assert len(target_types) > 0 + + for linode_type in target_types: + assert linode_type.region_prices[0].hourly >= 0 + assert linode_type.region_prices[0].monthly >= 0 + + def test_get_linode_type_by_id(get_client): pytest.skip( "Might need Type to match how other object models are behaving e.g. client.load(Type, 123)"