예제 #1
0
    def test_type_boolean_false(self):
        query_result = mqm(string_query="active!=false")
        assert query_result == {
            'filter': {
                "active": {
                    '$ne': False
                }
            },
            'sort': None,
            'skip': 0,
            'limit': 0,
            'projection': None
        }

        query_result = mqm(string_query="active!=False")
        assert query_result == {
            'filter': {
                "active": {
                    '$ne': False
                }
            },
            'sort': None,
            'skip': 0,
            'limit': 0,
            'projection': None
        }
예제 #2
0
    def test_type_null(self):
        query_result = mqm(string_query="active!=null")
        assert query_result == {
            'filter': {
                "active": {
                    '$ne': None
                }
            },
            'sort': None,
            'skip': 0,
            'limit': 0,
            'projection': None
        }

        query_result = mqm(string_query="active!=Null")
        assert query_result == {
            'filter': {
                "active": {
                    '$ne': None
                }
            },
            'sort': None,
            'skip': 0,
            'limit': 0,
            'projection': None
        }

        query_result = mqm(string_query="active!=none")
        assert query_result == {
            'filter': {
                "active": {
                    '$ne': None
                }
            },
            'sort': None,
            'skip': 0,
            'limit': 0,
            'projection': None
        }

        query_result = mqm(string_query="active!=None")
        assert query_result == {
            'filter': {
                "active": {
                    '$ne': None
                }
            },
            'sort': None,
            'skip': 0,
            'limit': 0,
            'projection': None
        }
    def test_custom_cast_2(self):
        def parse_custom_list(custom_list: str) -> List[str]:
            return custom_list.split(';')

        query_result = mqm(
            string_query=
            "price=string(5)&name=John&in_stock=custom_list(1;2;3;4)&"
            "in_stock_string=custom_list(string(1);string(2);string(3);string(4))",
            casters={
                'string': str,
                'custom_list': parse_custom_list
            })

        assert query_result == {
            'filter': {
                'price': '5',
                'name': 'John',
                'in_stock': {
                    '$in': [1, 2, 3, 4]
                },
                'in_stock_string': {
                    '$in': ['1', '2', '3', '4']
                }
            },
            'sort': None,
            'skip': 0,
            'limit': 0,
            'projection': None
        }
    def test_bad_population_logic(self):
        with pytest.raises(LogicalPopulationError) as excinfo:
            query_result = mqm(string_query="populate=service.description",
                               populate=True)

        assert excinfo.value.__str__(
        ) == 'Fail to find logical population item'
    def test_multi_population_with_multi_projection(self):
        query_result = mqm(
            string_query="fields=-created_at,-updated_at,hives.label,hives._id,"
            "data.temperature&populate=hives,data",
            populate=True)

        assert query_result == {
            'filter': {},
            'sort':
            None,
            'skip':
            0,
            'limit':
            0,
            'projection': {
                'created_at': 0,
                'updated_at': 0
            },
            'population': [{
                'path': 'hives',
                'projection': {
                    'label': 1,
                    '_id': 1
                }
            }, {
                'path': 'data',
                'projection': {
                    'temperature': 1
                }
            }]
        }
예제 #6
0
    def test_multi_descending_sort(self):
        query_result = mqm(string_query="sort=-_id,-created_at,-price")

        assert query_result == {'filter': {}, 'sort': [('_id', pymongo.DESCENDING),
                                                       ('created_at', pymongo.DESCENDING),
                                                       ('price', pymongo.DESCENDING)],
                                'skip': 0, 'limit': 0, 'projection': None}
    def test_multi_population_3(self):
        query_result = mqm(
            string_query="populate=user,user.settings,user.comments,user.info",
            populate=True)

        assert query_result == {
            'filter': {},
            'sort':
            None,
            'skip':
            0,
            'limit':
            0,
            'projection':
            None,
            'population': [{
                'path':
                'user',
                'projection':
                None,
                'population': [{
                    'path': 'settings',
                    'projection': None
                }, {
                    'path': 'comments',
                    'projection': None
                }, {
                    'path': 'info',
                    'projection': None
                }]
            }]
        }
    def test_complex_projection_error(self):
        with pytest.raises(ProjectionError) as excinfo:
            query_result = mqm(
                string_query=
                'fields={"games": {"$elemMatch":{"score": {"$gt": 5}}},joined,lastLogin'
            )

        assert excinfo.value.__str__() == 'Fail to decode projection'
    def test_custom_cast_fail(self):

        with pytest.raises(CustomCasterFail) as excinfo:
            query_result = mqm(string_query="price=float(A.B)",
                               casters={'float': float})

        assert excinfo.value.__str__(
        ) == 'Fail to cast float(A.B) with caster float'
