Skip to content

Commit 402cb28

Browse files
committed
Fix historic error that prevented assessment items having files properly attached during updates.
Delete outdated, skipped assessment item tests.
1 parent feeffd5 commit 402cb28

3 files changed

Lines changed: 167 additions & 136 deletions

File tree

Lines changed: 0 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,7 @@
1-
import json
2-
31
import pytest
42
from django.urls import reverse_lazy
5-
from le_utils.constants import content_kinds
6-
from le_utils.constants import exercises
73

84
from .base import BaseAPITestCase
9-
from contentcuration.models import AssessmentItem
10-
from contentcuration.models import ContentNode
11-
from contentcuration.models import File
125
from contentcuration.models import User
136

147
pytestmark = pytest.mark.django_db
@@ -47,109 +40,3 @@ def test_readonly_fields(self):
4740
)
4841
self.channel.refresh_from_db()
4942
self.assertEqual(original_version, self.channel.version)
50-
51-
52-
# TODO: rtibbles - update tests to test sync behaviour.
53-
@pytest.mark.skip
54-
class AssessmentItemTestCase(BaseAPITestCase):
55-
def test_bulk_update(self):
56-
exercise = ContentNode.objects.filter(kind=content_kinds.EXERCISE).first()
57-
item1 = AssessmentItem.objects.create(contentnode=exercise)
58-
item2 = AssessmentItem.objects.create(contentnode=exercise)
59-
item3 = AssessmentItem.objects.create(contentnode=exercise)
60-
item1dict = {}
61-
item2dict = {}
62-
item3dict = {}
63-
for field in AssessmentItem._meta.fields:
64-
attname = field.attname
65-
set_attname = attname
66-
if attname == "contentnode_id":
67-
set_attname = "contentnode"
68-
item1dict[set_attname] = getattr(item1, attname)
69-
item2dict[set_attname] = getattr(item2, attname)
70-
item3dict[set_attname] = getattr(item3, attname)
71-
item1dict["question"] = "test"
72-
item2dict["type"] = "test"
73-
self.client.put(
74-
reverse_lazy("assessmentitem-list"),
75-
json.dumps([item1dict, item2dict, item3dict]),
76-
content_type="application/json",
77-
)
78-
item1.refresh_from_db()
79-
self.assertEqual(item1.question, "test")
80-
item2.refresh_from_db()
81-
self.assertEqual(item2.type, "test")
82-
item3.refresh_from_db()
83-
self.assertEqual(item3.question, item3dict["question"])
84-
85-
def test_bulk_update_non_existent_item(self):
86-
exercise = ContentNode.objects.filter(kind=content_kinds.EXERCISE).first()
87-
item1 = AssessmentItem.objects.create(contentnode=exercise)
88-
item1dict = {}
89-
item2dict = {}
90-
item3dict = {}
91-
for field in AssessmentItem._meta.fields:
92-
attname = field.attname
93-
set_attname = attname
94-
if attname == "contentnode_id":
95-
set_attname = "contentnode"
96-
item1dict[set_attname] = getattr(item1, attname)
97-
item2dict[set_attname] = getattr(item1, attname)
98-
item3dict[set_attname] = getattr(item1, attname)
99-
item2dict["id"] = 10000
100-
item3dict["id"] = 10001
101-
item1dict["question"] = "test"
102-
response = self.client.put(
103-
reverse_lazy("assessmentitem-list"),
104-
json.dumps([item1dict, item2dict, item3dict]),
105-
content_type="application/json",
106-
)
107-
self.assertEqual(response.status_code, 400)
108-
109-
def test_bulk_update_checksum_file_not_associated_create_new_file_object(self):
110-
exercise = ContentNode.objects.filter(kind=content_kinds.EXERCISE).first()
111-
item1 = AssessmentItem.objects.create(contentnode=exercise)
112-
item1dict = {}
113-
for field in AssessmentItem._meta.fields:
114-
attname = field.attname
115-
set_attname = attname
116-
if attname == "contentnode_id":
117-
set_attname = "contentnode"
118-
item1dict[set_attname] = getattr(item1, attname)
119-
checksum = "b6d83d66859b0cf095ef81120ef98e1f"
120-
item1dict["question"] = (
121-
"![I'm an image!]($"
122-
+ exercises.IMG_PLACEHOLDER
123-
+ "/{checksum}.gif)".format(checksum=checksum)
124-
)
125-
File.objects.create(checksum=checksum)
126-
self.client.put(
127-
reverse_lazy("assessmentitem-list"),
128-
json.dumps([item1dict]),
129-
content_type="application/json",
130-
)
131-
self.assertEqual(File.objects.filter(checksum=checksum).count(), 2)
132-
133-
def test_bulk_update_checksum_file_associated_use_existing_file_object(self):
134-
exercise = ContentNode.objects.filter(kind=content_kinds.EXERCISE).first()
135-
item1 = AssessmentItem.objects.create(contentnode=exercise)
136-
item1dict = {}
137-
for field in AssessmentItem._meta.fields:
138-
attname = field.attname
139-
set_attname = attname
140-
if attname == "contentnode_id":
141-
set_attname = "contentnode"
142-
item1dict[set_attname] = getattr(item1, attname)
143-
checksum = "b6d83d66859b0cf095ef81120ef98e1f"
144-
item1dict["question"] = (
145-
"![I'm an image!]($"
146-
+ exercises.IMG_PLACEHOLDER
147-
+ "/{checksum}.gif)".format(checksum=checksum)
148-
)
149-
File.objects.create(checksum=checksum, assessment_item=item1)
150-
self.client.put(
151-
reverse_lazy("assessmentitem-list"),
152-
json.dumps([item1dict]),
153-
content_type="application/json",
154-
)
155-
self.assertEqual(File.objects.filter(checksum=checksum).count(), 1)

