diff --git a/recurly/__init__.py b/recurly/__init__.py
index ad525ac7..4cf9fdac 100644
--- a/recurly/__init__.py
+++ b/recurly/__init__.py
@@ -2277,6 +2277,7 @@ class ExternalSubscription(Resource):
'account',
'external_id',
'external_product_reference',
+ 'uuid',
'external_invoices',
'external_payment_phases',
'last_purchased',
@@ -2310,6 +2311,14 @@ def get_by_external_id(cls, external_id):
"""
return cls.get("external-id-{}".format(external_id))
+ @classmethod
+ def get_by_uuid(cls, uuid):
+ """Return a `External Subscription` instance identified by
+ the given uuid.
+
+ """
+ return cls.get("uuid-{}".format(uuid))
+
class ExternalProductReference(Resource):
""" A reference of a product from an external resource that is not managed by the Recurly platform and instead is managed by third-party platforms like Apple Store and Google Play. """
diff --git a/tests/fixtures/account/external-subscriptions.xml b/tests/fixtures/account/external-subscriptions.xml
index f84c3b54..9ee9f2c1 100644
--- a/tests/fixtures/account/external-subscriptions.xml
+++ b/tests/fixtures/account/external-subscriptions.xml
@@ -15,6 +15,7 @@ Content-Type: application/xml; charset=utf-8
abcd1234
+ 72bb9966bb5dc3767461ce4368a6b366
false
false
@@ -36,6 +37,7 @@ Content-Type: application/xml; charset=utf-8
efgh5678
+ 72bba6cc3a2323d04632374f0fb44a5a
false
false
diff --git a/tests/fixtures/external-subscription/get-by-external-id.xml b/tests/fixtures/external-subscription/get-by-external-id.xml
index 3f1f1e96..f268ecc9 100644
--- a/tests/fixtures/external-subscription/get-by-external-id.xml
+++ b/tests/fixtures/external-subscription/get-by-external-id.xml
@@ -15,6 +15,7 @@ Content-Type: application/xml; charset=utf-8
abcd1234
+ 72bb9966bb5dc3767461ce4368a6b366
false
false
diff --git a/tests/fixtures/external-subscription/get-by-uuid.xml b/tests/fixtures/external-subscription/get-by-uuid.xml
new file mode 100644
index 00000000..9cdf4796
--- /dev/null
+++ b/tests/fixtures/external-subscription/get-by-uuid.xml
@@ -0,0 +1,34 @@
+GET https://api.recurly.com/v2/external_subscriptions/uuid-72bb9966bb5dc3767461ce4368a6b366 HTTP/1.1
+X-Api-Version: {api-version}
+Accept: application/xml
+Authorization: Basic YXBpa2V5Og==
+User-Agent: {user-agent}
+
+
+HTTP/1.1 200 OK
+Content-Type: application/xml; charset=utf-8
+
+
+
+
+
+
+ abcd1234
+
+ 72bb9966bb5dc3767461ce4368a6b366
+
+ false
+ false
+ false
+ false
+ app_identifier
+ 1
+ active
+
+ 2022-11-03T21:57:14Z
+
+ 2022-11-03T21:57:14Z
+ 2022-11-03T21:57:14Z
+ 2022-11-03T21:57:14Z
+ 2022-11-04T18:11:51Z
+
diff --git a/tests/fixtures/external-subscription/get.xml b/tests/fixtures/external-subscription/get.xml
index 448f6f18..b67fc3ec 100644
--- a/tests/fixtures/external-subscription/get.xml
+++ b/tests/fixtures/external-subscription/get.xml
@@ -10,11 +10,12 @@ Content-Type: application/xml; charset=utf-8
-
+
abcd1234
+ 72bb9966bb5dc3767461ce4368a6b366
false
false
diff --git a/tests/fixtures/external-subscription/list.xml b/tests/fixtures/external-subscription/list.xml
index c3bb44ed..b0be92f0 100644
--- a/tests/fixtures/external-subscription/list.xml
+++ b/tests/fixtures/external-subscription/list.xml
@@ -16,6 +16,7 @@ Content-Type: application/xml; charset=utf-8
abcd1234
+ 72bb9966bb5dc3767461ce4368a6b366
false
false
@@ -38,6 +39,7 @@ Content-Type: application/xml; charset=utf-8
efgh5678
+ 72bba6cc3a2323d04632374f0fb44a5a
false
false
diff --git a/tests/test_resources.py b/tests/test_resources.py
index cc33cb02..32694b47 100644
--- a/tests/test_resources.py
+++ b/tests/test_resources.py
@@ -3422,6 +3422,7 @@ def test_external_subscriptions_on_account(self):
self.assertEqual(external_subscriptions[0].external_id, 'abcd1234')
self.assertEqual(external_subscriptions[0].external_product_reference, None)
+ self.assertEqual(external_subscriptions[0].uuid, '72bb9966bb5dc3767461ce4368a6b366')
self.assertEqual(external_subscriptions[0].last_purchased, None)
self.assertEqual(external_subscriptions[0].auto_renew, False)
self.assertEqual(external_subscriptions[0].in_grace_period, False)
@@ -3440,6 +3441,7 @@ def test_external_subscriptions_on_account(self):
self.assertEqual(external_subscriptions[1].external_id, 'efgh5678')
self.assertEqual(external_subscriptions[1].external_product_reference, None)
+ self.assertEqual(external_subscriptions[0].uuid, '72bba6cc3a2323d04632374f0fb44a5a')
self.assertEqual(external_subscriptions[1].last_purchased, None)
self.assertEqual(external_subscriptions[1].auto_renew, False)
self.assertEqual(external_subscriptions[1].in_grace_period, False)
@@ -3465,6 +3467,7 @@ def test_list_external_subscriptions(self):
self.assertEqual(external_subscriptions[0].external_id, 'abcd1234')
self.assertEqual(external_subscriptions[0].external_product_reference, None)
+ self.assertEqual(external_subscriptions[0].uuid, '72bb9966bb5dc3767461ce4368a6b366')
self.assertEqual(external_subscriptions[0].last_purchased, None)
self.assertEqual(external_subscriptions[0].auto_renew, False)
self.assertEqual(external_subscriptions[0].in_grace_period, False)
@@ -3483,6 +3486,7 @@ def test_list_external_subscriptions(self):
self.assertEqual(external_subscriptions[1].external_id, 'efgh5678')
self.assertEqual(external_subscriptions[1].external_product_reference, None)
+ self.assertEqual(external_subscriptions[0].uuid, '72bba6cc3a2323d04632374f0fb44a5a')
self.assertEqual(external_subscriptions[1].last_purchased, None)
self.assertEqual(external_subscriptions[1].auto_renew, False)
self.assertEqual(external_subscriptions[1].in_grace_period, False)
@@ -3506,6 +3510,7 @@ def test_get_external_subscription(self):
self.assertEqual(external_subscription.external_id, 'abcd1234')
self.assertEqual(external_subscription.external_product_reference, None)
+ self.assertEqual(external_subscription.uuid, '72bb9966bb5dc3767461ce4368a6b366')
self.assertEqual(external_subscription.last_purchased, None)
self.assertEqual(external_subscription.auto_renew, False)
self.assertEqual(external_subscription.in_grace_period, False)
@@ -3529,6 +3534,31 @@ def test_get_external_subscription_by_external_id(self):
self.assertEqual(external_subscription.external_id, 'abcd1234')
self.assertEqual(external_subscription.external_product_reference, None)
+ self.assertEqual(external_subscription.uuid, '72bb9966bb5dc3767461ce4368a6b366')
+ self.assertEqual(external_subscription.last_purchased, None)
+ self.assertEqual(external_subscription.auto_renew, False)
+ self.assertEqual(external_subscription.in_grace_period, False)
+ self.assertEqual(external_subscription.imported, False)
+ self.assertEqual(external_subscription.test, False)
+ self.assertEqual(external_subscription.app_identifier, 'app_identifier')
+ self.assertEqual(external_subscription.quantity, 1)
+ self.assertEqual(external_subscription.state, 'active')
+ self.assertEqual(external_subscription.activated_at, None)
+ self.assertEqual(external_subscription.canceled_at, datetime(2022, 11, 3, 21, 57, 14, tzinfo=external_subscription.canceled_at.tzinfo))
+ self.assertEqual(external_subscription.expires_at, None)
+ self.assertEqual(external_subscription.trial_started_at, datetime(2022, 11, 3, 21, 57, 14, tzinfo=external_subscription.trial_started_at.tzinfo))
+ self.assertEqual(external_subscription.trial_ends_at, datetime(2022, 11, 3, 21, 57, 14, tzinfo=external_subscription.trial_ends_at.tzinfo))
+ self.assertEqual(external_subscription.created_at, datetime(2022, 11, 3, 21, 57, 14, tzinfo=external_subscription.created_at.tzinfo))
+ self.assertEqual(external_subscription.updated_at, datetime(2022, 11, 4, 18, 11, 51, tzinfo=external_subscription.updated_at.tzinfo))
+
+ def test_get_external_subscription_by_external_id(self):
+
+ with self.mock_request('external-subscription/get-by-uuid.xml'):
+ external_subscription = ExternalSubscription.get_by_external_id('72bb9966bb5dc3767461ce4368a6b366')
+
+ self.assertEqual(external_subscription.external_id, 'abcd1234')
+ self.assertEqual(external_subscription.external_product_reference, None)
+ self.assertEqual(external_subscription.uuid, '72bb9966bb5dc3767461ce4368a6b366')
self.assertEqual(external_subscription.last_purchased, None)
self.assertEqual(external_subscription.auto_renew, False)
self.assertEqual(external_subscription.in_grace_period, False)