Repository: linode/linode_api4-python (language: python)

Issue:
new: Add integration test for `region_prices` Type field
## 📝 Description

This change adds an integration test for the `region_prices` field user the `Type` class.

## ✔️ How to Test

```
export LINODE_API_URL="https://.../v4beta"
export LINODE_API_CA=$PWD/foobar.pem

make INTEGRATION_TEST_PATH="models/test_linode.py::test_get_linode_types_overrides" testint
```



Discussion / hints:

Fix patch:
diff --git a/Makefile b/Makefile
index 1cb2da01b..9ed3e4eb8 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 3bc402b0d..d928b31b6 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(),


Test patch:
diff --git a/test/fixtures/account_transfer.json b/test/fixtures/account_transfer.json
new file mode 100644
index 000000000..ce4658a6a
--- /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 b270da778..c864082e8 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 69248b57a..a17a6f847 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 4427c7d5d..22f5709c7 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)"
diff --git a/test/unit/linode_client_test.py b/test/unit/linode_client_test.py
index 498c35509..69af304f7 100644
--- a/test/unit/linode_client_test.py
+++ b/test/unit/linode_client_test.py
@@ -476,6 +476,22 @@ def test_join_beta_program(self):
             )
             self.assertEqual(m.call_url, join_beta_url)
 
+    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 1f75f8c1a..2aa280fef 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):
         """