# 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 DisableIndexArrayLengthsTest(mango.UserDocsTextTests):
    def setUp(self):
        self.db.create_text_index(
            ddoc="disable_index_array_lengths",
            analyzer="keyword",
            index_array_lengths=False,
        )
        self.db.create_text_index(
            ddoc="explicit_enable_index_array_lengths",
            analyzer="keyword",
            index_array_lengths=True,
        )

    def test_disable_index_array_length(self):
        docs = self.db.find(
            {"favorites": {"$size": 4}}, use_index="disable_index_array_lengths"
        )
        assert len(docs) == 0

    def test_enable_index_array_length(self):
        docs = self.db.find(
            {"favorites": {"$size": 4}}, use_index="explicit_enable_index_array_lengths"
        )
        assert len(docs) > 0
        for d in docs:
            assert len(d["favorites"]) == 4
