Ejemplo n.º 1
0
 def test_indexers_courses_build_es_query_search_with_invalid_params(self):
     """
     Error case: the request contained invalid parameters
     """
     with self.assertRaises(QueryFormatException):
         CoursesIndexer.build_es_query(
             SimpleNamespace(query_params=QueryDict(query_string="limit=-2"))
         )
Ejemplo n.º 2
0
 def test_indexers_courses_build_es_query_search_by_terms_organizations(self):
     """
     Happy path: build a query that filters courses by more than 1 related organizations
     """
     # Build a request stub
     request = SimpleNamespace(
         query_params=QueryDict(
             query_string="organizations=13&organizations=15&limit=2"
         )
     )
     terms_organizations = {"terms": {"organizations": [13, 15]}}
     self.assertEqual(
         CoursesIndexer.build_es_query(request),
         (
             2,
             0,
             {"bool": {"must": [terms_organizations]}},
             {
                 "all_courses": {
                     "global": {},
                     "aggregations": {
                         "language@en": {
                             "filter": {
                                 "bool": {
                                     "must": [
                                         {"term": {"language": "en"}},
                                         terms_organizations,
                                     ]
                                 }
                             }
                         },
                         "language@fr": {
                             "filter": {
                                 "bool": {
                                     "must": [
                                         {"term": {"language": "fr"}},
                                         terms_organizations,
                                     ]
                                 }
                             }
                         },
                         "organizations": {
                             "filter": {"bool": {"must": []}},
                             "aggregations": {
                                 "organizations": {
                                     "terms": {"field": "organizations"}
                                 }
                             },
                         },
                         "subjects": {
                             "filter": {"bool": {"must": [terms_organizations]}},
                             "aggregations": {
                                 "subjects": {"terms": {"field": "subjects"}}
                             },
                         },
                     },
                 }
             },
         ),
     )
Ejemplo n.º 3
0
 def test_build_es_query_search_by_match_text(self):
     """
     Happy path: build a query that filters courses by matching text
     """
     # Build a request stub
     request = SimpleNamespace(
         query_params=QueryDict(
             query_string="query=some%20phrase%20terms&limit=2&offset=20"
         )
     )
     multi_match = {
         "multi_match": {
             "fields": ["short_description.*", "title.*"],
             "query": "some phrase terms",
             "type": "cross_fields",
         }
     }
     self.assertEqual(
         CoursesIndexer.build_es_query(request, self.facets),
         (
             2,
             20,
             {
                 "bool": {
                     "must": [
                         {
                             "multi_match": {
                                 "fields": ["short_description.*", "title.*"],
                                 "query": "some phrase terms",
                                 "type": "cross_fields",
                             }
                         }
                     ]
                 }
             },
             {
                 "all_courses": {
                     "global": {},
                     "aggregations": {
                         "organizations": {
                             "filter": {"bool": {"must": [multi_match]}},
                             "aggregations": {
                                 "organizations": {
                                     "terms": {"field": "organizations"}
                                 }
                             },
                         },
                         "subjects": {
                             "filter": {"bool": {"must": [multi_match]}},
                             "aggregations": {
                                 "subjects": {"terms": {"field": "subjects"}}
                             },
                         },
                     },
                 }
             },
         ),
     )
Ejemplo n.º 4
0
 def test_indexers_courses_build_es_query_search_all_courses(self):
     """
     Happy path: build a query that does not filter the courses at all
     """
     # Build a request stub
     request = SimpleNamespace(
         query_params=QueryDict(query_string="limit=2&offset=10")
     )
     self.assertEqual(
         CoursesIndexer.build_es_query(request),
         (
             2,
             10,
             {"match_all": {}},
             {
                 "all_courses": {
                     "global": {},
                     "aggregations": {
                         "language@en": {
                             "filter": {
                                 "bool": {"must": [{"term": {"language": "en"}}]}
                             }
                         },
                         "language@fr": {
                             "filter": {
                                 "bool": {"must": [{"term": {"language": "fr"}}]}
                             }
                         },
                         "organizations": {
                             "filter": {"bool": {"must": []}},
                             "aggregations": {
                                 "organizations": {
                                     "terms": {"field": "organizations"}
                                 }
                             },
                         },
                         "subjects": {
                             "filter": {"bool": {"must": []}},
                             "aggregations": {
                                 "subjects": {"terms": {"field": "subjects"}}
                             },
                         },
                     },
                 }
             },
         ),
     )
