From b2072151f2541eb2c49d9212c71fb634e0c96ee4 Mon Sep 17 00:00:00 2001 From: Too-Far Date: Fri, 1 May 2020 11:35:45 -0400 Subject: [PATCH 01/11] Created SuccessStory model in DB, added model to admin, created serializer and view for new model. Created a test.py file, but I am unable to write the tests without help. --- src/api/admin.py | 10 ++++++++ src/api/migrations/0009_successstory.py | 23 +++++++++++++++++++ src/api/migrations/0010_auto_20200501_1444.py | 17 ++++++++++++++ src/api/models.py | 13 +++++++++++ src/api/serializers.py | 7 ++++++ src/api/views.py | 8 +++++++ src/tests/integration/test_success_story.py | 4 ++++ 7 files changed, 82 insertions(+) create mode 100644 src/api/migrations/0009_successstory.py create mode 100644 src/api/migrations/0010_auto_20200501_1444.py create mode 100644 src/tests/integration/test_success_story.py diff --git a/src/api/admin.py b/src/api/admin.py index 413e7154..070cdb24 100644 --- a/src/api/admin.py +++ b/src/api/admin.py @@ -6,6 +6,7 @@ Scholarship, ScholarshipApplication, TeamMember, + SuccessStory, ) @@ -73,3 +74,12 @@ class CodeSchoolAdmin(admin.ModelAdmin): ) search_fields = ("name", "rep_name", "rep_email", "url") + +@admin.register(SuccessStory) +class SuccessStoryAdmin(admin.ModelAdmin): + list_display = ( + "created_by", + "created_at", + "text", + "is_approved", + ) diff --git a/src/api/migrations/0009_successstory.py b/src/api/migrations/0009_successstory.py new file mode 100644 index 00000000..46b1f721 --- /dev/null +++ b/src/api/migrations/0009_successstory.py @@ -0,0 +1,23 @@ +# Generated by Django 2.2.10 on 2020-05-01 14:35 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0008_codeschool_is_vet_tec_approved'), + ] + + operations = [ + migrations.CreateModel( + name='SuccessStory', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_by', models.CharField(blank=True, max_length=256, null=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('text', models.TextField(blank=True, null=True)), + ('is_approved', models.BooleanField(blank=True, null=True)), + ], + ), + ] diff --git a/src/api/migrations/0010_auto_20200501_1444.py b/src/api/migrations/0010_auto_20200501_1444.py new file mode 100644 index 00000000..54c295ad --- /dev/null +++ b/src/api/migrations/0010_auto_20200501_1444.py @@ -0,0 +1,17 @@ +# Generated by Django 2.2.10 on 2020-05-01 14:44 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0009_successstory'), + ] + + operations = [ + migrations.AlterModelOptions( + name='successstory', + options={'verbose_name_plural': 'Success Stories'}, + ), + ] diff --git a/src/api/models.py b/src/api/models.py index f80adb05..8bd24fde 100644 --- a/src/api/models.py +++ b/src/api/models.py @@ -92,3 +92,16 @@ def __str__(self): class Meta: db_table = "api_team_members" + + +class SuccessStory(models.Model): + created_by = models.CharField(max_length=256, blank=True, null=True) + created_at = models.DateTimeField(auto_now_add=True) + text = models.TextField(blank=True, null=True) + is_approved = models.BooleanField(blank=True, null=True) + + def __str__(self): + return f"{self.created_by} - {self.is_approved}" + + class Meta: + verbose_name_plural = 'Success Stories' diff --git a/src/api/serializers.py b/src/api/serializers.py index 457789c0..ce5d4f7c 100644 --- a/src/api/serializers.py +++ b/src/api/serializers.py @@ -6,6 +6,7 @@ Scholarship, ScholarshipApplication, TeamMember, + SuccessStory, ) @@ -39,3 +40,9 @@ class TeamMemberSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = TeamMember fields = "__all__" + + +class SuccessStorySerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = SuccessStory + fields = "__all__" diff --git a/src/api/views.py b/src/api/views.py index 22c260b3..4da11a60 100644 --- a/src/api/views.py +++ b/src/api/views.py @@ -7,6 +7,7 @@ Scholarship, ScholarshipApplication, TeamMember, + SuccessStory, ) from api.serializers import ( CodeSchoolSerializer, @@ -14,6 +15,7 @@ ScholarshipApplicationSerializer, ScholarshipSerializer, TeamMemberSerializer, + SuccessStorySerializer, ) @@ -41,3 +43,9 @@ class ScholarshipApplicationViewSet(ReadOnlyModelViewSet): class TeamMemberViewSet(ReadOnlyModelViewSet): serializer_class = TeamMemberSerializer queryset = TeamMember.objects.all() + + +class SuccessStoryViewSet(ReadOnlyModelViewSet): + permission_classes = (IsAuthenticated,) + serializer_class = SuccessStorySerializer + queryset = SuccessStory.objects.all() diff --git a/src/tests/integration/test_success_story.py b/src/tests/integration/test_success_story.py new file mode 100644 index 00000000..e77d7421 --- /dev/null +++ b/src/tests/integration/test_success_story.py @@ -0,0 +1,4 @@ +import pytest + + +@pytest.mark.django_db From 7bcf46c9d9522e582e7177e56c5b261c61e87aea Mon Sep 17 00:00:00 2001 From: Too-Far Date: Sun, 3 May 2020 00:57:28 -0400 Subject: [PATCH 02/11] Created test for success story model. --- poetry.lock | 30 +++++++++---------- src/api/admin.py | 1 + src/api/migrations/0009_successstory.py | 22 +++++++++----- src/api/migrations/0010_auto_20200501_1444.py | 5 ++-- src/api/models.py | 2 +- src/tests/integration/test_success_story.py | 14 +++++++++ 6 files changed, 48 insertions(+), 26 deletions(-) diff --git a/poetry.lock b/poetry.lock index 19e27c18..57ce2c80 100644 --- a/poetry.lock +++ b/poetry.lock @@ -7,7 +7,7 @@ python-versions = "*" version = "1.4.3" [[package]] -category = "dev" +category = "main" description = "Atomic file writes." marker = "sys_platform == \"win32\"" name = "atomicwrites" @@ -16,7 +16,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "1.3.0" [[package]] -category = "dev" +category = "main" description = "Classes Without Boilerplate" name = "attrs" optional = false @@ -145,9 +145,9 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "7.0" [[package]] -category = "dev" +category = "main" description = "Cross-platform colored terminal text." -marker = "platform_system == \"Windows\" or sys_platform == \"win32\"" +marker = "sys_platform == \"win32\" or platform_system == \"Windows\"" name = "colorama" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -575,7 +575,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "2.8" [[package]] -category = "dev" +category = "main" description = "Read metadata from Python packages" marker = "python_version < \"3.8\"" name = "importlib-metadata" @@ -695,7 +695,7 @@ python-versions = "*" version = "0.6.1" [[package]] -category = "dev" +category = "main" description = "More routines for operating on iterables, beyond itertools" name = "more-itertools" optional = false @@ -760,7 +760,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" version = "6.2.2" [[package]] -category = "dev" +category = "main" description = "plugin and hook calling mechanisms for python" name = "pluggy" optional = false @@ -784,7 +784,7 @@ python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" version = "2.8.4" [[package]] -category = "dev" +category = "main" description = "library with cross-python path, ini-parsing, io, code, log facilities" name = "py" optional = false @@ -845,12 +845,12 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" version = "2.4.6" [[package]] -category = "dev" +category = "main" description = "pytest: simple powerful testing with Python" name = "pytest" optional = false python-versions = ">=3.5" -version = "5.3.5" +version = "5.4.1" [package.dependencies] atomicwrites = ">=1.0" @@ -1178,7 +1178,7 @@ secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "cer socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] [[package]] -category = "dev" +category = "main" description = "Measures number of Terminal column cells of wide-character codes" name = "wcwidth" optional = false @@ -1194,7 +1194,7 @@ python-versions = "*" version = "1.11.2" [[package]] -category = "dev" +category = "main" description = "Backport of pathlib-compatible object wrapper for zip files" marker = "python_version < \"3.8\"" name = "zipp" @@ -1207,7 +1207,7 @@ docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["jaraco.itertools"] [metadata] -content-hash = "61babe314304f60419b60f31a5983a3094a54ba90a6672fe1cb226eb90c95ff3" +content-hash = "644e3ee7ae1e5ed64b386110b6f334b70badfc85573cda1d1d46b09af61c4560" python-versions = "^3.7" [metadata.files] @@ -1648,8 +1648,8 @@ pyparsing = [ {file = "pyparsing-2.4.6.tar.gz", hash = "sha256:4c830582a84fb022400b85429791bc551f1f4871c33f23e44f353119e92f969f"}, ] pytest = [ - {file = "pytest-5.3.5-py3-none-any.whl", hash = "sha256:ff615c761e25eb25df19edddc0b970302d2a9091fbce0e7213298d85fb61fef6"}, - {file = "pytest-5.3.5.tar.gz", hash = "sha256:0d5fe9189a148acc3c3eb2ac8e1ac0742cb7618c084f3d228baaec0c254b318d"}, + {file = "pytest-5.4.1-py3-none-any.whl", hash = "sha256:0e5b30f5cb04e887b91b1ee519fa3d89049595f428c1db76e73bd7f17b09b172"}, + {file = "pytest-5.4.1.tar.gz", hash = "sha256:84dde37075b8805f3d1f392cc47e38a0e59518fb46a431cfdaf7cf1ce805f970"}, ] pytest-django = [ {file = "pytest-django-3.8.0.tar.gz", hash = "sha256:489b904f695f9fb880ce591cf5a4979880afb467763b1f180c07574554bdfd26"}, diff --git a/src/api/admin.py b/src/api/admin.py index 070cdb24..007e4245 100644 --- a/src/api/admin.py +++ b/src/api/admin.py @@ -75,6 +75,7 @@ class CodeSchoolAdmin(admin.ModelAdmin): search_fields = ("name", "rep_name", "rep_email", "url") + @admin.register(SuccessStory) class SuccessStoryAdmin(admin.ModelAdmin): list_display = ( diff --git a/src/api/migrations/0009_successstory.py b/src/api/migrations/0009_successstory.py index 46b1f721..adea82aa 100644 --- a/src/api/migrations/0009_successstory.py +++ b/src/api/migrations/0009_successstory.py @@ -6,18 +6,26 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0008_codeschool_is_vet_tec_approved'), + ("api", "0008_codeschool_is_vet_tec_approved"), ] operations = [ migrations.CreateModel( - name='SuccessStory', + name="SuccessStory", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_by', models.CharField(blank=True, max_length=256, null=True)), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('text', models.TextField(blank=True, null=True)), - ('is_approved', models.BooleanField(blank=True, null=True)), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("created_by", models.CharField(blank=True, max_length=256, null=True)), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("text", models.TextField(blank=True, null=True)), + ("is_approved", models.BooleanField(blank=True, null=True)), ], ), ] diff --git a/src/api/migrations/0010_auto_20200501_1444.py b/src/api/migrations/0010_auto_20200501_1444.py index 54c295ad..32f41224 100644 --- a/src/api/migrations/0010_auto_20200501_1444.py +++ b/src/api/migrations/0010_auto_20200501_1444.py @@ -6,12 +6,11 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0009_successstory'), + ("api", "0009_successstory"), ] operations = [ migrations.AlterModelOptions( - name='successstory', - options={'verbose_name_plural': 'Success Stories'}, + name="successstory", options={"verbose_name_plural": "Success Stories"}, ), ] diff --git a/src/api/models.py b/src/api/models.py index 8bd24fde..c741827c 100644 --- a/src/api/models.py +++ b/src/api/models.py @@ -104,4 +104,4 @@ def __str__(self): return f"{self.created_by} - {self.is_approved}" class Meta: - verbose_name_plural = 'Success Stories' + verbose_name_plural = "Success Stories" diff --git a/src/tests/integration/test_success_story.py b/src/tests/integration/test_success_story.py index e77d7421..837b32d5 100644 --- a/src/tests/integration/test_success_story.py +++ b/src/tests/integration/test_success_story.py @@ -1,4 +1,18 @@ import pytest +from api.models import SuccessStory +from django.db import models @pytest.mark.django_db +def success_save_test(): + test_obj = SuccessStory( + created_by="Bob Vila", + created_at=models.DateTimeField(auto_now_add=True), + text="This is some test text", + is_approved=True, + ) + test_obj.save() + assert test_obj.created_by == "Bob Vila" + assert test_obj.created_at + assert test_obj.text == "This is some test text" + assert test_obj.is_approved == True From 57e8c36f910fd92917bc2dfc8a5c025a9951e0b8 Mon Sep 17 00:00:00 2001 From: Too-Far Date: Sun, 3 May 2020 01:11:16 -0400 Subject: [PATCH 03/11] Fixed flake8 reqs and ran rest of the tests --- src/api/admin.py | 2 +- src/api/serializers.py | 2 +- src/api/views.py | 4 ++-- src/tests/integration/test_success_story.py | 5 +++-- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/api/admin.py b/src/api/admin.py index 007e4245..f7cbcbe7 100644 --- a/src/api/admin.py +++ b/src/api/admin.py @@ -5,8 +5,8 @@ Location, Scholarship, ScholarshipApplication, - TeamMember, SuccessStory, + TeamMember, ) diff --git a/src/api/serializers.py b/src/api/serializers.py index ce5d4f7c..66320f88 100644 --- a/src/api/serializers.py +++ b/src/api/serializers.py @@ -5,8 +5,8 @@ Location, Scholarship, ScholarshipApplication, - TeamMember, SuccessStory, + TeamMember, ) diff --git a/src/api/views.py b/src/api/views.py index 4da11a60..21e81e10 100644 --- a/src/api/views.py +++ b/src/api/views.py @@ -6,16 +6,16 @@ Location, Scholarship, ScholarshipApplication, - TeamMember, SuccessStory, + TeamMember, ) from api.serializers import ( CodeSchoolSerializer, LocationSerializer, ScholarshipApplicationSerializer, ScholarshipSerializer, - TeamMemberSerializer, SuccessStorySerializer, + TeamMemberSerializer, ) diff --git a/src/tests/integration/test_success_story.py b/src/tests/integration/test_success_story.py index 837b32d5..35152287 100644 --- a/src/tests/integration/test_success_story.py +++ b/src/tests/integration/test_success_story.py @@ -1,7 +1,8 @@ import pytest -from api.models import SuccessStory from django.db import models +from api.models import SuccessStory + @pytest.mark.django_db def success_save_test(): @@ -15,4 +16,4 @@ def success_save_test(): assert test_obj.created_by == "Bob Vila" assert test_obj.created_at assert test_obj.text == "This is some test text" - assert test_obj.is_approved == True + assert test_obj.is_approved From 58df2a8a55f36bfedfa660ac724bc5ac94cac370 Mon Sep 17 00:00:00 2001 From: Too-Far Date: Sun, 3 May 2020 12:58:24 -0400 Subject: [PATCH 04/11] Fixed my test to prefix with test_. --- src/tests/integration/test_success_story.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/integration/test_success_story.py b/src/tests/integration/test_success_story.py index 35152287..0661ad4a 100644 --- a/src/tests/integration/test_success_story.py +++ b/src/tests/integration/test_success_story.py @@ -5,7 +5,7 @@ @pytest.mark.django_db -def success_save_test(): +def test_success_save(): test_obj = SuccessStory( created_by="Bob Vila", created_at=models.DateTimeField(auto_now_add=True), From 06e4059000963f693d65db961d877a3cbdf609dd Mon Sep 17 00:00:00 2001 From: Too-Far Date: Sun, 3 May 2020 16:18:54 -0400 Subject: [PATCH 05/11] stuck on testing --- src/api/migrations/0011_auto_20200503_1834.py | 25 +++++++++++++++++++ src/api/models.py | 4 +-- src/api/urls.py | 1 + src/api/views.py | 15 ++++++++--- src/tests/factories.py | 14 +++++++++++ src/tests/integration/test_success_story.py | 8 ++++-- src/tests/test_data.py | 5 ++++ 7 files changed, 64 insertions(+), 8 deletions(-) create mode 100644 src/api/migrations/0011_auto_20200503_1834.py diff --git a/src/api/migrations/0011_auto_20200503_1834.py b/src/api/migrations/0011_auto_20200503_1834.py new file mode 100644 index 00000000..29090940 --- /dev/null +++ b/src/api/migrations/0011_auto_20200503_1834.py @@ -0,0 +1,25 @@ +# Generated by Django 2.2.10 on 2020-05-03 18:34 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0010_auto_20200501_1444'), + ] + + operations = [ + migrations.AlterField( + model_name='successstory', + name='created_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='successstory', + name='is_approved', + field=models.BooleanField(default=False), + ), + ] diff --git a/src/api/models.py b/src/api/models.py index c741827c..959c45a0 100644 --- a/src/api/models.py +++ b/src/api/models.py @@ -95,10 +95,10 @@ class Meta: class SuccessStory(models.Model): - created_by = models.CharField(max_length=256, blank=True, null=True) + created_by = models.ForeignKey(User, models.DO_NOTHING, blank=True, null=True) created_at = models.DateTimeField(auto_now_add=True) text = models.TextField(blank=True, null=True) - is_approved = models.BooleanField(blank=True, null=True) + is_approved = models.BooleanField( default=False) def __str__(self): return f"{self.created_by} - {self.is_approved}" diff --git a/src/api/urls.py b/src/api/urls.py index 0f3c2eb4..5d4a04a8 100644 --- a/src/api/urls.py +++ b/src/api/urls.py @@ -9,5 +9,6 @@ router.register("scholarships", views.ScholarshipViewSet) router.register("scholarshipApplications", views.ScholarshipApplicationViewSet) router.register("teamMembers", views.TeamMemberViewSet) +router.register('sucessStory', views.SuccessStoryViewSet) urlpatterns = [path("", include(router.urls))] diff --git a/src/api/views.py b/src/api/views.py index 21e81e10..c5ba7b64 100644 --- a/src/api/views.py +++ b/src/api/views.py @@ -1,5 +1,12 @@ -from rest_framework.permissions import IsAuthenticated -from rest_framework.viewsets import ReadOnlyModelViewSet +from rest_framework.permissions import ( + IsAuthenticated, + IsAuthenticatedOrReadOnly, +) + +from rest_framework.viewsets import ( + ReadOnlyModelViewSet, + ModelViewSet, + ) from api.models import ( CodeSchool, @@ -45,7 +52,7 @@ class TeamMemberViewSet(ReadOnlyModelViewSet): queryset = TeamMember.objects.all() -class SuccessStoryViewSet(ReadOnlyModelViewSet): - permission_classes = (IsAuthenticated,) +class SuccessStoryViewSet(ModelViewSet): serializer_class = SuccessStorySerializer queryset = SuccessStory.objects.all() + permission_classes = (IsAuthenticatedOrReadOnly,) diff --git a/src/tests/factories.py b/src/tests/factories.py index 6cf9a374..bb2d7d0d 100644 --- a/src/tests/factories.py +++ b/src/tests/factories.py @@ -1,4 +1,5 @@ import threading +import datetime from allauth.account.models import EmailAddress from django.conf import settings @@ -14,6 +15,7 @@ django, ) +from api.models import SuccessStory from core.models import Profile from tests.test_data import ( DEFAULT_PASSWORD, @@ -21,6 +23,7 @@ random_branch, random_mos, random_pay_grade, + random_text, ) @@ -86,3 +89,14 @@ class Meta: ) profile = RelatedFactory(ProfileFactory, "user") active_email = RelatedFactory(EmailAddressFactory, "user", email=email) + +class SuccessFactory(DjangoModelFactory): + class Meta: + model = SuccessStory + + created_by = SubFactory("tests.factories.UserFactory", active_email=None) + created_on = datetime.datetime.now() + text = fake.random_text + is_approved = LazyFunction(fake.pybool) + + diff --git a/src/tests/integration/test_success_story.py b/src/tests/integration/test_success_story.py index 0661ad4a..37a3e077 100644 --- a/src/tests/integration/test_success_story.py +++ b/src/tests/integration/test_success_story.py @@ -1,8 +1,7 @@ import pytest from django.db import models - from api.models import SuccessStory - +from tests.factories import SuccessFactory @pytest.mark.django_db def test_success_save(): @@ -17,3 +16,8 @@ def test_success_save(): assert test_obj.created_at assert test_obj.text == "This is some test text" assert test_obj.is_approved + +@pytest.mark.django_db +def test_Story_Creation(): + story = SuccessFactory + assert SuccessStory == story \ No newline at end of file diff --git a/src/tests/test_data.py b/src/tests/test_data.py index 2b3cabbf..e636c7cd 100644 --- a/src/tests/test_data.py +++ b/src/tests/test_data.py @@ -13,6 +13,11 @@ def random_branch(): ) +def random_text(): + return ( + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis tristique dapibus risus, vitae ultricies ipsum porta vel. Proin eget aliquet." + ) + def random_pay_grade(): return f"{fake.random_element(('E', 'O'))}{fake.random_digit()}" From c311f633b78c2714b7a623b3c88f8856732d8195 Mon Sep 17 00:00:00 2001 From: Too-Far Date: Tue, 5 May 2020 12:58:51 -0400 Subject: [PATCH 06/11] wrapped up testing for new success story module --- src/api/migrations/0011_auto_20200503_1834.py | 2 +- src/api/models.py | 8 +++---- src/api/views.py | 11 ++------- src/tests/factories.py | 12 ++++------ src/tests/fixtures.py | 8 +++++++ src/tests/integration/test_success_story.py | 23 ++++++------------- src/tests/test_data.py | 5 ++-- 7 files changed, 29 insertions(+), 40 deletions(-) diff --git a/src/api/migrations/0011_auto_20200503_1834.py b/src/api/migrations/0011_auto_20200503_1834.py index 29090940..8818c8dd 100644 --- a/src/api/migrations/0011_auto_20200503_1834.py +++ b/src/api/migrations/0011_auto_20200503_1834.py @@ -1,8 +1,8 @@ # Generated by Django 2.2.10 on 2020-05-03 18:34 +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): diff --git a/src/api/models.py b/src/api/models.py index 959c45a0..db859c1b 100644 --- a/src/api/models.py +++ b/src/api/models.py @@ -95,10 +95,10 @@ class Meta: class SuccessStory(models.Model): - created_by = models.ForeignKey(User, models.DO_NOTHING, blank=True, null=True) - created_at = models.DateTimeField(auto_now_add=True) - text = models.TextField(blank=True, null=True) - is_approved = models.BooleanField( default=False) + created_by = models.ForeignKey(User, models.DO_NOTHING, blank=True, null=True, unique=False) + created_at = models.DateTimeField(auto_now_add=True, unique=False) + text = models.TextField(blank=True, null=True, unique=False) + is_approved = models.BooleanField( default=False, unique=False) def __str__(self): return f"{self.created_by} - {self.is_approved}" diff --git a/src/api/views.py b/src/api/views.py index c5ba7b64..faace9be 100644 --- a/src/api/views.py +++ b/src/api/views.py @@ -1,12 +1,5 @@ -from rest_framework.permissions import ( - IsAuthenticated, - IsAuthenticatedOrReadOnly, -) - -from rest_framework.viewsets import ( - ReadOnlyModelViewSet, - ModelViewSet, - ) +from rest_framework.permissions import IsAuthenticated, IsAuthenticatedOrReadOnly +from rest_framework.viewsets import ModelViewSet, ReadOnlyModelViewSet from api.models import ( CodeSchool, diff --git a/src/tests/factories.py b/src/tests/factories.py index bb2d7d0d..3edcedb5 100644 --- a/src/tests/factories.py +++ b/src/tests/factories.py @@ -1,5 +1,5 @@ -import threading import datetime +import threading from allauth.account.models import EmailAddress from django.conf import settings @@ -14,6 +14,7 @@ SubFactory, django, ) +from faker import Faker from api.models import SuccessStory from core.models import Profile @@ -90,13 +91,10 @@ class Meta: profile = RelatedFactory(ProfileFactory, "user") active_email = RelatedFactory(EmailAddressFactory, "user", email=email) + class SuccessFactory(DjangoModelFactory): class Meta: model = SuccessStory - - created_by = SubFactory("tests.factories.UserFactory", active_email=None) - created_on = datetime.datetime.now() - text = fake.random_text + created_at = datetime.datetime.now() + text = LazyFunction(fake.paragraph) is_approved = LazyFunction(fake.pybool) - - diff --git a/src/tests/fixtures.py b/src/tests/fixtures.py index 8f0f2c4d..72e91ae1 100644 --- a/src/tests/fixtures.py +++ b/src/tests/fixtures.py @@ -85,3 +85,11 @@ def random_profile_dict(request): profile = request.param profile.pop("user") return request.param + + +@pytest.fixture +def success_story(db, user): + story = f.SuccessFactory() + story.created_by = user + story.save() + return story diff --git a/src/tests/integration/test_success_story.py b/src/tests/integration/test_success_story.py index 37a3e077..b61dba23 100644 --- a/src/tests/integration/test_success_story.py +++ b/src/tests/integration/test_success_story.py @@ -1,23 +1,14 @@ import pytest from django.db import models + from api.models import SuccessStory from tests.factories import SuccessFactory -@pytest.mark.django_db -def test_success_save(): - test_obj = SuccessStory( - created_by="Bob Vila", - created_at=models.DateTimeField(auto_now_add=True), - text="This is some test text", - is_approved=True, - ) - test_obj.save() - assert test_obj.created_by == "Bob Vila" - assert test_obj.created_at - assert test_obj.text == "This is some test text" - assert test_obj.is_approved @pytest.mark.django_db -def test_Story_Creation(): - story = SuccessFactory - assert SuccessStory == story \ No newline at end of file +def test_stories(success_story): + db = SuccessStory.objects.all() + assert db.get(created_by=success_story.created_by) + assert db.get(created_at=success_story.created_at) + assert db.get(text=success_story.text) + assert db.get(is_approved=success_story.is_approved) diff --git a/src/tests/test_data.py b/src/tests/test_data.py index e636c7cd..b530a458 100644 --- a/src/tests/test_data.py +++ b/src/tests/test_data.py @@ -14,9 +14,8 @@ def random_branch(): def random_text(): - return ( - "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis tristique dapibus risus, vitae ultricies ipsum porta vel. Proin eget aliquet." - ) + return fake.random_text(max_nb_chars=200) + def random_pay_grade(): return f"{fake.random_element(('E', 'O'))}{fake.random_digit()}" From 6d62b8f93b313dd7afef1eb25922226267cc6715 Mon Sep 17 00:00:00 2001 From: Too-Far Date: Tue, 5 May 2020 13:06:43 -0400 Subject: [PATCH 07/11] fixed linting errors --- src/api/migrations/0010_auto_20200501_1444.py | 16 ------------ src/api/migrations/0011_auto_20200503_1834.py | 25 ------------------- src/api/models.py | 2 +- src/tests/test_data.py | 2 +- 4 files changed, 2 insertions(+), 43 deletions(-) delete mode 100644 src/api/migrations/0010_auto_20200501_1444.py delete mode 100644 src/api/migrations/0011_auto_20200503_1834.py diff --git a/src/api/migrations/0010_auto_20200501_1444.py b/src/api/migrations/0010_auto_20200501_1444.py deleted file mode 100644 index 32f41224..00000000 --- a/src/api/migrations/0010_auto_20200501_1444.py +++ /dev/null @@ -1,16 +0,0 @@ -# Generated by Django 2.2.10 on 2020-05-01 14:44 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ("api", "0009_successstory"), - ] - - operations = [ - migrations.AlterModelOptions( - name="successstory", options={"verbose_name_plural": "Success Stories"}, - ), - ] diff --git a/src/api/migrations/0011_auto_20200503_1834.py b/src/api/migrations/0011_auto_20200503_1834.py deleted file mode 100644 index 8818c8dd..00000000 --- a/src/api/migrations/0011_auto_20200503_1834.py +++ /dev/null @@ -1,25 +0,0 @@ -# Generated by Django 2.2.10 on 2020-05-03 18:34 - -import django.db.models.deletion -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('api', '0010_auto_20200501_1444'), - ] - - operations = [ - migrations.AlterField( - model_name='successstory', - name='created_by', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to=settings.AUTH_USER_MODEL), - ), - migrations.AlterField( - model_name='successstory', - name='is_approved', - field=models.BooleanField(default=False), - ), - ] diff --git a/src/api/models.py b/src/api/models.py index db859c1b..c7b2966b 100644 --- a/src/api/models.py +++ b/src/api/models.py @@ -98,7 +98,7 @@ class SuccessStory(models.Model): created_by = models.ForeignKey(User, models.DO_NOTHING, blank=True, null=True, unique=False) created_at = models.DateTimeField(auto_now_add=True, unique=False) text = models.TextField(blank=True, null=True, unique=False) - is_approved = models.BooleanField( default=False, unique=False) + is_approved = models.BooleanField(default=False, unique=False) def __str__(self): return f"{self.created_by} - {self.is_approved}" diff --git a/src/tests/test_data.py b/src/tests/test_data.py index b530a458..43abb50d 100644 --- a/src/tests/test_data.py +++ b/src/tests/test_data.py @@ -15,7 +15,7 @@ def random_branch(): def random_text(): return fake.random_text(max_nb_chars=200) - + def random_pay_grade(): return f"{fake.random_element(('E', 'O'))}{fake.random_digit()}" From 62551970207d61f2e88d5d6002d2bda46e89fcb5 Mon Sep 17 00:00:00 2001 From: Too-Far Date: Tue, 5 May 2020 13:12:49 -0400 Subject: [PATCH 08/11] Fixed test failure --- src/api/migrations/0010_auto_20200505_1711.py | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/api/migrations/0010_auto_20200505_1711.py diff --git a/src/api/migrations/0010_auto_20200505_1711.py b/src/api/migrations/0010_auto_20200505_1711.py new file mode 100644 index 00000000..9f0d1f1f --- /dev/null +++ b/src/api/migrations/0010_auto_20200505_1711.py @@ -0,0 +1,29 @@ +# Generated by Django 2.2.10 on 2020-05-05 17:11 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0009_successstory'), + ] + + operations = [ + migrations.AlterModelOptions( + name='successstory', + options={'verbose_name_plural': 'Success Stories'}, + ), + migrations.AlterField( + model_name='successstory', + name='created_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='successstory', + name='is_approved', + field=models.BooleanField(default=False), + ), + ] From bc9800d9dda2561e567bc966d181e31c57423723 Mon Sep 17 00:00:00 2001 From: Too-Far Date: Tue, 5 May 2020 13:33:48 -0400 Subject: [PATCH 09/11] Added migrations to flake 8 esclusion. merge conflict resolution --- .flake8 | 1 + 1 file changed, 1 insertion(+) diff --git a/.flake8 b/.flake8 index add395f6..f76d6a60 100644 --- a/.flake8 +++ b/.flake8 @@ -12,3 +12,4 @@ ignore = exclude = __pycache__ testing.py + migrations From 99a1ce5265b895bfb0063769b66935d1888669e4 Mon Sep 17 00:00:00 2001 From: Too-Far Date: Tue, 5 May 2020 14:55:50 -0400 Subject: [PATCH 10/11] black changes --- src/api/migrations/0010_auto_20200505_1711.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/migrations/0010_auto_20200505_1711.py b/src/api/migrations/0010_auto_20200505_1711.py index 9f0d1f1f..2f10fb6a 100644 --- a/src/api/migrations/0010_auto_20200505_1711.py +++ b/src/api/migrations/0010_auto_20200505_1711.py @@ -1,8 +1,8 @@ # Generated by Django 2.2.10 on 2020-05-05 17:11 +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): From 41802ce36e49d8a63b38116c0e543acd059ced76 Mon Sep 17 00:00:00 2001 From: Too-Far Date: Tue, 5 May 2020 15:00:44 -0400 Subject: [PATCH 11/11] Got all tests to execute without issue --- src/api/migrations/0010_auto_20200505_1711.py | 20 +++++++++++-------- src/api/models.py | 8 +++++++- src/api/urls.py | 2 +- src/tests/factories.py | 1 + 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/api/migrations/0010_auto_20200505_1711.py b/src/api/migrations/0010_auto_20200505_1711.py index 2f10fb6a..a0ca4a3d 100644 --- a/src/api/migrations/0010_auto_20200505_1711.py +++ b/src/api/migrations/0010_auto_20200505_1711.py @@ -8,22 +8,26 @@ class Migration(migrations.Migration): dependencies = [ - ('api', '0009_successstory'), + ("api", "0009_successstory"), ] operations = [ migrations.AlterModelOptions( - name='successstory', - options={'verbose_name_plural': 'Success Stories'}, + name="successstory", options={"verbose_name_plural": "Success Stories"}, ), migrations.AlterField( - model_name='successstory', - name='created_by', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to=settings.AUTH_USER_MODEL), + model_name="successstory", + name="created_by", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + to=settings.AUTH_USER_MODEL, + ), ), migrations.AlterField( - model_name='successstory', - name='is_approved', + model_name="successstory", + name="is_approved", field=models.BooleanField(default=False), ), ] diff --git a/src/api/models.py b/src/api/models.py index c7b2966b..52b43ca2 100644 --- a/src/api/models.py +++ b/src/api/models.py @@ -95,7 +95,13 @@ class Meta: class SuccessStory(models.Model): - created_by = models.ForeignKey(User, models.DO_NOTHING, blank=True, null=True, unique=False) + """ + Model that holds user success stories. + """ + + created_by = models.ForeignKey( + User, models.DO_NOTHING, blank=True, null=True, unique=False + ) created_at = models.DateTimeField(auto_now_add=True, unique=False) text = models.TextField(blank=True, null=True, unique=False) is_approved = models.BooleanField(default=False, unique=False) diff --git a/src/api/urls.py b/src/api/urls.py index 5d4a04a8..00f31ec7 100644 --- a/src/api/urls.py +++ b/src/api/urls.py @@ -9,6 +9,6 @@ router.register("scholarships", views.ScholarshipViewSet) router.register("scholarshipApplications", views.ScholarshipApplicationViewSet) router.register("teamMembers", views.TeamMemberViewSet) -router.register('sucessStory', views.SuccessStoryViewSet) +router.register("sucessStory", views.SuccessStoryViewSet) urlpatterns = [path("", include(router.urls))] diff --git a/src/tests/factories.py b/src/tests/factories.py index 3edcedb5..fac9e276 100644 --- a/src/tests/factories.py +++ b/src/tests/factories.py @@ -95,6 +95,7 @@ class Meta: class SuccessFactory(DjangoModelFactory): class Meta: model = SuccessStory + created_at = datetime.datetime.now() text = LazyFunction(fake.paragraph) is_approved = LazyFunction(fake.pybool)