Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def execute_query(self, querystring=""):
"""
Not a test.
This method is doing the heavy lifting for the tests in this class: create and fill the
index with our organizations so we can run our queries and check the results.
It also executes the query and returns the result from the API.
"""
# Index these organizations in Elasticsearch
indices_client = IndicesClient(client=ES_CLIENT)
# Delete any existing indices so we get a clean slate
indices_client.delete(index="_all")
# Create an index we'll use to test the ES features
indices_client.create(index="test_organizations")
indices_client.close(index="test_organizations")
indices_client.put_settings(body=ANALYSIS_SETTINGS, index="test_organizations")
indices_client.open(index="test_organizations")
# Use the default organizations mapping from the Indexer
indices_client.put_mapping(
body=OrganizationsIndexer.mapping,
doc_type="organization",
index="test_organizations",
)
# Actually insert our organizations in the index
def test_viewsets_persons_retrieve(self):
"""
Happy path: the client requests an existing person, gets it back
"""
with mock.patch.object(
ES_CLIENT,
"get",
return_value={
"_id": 42,
"_source": {
"portrait": {"fr": "/portrait.png"},
"title": {"fr": "Edmond Dantès"},
},
},
):
# Note: we need to use a separate argument for the ID as that is what the ViewSet uses
response = self.client.get("/api/v1.0/persons/42/")
# The client received a proper response with the relevant person
self.assertEqual(response.status_code, 200)
self.assertEqual(
response.data,
def execute_query(self, querystring=""):
"""
Not a test.
This method is doing the heavy lifting for the tests in this class: create and fill the
index with our courses so we can run our queries and check our facet counts.
It also executes the query and returns the result from the API.
"""
# Create the subject category page. This is necessary to link the subjects we
# defined above with the "subjects" filter
# As it is the only page we create, we expect it to have the path "0001"
CategoryFactory(page_reverse_id="subjects", should_publish=True)
# Index these 4 courses in Elasticsearch
indices_client = IndicesClient(client=ES_CLIENT)
# Delete any existing indices so we get a clean slate
indices_client.delete(index="_all")
# Create an index we'll use to test the ES features
indices_client.create(index="test_courses")
indices_client.close(index="test_courses")
indices_client.put_settings(body=ANALYSIS_SETTINGS, index="test_courses")
indices_client.open(index="test_courses")
# Use the default courses mapping from the Indexer
indices_client.put_mapping(
body=CoursesIndexer.mapping, doc_type="course", index="test_courses"
)
# Add the sorting script
ES_CLIENT.put_script(id="state", body=CoursesIndexer.scripts["state"])
# Actually insert our courses in the index
actions = [
"effort": {"en": "N/A"},
"icon": {"en": "icon.jpg"},
"title": {"en": "title"},
**COURSES[course_id],
"course_runs": sorted(
[
# Each course randomly gets 2 course runs (thanks to above shuffle)
COURSE_RUNS[course_run_id]
for course_run_id in course_run_ids
],
key=lambda o: now - o["end"],
),
}
for course_id, course_run_ids in courses_definition
]
bulk(actions=actions, chunk_size=500, client=ES_CLIENT)
indices_client.refresh()
response = self.client.get(f"/api/v1.0/courses/?{querystring:s}")
self.assertEqual(response.status_code, 200)
return courses_definition, json.loads(response.content)
"_id": category["id"],
"_index": "test_categories",
"_op_type": "create",
"_type": "category",
"absolute_url": {"en": "en/url"},
"description": {"en": "en/description"},
"icon": {"en": "en/icon"},
"is_meta": False,
"logo": {"en": "en/logo"},
"nb_children": 0,
"path": category["id"],
**category,
}
for category in CATEGORIES
]
bulk(actions=actions, chunk_size=500, client=ES_CLIENT)
indices_client.refresh()
response = self.client.get(f"/api/v1.0/{kind:s}/?{querystring:s}")
self.assertEqual(response.status_code, 200)
return json.loads(response.content)
def test_viewsets_organizations_retrieve(self):
"""
Happy path: the client requests an existing organization, gets it back
"""
with mock.patch.object(
ES_CLIENT,
"get",
return_value={
"_id": 42,
"_source": {
"logo": {"fr": "/logo.png"},
"title": {"fr": "Université Paris 42"},
},
},
):
# Note: we need to use a separate argument for the ID as that is what the ViewSet uses
response = self.client.get("/api/v1.0/organizations/42/")
# The client received a proper response with the relevant organization
self.assertEqual(response.status_code, 200)
self.assertEqual(
response.data,
def test_viewsets_persons_retrieve_unknown(self):
"""
Error case: the client is asking for an person that does not exist
"""
# Act like the ES client would when we attempt to get a non-existent document
with mock.patch.object(ES_CLIENT, "get", side_effect=NotFoundError):
response = self.client.get("/api/v1.0/persons/43/", follow=True)
# The client received a standard NotFound response
self.assertEqual(response.status_code, 404)
def test_index_manager_regenerate_indices_from_broken_state(self, *args):
"""
`regenerate_indices` should succeed and give us a working ElasticSearch
when it runs and finds a broken state (eg. with an existing, incorrect
index with the name of an alias).
This can occur when ES restarts and an update signal is triggered before
Richie had a chance to bootstrap ES.
"""
# The indices client will be used to test the actual indices in ElasticSearch
indices_client = IndicesClient(client=ES_CLIENT)
# Create a course and trigger a signal to index it. This will create a
# broken "richie_test_courses" index
course = CourseFactory(should_publish=True)
update_course(course.extended_object, "en")
self.assertIsNotNone(indices_client.get("richie_test_courses"))
# Call our `regenerate_indices command`
creation_datetime = datetime(2010, 1, 1, tzinfo=timezone.utc)
creation_string = creation_datetime.strftime("%Y-%m-%d-%Hh%Mm%S.%fs")
with mock.patch.object(timezone, "now", return_value=creation_datetime):
regenerate_indices(None)
# No error was thrown, the courses index (like all others) was bootstrapped
self.assertIsNotNone(
indices_client.get(f"richie_test_courses_{creation_string}")
# Index these 4 courses in Elasticsearch
indices_client = IndicesClient(client=ES_CLIENT)
# Delete any existing indices so we get a clean slate
indices_client.delete(index="_all")
# Create an index we'll use to test the ES features
indices_client.create(index="test_courses")
indices_client.close(index="test_courses")
indices_client.put_settings(body=ANALYSIS_SETTINGS, index="test_courses")
indices_client.open(index="test_courses")
# Use the default courses mapping from the Indexer
indices_client.put_mapping(
body=CoursesIndexer.mapping, doc_type="course", index="test_courses"
)
# Add the sorting script
ES_CLIENT.put_script(id="state", body=CoursesIndexer.scripts["state"])
# Actually insert our courses in the index
actions = [
{
"_id": course["id"],
"_index": "test_courses",
"_op_type": "create",
"_type": "course",
"absolute_url": {"en": "url"},
"cover_image": {"en": "image"},
"title": {"en": "title"},
**course,
"course_runs": [
{
"languages": course_run["languages"],
"start": arrow.utcnow().datetime,
"end": arrow.utcnow().datetime,
def setUp(self):
"""
Make sure all indices are deleted before each new test is run.
"""
super().setUp()
self.indices_client = IndicesClient(client=ES_CLIENT)
self.indices_client.delete(index="_all")