Ejemplo n.º 5
0
 def test_build_es_query_search_by_single_term_organizations(self):
     """
     Happy path: build a query that filters courses by exactly 1 related organization
     """
     # Build a request stub
     request = SimpleNamespace(
         query_params=QueryDict(query_string="organizations=345&limit=2")
     )
     term_organization = {"terms": {"organizations": [345]}}
     self.assertEqual(
         CoursesIndexer.build_es_query(request, self.facets),
         (
             2,
             0,
             {"bool": {"must": [term_organization]}},
             {
                 "all_courses": {
                     "global": {},
                     "aggregations": {
                         "organizations": {
                             "filter": {"bool": {"must": []}},
                             "aggregations": {
                                 "organizations": {
                                     "terms": {"field": "organizations"}
                                 }
                             },
                         },
                         "subjects": {
                             "filter": {"bool": {"must": [term_organization]}},
                             "aggregations": {
                                 "subjects": {"terms": {"field": "subjects"}}
                             },
                         },
                     },
                 }
             },
         ),
     )
Ejemplo n.º 6
0
 def test_indexers_courses_build_es_query_search_with_empty_filters(self):
     """
     Edge case: custom filters have been removed entirely through settings
     """
     # Build a request stub
     request = SimpleNamespace(
         query_params=QueryDict(query_string="limit=20&offset=40")
     )
     self.assertEqual(
         CoursesIndexer.build_es_query(request),
         (
             20,
             40,
             {"match_all": {}},
             {
                 "all_courses": {
                     "global": {},
                     "aggregations": {
                         "organizations": {
                             "filter": {"bool": {"must": []}},
                             "aggregations": {
                                 "organizations": {
                                     "terms": {"field": "organizations"}
                                 }
                             },
                         },
                         "subjects": {
                             "filter": {"bool": {"must": []}},
                             "aggregations": {
                                 "subjects": {"terms": {"field": "subjects"}}
                             },
                         },
                     },
                 }
             },
         ),
     )