contentcuration/contentcuration/tests/viewsets/test_assessmentitem.py

Lines changed: 132 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ def test_create_assessmentitem_no_node_permission(self):
9393
except models.AssessmentItem.DoesNotExist:
9494
pass
9595

96-
def test_create_assessmentitem_with_file_question(self):
96+
def test_create_assessmentitem_with_incorrect_file_placeholder_in_question(self):
9797
self.client.force_authenticate(user=self.user)
9898
assessmentitem = self.assessmentitem_metadata
9999
image_file = testdata.fileobj_exercise_image()
@@ -103,6 +103,43 @@ def test_create_assessmentitem_with_file_question(self):
103103
exercises.IMG_PLACEHOLDER, image_file.checksum, image_file.file_format_id
104104
)
105105

106+
assessmentitem["question"] = question
107+
response = self.sync_changes(
108+
[
109+
generate_create_event(
110+
[assessmentitem["contentnode"], assessmentitem["assessment_id"]],
111+
ASSESSMENTITEM,
112+
assessmentitem,
113+
channel_id=self.channel.id,
114+
)
115+
],
116+
)
117+
self.assertEqual(response.status_code, 200, response.content)
118+
try:
119+
ai = models.AssessmentItem.objects.get(
120+
assessment_id=assessmentitem["assessment_id"]
121+
)
122+
except models.AssessmentItem.DoesNotExist:
123+
self.fail("AssessmentItem was not created")
124+
try:
125+
file = ai.files.get()
126+
self.assertEqual(file.id, image_file.id)
127+
self.fail("File was updated")
128+
except models.File.DoesNotExist:
129+
pass
130+
131+
def test_create_assessmentitem_with_file_question(self):
132+
self.client.force_authenticate(user=self.user)
133+
assessmentitem = self.assessmentitem_metadata
134+
image_file = testdata.fileobj_exercise_image()
135+
image_file.uploaded_by = self.user
136+
image_file.save()
137+
question = "![alt_text](${}/{}.{})".format(
138+
exercises.CONTENT_STORAGE_PLACEHOLDER,
139+
image_file.checksum,
140+
image_file.file_format_id,
141+
)
142+
106143
assessmentitem["question"] = question
107144
response = self.sync_changes(
108145
[
@@ -127,14 +164,84 @@ def test_create_assessmentitem_with_file_question(self):
127164
except models.File.DoesNotExist:
128165
self.fail("File was not updated")
129166

167+
def test_create_assessmentitem_with_file_in_question_no_file_object(self):
168+
self.client.force_authenticate(user=self.user)
169+
assessmentitem = self.assessmentitem_metadata
170+
image_file = testdata.fileobj_exercise_image()
171+
image_file.uploaded_by = self.user
172+
image_file.save()
173+
question = "![alt_text](${}/{}.{})".format(
174+
exercises.CONTENT_STORAGE_PLACEHOLDER,
175+
image_file.checksum,
176+
image_file.file_format_id,
177+
)
178+
179+
image_file.delete()
180+
181+
assessmentitem["question"] = question
182+
response = self.sync_changes(
183+
[
184+
generate_create_event(
185+
[assessmentitem["contentnode"], assessmentitem["assessment_id"]],
186+
ASSESSMENTITEM,
187+
assessmentitem,
188+
channel_id=self.channel.id,
189+
)
190+
],
191+
)
192+
self.assertEqual(response.status_code, 200, response.content)
193+
try:
194+
ai = models.AssessmentItem.objects.get(
195+
assessment_id=assessmentitem["assessment_id"]
196+
)
197+
except models.AssessmentItem.DoesNotExist:
198+
self.fail("AssessmentItem was not created")
199+
try:
200+
file = ai.files.get()
201+
self.assertEqual(file.assessment_item_id, ai.id)
202+
except models.File.DoesNotExist:
203+
self.fail("File was not created")
204+
205+
def test_create_assessmentitem_with_file_in_question_no_file_uploaded(self):
206+
self.client.force_authenticate(user=self.user)
207+
assessmentitem = self.assessmentitem_metadata
208+
question = "![alt_text](${}/{}.{})".format(
209+
exercises.CONTENT_STORAGE_PLACEHOLDER,
210+
"123456789012345678901234567890ab",
211+
"jpg",
212+
)
213+
214+
assessmentitem["question"] = question
215+
response = self.sync_changes(
216+
[
217+
generate_create_event(
218+
[assessmentitem["contentnode"], assessmentitem["assessment_id"]],
219+
ASSESSMENTITEM,
220+
assessmentitem,
221+
channel_id=self.channel.id,
222+
)
223+
],
224+
)
225+
self.assertEqual(response.status_code, 200, response.content)
226+
self.assertEqual(len(response.data["errors"]), 1)
227+
try:
228+
models.AssessmentItem.objects.get(
229+
assessment_id=assessmentitem["assessment_id"]
230+
)
231+
self.fail("AssessmentItem was created")
232+
except models.AssessmentItem.DoesNotExist:
233+
pass
234+
130235
def test_create_assessmentitem_with_file_answers(self):
131236
self.client.force_authenticate(user=self.user)
132237
assessmentitem = self.assessmentitem_metadata
133238
image_file = testdata.fileobj_exercise_image()
134239
image_file.uploaded_by = self.user
135240
image_file.save()
136241
answer = "![alt_text](${}/{}.{})".format(
137-
exercises.IMG_PLACEHOLDER, image_file.checksum, image_file.file_format_id
242+
exercises.CONTENT_STORAGE_PLACEHOLDER,
243+
image_file.checksum,
244+
image_file.file_format_id,
138245
)
139246

140247
answers = [{"answer": answer, "correct": False, "order": 1}]
@@ -171,7 +278,9 @@ def test_create_assessmentitem_with_file_hints(self):
171278
image_file.uploaded_by = self.user
172279
image_file.save()
173280
hint = "![alt_text](${}/{}.{})".format(
174-
exercises.IMG_PLACEHOLDER, image_file.checksum, image_file.file_format_id
281+
exercises.CONTENT_STORAGE_PLACEHOLDER,
282+
image_file.checksum,
283+
image_file.file_format_id,
175284
)
176285
hints = [
177286
{"hint": hint, "order": 1},
@@ -209,7 +318,9 @@ def test_create_assessmentitem_with_file_no_permission(self):
209318
assessmentitem = self.assessmentitem_metadata
210319
image_file = testdata.fileobj_exercise_image()
211320
question = "![alt_text](${}/{}.{})".format(
212-
exercises.IMG_PLACEHOLDER, image_file.checksum, image_file.file_format_id
321+
exercises.CONTENT_STORAGE_PLACEHOLDER,
322+
image_file.checksum,
323+
image_file.file_format_id,
213324
)
214325
assessmentitem["question"] = question
215326
response = self.sync_changes(
@@ -223,14 +334,17 @@ def test_create_assessmentitem_with_file_no_permission(self):
223334
],
224335
)
225336
self.assertEqual(response.status_code, 200, response.content)
226-
self.assertEqual(len(response.json()["errors"]), 1)
227337
try:
228-
models.AssessmentItem.objects.get(
338+
ai = models.AssessmentItem.objects.get(
229339
assessment_id=assessmentitem["assessment_id"]
230340
)
231-
self.fail("AssessmentItem was created")
232341
except models.AssessmentItem.DoesNotExist:
233-
pass
342+
self.fail("AssessmentItem was not created")
343+
try:
344+
file = ai.files.get()
345+
self.assertEqual(file.assessment_item_id, ai.id)
346+
except models.File.DoesNotExist:
347+
self.fail("File was not created")
234348

235349
self.assertIsNone(image_file.assessment_item)
236350

@@ -324,7 +438,9 @@ def test_update_assessmentitem_with_file(self):
324438
image_file.uploaded_by = self.user
325439
image_file.save()
326440
question = "![alt_text](${}/{}.{})".format(
327-
exercises.IMG_PLACEHOLDER, image_file.checksum, image_file.file_format_id
441+
exercises.CONTENT_STORAGE_PLACEHOLDER,
442+
image_file.checksum,
443+
image_file.file_format_id,
328444
)
329445

330446
self.client.force_authenticate(user=self.user)
@@ -352,7 +468,9 @@ def test_update_assessmentitem_with_file_no_permissions(self):
352468
)
353469
image_file = testdata.fileobj_exercise_image()
354470
question = "![alt_text](${}/{}.{})".format(
355-
exercises.IMG_PLACEHOLDER, image_file.checksum, image_file.file_format_id
471+
exercises.CONTENT_STORAGE_PLACEHOLDER,
472+
image_file.checksum,
473+
image_file.file_format_id,
356474
)
357475

358476
self.client.force_authenticate(user=self.user)
@@ -367,13 +485,13 @@ def test_update_assessmentitem_with_file_no_permissions(self):
367485
],
368486
)
369487
self.assertEqual(response.status_code, 200, response.content)
370-
self.assertEqual(len(response.json()["errors"]), 1)
371488
try:
372489
file = assessmentitem.files.get()
373-
self.assertNotEqual(file.id, image_file.id)
374-
self.fail("File was updated")
490+
self.assertEqual(file.assessment_item_id, assessmentitem.id)
375491
except models.File.DoesNotExist:
376-
pass
492+
self.fail("File was not created")
493+
494+
self.assertIsNone(image_file.assessment_item)
377495

378496
def test_update_assessmentitem_remove_file(self):
379497

0 commit comments

Comments
 (0)