Example #1
0
 def test_list_devices_with_search_constraints(self):
     expressions = shared_messages.SearchExpression(
         expression='serial_number')
     expected_response = device_message.ListDevicesResponse(
         devices=[device_message.Device(serial_number='6789')],
         additional_results=False)
     request = device_message.Device(query=shared_messages.SearchRequest(
         query_string='sn:6789',
         expressions=[expressions],
         returned_fields=['serial_number']))
     response = self.service.list_devices(request)
     self.assertEqual(response.devices[0].serial_number,
                      expected_response.devices[0].serial_number)
     self.assertFalse(response.additional_results)
Example #2
0
 def test_list_devices_with_search_constraints(self):
     expressions = shared_messages.SearchExpression(
         expression='serial_number')
     expected_response = device_messages.ListDevicesResponse(
         devices=[
             device_messages.Device(serial_number='6789',
                                    guest_permitted=True)
         ],
         total_results=1,
         total_pages=1)
     request = device_messages.Device(query=shared_messages.SearchRequest(
         query_string='sn:6789',
         expressions=[expressions],
         returned_fields=['serial_number']))
     response = self.service.list_devices(request)
     self.assertEqual(response, expected_response)
Example #3
0
 def test_list_shelves_with_search_constraints(self):
     expressions = shared_messages.SearchExpression(expression='location')
     expected_response = shelf_messages.ListShelfResponse(shelves=[
         shelf_messages.Shelf(location=self.shelf.location,
                              shelf_request=shelf_messages.ShelfRequest(
                                  location=self.shelf.location,
                                  urlsafe_key=self.shelf.key.urlsafe()))
     ],
                                                          total_results=1,
                                                          total_pages=1)
     request = shelf_messages.Shelf(
         query=shared_messages.SearchRequest(query_string='location:NYC',
                                             expressions=[expressions],
                                             returned_fields=['location']))
     response = self.service.list_shelves(request)
     self.assertEqual(response, expected_response)
    def testSearchRequest(self):
        search_exp = shared_messages.SearchExpression(
            expression='FAKE-EXPRESSION',
            direction=shared_messages.SortDirection(0))

        search_request = shared_messages.SearchRequest(
            query_string='FAKE-QUERY-STRING',
            expressions=[search_exp],
            returned_fields=['FAKE-RETURN'])

        self.assertEqual(search_request.query_string, 'FAKE-QUERY-STRING')
        self.assertListEqual(search_request.returned_fields, ['FAKE-RETURN'])
        self.assertEqual(search_request.expressions[0].expression,
                         'FAKE-EXPRESSION')
        self.assertEqual(search_request.expressions[0].direction.name,
                         'ASCENDING')