Ejemplo n.º 7
0
 def test_indexers_courses_build_es_query_combined_search(self):
     """
     Happy path: build a query that filters courses by multiple filters, including a custom
     filter; make all aggs using all of those along with another custom filter
     """
     # Build a request stub
     start_date = json.dumps(["2018-01-01T06:00:00Z", None])
     end_date = json.dumps(["2018-04-30T06:00:00Z", "2018-06-30T06:00:00Z"])
     request = SimpleNamespace(
         query_params=QueryDict(
             query_string="subjects=42&subjects=84&query=these%20phrase%20terms&limit=2&"
             + "language=fr&"
             + "start_date={start_date}&end_date={end_date}".format(
                 start_date=start_date, end_date=end_date
             )
         )
     )
     range_end_date = {
         "range": {
             "end_date": {
                 "gte": arrow.get("2018-04-30T06:00:00Z").datetime,
                 "lte": arrow.get("2018-06-30T06:00:00Z").datetime,
             }
         }
     }
     multi_match = {
         "multi_match": {
             "fields": ["short_description.*", "title.*"],
             "query": "these phrase terms",
             "type": "cross_fields",
         }
     }
     range_start_date = {
         "range": {
             "start_date": {
                 "gte": arrow.get("2018-01-01T06:00:00Z").datetime,
                 "lte": None,
             }
         }
     }
     terms_subjects = {"terms": {"subjects": [42, 84]}}
     term_language_fr = {"term": {"language": "fr"}}
     self.assertEqual(
         CoursesIndexer.build_es_query(request),
         (
             2,
             0,
             {
                 "bool": {
                     "must": [
                         range_end_date,
                         multi_match,
                         range_start_date,
                         terms_subjects,
                         term_language_fr,
                     ]
                 }
             },
             {
                 "all_courses": {
                     "global": {},
                     "aggregations": {
                         "language@en": {
                             "filter": {
                                 "bool": {
                                     "must": [
                                         {"term": {"language": "en"}},
                                         range_end_date,
                                         multi_match,
                                         range_start_date,
                                         terms_subjects,
                                     ]
                                 }
                             }
                         },
                         "language@fr": {
                             "filter": {
                                 "bool": {
                                     "must": [
                                         term_language_fr,
                                         range_end_date,
                                         multi_match,
                                         range_start_date,
                                         terms_subjects,
                                     ]
                                 }
                             }
                         },
                         "new@new": {
                             "filter": {
                                 "bool": {
                                     "must": [
                                         {"term": {"session_number": 1}},
                                         range_end_date,
                                         multi_match,
                                         range_start_date,
                                         terms_subjects,
                                         term_language_fr,
                                     ]
                                 }
                             }
                         },
                         "organizations": {
                             "filter": {
                                 "bool": {
                                     "must": [
                                         range_end_date,
                                         multi_match,
                                         range_start_date,
                                         terms_subjects,
                                         term_language_fr,
                                     ]
                                 }
                             },
                             "aggregations": {
                                 "organizations": {
                                     "terms": {"field": "organizations"}
                                 }
                             },
                         },
                         "subjects": {
                             "filter": {
                                 "bool": {
                                     "must": [
                                         range_end_date,
                                         multi_match,
                                         range_start_date,
                                         term_language_fr,
                                     ]
                                 }
                             },
                             "aggregations": {
                                 "subjects": {"terms": {"field": "subjects"}}
                             },
                         },
                     },
                 }
             },
         ),
     )
Ejemplo n.º 8
0
 def test_indexers_courses_build_es_query_search_by_custom_filter(self):
     """
     Happy path: build a query using custom filters
     Note: we're keeping fields from defaults.py instead of mocking for simplicity
     """
     # Build a request stub
     request = SimpleNamespace(
         query_params=QueryDict(query_string="limit=2&offset=10&language=fr")
     )
     self.assertEqual(
         CoursesIndexer.build_es_query(request),
         (
             2,
             10,
             {"bool": {"must": [{"term": {"language": "fr"}}]}},
             {
                 "all_courses": {
                     "global": {},
                     "aggregations": {
                         "language@en": {
                             "filter": {
                                 "bool": {"must": [{"term": {"language": "en"}}]}
                             }
                         },
                         "language@fr": {
                             "filter": {
                                 "bool": {"must": [{"term": {"language": "fr"}}]}
                             }
                         },
                         "new@new": {
                             "filter": {
                                 "bool": {
                                     "must": [
                                         {"term": {"session_number": 1}},
                                         {"term": {"language": "fr"}},
                                     ]
                                 }
                             }
                         },
                         "organizations": {
                             "filter": {
                                 "bool": {"must": [{"term": {"language": "fr"}}]}
                             },
                             "aggregations": {
                                 "organizations": {
                                     "terms": {"field": "organizations"}
                                 }
                             },
                         },
                         "subjects": {
                             "filter": {
                                 "bool": {"must": [{"term": {"language": "fr"}}]}
                             },
                             "aggregations": {
                                 "subjects": {"terms": {"field": "subjects"}}
                             },
                         },
                     },
                 }
             },
         ),
     )
