Skip to content

Commit

Permalink
Add Score Checking on Prompt Models
Browse files Browse the repository at this point in the history
  • Loading branch information
jeffshek committed Aug 10, 2019
1 parent 6563093 commit 4ed0539
Show file tree
Hide file tree
Showing 9 changed files with 230 additions and 157 deletions.
40 changes: 40 additions & 0 deletions open/core/migrations/0003_add_score_to_prompt_model.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# Generated by Django 2.2.4 on 2019-08-10 06:24

from django.db import migrations, models
import django_fsm


class Migration(migrations.Migration):

dependencies = [("core", "0002_writeup_prompt_models_refactored")]

operations = [
migrations.AlterModelOptions(
name="writeupflaggedprompt",
options={"verbose_name": "Write Up Flagged Prompt"},
),
migrations.AlterModelOptions(
name="writeupprompt", options={"verbose_name": "Write Up Prompt"}
),
migrations.AlterModelOptions(
name="writeuppromptvote", options={"verbose_name": "Write Up Prompt Vote"}
),
migrations.AddField(
model_name="writeupprompt",
name="score",
field=models.IntegerField(default=0),
),
migrations.AlterField(
model_name="writeupprompt",
name="share_state",
field=django_fsm.FSMField(
choices=[
("unshared", "Unshared"),
("published_link_access_only", "Link Access Only"),
("published", "Published"),
],
default="unshared",
max_length=50,
),
),
]
2 changes: 1 addition & 1 deletion open/core/writeup/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
@admin.register(WriteUpPrompt)
class WriteUpPromptAdmin(admin.ModelAdmin):
list_display = (
"id",
"uuid",
"text",
"title",
Expand All @@ -21,6 +20,7 @@ class WriteUpPromptAdmin(admin.ModelAdmin):
"website",
"share_state",
"staff_verified_share_state",
"score",
)
list_filter = ("user",)

Expand Down
4 changes: 4 additions & 0 deletions open/core/writeup/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ class WriteUpPrompt(BaseModel):
choices=STAFF_VERIFIED_SHARE_STATE_CHOICES,
default=StaffVerifiedShareStates.UNVERIFIED,
)
# this is a denormalized field that is the sum of all the upvotes
# this serves as a quick queryable field, where it's also easy to easy
# to recompute for all prompts when cpu is idle
score = IntegerField(default=0)

class Meta:
verbose_name = "Write Up Prompt"
Expand Down
4 changes: 3 additions & 1 deletion open/core/writeup/serializers.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

from rest_framework import serializers
from rest_framework.fields import IntegerField, UUIDField