Example #5
0
class SearchTest(loanertest.EndpointsTestCase, parameterized.TestCase):

    _ASSIGNED_DATE = datetime.datetime(year=2017, month=1, day=1)

    @parameterized.parameters((
        shelf_messages.Shelf(location='NY', capacity=50),
        'location:NY capacity:50 enabled:True',
    ), (
        shelf_messages.Shelf(location='NY', capacity=50, enabled=False),
        'location:NY capacity:50 enabled:False',
    ))
    def test_to_query(self, message, expected_query):
        """Tests the creation of a valid search query from ndb properties."""
        query = search_utils.to_query(message, shelf_model.Shelf)
        #  The query is split because ndb properties are unordered when called by
        #  model_class._properties. This test would be flaky otherwise.
        self.assertCountEqual(query.split(' '), expected_query.split(' '))

    @parameterized.named_parameters(
        ('Shelf Message', shelf_messages.Shelf(),
         search.ScoredDocument(
             doc_id='test_doc_id',
             fields=[
                 search.NumberField(name='capacity', value=20.0),
                 search.TextField(name='location', value='US MTV'),
                 search.AtomField(name='location', value='US-MTV'),
                 search.AtomField(name='enabled', value='True'),
                 search.GeoField(name='lat_long',
                                 value=search.GeoPoint(52.37, 4.88)),
                 search.TextField(name='not_present', value='MTV')
             ]),
         shelf_messages.Shelf(enabled=True,
                              location='US-MTV',
                              capacity=20,
                              latitude=52.37,
                              longitude=4.88), 1),
        ('Device Message', device_messages.Device(),
         search.ScoredDocument(
             doc_id='test_doc_id',
             fields=[
                 search.DateField(name='assignment_date',
                                  value=_ASSIGNED_DATE),
                 search.TextField(name='serial_number', value='1234'),
                 search.AtomField(name='enrolled', value='True'),
                 search.TextField(name='assigned_user', value='user')
             ]),
         device_messages.Device(
             enrolled=True,
             serial_number='1234',
             assigned_user='******',
             max_extend_date=_ASSIGNED_DATE + datetime.timedelta(days=14),
             assignment_date=_ASSIGNED_DATE), 0))
    def test_document_to_message(self, message, test_search_document,
                                 expected_message, log_call_count):
        """Tests the creation of a protorpc message from a search document."""
        with mock.patch.object(search_utils, 'logging',
                               autospec=True) as mock_logging:
            response_message = search_utils.document_to_message(
                test_search_document, message)
            self.assertEqual(response_message, expected_message)
            self.assertEqual(mock_logging.error.call_count, log_call_count)

    def test_calculate_page_offset(self):
        """Tests the calculation of page offset."""
        page_size = 10
        page_number = 5
        offset = search_utils.calculate_page_offset(page_size, page_number)
        self.assertEqual(40, offset)

    def test_calculate_total_pages(self):
        """Tests the calculation of total pages."""
        page_size = 6
        total_results = 11
        total_pages = search_utils.calculate_total_pages(
            page_size, total_results)
        self.assertEqual(2, total_pages)

    @parameterized.named_parameters(
        {
            'testcase_name': 'QueryStringOnly',
            'request':
            shared_messages.SearchRequest(query_string='enrolled:True'),
            'expected_values': ('enrolled:True', None, [])
        },
        {
            'testcase_name':
            'QueryStringWithReturnedFields',
            'request':
            shared_messages.SearchRequest(query_string='location:US-NYC',
                                          returned_fields=['location']),
            'expected_values': ('location:US-NYC', None, ['location'])
        },
    )
    def test_set_search_query_options(self, request, expected_values):
        """Tests setting the query options without sort options from message."""
        returned_query, returned_sort_options, returned_returned_fields = (
            search_utils.set_search_query_options(request))
        expected_query, expected_sort_options, expcted_returned_fields = (
            expected_values)
        self.assertEqual(expected_sort_options, returned_sort_options)
        self.assertEqual(expected_query, returned_query)
        self.assertEqual(expcted_returned_fields, returned_returned_fields)

    @parameterized.named_parameters(
        {
            'testcase_name':
            'ExpressionWithDirection',
            'request':
            shared_messages.SearchRequest(
                query_string='enrolled:True',
                expressions=[
                    shared_messages.SearchExpression(
                        expression='enrolled',
                        direction=shared_messages.SortDirection.ASCENDING)
                ]),
            'expected_sort_options_expressions': [
                search.SortExpression(
                    expression='enrolled',
                    direction=search.SortExpression.ASCENDING)
            ]
        },
        {
            'testcase_name':
            'MultipleExpressionsWithDirection',
            'request':
            shared_messages.SearchRequest(
                query_string='enrolled:True',
                expressions=[
                    shared_messages.SearchExpression(
                        expression='enrolled',
                        direction=shared_messages.SortDirection.ASCENDING),
                    shared_messages.SearchExpression(
                        expression='serial_number',
                        direction=shared_messages.SortDirection.DESCENDING)
                ]),
            'expected_sort_options_expressions': [
                search.SortExpression(
                    expression='enrolled',
                    direction=search.SortExpression.ASCENDING),
                search.SortExpression(
                    expression='serial_number',
                    direction=search.SortExpression.DESCENDING)
            ]
        },
        {
            'testcase_name':
            'ExpressionWithoutDirection',
            'request':
            shared_messages.SearchRequest(
                query_string='enrolled:True',
                expressions=[
                    shared_messages.SearchExpression(expression='enrolled')
                ]),
            'expected_sort_options_expressions':
            [search.SortExpression(expression='enrolled')]
        },
        {
            'testcase_name':
            'MultipleExpressionsWithoutDirection',
            'request':
            shared_messages.SearchRequest(
                query_string='enrolled:True',
                expressions=[
                    shared_messages.SearchExpression(expression='enrolled'),
                    shared_messages.SearchExpression(
                        expression='serial_number')
                ]),
            'expected_sort_options_expressions': [
                search.SortExpression(
                    expression='enrolled',
                    direction=search.SortExpression.DESCENDING),
                search.SortExpression(
                    expression='serial_number',
                    direction=search.SortExpression.DESCENDING)
            ]
        },
    )
    def test_set_search_query_options_with_sort_options(
            self, request, expected_sort_options_expressions):
        """Tests setting query options with sort options from message."""
        returned_query, returned_sort_options, returned_returned_fields = (
            search_utils.set_search_query_options(request))
        del returned_query  # Unused.
        del returned_returned_fields  # Unused.
        for i in range(len(returned_sort_options.expressions)):
            self.assertEqual(returned_sort_options.expressions[i].expression,
                             expected_sort_options_expressions[i].expression)
            self.assertEqual(returned_sort_options.expressions[i].direction,
                             expected_sort_options_expressions[i].direction)
