예제 #1
0
def test_uri():
    connector = MongoConnector(name='my_mongo_con',
                               host='myhost',
                               port='123',
                               database='mydb')
    assert connector.uri == 'mongodb://*****:*****@myhost:123'
    connector = MongoConnector(name='my_mongo_con',
                               host='myhost',
                               port='123',
                               database='mydb',
                               username='******',
                               password='******')
    assert connector.uri == 'mongodb://*****:*****@myhost:123'
    with pytest.raises(ValueError) as exc_info:
        MongoConnector(name='my_mongo_con',
                       host='myhost',
                       port='123',
                       database='mydb',
                       password='******')
    assert 'password:\n  username must be set' in str(exc_info.value)
예제 #2
0
def mongo_connector(mongo_server):
    return MongoConnector(name='mycon',
                          host='localhost',
                          database='toucan',
                          port=mongo_server['port'],
                          username='******',
                          password='******')
예제 #3
0
def test_client_args_with_mongo_uri(mocker):
    """It should not pass any other parameter than the host to MongoClient"""
    mongo_client_mock = mocker.patch(
        'toucan_connectors.mongo.mongo_connector.pymongo.MongoClient')
    connector = MongoConnector(name='my_mongo_con',
                               host='mongodb://*****:*****@myhost:123')
    connector.client
    mongo_client_mock.assert_called_with(
        host='mongodb://*****:*****@myhost:123')
예제 #4
0
def test_get_df(mocker):
    class MongoMock:
        def __init__(self, database, collection):
            self.data = {database: {collection: pymongo.collection.Collection}}

        def __getitem__(self, row):
            return self.data[row]

        def close(self):
            pass

    snock = mocker.patch('pymongo.MongoClient')
    snock.return_value = MongoMock('toucan', 'test_col')
    find = mocker.patch('pymongo.collection.Collection.find')
    aggregate = mocker.patch('pymongo.collection.Collection.aggregate')

    mongo_connector = MongoConnector(name='mycon',
                                     host='localhost',
                                     database='toucan',
                                     port=22,
                                     username='******',
                                     password='******')

    datasource = MongoDataSource(name='mycon',
                                 domain='mydomain',
                                 collection='test_col',
                                 query={'domain': 'domain1'})
    mongo_connector.get_df(datasource)

    datasource = MongoDataSource(name='mycon',
                                 domain='mydomain',
                                 collection='test_col',
                                 query='domain1')
    mongo_connector.get_df(datasource)

    datasource = MongoDataSource(name='mycon',
                                 domain='mydomain',
                                 collection='test_col',
                                 query=[{
                                     '$match': {
                                         'domain': 'domain1'
                                     }
                                 }])
    mongo_connector.get_df(datasource)

    snock.assert_called_with('mongodb://*****:*****@localhost:22',
                             ssl=False)
    assert snock.call_count == 3

    find.assert_called_with({'domain': 'domain1'})
    assert find.call_count == 2

    aggregate.assert_called_once_with([{'$match': {'domain': 'domain1'}}])
예제 #5
0
def test_username_password():
    # password not set
    mongo_connector = MongoConnector(name='mycon', host='localhost', port=22)
    assert mongo_connector._get_mongo_client_kwargs() == {
        'host': 'localhost',
        'port': 22
    }

    # password set to None
    mongo_connector = MongoConnector(name='mycon',
                                     host='localhost',
                                     port=22,
                                     password=None)
    assert mongo_connector._get_mongo_client_kwargs() == {
        'host': 'localhost',
        'port': 22
    }

    # password set without username
    with pytest.raises(ValueError) as e:
        MongoConnector(name='mycon',
                       host='localhost',
                       port=22,
                       password='******')
    assert 'username must be set' in str(e.value)

    # password and user set
    mongo_connector = MongoConnector(name='mycon',
                                     host='localhost',
                                     port=22,
                                     username='******',
                                     password='******')
    assert mongo_connector._get_mongo_client_kwargs() == {
        'host': 'localhost',
        'port': 22,
        'username': '******',
        'password': '******',
    }
예제 #6
0
def test_client_args_with_ssl(mocker):
    """It should forward parameters to mongo client"""
    mongo_client_mock = mocker.patch(
        'toucan_connectors.mongo.mongo_connector.pymongo.MongoClient')
    connector = MongoConnector(name='my_mongo_con',
                               host='myhost',
                               password='******',
                               username='******',
                               ssl=True)
    connector.client
    mongo_client_mock.assert_called_with(host='myhost',
                                         ssl=True,
                                         password='******',
                                         username='******')
예제 #7
0
def test_get_cache_key(mongo_connector):
    """
    It should not raise 'TypeError: Object of type 'MongoClient' is not JSON serializable'
    """
    assert mongo_connector.client is not None
    assert isinstance(mongo_connector.get_cache_key(), str)

    conn1 = MongoConnector(name='aaa',
                           host='here',
                           port=42,
                           username='******',
                           password='******')
    conn2 = MongoConnector(name='aaa',
                           host='here',
                           port=42,
                           username='******',
                           password='******')
    assert conn1.get_cache_key() != conn2.get_cache_key()
예제 #8
0
def test_client_with_detailed_params():
    connector = MongoConnector(name='my_mongo_con', host='myhost', port='123')
    assert isinstance(connector.client, pymongo.MongoClient)
예제 #9
0
def test_get_df(mocker):
    class DatabaseMock:
        def __init__(self, collection):
            self.collections = {collection: pymongo.collection.Collection}

        def __getitem__(self, col):
            return self.collections[col]

        def list_collection_names(self):
            return self.collections.keys()

    class MongoMock:
        def __init__(self, database, collection):
            self.data = {database: DatabaseMock(collection)}

        def __getitem__(self, row):
            return self.data[row]

        def close(self):
            pass

        def list_database_names(self):
            return self.data.keys()

    snock = mocker.patch('pymongo.MongoClient')
    snock.return_value = MongoMock('toucan', 'test_col')
    aggregate = mocker.patch('pymongo.collection.Collection.aggregate')

    mongo_connector = MongoConnector(name='mycon',
                                     host='localhost',
                                     port=22,
                                     username='******',
                                     password='******')

    datasource = MongoDataSource(
        name='mycon',
        domain='mydomain',
        database='toucan',
        collection='test_col',
        query={'domain': 'domain1'},
    )
    mongo_connector.get_df(datasource)

    datasource = MongoDataSource(
        name='mycon',
        domain='mydomain',
        database='toucan',
        collection='test_col',
        query=[{
            '$match': {
                'domain': 'domain1'
            }
        }],
    )
    mongo_connector.get_df(datasource)

    snock.assert_called_with(host='localhost',
                             username='******',
                             password='******',
                             port=22)
    assert snock.call_count == 1  # client is cached

    aggregate.assert_called_with([{'$match': {'domain': 'domain1'}}])
    assert aggregate.call_count == 2
예제 #10
0
def test_client_with_mongo_uri():
    connector = MongoConnector(name='my_mongo_con',
                               host='mongodb://*****:*****@myhost:123')
    assert isinstance(connector.client, pymongo.MongoClient)