Ejemplo n.º 9
0
 def test_indexers_courses_build_es_query_search_by_range_datetimes(self):
     """
     Happy path: build a query that filters courses by start & end date datetime ranges
     """
     # Build a request stub
     start_date = json.dumps(["2018-01-01T06:00:00Z", None])
     end_date = json.dumps(["2018-04-30T06:00:00Z", "2018-06-30T06:00:00Z"])
     request = SimpleNamespace(
         query_params=QueryDict(
             query_string="start_date={start_date}&end_date={end_date}".format(
                 start_date=start_date, end_date=end_date
             )
         )
     )
     range_end_date = {
         "range": {
             "end_date": {
                 "gte": arrow.get("2018-04-30T06:00:00Z").datetime,
                 "lte": arrow.get("2018-06-30T06:00:00Z").datetime,
             }
         }
     }
     range_start_date = {
         "range": {
             "start_date": {
                 "gte": arrow.get("2018-01-01T06:00:00Z").datetime,
                 "lte": None,
             }
         }
     }
     self.assertEqual(
         CoursesIndexer.build_es_query(request),
         (
             None,
             0,
             {"bool": {"must": [range_end_date, range_start_date]}},
             {
                 "all_courses": {
                     "global": {},
                     "aggregations": {
                         "language@en": {
                             "filter": {
                                 "bool": {
                                     "must": [
                                         {"term": {"language": "en"}},
                                         range_end_date,
                                         range_start_date,
                                     ]
                                 }
                             }
                         },
                         "language@fr": {
                             "filter": {
                                 "bool": {
                                     "must": [
                                         {"term": {"language": "fr"}},
                                         range_end_date,
                                         range_start_date,
                                     ]
                                 }
                             }
                         },
                         "organizations": {
                             "filter": {
                                 "bool": {"must": [range_end_date, range_start_date]}
                             },
                             "aggregations": {
                                 "organizations": {
                                     "terms": {"field": "organizations"}
                                 }
                             },
                         },
                         "subjects": {
                             "filter": {
                                 "bool": {"must": [range_end_date, range_start_date]}
                             },
                             "aggregations": {
                                 "subjects": {"terms": {"field": "subjects"}}
                             },
                         },
                     },
                 }
             },
         ),
     )
Ejemplo n.º 10
0
 def test_build_es_query_combined_search(self):
     """
     Happy path: build a query that filters courses by multiple filters
     """
     # Build a request stub
     start_date = json.dumps(["2018-01-01T06:00:00Z", None])
     end_date = json.dumps(["2018-04-30T06:00:00Z", "2018-06-30T06:00:00Z"])
     request = SimpleNamespace(
         query_params=QueryDict(
             query_string="subjects=42&subjects=84&query=these%20phrase%20terms&limit=2&"
             + "start_date={start_date}&end_date={end_date}".format(
                 start_date=start_date, end_date=end_date
             )
         )
     )
     range_end_date = {
         "range": {
             "end_date": {
                 "gte": arrow.get("2018-04-30T06:00:00Z").datetime,
                 "lte": arrow.get("2018-06-30T06:00:00Z").datetime,
             }
         }
     }
     multi_match = {
         "multi_match": {
             "fields": ["short_description.*", "title.*"],
             "query": "these phrase terms",
             "type": "cross_fields",
         }
     }
     range_start_date = {
         "range": {
             "start_date": {
                 "gte": arrow.get("2018-01-01T06:00:00Z").datetime,
                 "lte": None,
             }
         }
     }
     terms_subjects = {"terms": {"subjects": [42, 84]}}
     self.assertEqual(
         CoursesIndexer.build_es_query(request, self.facets),
         (
             2,
             0,
             {
                 "bool": {
                     "must": [
                         range_end_date,
                         multi_match,
                         range_start_date,
                         terms_subjects,
                     ]
                 }
             },
             {
                 "all_courses": {
                     "global": {},
                     "aggregations": {
                         "organizations": {
                             "filter": {
                                 "bool": {
                                     "must": [
                                         range_end_date,
                                         multi_match,
                                         range_start_date,
                                         terms_subjects,
                                     ]
                                 }
                             },
                             "aggregations": {
                                 "organizations": {
                                     "terms": {"field": "organizations"}
                                 }
                             },
                         },
                         "subjects": {
                             "filter": {
                                 "bool": {
                                     "must": [
                                         range_end_date,
                                         multi_match,
                                         range_start_date,
                                     ]
                                 }
                             },
                             "aggregations": {
                                 "subjects": {"terms": {"field": "subjects"}}
                             },
                         },
                     },
                 }
             },
         ),
     )