def test_execute(self, mock_save, mock_execute, mock_now):
        """Test the execute class method."""
        search = Search()
        sq = SearchQuery.execute(search)
        self.assertEqual(sq.user, None)
        self.assertEqual(sq.index, '_all')
        self.assertEqual(sq.query, search.to_dict())
        self.assertEqual(sq.hits, [])
        self.assertEqual(sq.total_hits, mock_execute.return_value.hits.total)
        self.assertEqual(sq.reference, '')
        self.assertTrue(sq.duration > 0)
        self.assertEqual(sq.executed_at, mock_now.return_value)
        mock_save.assert_called_once_with()

        # try without saving
        mock_save.reset_mock()
        sq = SearchQuery.execute(search, save=False)
        mock_save.assert_not_called()
 def test_execute_count(self, mock_count):
     mock_count.return_value = 100
     search = Search()
     sq = execute_count(search,
                        search_terms="foo",
                        user=None,
                        reference="bar")
     sq.refresh_from_db()  # just to confirm it saves in / out
     self.assertIsNotNone(sq.id)
     self.assertEqual(sq.search_terms, "foo")
     self.assertEqual(sq.reference, "bar")
     self.assertEqual(sq.query, search.to_dict())
     self.assertEqual(sq.index, "_all")
     self.assertEqual(sq.hits, [])
     self.assertEqual(sq.total_hits, 100)
     self.assertEqual(sq.total_hits_relation,
                      SearchQuery.TotalHitsRelation.ACCURATE)
     self.assertEqual(sq.query_type, SearchQuery.QueryType.COUNT)
     self.assertEqual(sq.aggregations, {})
     self.assertTrue(sq.duration > 0)
    def test_execute_search(self, mock_search):
        # lots of mocking to get around lack of ES server during tests

        def mock_hit(meta_dict):
            # Returns a mock that looks like a Hit
            hm = mock.Mock(spec=HitMeta)
            hm.to_dict.return_value = meta_dict
            return mock.Mock(spec=Hit, meta=hm)

        response = mock.MagicMock(spec=Response)
        response.hits.__iter__.return_value = iter(
            [mock_hit(h) for h in ExecuteFunctionTests.hits])
        response.hits.total.value = 100
        response.hits.total.relation = "gte"
        response.aggregations = mock.Mock(spec=AggResponse)
        response.aggregations.to_dict.return_value = ExecuteFunctionTests.aggregations
        mock_search.return_value = response

        search = Search()
        sq = execute_search(search,
                            search_terms="foo",
                            user=None,
                            reference="bar")
        sq.refresh_from_db()  # just to confirm it saves in / out
        self.assertIsNotNone(sq.id)
        self.assertEqual(sq.search_terms, "foo")
        self.assertEqual(sq.reference, "bar")
        self.assertEqual(sq.query, search.to_dict())
        self.assertEqual(sq.index, "_all")
        self.assertEqual(sq.hits, ExecuteFunctionTests.hits)
        self.assertEqual(sq.total_hits, 100)
        self.assertEqual(sq.total_hits_relation,
                         SearchQuery.TotalHitsRelation.ESTIMATE)
        self.assertEqual(sq.query_type, SearchQuery.QueryType.SEARCH)
        self.assertEqual(sq.aggregations, ExecuteFunctionTests.aggregations)
        self.assertTrue(sq.duration > 0)