# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

import mango
import unittest


@unittest.skipUnless(mango.has_text_service(), "requires text service")
class NoDefaultFieldTest(mango.UserDocsTextTests):

    DEFAULT_FIELD = False

    def test_basic(self):
        docs = self.db.find({"$text": "Ramona"})
        # Or should this throw an error?
        assert len(docs) == 0

    def test_other_fields_exist(self):
        docs = self.db.find({"age": 22})
        assert len(docs) == 1
        assert docs[0]["user_id"] == 9


@unittest.skipUnless(mango.has_text_service(), "requires text service")
class NoDefaultFieldWithAnalyzer(mango.UserDocsTextTests):

    DEFAULT_FIELD = {
        "enabled": False,
        "analyzer": "keyword"
    }

    def test_basic(self):
        docs = self.db.find({"$text": "Ramona"})
        assert len(docs) == 0

    def test_other_fields_exist(self):
        docs = self.db.find({"age": 22})
        assert len(docs) == 1
        assert docs[0]["user_id"] == 9


@unittest.skipUnless(mango.has_text_service(), "requires text service")
class DefaultFieldWithCustomAnalyzer(mango.UserDocsTextTests):

    DEFAULT_FIELD = {
        "enabled": True,
        "analyzer": "keyword"
    }

    def test_basic(self):
        docs = self.db.find({"$text": "Ramona"})
        assert len(docs) == 1
        assert docs[0]["user_id"] == 9

    def test_not_analyzed(self):
        docs = self.db.find({"$text": "Lott Place"})
        assert len(docs) == 1
        assert docs[0]["user_id"] == 9

        docs = self.db.find({"$text": "Lott"})
        assert len(docs) == 0

        docs = self.db.find({"$text": "Place"})
        assert len(docs) == 0
