blob: 46abe68d439adc5df07b2f84c7250c4395ba6095 [file] [log] [blame]
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you 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.
from trac.test import Mock
from bhsearch.query_parser import DefaultQueryParser
from bhsearch.tests import unittest
from bhsearch.tests.base import BaseBloodhoundSearchTest
from whoosh import query
class MetaKeywordsParsingTestCase(BaseBloodhoundSearchTest):
def setUp(self):
super(MetaKeywordsParsingTestCase, self).setUp()
self.parser = DefaultQueryParser(self.env)
def test_can_parse_keyword_ticket(self):
parsed_query = self.parser.parse("$ticket")
self.assertEqual(parsed_query, query.Term('type', 'ticket'))
def test_can_parse_NOT_keyword_ticket(self):
parsed_query = self.parser.parse("NOT $ticket")
self.assertEqual(parsed_query,
query.Not(
query.Term('type', 'ticket')))
def test_can_parse_keyword_wiki(self):
parsed_query = self.parser.parse("$wiki")
self.assertEqual(parsed_query, query.Term('type', 'wiki'))
def test_can_parse_keyword_resolved(self):
parsed_query = self.parser.parse("$resolved")
self.assertEqual(parsed_query,
query.Or([query.Term('status', 'resolved'),
query.Term('status', 'closed')]))
def test_can_parse_meta_keywords_that_resolve_to_meta_keywords(self):
parsed_query = self.parser.parse("$unresolved")
self.assertEqual(parsed_query,
query.Not(
query.Or([query.Term('status', 'resolved'),
query.Term('status', 'closed')])))
def test_can_parse_complex_query(self):
parsed_query = self.parser.parse("content:test $ticket $unresolved")
self.assertEqual(parsed_query,
query.And([
query.Term('content', 'test'),
query.Term('type', 'ticket'),
query.Not(
query.Or([query.Term('status', 'resolved'),
query.Term('status', 'closed')])
)
]))
def test_can_parse_keyword_me(self):
context = self._mock_context_with_username('username')
parsed_query = self.parser.parse("author:$me", context)
self.assertEqual(parsed_query, query.Term('author', 'username'))
def test_can_parse_keyword_my(self):
context = self._mock_context_with_username('username')
parsed_query = self.parser.parse("$my", context)
self.assertEqual(parsed_query, query.Term('owner', 'username'))
def _mock_context_with_username(self, username):
context = Mock(
req=Mock(
authname=username
)
)
return context
def suite():
test_suite = unittest.TestSuite()
test_suite.addTest(unittest.makeSuite(MetaKeywordsParsingTestCase, 'test'))
return test_suite
if __name__ == '__main__':
unittest.main()