예제 #10
0
    def test_empty_limit(self):
        query_result = mqm(string_query="limit=")

        assert query_result == {
            'filter': {},
            'sort': None,
            'skip': 0,
            'limit': 0,
            'projection': None
        }
예제 #11
0
    def test_good_skip(self):
        query_result = mqm(string_query="skip=5")

        assert query_result == {
            'filter': {},
            'sort': None,
            'skip': 5,
            'limit': 0,
            'projection': None
        }
    def test_bad_sub_population_logic_2(self):
        with pytest.raises(LogicalSubPopulationError) as excinfo:
            query_result = mqm(
                string_query=
                "populate=service,service.description,service.description.info,"
                "service.description.info,service.description.info.toto,"
                "service.descriptions.info.titi",
                populate=True)

        assert excinfo.value.__str__(
        ) == 'Fail to find logical sub population item'
    def test_empty_population(self):
        query_result = mqm(string_query="populate=", populate=True)

        assert query_result == {
            'filter': {},
            'sort': None,
            'skip': 0,
            'limit': 0,
            'projection': None,
            'population': []
        }
    def test_simple_projection_2(self):
        query_result = mqm(string_query="fields=-_id")

        assert query_result == {
            'filter': {},
            'sort': None,
            'skip': 0,
            'limit': 0,
            'projection': {
                '_id': 0
            }
        }
예제 #15
0
    def test_type_integer(self):
        query_result = mqm(string_query="price=5")

        assert query_result == {
            'filter': {
                "price": 5
            },
            'sort': None,
            'skip': 0,
            'limit': 0,
            'projection': None
        }
예제 #16
0
    def test_type_negative_float(self):
        query_result = mqm(string_query="price=-5.5")

        assert query_result == {
            'filter': {
                "price": -5.5
            },
            'sort': None,
            'skip': 0,
            'limit': 0,
            'projection': None
        }
예제 #17
0
    def test_type_datetime_format_1(self):
        query_result = mqm(string_query="created_at=2016-01-01")

        assert query_result == {
            'filter': {
                "created_at": datetime(year=2016, month=1, day=1)
            },
            'sort': None,
            'skip': 0,
            'limit': 0,
            'projection': None
        }
예제 #18
0
    def test_type_string(self):
        query_result = mqm(string_query="name=toto")

        assert query_result == {
            'filter': {
                "name": 'toto'
            },
            'sort': None,
            'skip': 0,
            'limit': 0,
            'projection': None
        }
예제 #19
0
    def test_type_regex(self):
        query_result = mqm(string_query="email=/@gmail\\.com$/i")

        assert query_result == {
            'filter': {
                "email": re.compile(r'/@gmail\.com$/i')
            },
            'sort': None,
            'skip': 0,
            'limit': 0,
            'projection': None
        }
    def test_custom_cast(self):
        query_result = mqm(string_query="price=string(5)",
                           casters={'string': str})

        assert query_result == {
            'filter': {
                'price': '5'
            },
            'sort': None,
            'skip': 0,
            'limit': 0,
            'projection': None
        }
예제 #21
0
    def test_type_boolean_true(self):
        query_result = mqm(string_query="active=true")
        assert query_result == {
            'filter': {
                "active": True
            },
            'sort': None,
            'skip': 0,
            'limit': 0,
            'projection': None
        }

        query_result = mqm(string_query="active=True")
        assert query_result == {
            'filter': {
                "active": True
            },
            'sort': None,
            'skip': 0,
            'limit': 0,
            'projection': None
        }
    def test_sub_population_alex_2(self):
        query_result = mqm(
            string_query=
            "populate=animal,crossbreed,crossbreed.crossbreeds,company,service,"
            "service.service_description,pet&fields=-company.settings.booking,"
            "-company.settings.toto",
            populate=True)

        assert query_result == {
            'filter': {},
            'sort':
            None,
            'skip':
            0,
            'limit':
            0,
            'projection':
            None,
            'population': [{
                'path': 'animal',
                'projection': None
            }, {
                'path':
                'crossbreed',
                'projection':
                None,
                'population': [{
                    'path': 'crossbreeds',
                    'projection': None
                }]
            }, {
                'path': 'company',
                'projection': {
                    'settings.booking': 0,
                    'settings.toto': 0
                }
            }, {
                'path':
                'service',
                'projection':
                None,
                'population': [{
                    'path': 'service_description',
                    'projection': None
                }]
            }, {
                'path': 'pet',
                'projection': None
            }]
        }