class SearchTest(loanertest.EndpointsTestCase, parameterized.TestCase):
    @parameterized.parameters((
        shelf_messages.Shelf(location='NY', capacity=50),
        'location:NY capacity:50 enabled:True',
    ), (
        shelf_messages.Shelf(location='NY', capacity=50, enabled=False),
        'location:NY capacity:50 enabled:False',
    ))
    def test_to_query(self, message, expected_query):
        """Tests the creation of a valid search query from ndb properties."""
        query = search_utils.to_query(message, shelf_model.Shelf)
        #  The query is split because ndb properties are unordered when called by
        #  model_class._properties. This test would be flaky otherwise.
        self.assertCountEqual(query.split(' '), expected_query.split(' '))

    @mock.patch.object(search_utils, 'logging', autospec=True)
    def test_document_to_message(self, mock_logging):
        """Tests the creation of a protorpc message from a search document."""
        test_search_document = search.ScoredDocument(
            doc_id='test_doc_id',
            fields=[
                search.NumberField(name='capacity', value=20.0),
                search.TextField(name='location', value='US MTV'),
                search.AtomField(name='location', value='US-MTV'),
                search.AtomField(name='enabled', value='True'),
                search.GeoField(name='lat_long',
                                value=search.GeoPoint(52.37, 4.88)),
                search.TextField(name='not_present', value='MTV')
            ])
        expected_message = shelf_messages.Shelf(enabled=True,
                                                location='US-MTV',
                                                capacity=20,
                                                latitude=52.37,
                                                longitude=4.88)

        response_message = search_utils.document_to_message(
            test_search_document, shelf_messages.Shelf())
        self.assertEqual(response_message, expected_message)
        self.assertTrue(response_message.enabled)
        assert mock_logging.error.call_count == 1

    def test_get_search_cursor(self):
        """Tests the creation of a search cursor with a web_safe_string."""
        expected_cursor_web_safe_string = 'False:ODUxODBhNTgyYTQ2ZmI0MDU'
        returned_cursor = (
            search_utils.get_search_cursor(expected_cursor_web_safe_string))
        self.assertEqual(expected_cursor_web_safe_string,
                         returned_cursor.web_safe_string)

    @mock.patch.object(search, 'Cursor', autospec=True)
    def test_get_search_cursor_error(self, mock_cursor):
        """Tests the creation of a search cursor when an error occurs."""
        mock_cursor.side_effect = ValueError
        with self.assertRaisesWithLiteralMatch(endpoints.BadRequestException,
                                               search_utils._CORRUPT_KEY_MSG):
            search_utils.get_search_cursor(None)

    @parameterized.named_parameters(
        {
            'testcase_name': 'QueryStringOnly',
            'request':
            shared_messages.SearchRequest(query_string='enrolled:True'),
            'expected_values': ('enrolled:True', None, [])
        },
        {
            'testcase_name':
            'QueryStringWithReturnedFields',
            'request':
            shared_messages.SearchRequest(query_string='location:US-NYC',
                                          returned_fields=['location']),
            'expected_values': ('location:US-NYC', None, ['location'])
        },
    )
    def test_set_search_query_options(self, request, expected_values):
        """Tests setting the query options without sort options from message."""
        returned_query, returned_sort_options, returned_returned_fields = (
            search_utils.set_search_query_options(request))
        expected_query, expected_sort_options, expcted_returned_fields = (
            expected_values)
        self.assertEqual(expected_sort_options, returned_sort_options)
        self.assertEqual(expected_query, returned_query)
        self.assertEqual(expcted_returned_fields, returned_returned_fields)

    @parameterized.named_parameters(
        {
            'testcase_name':
            'ExpressionWithDirection',
            'request':
            shared_messages.SearchRequest(
                query_string='enrolled:True',
                expressions=[
                    shared_messages.SearchExpression(
                        expression='enrolled',
                        direction=shared_messages.SortDirection.ASCENDING)
                ]),
            'expected_sort_options_expressions': [
                search.SortExpression(
                    expression='enrolled',
                    direction=search.SortExpression.ASCENDING)
            ]
        },
        {
            'testcase_name':
            'MultipleExpressionsWithDirection',
            'request':
            shared_messages.SearchRequest(
                query_string='enrolled:True',
                expressions=[
                    shared_messages.SearchExpression(
                        expression='enrolled',
                        direction=shared_messages.SortDirection.ASCENDING),
                    shared_messages.SearchExpression(
                        expression='serial_number',
                        direction=shared_messages.SortDirection.DESCENDING)
                ]),
            'expected_sort_options_expressions': [
                search.SortExpression(
                    expression='enrolled',
                    direction=search.SortExpression.ASCENDING),
                search.SortExpression(
                    expression='serial_number',
                    direction=search.SortExpression.DESCENDING)
            ]
        },
        {
            'testcase_name':
            'ExpressionWithoutDirection',
            'request':
            shared_messages.SearchRequest(
                query_string='enrolled:True',
                expressions=[
                    shared_messages.SearchExpression(expression='enrolled')
                ]),
            'expected_sort_options_expressions':
            [search.SortExpression(expression='enrolled')]
        },
        {
            'testcase_name':
            'MultipleExpressionsWithoutDirection',
            'request':
            shared_messages.SearchRequest(
                query_string='enrolled:True',
                expressions=[
                    shared_messages.SearchExpression(expression='enrolled'),
                    shared_messages.SearchExpression(
                        expression='serial_number')
                ]),
            'expected_sort_options_expressions': [
                search.SortExpression(
                    expression='enrolled',
                    direction=search.SortExpression.DESCENDING),
                search.SortExpression(
                    expression='serial_number',
                    direction=search.SortExpression.DESCENDING)
            ]
        },
    )
    def test_set_search_query_options_with_sort_options(
            self, request, expected_sort_options_expressions):
        """Tests setting query options with sort options from message."""
        returned_query, returned_sort_options, returned_returned_fields = (
            search_utils.set_search_query_options(request))
        del returned_query  # Unused.
        del returned_returned_fields  # Unused.
        for i in range(len(returned_sort_options.expressions)):
            self.assertEqual(returned_sort_options.expressions[i].expression,
                             expected_sort_options_expressions[i].expression)
            self.assertEqual(returned_sort_options.expressions[i].direction,
                             expected_sort_options_expressions[i].direction)
 def testSearchExpression(self):
     search_exp = shared_messages.SearchExpression(
         expression='FAKE-EXPRESSION',
         direction=shared_messages.SortDirection(0))
     self.assertEqual(search_exp.expression, 'FAKE-EXPRESSION')
     self.assertEqual(search_exp.direction.name, 'ASCENDING')