David Burke 8 months ago
parent
commit
98933213cf

+ 12 - 1
apps/performance/serializers.py

@@ -1,23 +1,34 @@
 import logging
 import logging
 import re
 import re
 import uuid
 import uuid
+from datetime import datetime
 from urllib.parse import parse_qs
 from urllib.parse import parse_qs
 
 
 from anonymizeip import anonymize_ip
 from anonymizeip import anonymize_ip
 from django.conf import settings
 from django.conf import settings
+from django.utils.timezone import make_aware
 from ipware import get_client_ip
 from ipware import get_client_ip
 from rest_framework import serializers
 from rest_framework import serializers
 from rest_framework.exceptions import ErrorDetail, ValidationError
 from rest_framework.exceptions import ErrorDetail, ValidationError
 
 
 from apps.environments.models import Environment
 from apps.environments.models import Environment
 from apps.releases.models import Release
 from apps.releases.models import Release
-from glitchtip.serializers import FlexibleDateTimeField
 
 
 from .models import Span, TransactionEvent, TransactionGroup
 from .models import Span, TransactionEvent, TransactionGroup
 
 
 logger = logging.getLogger(__name__)
 logger = logging.getLogger(__name__)
 
 
 
 
+class FlexibleDateTimeField(serializers.DateTimeField):
+    """Supports both DateTime and unix epoch timestamp"""
+
+    def to_internal_value(self, value):
+        try:
+            return make_aware(datetime.fromtimestamp(float(value)))
+        except (ValueError, TypeError):
+            return super().to_internal_value(value)
+
+
 class ErrorValueDetail(ErrorDetail):
 class ErrorValueDetail(ErrorDetail):
     """Extended ErrorDetail with validation value"""
     """Extended ErrorDetail with validation value"""
 
 

+ 2 - 2
apps/uptime/api.py

@@ -181,7 +181,7 @@ async def list_monitor_checks(
 
 
 
 
 @router.get(
 @router.get(
-    "organizations/{slug:organization_slug}/status-pages/",
+    "/organizations/{slug:organization_slug}/status-pages/",
     response=list[StatusPageSchema],
     response=list[StatusPageSchema],
     by_alias=True,
     by_alias=True,
 )
 )
@@ -196,7 +196,7 @@ async def list_status_pages(
 
 
 
 
 @router.post(
 @router.post(
-    "organizations/{slug:organization_slug}/status-pages/",
+    "/organizations/{slug:organization_slug}/status-pages/",
     response={201: StatusPageSchema},
     response={201: StatusPageSchema},
     by_alias=True,
     by_alias=True,
 )
 )

+ 10 - 7
apps/uptime/tests/test_api.py

@@ -1,6 +1,5 @@
 from unittest import mock
 from unittest import mock
 
 
-from django.test import TestCase
 from django.urls import reverse
 from django.urls import reverse
 from django.utils import timezone
 from django.utils import timezone
 from django.utils.dateparse import parse_datetime
 from django.utils.dateparse import parse_datetime
@@ -8,17 +7,21 @@ from freezegun import freeze_time
 from model_bakery import baker
 from model_bakery import baker
 
 
 from apps.uptime.models import Monitor
 from apps.uptime.models import Monitor
-from glitchtip.test_utils.test_case import GlitchTipTestCaseMixin
+from glitchtip.test_utils.test_case import GlitchTestCase
 
 
 
 
-class UptimeAPITestCase(GlitchTipTestCaseMixin, TestCase):
-    def setUp(self):
-        self.create_logged_in_user()
-        self.list_url = reverse(
+class UptimeAPITestCase(GlitchTestCase):
+    @classmethod
+    def setUpTestData(cls):
+        cls.create_user()
+        cls.list_url = reverse(
             "api:list_monitors",
             "api:list_monitors",
-            args=[self.organization.slug],
+            args=[cls.organization.slug],
         )
         )
 
 
+    def setUp(self):
+        self.client.force_login(self.user)
+
     @mock.patch("apps.uptime.tasks.perform_checks.run")
     @mock.patch("apps.uptime.tasks.perform_checks.run")
     def test_list(self, mocked):
     def test_list(self, mocked):
         monitor = baker.make(
         monitor = baker.make(

+ 7 - 4
apps/uptime/tests/test_status_page.py

@@ -1,13 +1,16 @@
-from django.test import TestCase
 from django.urls import reverse
 from django.urls import reverse
 from model_bakery import baker
 from model_bakery import baker
 
 
-from glitchtip.test_utils.test_case import GlitchTipTestCaseMixin
+from glitchtip.test_utils.test_case import GlitchTestCase
 
 
 
 
-class StatusPageTestCase(GlitchTipTestCaseMixin, TestCase):
+class StatusPageTestCase(GlitchTestCase):
+    @classmethod
+    def setUpTestData(cls):
+        cls.create_user()
+
     def setUp(self):
     def setUp(self):
-        self.create_logged_in_user()
+        self.client.force_login(self.user)
 
 
     def test_status_page(self):
     def test_status_page(self):
         status_page = baker.make(
         status_page = baker.make(

+ 0 - 1
glitchtip/api/__init__.py

@@ -1 +0,0 @@
-from .api import api  # noqa: F401

+ 0 - 14
glitchtip/serializers.py

@@ -1,14 +0,0 @@
-from datetime import datetime
-
-from django.utils.timezone import make_aware
-from rest_framework import serializers
-
-
-class FlexibleDateTimeField(serializers.DateTimeField):
-    """Supports both DateTime and unix epoch timestamp"""
-
-    def to_internal_value(self, value):
-        try:
-            return make_aware(datetime.fromtimestamp(float(value)))
-        except (ValueError, TypeError):
-            return super().to_internal_value(value)

+ 28 - 0
glitchtip/test_utils/test_case.py

@@ -8,6 +8,34 @@ from rest_framework.test import APITestCase
 from apps.organizations_ext.models import Organization, OrganizationUserRole
 from apps.organizations_ext.models import Organization, OrganizationUserRole
 
 
 
 
+class GlitchTestCase(TestCase):
+    organization: Optional[Organization] = None
+
+    @classmethod
+    def create_project(cls):
+        """Create project, dsn, and organization"""
+        cls.project = baker.make(
+            "projects.Project", organization__scrub_ip_addresses=False
+        )
+        cls.projectkey = cls.project.projectkey_set.first()
+        cls.organization = cls.project.organization
+
+    @classmethod
+    def create_user(cls):
+        """
+        Create user and joins them to organization with a team
+        If organization does not exist, create it
+        """
+        if not cls.organization:
+            cls.create_project()
+        cls.user = baker.make("users.user")
+        cls.org_user = cls.organization.add_user(cls.user, OrganizationUserRole.ADMIN)
+        cls.team = baker.make("teams.Team", organization=cls.organization)
+        cls.team.members.add(cls.org_user)
+        cls.project = baker.make("projects.Project", organization=cls.organization)
+        cls.project.teams.add(cls.team)
+
+
 class GlitchTipTestCaseMixin:
 class GlitchTipTestCaseMixin:
     organization: Optional[Organization] = None
     organization: Optional[Organization] = None
 
 

+ 1 - 1
glitchtip/urls.py

@@ -13,7 +13,7 @@ from apps.projects.urls import router as projectsRouter
 from apps.users.urls import router as usersRouter
 from apps.users.urls import router as usersRouter
 
 
 from . import social
 from . import social
-from .api import api
+from .api.api import api
 from .views import health
 from .views import health
 
 
 router = routers.DefaultRouter()
 router = routers.DefaultRouter()