"""Helpers for dynamodb.""" import boto3 from moto import mock_dynamodb import pytest from users import config from users.connectors import dynamodb @pytest.fixture def mock_connected_item(): """mock_connected_item. Mock a social auth item which is connected """ participant_id = 'participant-1234' identity_id = 'identity-5678' platform_id = 'platform-9876' platform = 'INSTAGRAM' linked = True return ( { 'PK': participant_id, 'SK': '{}#{}'.format(identity_id, platform), 'PK1': platform_id, 'SK1': platform, 'identity_id': identity_id, 'linked': linked, }, platform_id, participant_id, identity_id, ) @pytest.fixture def mock_disconnected_item(): """mock_disconnected_item. Mock a social auth item which is disconnected """ participant_id = 'participant-1234' identity_id = 'identity-5678' platform_id = 'platform-9876' platform = 'INSTAGRAM' linked = False return ( { 'PK': participant_id, 'SK': '{}#{}'.format(identity_id, platform), 'PK1': platform_id, 'SK1': platform, 'identity_id': identity_id, 'linked': linked, }, platform_id, participant_id, identity_id, ) @pytest.fixture def mock_dynamodb_table(): """mock_dynamodb_table. Fixture to setup dynamodb instance and table """ with mock_dynamodb(): table_name = 'test_social-auth' config.DYNAMODB_SOCIAL_AUTH_TABLE = table_name db = boto3.resource('dynamodb', 'us-east-1') table = db.create_table( TableName=table_name, KeySchema=[ {'AttributeName': 'PK', 'KeyType': 'HASH'}, {'AttributeName': 'SK', 'KeyType': 'RANGE'}, ], AttributeDefinitions=[ {'AttributeName': 'PK', 'AttributeType': 'S'}, {'AttributeName': 'SK', 'AttributeType': 'S'}, {'AttributeName': 'PK1', 'AttributeType': 'S'}, {'AttributeName': 'SK1', 'AttributeType': 'S'}, ], GlobalSecondaryIndexes=[ { 'IndexName': 'GSI1', 'KeySchema': [ {'AttributeName': 'PK1', 'KeyType': 'HASH'}, {'AttributeName': 'SK1', 'KeyType': 'RANGE'}, ], 'Projection': { 'ProjectionType': 'ALL', 'NonKeyAttributes': [ 'string', ], }, 'ProvisionedThroughput': {'ReadCapacityUnits': 123, 'WriteCapacityUnits': 123}, }, ], ProvisionedThroughput={'ReadCapacityUnits': 5, 'WriteCapacityUnits': 5}, ) yield table, db def test_get_social_auth_item_returns_participant(mock_dynamodb_table, mock_connected_item): """test_get_social_auth_item_returns_participant. Test to check whether the query returns the participant """ table, db = mock_dynamodb_table item, platform_id, participant_id, identity_id = mock_connected_item table.put_item(Item=item) social_auth_item = dynamodb.get_social_auth_item(participant_id, identity_id, 'INSTAGRAM', db) assert social_auth_item['PK'] == participant_id assert social_auth_item['PK1'] == platform_id def test_get_social_auth_item_returns_none(mock_dynamodb_table, mock_connected_item): """test_get_social_auth_item_returns_none. Test to check whether the query does not return a participant """ table, db = mock_dynamodb_table item, platform_id, participant_id, identity_id = mock_connected_item table.put_item(Item=item) social_auth_item = dynamodb.get_social_auth_item( 'invalid-participant-id', identity_id, 'INSTAGRAM', db ) assert social_auth_item is None def test_get_social_auth_item_returns_none_on_disconnected( mock_dynamodb_table, mock_disconnected_item ): """test_get_social_auth_item_returns_none_on_disconnected. Test to check whether the query does not return a participant if it is already disconnected """ table, db = mock_dynamodb_table item, platform_id, participant_id, identity_id = mock_disconnected_item table.put_item(Item=item) social_auth_item = dynamodb.get_social_auth_item(participant_id, identity_id, 'INSTAGRAM', db) assert social_auth_item is None def test_get_social_auth_item_returns_none_on_different_platform( mock_dynamodb_table, mock_connected_item ): """test_get_social_auth_item_returns_none_on_different_platform. Test to check whether the query does not return a participant if a different platform is provided """ table, db = mock_dynamodb_table item, platform_id, participant_id, identity_id = mock_connected_item table.put_item(Item=item) social_auth_item = dynamodb.get_social_auth_item( participant_id, identity_id, 'invalid-platform', db ) assert social_auth_item is None def test_get_social_auth_item_returns_none_if_participant_id_is_none( mock_dynamodb_table, mock_connected_item ): """test_get_social_auth_item_returns_none_if_participant_id_is_none. Test to check whether the query does not return a participant or has error if the argument participant_id is None """ table, db = mock_dynamodb_table item, platform_id, participant_id, identity_id = mock_connected_item table.put_item(Item=item) social_auth_item = dynamodb.get_social_auth_item(None, identity_id, 'INSTAGRAM', db) assert social_auth_item is None def test_get_social_auth_item_returns_none_if_platform_is_none( mock_dynamodb_table, mock_connected_item ): """test_get_social_auth_item_returns_none_if_platform_is_none. Test to check whether the query does not return a participant or has error if the argument platform is None """ table, db = mock_dynamodb_table item, platform_id, participant_id, identity_id = mock_connected_item table.put_item(Item=item) social_auth_item = dynamodb.get_social_auth_item(participant_id, identity_id, None, db) assert social_auth_item is None def test_get_social_auth_item_returns_none_if_identity_id_is_none( mock_dynamodb_table, mock_connected_item ): """test_get_social_auth_item_returns_none_if_identity_id_is_none. Test to check whether the query does not return a participant or has error if the argument platform is None """ table, db = mock_dynamodb_table item, platform_id, participant_id, identity_id = mock_connected_item table.put_item(Item=item) social_auth_item = dynamodb.get_social_auth_item(participant_id, None, 'INSTAGRAM', db) assert social_auth_item is None def test_update_social_auth_item_linked_status_if_participant_id_is_none( mock_dynamodb_table, mock_connected_item ): """test_update_social_auth_item_linked_status_if_participant_id_is_none. Test to check whether the update query does not return a participant or has an error when participant_id is None """ table, db = mock_dynamodb_table item, platform_id, participant_id, identity_id = mock_connected_item table.put_item(Item=item) social_auth_item = dynamodb.update_social_auth_item_linked_status( None, identity_id, 'INSTAGRAM', False, db ) assert social_auth_item is None def test_update_social_auth_item_linked_status_if_identity_id_is_none( mock_dynamodb_table, mock_connected_item ): """test_update_social_auth_item_linked_status_if_identity_id_is_none. Test to check whether the update query does not return a participant or has an error when identity_id is None """ table, db = mock_dynamodb_table item, platform_id, participant_id, identity_id = mock_connected_item table.put_item(Item=item) social_auth_item = dynamodb.update_social_auth_item_linked_status( participant_id, None, 'INSTAGRAM', False, db ) assert social_auth_item is None def test_update_social_auth_item_linked_status_if_platform_is_none( mock_dynamodb_table, mock_connected_item ): """test_update_social_auth_item_linked_status_if_platform_is_none. Test to check whether the update query does not return a participant or has an error when platform is None """ table, db = mock_dynamodb_table item, platform_id, participant_id, identity_id = mock_connected_item table.put_item(Item=item) social_auth_item = dynamodb.update_social_auth_item_linked_status( participant_id, identity_id, None, False, db ) assert social_auth_item is None def test_update_social_auth_item_linked_status_if_item_exists( mock_dynamodb_table, mock_connected_item ): """test_update_social_auth_item_linked_status_if_item_exists. Test to check whether the update query returns a participant when it exists in the table. """ table, db = mock_dynamodb_table item, platform_id, participant_id, identity_id = mock_connected_item table.put_item(Item=item) social_auth_item = dynamodb.update_social_auth_item_linked_status( participant_id, identity_id, 'INSTAGRAM', False, db ) assert 'linked' in social_auth_item