From 9faa8c9bd6453f17d76b3eb68a69fef14232af0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlota=20Catot=20Brag=C3=B3s?= Date: Thu, 11 Jan 2024 19:46:24 +0100 Subject: [PATCH 1/3] application model and orm --- .../applications/domain/models/application.py | 16 +++++++++++++++- .../persistence/models/orm_application.py | 3 +++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/organizator_api/app/applications/domain/models/application.py b/organizator_api/app/applications/domain/models/application.py index 863a35d0..29abf1cf 100644 --- a/organizator_api/app/applications/domain/models/application.py +++ b/organizator_api/app/applications/domain/models/application.py @@ -1,16 +1,30 @@ import uuid from dataclasses import dataclass from datetime import datetime -from typing import Optional +from enum import Enum from app.events.domain.models.event import Event from app.users.domain.models.user import User +class ApplicationStatus(Enum): + PENDING = "Under review" + INVITED = "Invited" + CONFIRMED = "Confirmed" + CANCELLED = "Cancelled" + INVALID = "Invalid" + REJECTED = "Rejected" + WAIT_LIST = "Wait list" + + @classmethod + def choices(cls) -> tuple[tuple[str, str], ...]: + return tuple((i.name, i.value) for i in cls) @dataclass class Application: id: uuid.UUID user: User event: Event + status: ApplicationStatus created_at: datetime updated_at: datetime + diff --git a/organizator_api/app/applications/infrastructure/persistence/models/orm_application.py b/organizator_api/app/applications/infrastructure/persistence/models/orm_application.py index 17e7d2f1..de70c7f6 100644 --- a/organizator_api/app/applications/infrastructure/persistence/models/orm_application.py +++ b/organizator_api/app/applications/infrastructure/persistence/models/orm_application.py @@ -1,5 +1,7 @@ from django.db import models +from app.applications.domain.models.application import ApplicationStatus + class ORMEventApplication(models.Model): class Meta: @@ -9,5 +11,6 @@ class Meta: id = models.UUIDField(primary_key=True) user = models.ForeignKey("ORMUser", on_delete=models.CASCADE) event = models.ForeignKey("ORMEvent", on_delete=models.CASCADE) + status = models.CharField(max_length=255, choices=ApplicationStatus.choices(), default=ApplicationStatus.PENDING.name) created_at = models.DateTimeField() updated_at = models.DateTimeField() From 1e5e01bc68f723622e1f405f70cbc48b2825b716 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlota=20Catot=20Brag=C3=B3s?= Date: Thu, 11 Jan 2024 19:46:35 +0100 Subject: [PATCH 2/3] migration --- .../0015_ormeventapplication_status.py | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 organizator_api/app/migrations/0015_ormeventapplication_status.py diff --git a/organizator_api/app/migrations/0015_ormeventapplication_status.py b/organizator_api/app/migrations/0015_ormeventapplication_status.py new file mode 100644 index 00000000..0e4fb5e1 --- /dev/null +++ b/organizator_api/app/migrations/0015_ormeventapplication_status.py @@ -0,0 +1,29 @@ +# Generated by Django 4.2.7 on 2024-01-11 18:44 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("app", "0014_alter_ormevent_age_restrictions_and_more"), + ] + + operations = [ + migrations.AddField( + model_name="ormeventapplication", + name="status", + field=models.CharField( + choices=[ + ("PENDING", "Under review"), + ("INVITED", "Invited"), + ("CONFIRMED", "Confirmed"), + ("CANCELLED", "Cancelled"), + ("INVALID", "Invalid"), + ("REJECTED", "Rejected"), + ("WAIT_LIST", "Wait list"), + ], + default="PENDING", + max_length=255, + ), + ), + ] From 68bbae988d2f436550659ed15818d6332962eabd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlota=20Catot=20Brag=C3=B3s?= Date: Thu, 11 Jan 2024 20:41:47 +0100 Subject: [PATCH 3/3] update tests --- organizator_api/app/applications/application/response.py | 6 +++++- .../app/applications/domain/models/application.py | 3 ++- .../domain/usecases/create_new_application_use_case.py | 3 ++- .../infrastructure/persistence/models/orm_application.py | 6 +++++- .../persistence/orm_applications_respository.py | 3 ++- .../tests/applications/domain/ApplicationFactory.py | 5 +++-- .../http/test_view_get_participants_in_events.py | 2 +- .../infrastructure/http/test_view_get_user_events.py | 2 +- .../persistence/test_orm_application_repository_create.py | 5 ++++- .../test_orm_application_repository_get_by_event.py | 4 +++- .../test_orm_application_repository_get_by_user.py | 7 ++++++- 11 files changed, 34 insertions(+), 12 deletions(-) diff --git a/organizator_api/app/applications/application/response.py b/organizator_api/app/applications/application/response.py index e038409f..8a970281 100644 --- a/organizator_api/app/applications/application/response.py +++ b/organizator_api/app/applications/application/response.py @@ -2,7 +2,7 @@ from datetime import datetime from typing import Any -from app.applications.domain.models.application import Application +from app.applications.domain.models.application import Application, ApplicationStatus from app.events.application.response import EventResponse from app.events.domain.models.event import Event from app.users.application.response import UserResponse @@ -14,6 +14,7 @@ class ApplicationResponse: id: str user: User event: Event + status: ApplicationStatus created_at: datetime updated_at: datetime @@ -23,6 +24,7 @@ def from_application(application: Application) -> "ApplicationResponse": id=str(application.id), user=application.user, event=application.event, + status=application.status, created_at=application.created_at, updated_at=application.updated_at, ) @@ -31,6 +33,7 @@ def to_dict_without_user(self) -> dict[str, Any]: return { "id": self.id, "event": EventResponse.from_event(self.event).to_dict(), + "status": self.status.value, "created_at": self.created_at.strftime("%Y-%m-%dT%H:%M:%SZ"), "updated_at": self.updated_at.strftime("%Y-%m-%dT%H:%M:%SZ"), } @@ -39,6 +42,7 @@ def to_dict_without_event(self) -> dict[str, Any]: return { "id": self.id, "user": UserResponse.from_user(self.user).to_dict(), + "status": self.status.value, "created_at": self.created_at.strftime("%Y-%m-%dT%H:%M:%SZ"), "updated_at": self.updated_at.strftime("%Y-%m-%dT%H:%M:%SZ"), } diff --git a/organizator_api/app/applications/domain/models/application.py b/organizator_api/app/applications/domain/models/application.py index 29abf1cf..0ef05f0b 100644 --- a/organizator_api/app/applications/domain/models/application.py +++ b/organizator_api/app/applications/domain/models/application.py @@ -6,6 +6,7 @@ from app.events.domain.models.event import Event from app.users.domain.models.user import User + class ApplicationStatus(Enum): PENDING = "Under review" INVITED = "Invited" @@ -19,6 +20,7 @@ class ApplicationStatus(Enum): def choices(cls) -> tuple[tuple[str, str], ...]: return tuple((i.name, i.value) for i in cls) + @dataclass class Application: id: uuid.UUID @@ -27,4 +29,3 @@ class Application: status: ApplicationStatus created_at: datetime updated_at: datetime - diff --git a/organizator_api/app/applications/domain/usecases/create_new_application_use_case.py b/organizator_api/app/applications/domain/usecases/create_new_application_use_case.py index 83ee954b..ab9609f2 100644 --- a/organizator_api/app/applications/domain/usecases/create_new_application_use_case.py +++ b/organizator_api/app/applications/domain/usecases/create_new_application_use_case.py @@ -7,7 +7,7 @@ UserIsNotStudent, UserIsTooYoung, ) -from app.applications.domain.models.application import Application +from app.applications.domain.models.application import Application, ApplicationStatus from app.applications.infrastructure.repository_factories import ( ApplicationRepositoryFactory, ) @@ -54,6 +54,7 @@ def execute(self, token: uuid.UUID, event_id: uuid.UUID) -> None: id=uuid.uuid4(), user=user, event=event, + status=ApplicationStatus.PENDING, created_at=datetime.now(tz=timezone.utc), updated_at=datetime.now(tz=timezone.utc), ) diff --git a/organizator_api/app/applications/infrastructure/persistence/models/orm_application.py b/organizator_api/app/applications/infrastructure/persistence/models/orm_application.py index de70c7f6..d07a3ca2 100644 --- a/organizator_api/app/applications/infrastructure/persistence/models/orm_application.py +++ b/organizator_api/app/applications/infrastructure/persistence/models/orm_application.py @@ -11,6 +11,10 @@ class Meta: id = models.UUIDField(primary_key=True) user = models.ForeignKey("ORMUser", on_delete=models.CASCADE) event = models.ForeignKey("ORMEvent", on_delete=models.CASCADE) - status = models.CharField(max_length=255, choices=ApplicationStatus.choices(), default=ApplicationStatus.PENDING.name) + status = models.CharField( + max_length=255, + choices=ApplicationStatus.choices(), + default=ApplicationStatus.PENDING.name, + ) created_at = models.DateTimeField() updated_at = models.DateTimeField() diff --git a/organizator_api/app/applications/infrastructure/persistence/orm_applications_respository.py b/organizator_api/app/applications/infrastructure/persistence/orm_applications_respository.py index 7737d36e..abc1d50f 100644 --- a/organizator_api/app/applications/infrastructure/persistence/orm_applications_respository.py +++ b/organizator_api/app/applications/infrastructure/persistence/orm_applications_respository.py @@ -4,7 +4,7 @@ from django.db import IntegrityError from app.applications.domain.exceptions import ApplicationAlreadyExists -from app.applications.domain.models.application import Application +from app.applications.domain.models.application import Application, ApplicationStatus from app.applications.domain.repositories import ApplicationRepository from app.applications.infrastructure.persistence.models.orm_application import ( ORMEventApplication, @@ -84,6 +84,7 @@ def _to_domain_model(self, orm_application: ORMEventApplication) -> Application: students_only=orm_application.event.students_only, age_restrictions=orm_application.event.age_restrictions, ), + status=ApplicationStatus[orm_application.status], created_at=orm_application.created_at, updated_at=orm_application.updated_at, ) diff --git a/organizator_api/tests/applications/domain/ApplicationFactory.py b/organizator_api/tests/applications/domain/ApplicationFactory.py index 8a4ec560..69eb294a 100644 --- a/organizator_api/tests/applications/domain/ApplicationFactory.py +++ b/organizator_api/tests/applications/domain/ApplicationFactory.py @@ -1,8 +1,7 @@ import uuid from datetime import datetime -from typing import Optional -from app.applications.domain.models.application import Application +from app.applications.domain.models.application import Application, ApplicationStatus from app.events.domain.models.event import Event from app.users.domain.models.user import User from tests.events.domain.EventFactory import EventFactory @@ -15,6 +14,7 @@ def create( new_id: uuid.UUID = uuid.UUID("ef6f6fb3-ba12-43dd-a0da-95de8125b1cc"), user: User = UserFactory().create(), event: Event = EventFactory().create(), + status: ApplicationStatus = ApplicationStatus.PENDING, created_at: datetime = datetime.now(), updated_at: datetime = datetime.now(), ) -> Application: @@ -22,6 +22,7 @@ def create( id=new_id, user=user, event=event, + status=status, created_at=created_at, updated_at=updated_at, ) diff --git a/organizator_api/tests/applications/infrastructure/http/test_view_get_participants_in_events.py b/organizator_api/tests/applications/infrastructure/http/test_view_get_participants_in_events.py index 07a09b22..8b9155e3 100644 --- a/organizator_api/tests/applications/infrastructure/http/test_view_get_participants_in_events.py +++ b/organizator_api/tests/applications/infrastructure/http/test_view_get_participants_in_events.py @@ -150,5 +150,5 @@ def test__given_a_organizer_user_and_a_existing_event_with_participants__when_ge self.assertEqual(response.status_code, 200) self.assertEqual( response.content, - b'[{"id": "eb41b762-5988-4fa3-8942-7a91ccb00686", "user": {"id": "eb41b762-5988-4fa3-8942-7a91ccb00686", "username": "john", "email": "john@test.com", "first_name": "Carlota", "last_name": "Catot", "bio": "The user that is using this application", "profile_image": "profile_picture.png", "role": "Participant", "date_of_birth": "07/05/1996", "study": true, "work": false, "university": "Universitat Polit\\u00e8cnica de Catalunya", "degree": "Computer Science", "expected_graduation": "01/05/2024", "current_job_role": "", "tshirt": "", "gender": "", "alimentary_restrictions": "", "github": "", "linkedin": "", "devpost": "", "webpage": ""}, "created_at": "2024-01-09T10:47:00Z", "updated_at": "2024-01-09T10:47:00Z"}, {"id": "eb41b762-5988-4fa3-8942-7a91ccb00687", "user": {"id": "ef6f6fb3-ba12-43dd-a0da-95de8125b1cc", "username": "carlotacb", "email": "carlota@hackupc.com", "first_name": "Carlota", "last_name": "Catot", "bio": "The user that is using this application", "profile_image": "profile_picture.png", "role": "Participant", "date_of_birth": "07/05/1996", "study": true, "work": false, "university": "Universitat Polit\\u00e8cnica de Catalunya", "degree": "Computer Science", "expected_graduation": "01/05/2024", "current_job_role": "", "tshirt": "", "gender": "", "alimentary_restrictions": "", "github": "", "linkedin": "", "devpost": "", "webpage": ""}, "created_at": "2024-01-09T10:47:00Z", "updated_at": "2024-01-09T10:47:00Z"}]', + b'[{"id": "eb41b762-5988-4fa3-8942-7a91ccb00686", "user": {"id": "eb41b762-5988-4fa3-8942-7a91ccb00686", "username": "john", "email": "john@test.com", "first_name": "Carlota", "last_name": "Catot", "bio": "The user that is using this application", "profile_image": "profile_picture.png", "role": "Participant", "date_of_birth": "07/05/1996", "study": true, "work": false, "university": "Universitat Polit\\u00e8cnica de Catalunya", "degree": "Computer Science", "expected_graduation": "01/05/2024", "current_job_role": "", "tshirt": "", "gender": "", "alimentary_restrictions": "", "github": "", "linkedin": "", "devpost": "", "webpage": ""}, "status": "Under review", "created_at": "2024-01-09T10:47:00Z", "updated_at": "2024-01-09T10:47:00Z"}, {"id": "eb41b762-5988-4fa3-8942-7a91ccb00687", "user": {"id": "ef6f6fb3-ba12-43dd-a0da-95de8125b1cc", "username": "carlotacb", "email": "carlota@hackupc.com", "first_name": "Carlota", "last_name": "Catot", "bio": "The user that is using this application", "profile_image": "profile_picture.png", "role": "Participant", "date_of_birth": "07/05/1996", "study": true, "work": false, "university": "Universitat Polit\\u00e8cnica de Catalunya", "degree": "Computer Science", "expected_graduation": "01/05/2024", "current_job_role": "", "tshirt": "", "gender": "", "alimentary_restrictions": "", "github": "", "linkedin": "", "devpost": "", "webpage": ""}, "status": "Under review", "created_at": "2024-01-09T10:47:00Z", "updated_at": "2024-01-09T10:47:00Z"}]', ) diff --git a/organizator_api/tests/applications/infrastructure/http/test_view_get_user_events.py b/organizator_api/tests/applications/infrastructure/http/test_view_get_user_events.py index 0c10786a..cfab2aa5 100644 --- a/organizator_api/tests/applications/infrastructure/http/test_view_get_user_events.py +++ b/organizator_api/tests/applications/infrastructure/http/test_view_get_user_events.py @@ -106,5 +106,5 @@ def test__given_a_valid_token_and_some_applications_for_a_user__when_get_user_ev self.assertEqual(response.status_code, 200) self.assertEqual( response.content, - b'[{"id": "ef6f6fb3-ba12-43dd-a0da-95de8125b1cc", "event": {"id": "eb41b762-5988-4fa3-8942-7a91ccb00686", "name": "HackUPC 2024", "url": "https://www.hackupc.com/", "description": "The biggest student hackathon in Europe", "start_date": "2023-05-12T16:00:00Z", "end_date": "2023-05-14T18:00:00Z", "location": "UPC Campus Nord", "header_image": "https://hackupc.com/ogimage.png", "deleted": false, "open_for_participants": true, "max_participants": 100, "expected_attrition_rate": 0.1, "students_only": true, "age_restrictions": 16}, "created_at": "2024-01-09T00:52:29Z", "updated_at": "2024-01-09T00:52:29Z"}, {"id": "eb41b762-5988-4fa3-8942-7a91ccb00687", "event": {"id": "ef6f6fb3-ba12-43dd-a0da-95de8125b1cc", "name": "HackUPC 2023", "url": "https://www.hackupc.com/", "description": "The biggest student hackathon in Europe", "start_date": "2023-05-12T16:00:00Z", "end_date": "2023-05-14T18:00:00Z", "location": "UPC Campus Nord", "header_image": "https://hackupc.com/ogimage.png", "deleted": false, "open_for_participants": true, "max_participants": 100, "expected_attrition_rate": 0.1, "students_only": true, "age_restrictions": 16}, "created_at": "2024-01-09T00:52:29Z", "updated_at": "2024-01-09T00:52:29Z"}]', + b'[{"id": "ef6f6fb3-ba12-43dd-a0da-95de8125b1cc", "event": {"id": "eb41b762-5988-4fa3-8942-7a91ccb00686", "name": "HackUPC 2024", "url": "https://www.hackupc.com/", "description": "The biggest student hackathon in Europe", "start_date": "2023-05-12T16:00:00Z", "end_date": "2023-05-14T18:00:00Z", "location": "UPC Campus Nord", "header_image": "https://hackupc.com/ogimage.png", "deleted": false, "open_for_participants": true, "max_participants": 100, "expected_attrition_rate": 0.1, "students_only": true, "age_restrictions": 16}, "status": "Under review", "created_at": "2024-01-09T00:52:29Z", "updated_at": "2024-01-09T00:52:29Z"}, {"id": "eb41b762-5988-4fa3-8942-7a91ccb00687", "event": {"id": "ef6f6fb3-ba12-43dd-a0da-95de8125b1cc", "name": "HackUPC 2023", "url": "https://www.hackupc.com/", "description": "The biggest student hackathon in Europe", "start_date": "2023-05-12T16:00:00Z", "end_date": "2023-05-14T18:00:00Z", "location": "UPC Campus Nord", "header_image": "https://hackupc.com/ogimage.png", "deleted": false, "open_for_participants": true, "max_participants": 100, "expected_attrition_rate": 0.1, "students_only": true, "age_restrictions": 16}, "status": "Under review", "created_at": "2024-01-09T00:52:29Z", "updated_at": "2024-01-09T00:52:29Z"}]', ) diff --git a/organizator_api/tests/applications/infrastructure/persistence/test_orm_application_repository_create.py b/organizator_api/tests/applications/infrastructure/persistence/test_orm_application_repository_create.py index c98521b7..2a8a2c07 100644 --- a/organizator_api/tests/applications/infrastructure/persistence/test_orm_application_repository_create.py +++ b/organizator_api/tests/applications/infrastructure/persistence/test_orm_application_repository_create.py @@ -2,7 +2,7 @@ from datetime import datetime, timezone from app.applications.domain.exceptions import ApplicationAlreadyExists -from app.applications.domain.models.application import Application +from app.applications.domain.models.application import Application, ApplicationStatus from app.applications.infrastructure.persistence.models.orm_application import ( ORMEventApplication, ) @@ -30,6 +30,7 @@ def test__given_a_application_with_a_valid_user_and_event__when_create__then_app id=uuid.UUID("ef6f6fb3-ba12-43dd-a0da-95de8125b1cc"), user=user, event=event, + status=ApplicationStatus.PENDING, created_at=datetime.now(tz=timezone.utc), updated_at=datetime.now(tz=timezone.utc), ) @@ -56,6 +57,7 @@ def test__given_a_application_in_orm_and_another_application_with_the_same_event id=uuid.UUID("ef6f6fb3-ba12-43dd-a0da-95de8125b1cc"), user=user, event=event, + status=ApplicationStatus.PENDING, created_at=datetime.now(tz=timezone.utc), updated_at=datetime.now(tz=timezone.utc), ) @@ -65,6 +67,7 @@ def test__given_a_application_in_orm_and_another_application_with_the_same_event id=uuid.UUID("ef6f6fb3-ba14-43dd-a0da-95de8125b1cc"), user=user, event=event, + status=ApplicationStatus.PENDING, created_at=datetime.now(tz=timezone.utc), updated_at=datetime.now(tz=timezone.utc), ) diff --git a/organizator_api/tests/applications/infrastructure/persistence/test_orm_application_repository_get_by_event.py b/organizator_api/tests/applications/infrastructure/persistence/test_orm_application_repository_get_by_event.py index fe78908a..db4dfe1e 100644 --- a/organizator_api/tests/applications/infrastructure/persistence/test_orm_application_repository_get_by_event.py +++ b/organizator_api/tests/applications/infrastructure/persistence/test_orm_application_repository_get_by_event.py @@ -1,7 +1,7 @@ import uuid from datetime import datetime, timezone -from app.applications.domain.models.application import Application +from app.applications.domain.models.application import Application, ApplicationStatus from app.applications.infrastructure.persistence.orm_applications_respository import ( ORMApplicationRepository, ) @@ -39,6 +39,7 @@ def test__given_a_application_for_the_event__when_get_by_event__then_return_the_ id=uuid.UUID("ef6f6fb3-ba46-43dd-a0da-95de8125b1cc"), user=user, event=event, + status=ApplicationStatus.PENDING, created_at=datetime.now(tz=timezone.utc), updated_at=datetime.now(tz=timezone.utc), ) @@ -53,5 +54,6 @@ def test__given_a_application_for_the_event__when_get_by_event__then_return_the_ self.assertEqual(application.id, response[0].id) self.assertEqual(application.user.id, response[0].user.id) self.assertEqual(application.event.id, response[0].event.id) + self.assertEqual(application.status, response[0].status) self.assertEqual(application.created_at, response[0].created_at) self.assertEqual(application.updated_at, response[0].updated_at) diff --git a/organizator_api/tests/applications/infrastructure/persistence/test_orm_application_repository_get_by_user.py b/organizator_api/tests/applications/infrastructure/persistence/test_orm_application_repository_get_by_user.py index b439610e..79d54efc 100644 --- a/organizator_api/tests/applications/infrastructure/persistence/test_orm_application_repository_get_by_user.py +++ b/organizator_api/tests/applications/infrastructure/persistence/test_orm_application_repository_get_by_user.py @@ -1,7 +1,7 @@ import uuid from datetime import timezone, datetime -from app.applications.domain.models.application import Application +from app.applications.domain.models.application import Application, ApplicationStatus from app.applications.infrastructure.persistence.orm_applications_respository import ( ORMApplicationRepository, ) @@ -41,6 +41,7 @@ def test__given_a_application_for_the_user__when_get_by_user__then_return_the_ap id=uuid.UUID("ef6f6fb3-ba46-43dd-a0da-95de8125b1cc"), user=user, event=event, + status=ApplicationStatus.PENDING, created_at=datetime.now(tz=timezone.utc), updated_at=datetime.now(tz=timezone.utc), ) @@ -55,6 +56,7 @@ def test__given_a_application_for_the_user__when_get_by_user__then_return_the_ap self.assertEqual(application.id, response[0].id) self.assertEqual(application.user.id, response[0].user.id) self.assertEqual(application.event.id, response[0].event.id) + self.assertEqual(application.status, response[0].status) self.assertEqual(application.created_at, response[0].created_at) self.assertEqual(application.updated_at, response[0].updated_at) @@ -80,6 +82,7 @@ def test__given_a_application_for_the_user_and_another_application_for_another_u id=uuid.UUID("ef6f6fb3-ba46-43dd-a0da-95de8125b1cc"), user=user, event=event, + status=ApplicationStatus.PENDING, created_at=datetime.now(tz=timezone.utc), updated_at=datetime.now(tz=timezone.utc), ) @@ -88,6 +91,7 @@ def test__given_a_application_for_the_user_and_another_application_for_another_u id=uuid.UUID("ef6f6fb3-ba46-43dd-a0da-95de8125b1cd"), user=user2, event=event, + status=ApplicationStatus.PENDING, created_at=datetime.now(tz=timezone.utc), updated_at=datetime.now(tz=timezone.utc), ) @@ -103,5 +107,6 @@ def test__given_a_application_for_the_user_and_another_application_for_another_u self.assertEqual(application.id, response[0].id) self.assertEqual(application.user.id, response[0].user.id) self.assertEqual(application.event.id, response[0].event.id) + self.assertEqual(application.status, response[0].status) self.assertEqual(application.created_at, response[0].created_at) self.assertEqual(application.updated_at, response[0].updated_at)