예제 #23
0
    def test_type_datetime_format_2(self):
        query_result = mqm(
            string_query="created_at=2016-01-01T00:00:00.000000+00:00")

        assert query_result == {
            'filter': {
                "created_at":
                datetime(year=2016, month=1, day=1, tzinfo=timezone.utc)
            },
            'sort': None,
            'skip': 0,
            'limit': 0,
            'projection': None
        }
    def test_multi_projection_1(self):
        query_result = mqm(string_query="fields=-_id,-created_at,-price")

        assert query_result == {
            'filter': {},
            'sort': None,
            'skip': 0,
            'limit': 0,
            'projection': {
                '_id': 0,
                'created_at': 0,
                'price': 0
            }
        }
    def test_simple_population(self):
        query_result = mqm(string_query="populate=user", populate=True)

        assert query_result == {
            'filter': {},
            'sort': None,
            'skip': 0,
            'limit': 0,
            'projection': None,
            'population': [{
                'path': 'user',
                'projection': None
            }]
        }
예제 #26
0
    def test_type_list(self):
        query_result = mqm(string_query="country=US,RU")

        assert query_result == {
            'filter': {
                "country": {
                    "$in": ['US', 'RU']
                }
            },
            'sort': None,
            'skip': 0,
            'limit': 0,
            'projection': None
        }
    def test_multi_population_with_multi_projection_2(self):
        query_result = mqm(
            string_query=
            "fields=-created_at,-updated_at,-service.created_at,-service.updated_at,"
            "-service.description.created_at,-service."
            "description.updated_at&populate=service,service.description,service."
            "description.picture,animal,animal.info",
            populate=True)

        assert query_result == {
            'filter': {},
            'sort':
            None,
            'skip':
            0,
            'limit':
            0,
            'projection': {
                'created_at': 0,
                'updated_at': 0
            },
            'population': [{
                'path':
                'service',
                'projection': {
                    'created_at': 0,
                    'updated_at': 0
                },
                'population': [{
                    'path':
                    'description',
                    'projection': {
                        'created_at': 0,
                        'updated_at': 0
                    },
                    'population': [{
                        'path': 'picture',
                        'projection': None
                    }]
                }]
            }, {
                'path': 'animal',
                'projection': None,
                'population': [{
                    'path': 'info',
                    'projection': None
                }]
            }]
        }
    def test_embedded_projection_1(self):
        query_result = mqm(string_query="fields=settings.notif&populate=user",
                           populate=True)

        assert query_result == {
            'filter': {},
            'sort': None,
            'skip': 0,
            'limit': 0,
            'projection': {
                'settings.notif': 1
            },
            'population': [{
                'path': 'user',
                'projection': None
            }]
        }
    def test_multi_population_6(self):
        query_result = mqm(
            string_query=
            "populate=user,user.life,user.life.info,user.settings,user.settings.notifications",
            populate=True)

        assert query_result == {
            'filter': {},
            'sort':
            None,
            'skip':
            0,
            'limit':
            0,
            'projection':
            None,
            'population': [{
                'path':
                'user',
                'projection':
                None,
                'population': [{
                    'path':
                    'life',
                    'projection':
                    None,
                    'population': [{
                        'path': 'info',
                        'projection': None
                    }]
                }, {
                    'path':
                    'settings',
                    'projection':
                    None,
                    'population': [{
                        'path': 'notifications',
                        'projection': None
                    }]
                }]
            }]
        }
    def test_simple_population_with_projection(self):
        query_result = mqm(
            string_query=
            "fields=-created_at,-updated_at,hives.label&populate=hives",
            populate=True)

        assert query_result == {
            'filter': {},
            'sort': None,
            'skip': 0,
            'limit': 0,
            'projection': {
                'created_at': 0,
                'updated_at': 0
            },
            'population': [{
                'path': 'hives',
                'projection': {
                    'label': 1
                }
            }]
        }