rm test file
This commit is contained in:
@@ -1,316 +0,0 @@
|
|||||||
from django.contrib.auth import get_user_model
|
|
||||||
from django.db import IntegrityError
|
|
||||||
from django.test import TestCase
|
|
||||||
|
|
||||||
from submission.models import Award, Submission, SubmissionAward
|
|
||||||
from task.models import Task
|
|
||||||
|
|
||||||
User = get_user_model()
|
|
||||||
|
|
||||||
|
|
||||||
def _make_user(username="student1", role="normal"):
|
|
||||||
return User.objects.create_user(username=username, password="pw", role=role)
|
|
||||||
|
|
||||||
|
|
||||||
def _make_task(display=1):
|
|
||||||
return Task.objects.create(
|
|
||||||
title=f"Task {display}", task_type="challenge", display=display, content=""
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def _make_submission(user, task, score=0.0):
|
|
||||||
return Submission.objects.create(
|
|
||||||
user=user, task=task, html="<p>hi</p>", css="", js="", score=score
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def _make_award(name="最佳设计", sort_order=0, is_active=True, item_ordering="manual"):
|
|
||||||
return Award.objects.create(
|
|
||||||
name=name,
|
|
||||||
sort_order=sort_order,
|
|
||||||
is_active=is_active,
|
|
||||||
item_ordering=item_ordering,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class AwardModelTest(TestCase):
|
|
||||||
def test_unique_submission_award(self):
|
|
||||||
user = _make_user()
|
|
||||||
task = _make_task()
|
|
||||||
sub = _make_submission(user, task)
|
|
||||||
award = _make_award()
|
|
||||||
SubmissionAward.objects.create(submission=sub, award=award)
|
|
||||||
|
|
||||||
with self.assertRaises(IntegrityError):
|
|
||||||
SubmissionAward.objects.create(submission=sub, award=award)
|
|
||||||
|
|
||||||
def test_submission_can_have_multiple_awards(self):
|
|
||||||
user = _make_user()
|
|
||||||
task = _make_task()
|
|
||||||
sub = _make_submission(user, task)
|
|
||||||
a1 = _make_award("奖1", sort_order=0)
|
|
||||||
a2 = _make_award("奖2", sort_order=1)
|
|
||||||
SubmissionAward.objects.create(submission=sub, award=a1)
|
|
||||||
SubmissionAward.objects.create(submission=sub, award=a2)
|
|
||||||
|
|
||||||
self.assertEqual(sub.awards.count(), 2)
|
|
||||||
|
|
||||||
def test_award_can_have_multiple_submissions(self):
|
|
||||||
user = _make_user()
|
|
||||||
task = _make_task()
|
|
||||||
sub1 = _make_submission(user, task, score=3.0)
|
|
||||||
task2 = _make_task(display=2)
|
|
||||||
sub2 = _make_submission(user, task2, score=4.0)
|
|
||||||
award = _make_award()
|
|
||||||
SubmissionAward.objects.create(submission=sub1, award=award)
|
|
||||||
SubmissionAward.objects.create(submission=sub2, award=award)
|
|
||||||
|
|
||||||
self.assertEqual(award.submission_awards.count(), 2)
|
|
||||||
|
|
||||||
|
|
||||||
class ShowcaseListTest(TestCase):
|
|
||||||
def setUp(self):
|
|
||||||
self.user = _make_user("student1")
|
|
||||||
self.task = _make_task()
|
|
||||||
|
|
||||||
def test_unauthenticated_returns_401(self):
|
|
||||||
resp = self.client.get("/api/submission/showcase/")
|
|
||||||
self.assertEqual(resp.status_code, 401)
|
|
||||||
|
|
||||||
def test_authenticated_returns_200(self):
|
|
||||||
self.client.force_login(self.user)
|
|
||||||
resp = self.client.get("/api/submission/showcase/")
|
|
||||||
self.assertEqual(resp.status_code, 200)
|
|
||||||
|
|
||||||
def test_inactive_award_not_returned(self):
|
|
||||||
award = _make_award("停用奖", is_active=False)
|
|
||||||
sub = _make_submission(self.user, self.task)
|
|
||||||
SubmissionAward.objects.create(submission=sub, award=award)
|
|
||||||
self.client.force_login(self.user)
|
|
||||||
resp = self.client.get("/api/submission/showcase/")
|
|
||||||
data = resp.json()
|
|
||||||
self.assertEqual(len(data), 0)
|
|
||||||
|
|
||||||
def test_award_with_no_items_not_returned(self):
|
|
||||||
_make_award("空奖项")
|
|
||||||
self.client.force_login(self.user)
|
|
||||||
resp = self.client.get("/api/submission/showcase/")
|
|
||||||
data = resp.json()
|
|
||||||
self.assertEqual(len(data), 0)
|
|
||||||
|
|
||||||
def test_active_award_with_items_returned(self):
|
|
||||||
award = _make_award("最佳设计")
|
|
||||||
sub = _make_submission(self.user, self.task)
|
|
||||||
SubmissionAward.objects.create(submission=sub, award=award)
|
|
||||||
self.client.force_login(self.user)
|
|
||||||
resp = self.client.get("/api/submission/showcase/")
|
|
||||||
data = resp.json()
|
|
||||||
self.assertEqual(len(data), 1)
|
|
||||||
self.assertEqual(data[0]["name"], "最佳设计")
|
|
||||||
self.assertEqual(len(data[0]["items"]), 1)
|
|
||||||
item = data[0]["items"][0]
|
|
||||||
self.assertEqual(item["username"], "student1")
|
|
||||||
self.assertEqual(item["has_prompt_chain"], False)
|
|
||||||
|
|
||||||
def test_manual_ordering_uses_sort_order(self):
|
|
||||||
award = _make_award("奖", item_ordering="manual")
|
|
||||||
sub1 = _make_submission(self.user, self.task)
|
|
||||||
task2 = _make_task(display=2)
|
|
||||||
sub2 = _make_submission(self.user, task2)
|
|
||||||
SubmissionAward.objects.create(submission=sub1, award=award, sort_order=2)
|
|
||||||
SubmissionAward.objects.create(submission=sub2, award=award, sort_order=1)
|
|
||||||
self.client.force_login(self.user)
|
|
||||||
resp = self.client.get("/api/submission/showcase/")
|
|
||||||
items = resp.json()[0]["items"]
|
|
||||||
self.assertEqual(items[0]["task_display"], task2.display)
|
|
||||||
self.assertEqual(items[1]["task_display"], self.task.display)
|
|
||||||
|
|
||||||
def test_score_ordering(self):
|
|
||||||
award = _make_award("奖", item_ordering="score")
|
|
||||||
sub1 = _make_submission(self.user, self.task, score=2.0)
|
|
||||||
task2 = _make_task(display=2)
|
|
||||||
sub2 = _make_submission(self.user, task2, score=4.0)
|
|
||||||
SubmissionAward.objects.create(submission=sub1, award=award)
|
|
||||||
SubmissionAward.objects.create(submission=sub2, award=award)
|
|
||||||
self.client.force_login(self.user)
|
|
||||||
resp = self.client.get("/api/submission/showcase/")
|
|
||||||
items = resp.json()[0]["items"]
|
|
||||||
self.assertGreater(items[0]["score"], items[1]["score"])
|
|
||||||
|
|
||||||
def test_view_count_ordering(self):
|
|
||||||
award = _make_award("奖", item_ordering="view_count")
|
|
||||||
sub1 = _make_submission(self.user, self.task)
|
|
||||||
sub1.view_count = 5
|
|
||||||
sub1.save(update_fields=["view_count"])
|
|
||||||
task2 = _make_task(display=2)
|
|
||||||
sub2 = _make_submission(self.user, task2)
|
|
||||||
sub2.view_count = 20
|
|
||||||
sub2.save(update_fields=["view_count"])
|
|
||||||
SubmissionAward.objects.create(submission=sub1, award=award)
|
|
||||||
SubmissionAward.objects.create(submission=sub2, award=award)
|
|
||||||
self.client.force_login(self.user)
|
|
||||||
resp = self.client.get("/api/submission/showcase/")
|
|
||||||
items = resp.json()[0]["items"]
|
|
||||||
self.assertGreater(items[0]["view_count"], items[1]["view_count"])
|
|
||||||
|
|
||||||
def test_has_prompt_chain_true_when_source_message_exists(self):
|
|
||||||
from prompt.models import Conversation, Message
|
|
||||||
|
|
||||||
award = _make_award("奖")
|
|
||||||
sub = _make_submission(self.user, self.task)
|
|
||||||
conv = Conversation.objects.create(user=self.user, task=self.task)
|
|
||||||
Message.objects.create(conversation=conv, role="user", content="做个按钮")
|
|
||||||
Message.objects.create(
|
|
||||||
conversation=conv,
|
|
||||||
role="assistant",
|
|
||||||
content="好的",
|
|
||||||
code_html="<button>OK</button>",
|
|
||||||
code_css="",
|
|
||||||
code_js="",
|
|
||||||
submission=sub,
|
|
||||||
)
|
|
||||||
SubmissionAward.objects.create(submission=sub, award=award)
|
|
||||||
self.client.force_login(self.user)
|
|
||||||
resp = self.client.get("/api/submission/showcase/")
|
|
||||||
item = resp.json()[0]["items"][0]
|
|
||||||
self.assertTrue(item["has_prompt_chain"])
|
|
||||||
|
|
||||||
|
|
||||||
class ShowcaseDetailTest(TestCase):
|
|
||||||
def setUp(self):
|
|
||||||
self.user = _make_user("student1")
|
|
||||||
self.task = _make_task()
|
|
||||||
self.award = _make_award("最佳设计")
|
|
||||||
self.sub = _make_submission(self.user, self.task, score=4.5)
|
|
||||||
self.sub.view_count = 10
|
|
||||||
self.sub.save(update_fields=["view_count"])
|
|
||||||
SubmissionAward.objects.create(submission=self.sub, award=self.award)
|
|
||||||
|
|
||||||
def test_unauthenticated_returns_401(self):
|
|
||||||
resp = self.client.get(f"/api/submission/showcase/{self.sub.id}/")
|
|
||||||
self.assertEqual(resp.status_code, 401)
|
|
||||||
|
|
||||||
def test_awarded_submission_accessible(self):
|
|
||||||
self.client.force_login(self.user)
|
|
||||||
resp = self.client.get(f"/api/submission/showcase/{self.sub.id}/")
|
|
||||||
self.assertEqual(resp.status_code, 200)
|
|
||||||
data = resp.json()
|
|
||||||
self.assertEqual(data["username"], "student1")
|
|
||||||
self.assertEqual(data["score"], 4.5)
|
|
||||||
self.assertEqual(data["view_count"], 10)
|
|
||||||
self.assertIn("最佳设计", data["awards"])
|
|
||||||
self.assertFalse(data["has_prompt_chain"])
|
|
||||||
|
|
||||||
def test_non_awarded_submission_returns_404(self):
|
|
||||||
other_sub = _make_submission(self.user, self.task)
|
|
||||||
self.client.force_login(self.user)
|
|
||||||
resp = self.client.get(f"/api/submission/showcase/{other_sub.id}/")
|
|
||||||
self.assertEqual(resp.status_code, 404)
|
|
||||||
|
|
||||||
def test_submission_shows_all_its_awards(self):
|
|
||||||
award2 = _make_award("最佳游戏", sort_order=1)
|
|
||||||
SubmissionAward.objects.create(submission=self.sub, award=award2)
|
|
||||||
self.client.force_login(self.user)
|
|
||||||
resp = self.client.get(f"/api/submission/showcase/{self.sub.id}/")
|
|
||||||
data = resp.json()
|
|
||||||
self.assertIn("最佳设计", data["awards"])
|
|
||||||
self.assertIn("最佳游戏", data["awards"])
|
|
||||||
|
|
||||||
|
|
||||||
class ShowcasePromptChainTest(TestCase):
|
|
||||||
def setUp(self):
|
|
||||||
from prompt.models import Conversation, Message as Msg
|
|
||||||
|
|
||||||
self.user = _make_user("student1")
|
|
||||||
self.task = _make_task()
|
|
||||||
self.award = _make_award("最佳设计")
|
|
||||||
self.sub = _make_submission(self.user, self.task)
|
|
||||||
SubmissionAward.objects.create(submission=self.sub, award=self.award)
|
|
||||||
|
|
||||||
self.conv = Conversation.objects.create(user=self.user, task=self.task)
|
|
||||||
Msg.objects.create(
|
|
||||||
conversation=self.conv,
|
|
||||||
role="user",
|
|
||||||
content="做个按钮",
|
|
||||||
source="conversation",
|
|
||||||
prompt_level=3,
|
|
||||||
)
|
|
||||||
Msg.objects.create(
|
|
||||||
conversation=self.conv,
|
|
||||||
role="assistant",
|
|
||||||
content="好的",
|
|
||||||
code_html="<button>OK</button>",
|
|
||||||
code_css="button{color:red}",
|
|
||||||
code_js="console.log(1)",
|
|
||||||
submission=self.sub,
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_unauthenticated_returns_401(self):
|
|
||||||
resp = self.client.get(
|
|
||||||
f"/api/submission/showcase/{self.sub.id}/prompt-chain/"
|
|
||||||
)
|
|
||||||
self.assertEqual(resp.status_code, 401)
|
|
||||||
|
|
||||||
def test_no_source_message_returns_404(self):
|
|
||||||
other_sub = _make_submission(self.user, self.task)
|
|
||||||
SubmissionAward.objects.create(submission=other_sub, award=self.award)
|
|
||||||
self.client.force_login(self.user)
|
|
||||||
resp = self.client.get(
|
|
||||||
f"/api/submission/showcase/{other_sub.id}/prompt-chain/"
|
|
||||||
)
|
|
||||||
self.assertEqual(resp.status_code, 404)
|
|
||||||
|
|
||||||
def test_non_awarded_submission_returns_404(self):
|
|
||||||
from prompt.models import Conversation, Message as Msg
|
|
||||||
|
|
||||||
other_sub = _make_submission(self.user, self.task)
|
|
||||||
conv = Conversation.objects.create(user=self.user, task=self.task)
|
|
||||||
Msg.objects.create(
|
|
||||||
conversation=conv,
|
|
||||||
role="assistant",
|
|
||||||
content="x",
|
|
||||||
submission=other_sub,
|
|
||||||
)
|
|
||||||
self.client.force_login(self.user)
|
|
||||||
resp = self.client.get(
|
|
||||||
f"/api/submission/showcase/{other_sub.id}/prompt-chain/"
|
|
||||||
)
|
|
||||||
self.assertEqual(resp.status_code, 404)
|
|
||||||
|
|
||||||
def test_returns_prompt_rounds(self):
|
|
||||||
self.client.force_login(self.user)
|
|
||||||
resp = self.client.get(f"/api/submission/showcase/{self.sub.id}/prompt-chain/")
|
|
||||||
self.assertEqual(resp.status_code, 200)
|
|
||||||
rounds = resp.json()
|
|
||||||
self.assertEqual(len(rounds), 1)
|
|
||||||
r = rounds[0]
|
|
||||||
self.assertEqual(r["question"], "做个按钮")
|
|
||||||
self.assertEqual(r["source"], "conversation")
|
|
||||||
self.assertEqual(r["prompt_level"], 3)
|
|
||||||
self.assertEqual(r["html"], "<button>OK</button>")
|
|
||||||
self.assertEqual(r["css"], "button{color:red}")
|
|
||||||
self.assertEqual(r["js"], "console.log(1)")
|
|
||||||
|
|
||||||
def test_multiple_rounds(self):
|
|
||||||
from prompt.models import Message as Msg
|
|
||||||
|
|
||||||
Msg.objects.create(
|
|
||||||
conversation=self.conv,
|
|
||||||
role="user",
|
|
||||||
content="再加个标题",
|
|
||||||
source="manual",
|
|
||||||
)
|
|
||||||
Msg.objects.create(
|
|
||||||
conversation=self.conv,
|
|
||||||
role="assistant",
|
|
||||||
content="好",
|
|
||||||
code_html="<h1>标题</h1>",
|
|
||||||
code_css="",
|
|
||||||
code_js="",
|
|
||||||
)
|
|
||||||
self.client.force_login(self.user)
|
|
||||||
resp = self.client.get(f"/api/submission/showcase/{self.sub.id}/prompt-chain/")
|
|
||||||
rounds = resp.json()
|
|
||||||
self.assertEqual(len(rounds), 2)
|
|
||||||
self.assertEqual(rounds[1]["question"], "再加个标题")
|
|
||||||
self.assertEqual(rounds[1]["source"], "manual")
|
|
||||||
Reference in New Issue
Block a user