Expand All @@ -25,6 +24,8 @@ class WriteUpPromptCreateReadSerializer(serializers.ModelSerializer):
PROMPTS
"""

score = IntegerField(read_only=True)

class Meta:
model = WriteUpPrompt
fields = (
Expand All @@ -36,6 +37,7 @@ class Meta:
"twitter",
"website",
"share_state",
"score",
)


Expand Down
Empty file.
74 changes: 74 additions & 0 deletions open/core/writeup/tests/views/test_flagged_prompt_views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
from rest_framework.reverse import reverse
from rest_framework.test import APIClient
from test_plus import TestCase

from open.core.writeup.constants import WriteUpResourceEndpoints
from open.core.writeup.factories import (
WriteUpPromptFactory,
WriteUpFlaggedPromptFactory,
)
from open.core.writeup.models import WriteUpFlaggedPrompt
from open.users.factories import UserFactory
from open.users.models import User
from open.utilities.testing import generate_random_uuid_as_string


class WriteUpFlaggedPromptViewTests(TestCase):
VIEW_NAME = WriteUpResourceEndpoints.PROMPT_FLAGS

@classmethod
def setUpTestData(cls):
registered_user = UserFactory(is_staff=False)
cls.registered_user_id = registered_user.id

staff_user = UserFactory(is_staff=True)
cls.staff_user_id = staff_user.id

def setUp(self):
self.unregistered_user_client = APIClient()

self.registered_user = User.objects.get(id=self.registered_user_id)
self.registered_user_client = APIClient()
self.registered_user_client.force_login(self.registered_user)

self.staff_user = UserFactory(is_staff=True)
self.staff_user_client = APIClient()
self.staff_user_client.force_login(self.staff_user)

def test_view(self):
prompt = WriteUpPromptFactory()
data_kwargs = {"prompt_uuid": prompt.uuid_str}
url = reverse(self.VIEW_NAME, kwargs=data_kwargs)

response = self.registered_user_client.post(url)
self.assertEqual(response.status_code, 200)

def test_post_view_multiple_times_only_results_in_one(self):
prompt = WriteUpPromptFactory()
data_kwargs = {"prompt_uuid": prompt.uuid_str}
url = reverse(self.VIEW_NAME, kwargs=data_kwargs)

for _ in range(3):
self.registered_user_client.post(url)

instance_count = WriteUpFlaggedPrompt.objects.filter(
user=self.registered_user, prompt=prompt
).count()
self.assertEqual(instance_count, 1)

def test_view_delete(self):
prompt = WriteUpPromptFactory()
WriteUpFlaggedPromptFactory(user=self.registered_user, prompt=prompt)

data_kwargs = {"prompt_uuid": prompt.uuid_str}
url = reverse(self.VIEW_NAME, kwargs=data_kwargs)

response = self.registered_user_client.delete(url)
self.assertEqual(response.status_code, 204)

def test_view_delete_doesnt_exist(self):
data_kwargs = {"prompt_uuid": generate_random_uuid_as_string()}
url = reverse(self.VIEW_NAME, kwargs=data_kwargs)

response = self.registered_user_client.delete(url)
self.assertEqual(response.status_code, 404)
11 changes: 11 additions & 0 deletions open/core/writeup/tests/views/test_gpt2_debug_view.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from open.core.writeup.constants import WriteUpResourceEndpoints
from open.utilities.testing_mixins import OpenDefaultTest


class GPT2MediumPromptDebugViewTests(OpenDefaultTest):
VIEW_NAME = WriteUpResourceEndpoints.GENERATED_SENTENCE
VIEW_NEEDS_LOGIN = False

def test_get_view(self):
response = self._get_response_data()
self.assertTrue("prompt" in response)
Original file line number Diff line number Diff line change
@@ -1,42 +1,18 @@
from unittest import mock

from rest_framework.reverse import reverse
from rest_framework.test import APIClient
from test_plus import TestCase

from open.core.writeup.constants import (
WriteUpResourceEndpoints,
PromptShareStates,
StaffVerifiedShareStates,
)
from open.core.writeup.factories import (
WriteUpPromptFactory,
WriteUpFlaggedPromptFactory,
)
from open.core.writeup.models import (
WriteUpPrompt,
WriteUpPromptVote,
WriteUpFlaggedPrompt,
)
from open.users.factories import UserFactory
from open.users.models import User
from open.utilities.testing import generate_random_uuid_as_string
from open.utilities.testing_mixins import OpenDefaultTest, OpenDefaultAPITest

"""
dpy test core.writeup.tests.test_views --keepdb
"""


class GPT2MediumPromptDebugViewTests(OpenDefaultTest):
VIEW_NAME = WriteUpResourceEndpoints.GENERATED_SENTENCE
VIEW_NEEDS_LOGIN = False

def test_get_view(self):
response = self._get_response_data()
self.assertTrue("prompt" in response)
from open.core.writeup.factories import WriteUpPromptFactory
from open.core.writeup.models import WriteUpPrompt
from open.utilities.testing_mixins import OpenDefaultAPITest


# dpy test core.writeup.tests.views.test_prompt_view --keepdb
class WriteUpPromptViewTests(OpenDefaultAPITest):
VIEW_NAME = WriteUpResourceEndpoints.PROMPTS

Expand Down Expand Up @@ -232,137 +208,25 @@ def test_list_view_returns_published_stuff(self):
WriteUpPromptFactory.create_batch(5, share_state=PromptShareStates.UNSHARED)

url = reverse(self.VIEW_NAME)

response = self.registered_user_client.get(url)
data = response.data

# should only see 5, the ones that are PUBLISHED
self.assertEqual(5, len(response.data))

# we synthetically generate score on prompts
result = data[0]
self.assertIsNotNone(result["score"])

class WriteUpPromptVoteViewTests(TestCase):
VIEW_NAME = WriteUpResourceEndpoints.PROMPT_VOTES

@classmethod
def setUpTestData(cls):
registered_user = UserFactory(is_staff=False)
cls.registered_user_id = registered_user.id

staff_user = UserFactory(is_staff=True)
cls.staff_user_id = staff_user.id

def setUp(self):
self.unregistered_user_client = APIClient()

self.registered_user = User.objects.get(id=self.registered_user_id)
self.registered_user_client = APIClient()
self.registered_user_client.force_login(self.registered_user)

self.staff_user = UserFactory(is_staff=True)
self.staff_user_client = APIClient()
self.staff_user_client.force_login(self.staff_user)

def test_view(self):
prompt_uuid = WriteUpPromptFactory().uuid_str
url_kwargs = {"prompt_uuid": prompt_uuid}
url = reverse(self.VIEW_NAME, kwargs=url_kwargs)

data = {"value": 3}

response = self.registered_user_client.post(url, data=data)
self.assertEqual(response.status_code, 200)

def test_view_fake_uuid(self):
fake_uuid = generate_random_uuid_as_string()
url_kwargs = {"prompt_uuid": fake_uuid}
url = reverse(self.VIEW_NAME, kwargs=url_kwargs)

data = {"value": 3}

response = self.registered_user_client.post(url, data=data)
self.assertEqual(response.status_code, 404)

def test_no_login_has_no_access(self):
prompt_uuid = WriteUpPromptFactory().uuid_str
url_kwargs = {"prompt_uuid": prompt_uuid}
url = reverse(self.VIEW_NAME, kwargs=url_kwargs)

data = {"value": 3}

response = self.unregistered_user_client.post(url, data=data)
self.assertEqual(response.status_code, 403)

def test_post_multiple_times_only_results_in_one_record(self):
prompt_uuid = WriteUpPromptFactory().uuid_str
url_kwargs = {"prompt_uuid": prompt_uuid}
url = reverse(self.VIEW_NAME, kwargs=url_kwargs)

data = {"value": 3}

for _ in range(3):
self.registered_user_client.post(url, data=data)

count = WriteUpPromptVote.objects.filter(
user=self.registered_user, prompt__uuid=prompt_uuid
).count()
self.assertEqual(count, 1)


class WriteUpFlaggedPromptViewTests(TestCase):
VIEW_NAME = WriteUpResourceEndpoints.PROMPT_FLAGS

@classmethod
def setUpTestData(cls):
registered_user = UserFactory(is_staff=False)
cls.registered_user_id = registered_user.id

staff_user = UserFactory(is_staff=True)
cls.staff_user_id = staff_user.id

def setUp(self):
self.unregistered_user_client = APIClient()

self.registered_user = User.objects.get(id=self.registered_user_id)
self.registered_user_client = APIClient()
self.registered_user_client.force_login(self.registered_user)

self.staff_user = UserFactory(is_staff=True)
self.staff_user_client = APIClient()
self.staff_user_client.force_login(self.staff_user)

def test_view(self):
prompt = WriteUpPromptFactory()
data_kwargs = {"prompt_uuid": prompt.uuid_str}
url = reverse(self.VIEW_NAME, kwargs=data_kwargs)

response = self.registered_user_client.post(url)
self.assertEqual(response.status_code, 200)

def test_post_view_multiple_times_only_results_in_one(self):
prompt = WriteUpPromptFactory()
data_kwargs = {"prompt_uuid": prompt.uuid_str}
url = reverse(self.VIEW_NAME, kwargs=data_kwargs)

for _ in range(3):
self.registered_user_client.post(url)

instance_count = WriteUpFlaggedPrompt.objects.filter(
user=self.registered_user, prompt=prompt
).count()
self.assertEqual(instance_count, 1)

def test_view_delete(self):
prompt = WriteUpPromptFactory()
WriteUpFlaggedPromptFactory(user=self.registered_user, prompt=prompt)

data_kwargs = {"prompt_uuid": prompt.uuid_str}
url = reverse(self.VIEW_NAME, kwargs=data_kwargs)

response = self.registered_user_client.delete(url)
self.assertEqual(response.status_code, 204)

def test_view_delete_doesnt_exist(self):
data_kwargs = {"prompt_uuid": generate_random_uuid_as_string()}
url = reverse(self.VIEW_NAME, kwargs=data_kwargs)
def test_list_view_query_count(self):
WriteUpPromptFactory.create_batch(100, share_state=PromptShareStates.PUBLISHED)
WriteUpPromptFactory.create_batch(
5, share_state=PromptShareStates.PUBLISHED_LINK_ACCESS_ONLY
)
WriteUpPromptFactory.create_batch(5, share_state=PromptShareStates.UNSHARED)
url = reverse(self.VIEW_NAME)

response = self.registered_user_client.delete(url)
self.assertEqual(response.status_code, 404)
# it's currently five queries for the view / auth login / some permission checking
with self.assertNumQueriesLessThan(6):
response = self.registered_user_client.get(url)
self.assertEqual(response.status_code, 200)
Loading

0 comments on commit 4ed0539

Please sign in to comment.