diff --git a/method/resources/Accounts/Attributes.py b/method/resources/Accounts/Attributes.py index 1ac5694..0a195a8 100644 --- a/method/resources/Accounts/Attributes.py +++ b/method/resources/Accounts/Attributes.py @@ -1,4 +1,4 @@ -from typing import TypedDict, Optional, Literal, List, Any +from typing import TypedDict, Optional, Literal, List, Any, Dict from method.resource import MethodResponse, Resource, ResourceListOpts from method.configuration import Configuration @@ -28,6 +28,7 @@ class AccountAttributes(TypedDict): id: str account_id: str status: AccountAttributesStatusesLiterals + payload: Optional[Dict[str, Any]] attributes: Optional[List[AccountAttributesType]] error: Optional[ResourceError] created_at: str diff --git a/method/resources/Entities/Attributes.py b/method/resources/Entities/Attributes.py index f7fa4ed..1ea30e0 100644 --- a/method/resources/Entities/Attributes.py +++ b/method/resources/Entities/Attributes.py @@ -35,6 +35,8 @@ class EntityAttributesType(TypedDict): credit_health_payment_history: CreditHealthAttribute credit_health_open_accounts: CreditHealthAttribute +class EntityAttributesCreateOpts(TypedDict): + attributes: List[EntityAttributesType] class EntityAttributes(TypedDict): id: str @@ -56,5 +58,5 @@ def retrieve(self, attr_id: str) -> MethodResponse[EntityAttributes]: def list(self, params: Optional[ResourceListOpts] = None) -> MethodResponse[List[EntityAttributes]]: return super(EntityAttributesResource, self)._list(params) - def create(self) -> MethodResponse[EntityAttributes]: - return super(EntityAttributesResource, self)._create({}) + def create(self, opts: EntityAttributesCreateOpts) -> MethodResponse[EntityAttributes]: + return super(EntityAttributesResource, self)._create(opts) diff --git a/method/resources/Entities/Subscriptions.py b/method/resources/Entities/Subscriptions.py index feca862..6a53e7b 100644 --- a/method/resources/Entities/Subscriptions.py +++ b/method/resources/Entities/Subscriptions.py @@ -1,4 +1,4 @@ -from typing import TypedDict, Optional, Literal +from typing import TypedDict, Optional, Literal, Dict, Any from method.resource import MethodResponse, Resource from method.configuration import Configuration @@ -22,6 +22,7 @@ class EntitySubscription(TypedDict): id: str name: EntitySubscriptionNamesLiterals status: EntitySubscriptionStatusesLiterals + payload: Optional[Dict[str, Any]] last_request_id: Optional[str] created_at: str updated_at: str @@ -35,6 +36,12 @@ class EntitySubscriptionResponseOpts(TypedDict): class EntitySubscriptionListResponse(TypedDict): connect: Optional[EntitySubscriptionResponseOpts] credit_score: Optional[EntitySubscriptionResponseOpts] + attribute: Optional[EntitySubscriptionResponseOpts] + + +class EntitySubscriptionCreateOpts(TypedDict): + enroll: EntitySubscriptionNamesLiterals + payload: Optional[Dict[str, Any]] class EntitySubscriptionsResource(Resource): @@ -47,8 +54,8 @@ def retrieve(self, sub_id: str) -> MethodResponse[EntitySubscriptionResponseOpts def list(self) -> MethodResponse[EntitySubscriptionListResponse]: return super(EntitySubscriptionsResource, self)._list() - def create(self, sub_name: EntitySubscriptionNamesLiterals) -> MethodResponse[EntitySubscriptionResponseOpts]: - return super(EntitySubscriptionsResource, self)._create({ 'enroll': sub_name }) + def create(self, opts: EntitySubscriptionCreateOpts) -> MethodResponse[EntitySubscriptionResponseOpts]: + return super(EntitySubscriptionsResource, self)._create(opts) def delete(self, sub_id: str) -> MethodResponse[EntitySubscriptionResponseOpts]: return super(EntitySubscriptionsResource, self)._delete(sub_id) diff --git a/setup.py b/setup.py index 17729c8..88c0cc7 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='method-python', - version='1.1.12', + version='1.1.13', description='Python library for the Method API', long_description='Python library for the Method API', long_description_content_type='text/x-rst', diff --git a/test/resources/Account_test.py b/test/resources/Account_test.py index 65069ec..9e0841c 100644 --- a/test/resources/Account_test.py +++ b/test/resources/Account_test.py @@ -160,7 +160,7 @@ def test_create_liability_account(setup): 'mask': '8721', 'ownership': 'unknown', 'type': 'credit_card', - 'name': 'Chase Sapphire Reserve', + 'name': 'Chase Credit Card', }, 'latest_verification_session': accounts_create_liability_response['latest_verification_session'], 'balance': None, @@ -628,6 +628,7 @@ def test_create_transaction_subscription(setup): 'id': create_txn_subscriptions_response['id'], 'name': 'transaction', 'status': 'active', + 'payload': None, 'latest_request_id': None, 'created_at': create_txn_subscriptions_response['created_at'], 'updated_at': create_txn_subscriptions_response['updated_at'], @@ -646,6 +647,7 @@ def test_create_update_subscription(setup): 'id': create_update_subscriptions_response['id'], 'name': 'update', 'status': 'active', + 'payload': None, 'latest_request_id': None, 'created_at': create_update_subscriptions_response['created_at'], 'updated_at': create_update_subscriptions_response['updated_at'], @@ -664,6 +666,7 @@ def test_create_snapshot_subscription(setup): 'id': create_update_snapshot_subscriptions_response['id'], 'name': 'update.snapshot', 'status': 'active', + 'payload': None, 'latest_request_id': None, 'created_at': create_update_snapshot_subscriptions_response['created_at'], 'updated_at': create_update_snapshot_subscriptions_response['updated_at'], @@ -686,6 +689,7 @@ def test_list_subscriptions(setup): 'id': create_update_subscriptions_response['id'], 'name': 'update', 'status': 'active', + 'payload': None, 'latest_request_id': None, 'created_at': create_update_subscriptions_response['created_at'], 'updated_at': create_update_subscriptions_response['updated_at'] @@ -697,6 +701,7 @@ def test_list_subscriptions(setup): 'id': create_txn_subscriptions_response['id'], 'name': 'transaction', 'status': 'active', + 'payload': None, 'latest_request_id': None, 'created_at': create_txn_subscriptions_response['created_at'], 'updated_at': create_txn_subscriptions_response['updated_at'] @@ -708,6 +713,7 @@ def test_list_subscriptions(setup): 'id': create_update_snapshot_subscriptions_response['id'], 'name': 'update.snapshot', 'status': 'active', + 'payload': None, 'latest_request_id': None, 'created_at': create_update_snapshot_subscriptions_response['created_at'], 'updated_at': create_update_snapshot_subscriptions_response['updated_at'] @@ -732,6 +738,7 @@ def test_retrieve_subscription(setup): 'id': create_txn_subscriptions_response['id'], 'name': 'transaction', 'status': 'active', + 'payload': None, 'latest_request_id': None, 'created_at': retrieve_txn_subscription_response['created_at'], 'updated_at': retrieve_txn_subscription_response['updated_at'], @@ -741,6 +748,7 @@ def test_retrieve_subscription(setup): 'id': create_update_subscriptions_response['id'], 'name': 'update', 'status': 'active', + 'payload': None, 'latest_request_id': None, 'created_at': retrieve_update_subscription_response['created_at'], 'updated_at': retrieve_update_subscription_response['updated_at'], @@ -750,6 +758,7 @@ def test_retrieve_subscription(setup): 'id': create_update_snapshot_subscriptions_response['id'], 'name': 'update.snapshot', 'status': 'active', + 'payload': None, 'latest_request_id': None, 'created_at': retrieve_update_snapshot_subscription_response['created_at'], 'updated_at': retrieve_update_snapshot_subscription_response['updated_at'], @@ -769,6 +778,7 @@ def test_delete_subscription(setup): 'id': create_update_snapshot_subscriptions_response['id'], 'name': 'update.snapshot', 'status': 'inactive', + 'payload': None, 'latest_request_id': None, 'created_at': delete_update_snapshot_subscription_response['created_at'], 'updated_at': delete_update_snapshot_subscription_response['updated_at'], @@ -838,7 +848,7 @@ def test_create_updates(setup): 'credit_limit': None, 'usage_pattern': None }, - 'data_as_of': None, + 'data_as_of': create_updates_response['data_as_of'], 'error': None, 'created_at': create_updates_response['created_at'], 'updated_at': create_updates_response['updated_at'], @@ -877,7 +887,7 @@ def get_updates(): 'credit_limit': 2800000, 'usage_pattern': None }, - 'data_as_of': None, + 'data_as_of': updates_retrieve_response['data_as_of'], 'error': None, 'created_at': updates_retrieve_response['created_at'], 'updated_at': updates_retrieve_response['updated_at'], @@ -916,7 +926,7 @@ def test_list_updates_for_account(setup): 'credit_limit': 2800000, 'usage_pattern': None }, - 'data_as_of': None, + 'data_as_of': update_to_check['data_as_of'] if update_to_check else None, 'error': None, 'created_at': update_to_check['created_at'] if update_to_check else None, 'updated_at': update_to_check['updated_at'] if update_to_check else None @@ -1061,7 +1071,7 @@ def test_list_account_products(setup): 'status': 'available', 'status_error': None, 'latest_request_id': account_products_list_response.get('card_brand', {}).get('latest_request_id', None), - 'is_subscribable': False, + 'is_subscribable': True, 'created_at': account_products_list_response.get('card_brand', {}).get('created_at', ''), 'updated_at': account_products_list_response.get('card_brand', {}).get('updated_at', ''), }, diff --git a/test/resources/Entity_test.py b/test/resources/Entity_test.py index 6858914..a096b7c 100644 --- a/test/resources/Entity_test.py +++ b/test/resources/Entity_test.py @@ -36,6 +36,7 @@ entities_retrieve_product_list_response = None entities_create_connect_subscription_response = None entities_create_credit_score_subscription_response = None +entities_create_attribute_subscription_response = None entities_create_individual_verification_response = None entities_create_phone_verification_response = None @@ -447,13 +448,15 @@ async def test_list_entity_credit_score(): def test_create_entity_attribute(): global entities_create_attribute_response - entities_create_attribute_response = method.entities(entities_create_response['id']).attributes.create() + entities_create_attribute_response = method.entities(entities_create_response['id']).attributes.create({ + 'attributes': ['credit_health_credit_card_usage'] + }) expect_results: EntityAttributes = { 'id': entities_create_attribute_response['id'], 'entity_id': entities_create_response['id'], 'status': 'completed', - 'attributes': entities_create_attribute_response.attributes, + 'attributes': entities_create_attribute_response['attributes'], 'error': None, 'created_at': entities_create_attribute_response['created_at'], 'updated_at': entities_create_attribute_response['updated_at'] @@ -472,7 +475,7 @@ def get_attribute(): 'id': attribute_retrieve_response['id'], 'entity_id': entities_create_response['id'], 'status': 'completed', - 'attributes': attribute_retrieve_response.attributes, + 'attributes': attribute_retrieve_response['attributes'], 'error': None, 'created_at': attribute_retrieve_response['created_at'], 'updated_at': attribute_retrieve_response['updated_at'] @@ -855,12 +858,15 @@ def test_retrieve_entity_product(): def test_create_entity_connect_subscription(): global entities_create_connect_subscription_response - entities_create_connect_subscription_response = method.entities(entities_create_response['id']).subscriptions.create('connect') + entities_create_connect_subscription_response = method.entities(entities_create_response['id']).subscriptions.create({ + 'enroll': 'connect' + }) expect_results: EntitySubscription = { 'id': entities_create_connect_subscription_response['id'], 'name': 'connect', 'status': 'active', + 'payload': None, 'latest_request_id': None, 'created_at': entities_create_connect_subscription_response['created_at'], 'updated_at': entities_create_connect_subscription_response['updated_at'] @@ -871,12 +877,15 @@ def test_create_entity_connect_subscription(): def test_create_entity_credit_score_subscription(): global entities_create_credit_score_subscription_response - entities_create_credit_score_subscription_response = method.entities(entities_create_response['id']).subscriptions.create('credit_score') + entities_create_credit_score_subscription_response = method.entities(entities_create_response['id']).subscriptions.create({ + 'enroll': 'credit_score' + }) expect_results: EntitySubscription = { 'id': entities_create_credit_score_subscription_response['id'], 'name': 'credit_score', 'status': 'active', + 'payload': None, 'latest_request_id': None, 'created_at': entities_create_credit_score_subscription_response['created_at'], 'updated_at': entities_create_credit_score_subscription_response['updated_at'] @@ -885,17 +894,43 @@ def test_create_entity_credit_score_subscription(): assert entities_create_credit_score_subscription_response == expect_results +def test_create_entity_attribute_subscription(): + global entities_create_attribute_subscription_response + entities_create_attribute_subscription_response = method.entities(entities_create_response['id']).subscriptions.create({ + 'enroll': 'attribute', + 'payload': { + 'attributes': { + 'requested_attributes': ['credit_health_credit_card_usage'] + } + } + }) + + expect_results: EntitySubscription = { + 'id': entities_create_attribute_subscription_response['id'], + 'name': 'attribute', + 'status': 'active', + 'payload': entities_create_attribute_subscription_response['payload'], + 'latest_request_id': entities_create_attribute_subscription_response['latest_request_id'], + 'created_at': entities_create_attribute_subscription_response['created_at'], + 'updated_at': entities_create_attribute_subscription_response['updated_at'] + } + + assert entities_create_attribute_subscription_response == expect_results + + def test_retrieve_entity_subscription(): entity_connect_subscription_id = entities_create_connect_subscription_response['id'] entity_credit_score_subscription_id = entities_create_credit_score_subscription_response['id'] - + entity_attribute_subscription_id = entities_create_attribute_subscription_response['id'] entity_connect_subscription_response = method.entities(entities_create_response['id']).subscriptions.retrieve(entity_connect_subscription_id) entity_credit_score_subscription_response = method.entities(entities_create_response['id']).subscriptions.retrieve(entity_credit_score_subscription_id) + entity_attribute_subscription_response = method.entities(entities_create_response['id']).subscriptions.retrieve(entity_attribute_subscription_id) expect_connect_results: EntitySubscription = { 'id': entity_connect_subscription_id, 'name': 'connect', 'status': 'active', + 'payload': None, 'latest_request_id': entity_connect_subscription_response['latest_request_id'], 'created_at': entity_connect_subscription_response['created_at'], 'updated_at': entity_connect_subscription_response['updated_at'] @@ -905,14 +940,25 @@ def test_retrieve_entity_subscription(): 'id': entity_credit_score_subscription_id, 'name': 'credit_score', 'status': 'active', + 'payload': None, 'latest_request_id': entity_credit_score_subscription_response['latest_request_id'], 'created_at': entity_credit_score_subscription_response['created_at'], 'updated_at': entity_credit_score_subscription_response['updated_at'] } + expect_attribute_results: EntitySubscription = { + 'id': entity_attribute_subscription_id, + 'name': 'attribute', + 'status': 'active', + 'payload': entities_create_attribute_subscription_response['payload'], + 'latest_request_id': entities_create_attribute_subscription_response['latest_request_id'], + 'created_at': entities_create_attribute_subscription_response['created_at'], + 'updated_at': entities_create_attribute_subscription_response['updated_at'] + } + assert entity_connect_subscription_response == expect_connect_results assert entity_credit_score_subscription_response == expect_credit_score_results - + assert entity_attribute_subscription_response == expect_attribute_results # ENTITY CONSENT TESTS def test_withdraw_entity_consent(): diff --git a/test/resources/Event_test.py b/test/resources/Event_test.py index cb55aa5..224d489 100644 --- a/test/resources/Event_test.py +++ b/test/resources/Event_test.py @@ -36,7 +36,9 @@ def setup(): connect_response = method.entities(entity_response['id']).connect.create() account_response = method.accounts.list({'holder_id': entity_response['id']}) - attribute_response = method.entities(entity_response['id']).attributes.create() + attribute_response = method.entities(entity_response['id']).attributes.create({ + 'attributes': ['credit_health_credit_card_usage'] + }) credit_score_response = method.entities(entity_response['id']).credit_scores.create() return {