0
0
Fork 0
mirror of https://github.com/healthchecks/healthchecks.git synced 2025-04-08 14:40:05 +00:00

Fix type annotations in tests to use _MonkeyPatchedWSGIResponse

This commit is contained in:
Pēteris Caune 2023-08-29 22:35:51 +03:00
parent 2b73ddde17
commit ab3dad4ecc
No known key found for this signature in database
GPG key ID: E28D7679E9A9EDE2
10 changed files with 83 additions and 102 deletions

View file

@ -5,7 +5,7 @@ from datetime import timedelta as td
from django.utils.timezone import now
from hc.api.models import Channel, Check
from hc.test import BaseTestCase
from hc.test import BaseTestCase, TestHttpResponse
class CreateCheckTestCase(BaseTestCase):
@ -16,7 +16,7 @@ class CreateCheckTestCase(BaseTestCase):
data: dict[str, str | int | bool | list[str]],
expect_fragment: str | None = None,
v: int = 1,
):
) -> TestHttpResponse:
if "api_key" not in data:
data["api_key"] = "X" * 32
@ -43,7 +43,6 @@ class CreateCheckTestCase(BaseTestCase):
"filter_body": True,
}
)
self.assertEqual(r.status_code, 201)
self.assertEqual(r["Access-Control-Allow-Origin"], "*")
@ -87,7 +86,6 @@ class CreateCheckTestCase(BaseTestCase):
def test_30_days_works(self) -> None:
r = self.post({"name": "Foo", "timeout": 2592000, "grace": 2592000})
self.assertEqual(r.status_code, 201)
check = Check.objects.get()
@ -106,8 +104,8 @@ class CreateCheckTestCase(BaseTestCase):
channel = Channel.objects.create(project=self.project)
r = self.post({"channels": "*"})
self.assertEqual(r.status_code, 201)
check = Check.objects.get()
self.assertEqual(check.channel_set.get(), channel)
@ -145,7 +143,6 @@ class CreateCheckTestCase(BaseTestCase):
Channel.objects.create(project=self.project, name="foo")
r = self.post({"channels": "foo"})
self.assertEqual(r.status_code, 400)
self.assertEqual(r.json()["error"], "non-unique channel identifier: foo")
@ -166,7 +163,6 @@ class CreateCheckTestCase(BaseTestCase):
check = Check.objects.create(project=self.project, name="Foo")
r = self.post({"name": "Foo", "tags": "bar", "unique": ["name"]})
# Expect 200 instead of 201
self.assertEqual(r.status_code, 200)
@ -181,7 +177,6 @@ class CreateCheckTestCase(BaseTestCase):
check = Check.objects.create(project=self.project, slug="foo")
r = self.post({"slug": "foo", "tags": "bar", "unique": ["slug"]})
# Expect 200 instead of 201
self.assertEqual(r.status_code, 200)
@ -196,7 +191,6 @@ class CreateCheckTestCase(BaseTestCase):
Check.objects.create(project=self.project, tags="foo")
r = self.post({"tags": "foo", "unique": ["tags"]})
# Expect 200 instead of 201
self.assertEqual(r.status_code, 200)
@ -207,7 +201,6 @@ class CreateCheckTestCase(BaseTestCase):
Check.objects.create(project=self.project, timeout=td(seconds=123))
r = self.post({"timeout": 123, "unique": ["timeout"]})
# Expect 200 instead of 201
self.assertEqual(r.status_code, 200)
@ -218,7 +211,6 @@ class CreateCheckTestCase(BaseTestCase):
Check.objects.create(project=self.project, grace=td(seconds=123))
r = self.post({"grace": 123, "unique": ["grace"]})
# Expect 200 instead of 201
self.assertEqual(r.status_code, 200)
@ -229,7 +221,6 @@ class CreateCheckTestCase(BaseTestCase):
check = Check.objects.create(project=self.project)
r = self.post({"name": "Hello", "unique": []})
# Expect 201
self.assertEqual(r.status_code, 201)
@ -282,7 +273,6 @@ class CreateCheckTestCase(BaseTestCase):
def test_it_supports_cron_syntax(self) -> None:
r = self.post({"schedule": "5 * * * *", "tz": "Europe/Riga", "grace": 60})
self.assertEqual(r.status_code, 201)
doc = r.json()
@ -330,13 +320,12 @@ class CreateCheckTestCase(BaseTestCase):
def test_it_rejects_non_boolean_manual_resume(self) -> None:
r = self.post({"manual_resume": "surprise"})
self.assertEqual(r.status_code, 400)
def test_it_sets_methods(self) -> None:
r = self.post({"methods": "POST"})
self.assertEqual(r.status_code, 201)
check = Check.objects.get()
self.assertEqual(check.methods, "POST")

View file

@ -3,7 +3,7 @@ from __future__ import annotations
from datetime import timedelta as td
from hc.api.models import Check
from hc.test import BaseTestCase
from hc.test import BaseTestCase, TestHttpResponse
class GetBadgesTestCase(BaseTestCase):
@ -20,7 +20,7 @@ class GetBadgesTestCase(BaseTestCase):
self.url = "/api/v1/badges/"
def get(self, api_key: str = "X" * 32, qs: str = ""):
def get(self, api_key: str = "X" * 32, qs: str = "") -> TestHttpResponse:
return self.client.get(self.url + qs, HTTP_X_API_KEY=api_key)
def test_it_works(self) -> None:

View file

@ -6,7 +6,7 @@ from uuid import UUID
from django.utils.timezone import now
from hc.api.models import Channel, Check
from hc.test import BaseTestCase
from hc.test import BaseTestCase, TestHttpResponse
class GetCheckTestCase(BaseTestCase):
@ -33,7 +33,9 @@ class GetCheckTestCase(BaseTestCase):
self.c1 = Channel.objects.create(project=self.project)
self.a1.channel_set.add(self.c1)
def get(self, code: UUID | str, api_key: str = "X" * 32, v: int = 1):
def get(
self, code: UUID | str, api_key: str = "X" * 32, v: int = 1
) -> TestHttpResponse:
url = f"/api/v{v}/checks/{code}"
return self.client.get(url, HTTP_X_API_KEY=api_key)

View file

@ -5,7 +5,7 @@ from datetime import timedelta as td
from datetime import timezone
from hc.api.models import Check, Flip
from hc.test import BaseTestCase
from hc.test import BaseTestCase, TestHttpResponse
class GetFlipsTestCase(BaseTestCase):
@ -30,7 +30,7 @@ class GetFlipsTestCase(BaseTestCase):
self.url = f"/api/v1/checks/{self.a1.code}/flips/"
def get(self, api_key: str = "X" * 32, qs: str = ""):
def get(self, api_key: str = "X" * 32, qs: str = "") -> TestHttpResponse:
return self.client.get(self.url + qs, HTTP_X_API_KEY=api_key)
def test_it_works(self) -> None:

View file

@ -6,7 +6,7 @@ from datetime import timezone
from uuid import uuid4
from hc.api.models import Check, Ping
from hc.test import BaseTestCase
from hc.test import BaseTestCase, TestHttpResponse
EPOCH = datetime(2020, 1, 1, tzinfo=timezone.utc)
@ -34,7 +34,7 @@ class GetPingsTestCase(BaseTestCase):
self.url = "/api/v1/checks/%s/pings/" % self.a1.code
def get(self, api_key: str = "X" * 32):
def get(self, api_key: str = "X" * 32) -> TestHttpResponse:
return self.csrf_client.get(self.url, HTTP_X_API_KEY=api_key)
def test_it_works(self) -> None:

View file

@ -1,7 +1,7 @@
from __future__ import annotations
from hc.api.models import Channel
from hc.test import BaseTestCase
from hc.test import BaseTestCase, TestHttpResponse
class ListChannelsTestCase(BaseTestCase):
@ -15,7 +15,7 @@ class ListChannelsTestCase(BaseTestCase):
self.url = "/api/v1/channels/"
def get(self):
def get(self) -> TestHttpResponse:
return self.client.get(self.url, HTTP_X_API_KEY="X" * 32)
def test_it_works(self) -> None:

View file

@ -6,7 +6,7 @@ from django.conf import settings
from django.utils.timezone import now
from hc.api.models import Channel, Check
from hc.test import BaseTestCase
from hc.test import BaseTestCase, TestHttpResponse
class ListChecksTestCase(BaseTestCase):
@ -36,7 +36,7 @@ class ListChecksTestCase(BaseTestCase):
self.c1 = Channel.objects.create(project=self.project)
self.a1.channel_set.add(self.c1)
def get(self, v: int = 1):
def get(self, v: int = 1) -> TestHttpResponse:
return self.client.get(f"/api/v{v}/checks/", HTTP_X_API_KEY="X" * 32)
def test_it_works(self) -> None:

View file

@ -6,7 +6,7 @@ from datetime import timedelta as td
from django.utils.timezone import now
from hc.api.models import Channel, Check
from hc.test import BaseTestCase
from hc.test import BaseTestCase, TestHttpResponse
class UpdateCheckTestCase(BaseTestCase):
@ -14,9 +14,17 @@ class UpdateCheckTestCase(BaseTestCase):
super().setUp()
self.check = Check.objects.create(project=self.project)
def post(self, code: uuid.UUID | str, data, v: int = 1):
def post(
self,
code: uuid.UUID | str,
data: dict[str, str | int | bool | list[str] | None],
v: int = 1,
api_key: str = "X" * 32,
) -> TestHttpResponse:
url = f"/api/v{v}/checks/{code}"
return self.csrf_client.post(url, data, content_type="application/json")
return self.csrf_client.post(
url, data, content_type="application/json", HTTP_X_API_KEY=api_key
)
def test_it_works(self) -> None:
self.check.last_ping = now()
@ -26,7 +34,6 @@ class UpdateCheckTestCase(BaseTestCase):
r = self.post(
self.check.code,
{
"api_key": "X" * 32,
"name": "Foo",
"tags": "bar,baz",
"desc": "My description",
@ -70,25 +77,25 @@ class UpdateCheckTestCase(BaseTestCase):
Channel.objects.create(project=self.project)
self.check.assign_all_channels()
r = self.post(self.check.code, {"api_key": "X" * 32, "channels": ""})
r = self.post(self.check.code, {"channels": ""})
self.assertEqual(r.status_code, 200)
check = Check.objects.get()
self.assertEqual(check.channel_set.count(), 0)
def test_it_handles_invalid_uuid(self) -> None:
r = self.post("not-an-uuid", {"api_key": "X" * 32})
r = self.post("not-an-uuid", {})
self.assertEqual(r.status_code, 404)
def test_it_handles_missing_check(self) -> None:
made_up_code = "07c2f548-9850-4b27-af5d-6c9dc157ec02"
r = self.post(made_up_code, {"api_key": "X" * 32})
r = self.post(made_up_code, {})
self.assertEqual(r.status_code, 404)
def test_it_validates_ownership(self) -> None:
check = Check.objects.create(project=self.bobs_project, status="up")
r = self.post(check.code, {"api_key": "X" * 32})
r = self.post(check.code, {})
self.assertEqual(r.status_code, 403)
def test_it_updates_cron_to_simple(self) -> None:
@ -96,7 +103,7 @@ class UpdateCheckTestCase(BaseTestCase):
self.check.schedule = "5 * * * *"
self.check.save()
r = self.post(self.check.code, {"api_key": "X" * 32, "timeout": 3600})
r = self.post(self.check.code, {"timeout": 3600})
self.assertEqual(r.status_code, 200)
self.check.refresh_from_db()
@ -108,10 +115,7 @@ class UpdateCheckTestCase(BaseTestCase):
# gets assigned:
Channel.objects.create(project=self.project)
r = self.post(
self.check.code, {"api_key": "X" * 32, "channels": str(channel.code)}
)
r = self.post(self.check.code, {"channels": str(channel.code)})
self.assertEqual(r.status_code, 200)
self.check.refresh_from_db()
@ -120,8 +124,8 @@ class UpdateCheckTestCase(BaseTestCase):
def test_it_sets_the_channel_only_once(self) -> None:
channel = Channel.objects.create(project=self.project)
duplicates = "%s,%s" % (channel.code, channel.code)
r = self.post(self.check.code, {"api_key": "X" * 32, "channels": duplicates})
duplicates = f"{channel.code},{channel.code}"
r = self.post(self.check.code, {"channels": duplicates})
self.assertEqual(r.status_code, 200)
self.check.refresh_from_db()
@ -130,8 +134,7 @@ class UpdateCheckTestCase(BaseTestCase):
def test_it_sets_channel_by_name(self) -> None:
channel = Channel.objects.create(project=self.project, name="alerts")
r = self.post(self.check.code, {"api_key": "X" * 32, "channels": "alerts"})
r = self.post(self.check.code, {"channels": "alerts"})
self.assertEqual(r.status_code, 200)
self.check.refresh_from_db()
@ -142,7 +145,7 @@ class UpdateCheckTestCase(BaseTestCase):
name = "102eaa82-a274-4b15-a499-c1bb6bbcd7b6"
channel = Channel.objects.create(project=self.project, name=name)
r = self.post(self.check.code, {"api_key": "X" * 32, "channels": name})
r = self.post(self.check.code, {"channels": name})
self.assertEqual(r.status_code, 200)
self.check.refresh_from_db()
@ -152,11 +155,7 @@ class UpdateCheckTestCase(BaseTestCase):
def test_it_handles_comma_separated_channel_codes(self) -> None:
c1 = Channel.objects.create(project=self.project)
c2 = Channel.objects.create(project=self.project)
r = self.post(
self.check.code,
{"api_key": "X" * 32, "channels": "%s,%s" % (c1.code, c2.code)},
)
r = self.post(self.check.code, {"channels": "%s,%s" % (c1.code, c2.code)})
self.assertEqual(r.status_code, 200)
self.check.refresh_from_db()
@ -165,8 +164,7 @@ class UpdateCheckTestCase(BaseTestCase):
def test_it_handles_asterix(self) -> None:
Channel.objects.create(project=self.project)
Channel.objects.create(project=self.project)
r = self.post(self.check.code, {"api_key": "X" * 32, "channels": "*"})
r = self.post(self.check.code, {"channels": "*"})
self.assertEqual(r.status_code, 200)
self.check.refresh_from_db()
@ -176,17 +174,14 @@ class UpdateCheckTestCase(BaseTestCase):
Channel.objects.create(project=self.project)
self.check.assign_all_channels()
r = self.post(self.check.code, {"api_key": "X" * 32})
r = self.post(self.check.code, {})
self.assertEqual(r.status_code, 200)
check = Check.objects.get()
self.assertEqual(check.channel_set.count(), 1)
def test_it_rejects_bad_channel_code(self) -> None:
payload = {"api_key": "X" * 32, "channels": "abc", "name": "New Name"}
r = self.post(
self.check.code,
payload,
)
r = self.post(self.check.code, {"channels": "abc", "name": "New Name"})
self.assertEqual(r.status_code, 400)
self.assertEqual(r.json()["error"], "invalid channel identifier: abc")
@ -196,8 +191,7 @@ class UpdateCheckTestCase(BaseTestCase):
def test_it_rejects_missing_channel(self) -> None:
code = str(uuid.uuid4())
r = self.post(self.check.code, {"api_key": "X" * 32, "channels": code})
r = self.post(self.check.code, {"channels": code})
self.assertEqual(r.status_code, 400)
self.assertEqual(r.json()["error"], "invalid channel identifier: " + code)
@ -206,10 +200,9 @@ class UpdateCheckTestCase(BaseTestCase):
def test_it_rejects_channel_from_another_project(self) -> None:
charlies_channel = Channel.objects.create(project=self.charlies_project)
code = str(charlies_channel.code)
r = self.post(self.check.code, {"api_key": "X" * 32, "channels": code})
r = self.post(self.check.code, {"channels": code})
self.assertEqual(r.status_code, 400)
self.assertEqual(r.json()["error"], "invalid channel identifier: " + code)
@ -217,8 +210,7 @@ class UpdateCheckTestCase(BaseTestCase):
self.assertEqual(self.check.channel_set.count(), 0)
def test_it_handles_channel_lookup_by_name_with_no_results(self) -> None:
r = self.post(self.check.code, {"api_key": "X" * 32, "channels": "foo"})
r = self.post(self.check.code, {"channels": "foo"})
self.assertEqual(r.status_code, 400)
self.assertEqual(r.json()["error"], "invalid channel identifier: foo")
@ -229,8 +221,7 @@ class UpdateCheckTestCase(BaseTestCase):
Channel.objects.create(project=self.project, name="foo")
Channel.objects.create(project=self.project, name="foo")
r = self.post(self.check.code, {"api_key": "X" * 32, "channels": "foo"})
r = self.post(self.check.code, {"channels": "foo"})
self.assertEqual(r.status_code, 400)
self.assertEqual(r.json()["error"], "non-unique channel identifier: foo")
@ -240,7 +231,7 @@ class UpdateCheckTestCase(BaseTestCase):
def test_it_rejects_multiple_empty_channel_names(self) -> None:
Channel.objects.create(project=self.project, name="")
r = self.post(self.check.code, {"api_key": "X" * 32, "channels": ","})
r = self.post(self.check.code, {"channels": ","})
self.assertEqual(r.status_code, 400)
self.assertEqual(r.json()["error"], "empty channel identifier")
@ -248,13 +239,11 @@ class UpdateCheckTestCase(BaseTestCase):
self.assertEqual(self.check.channel_set.count(), 0)
def test_it_rejects_non_string_channels_key(self) -> None:
r = self.post(self.check.code, {"api_key": "X" * 32, "channels": None})
r = self.post(self.check.code, {"channels": None})
self.assertEqual(r.status_code, 400)
def test_it_rejects_non_string_desc(self) -> None:
r = self.post(self.check.code, {"api_key": "X" * 32, "desc": 123})
r = self.post(self.check.code, {"desc": 123})
self.assertEqual(r.status_code, 400)
def test_it_validates_cron_expression(self) -> None:
@ -264,8 +253,8 @@ class UpdateCheckTestCase(BaseTestCase):
samples = ["* invalid *", "1,2 61 * * *", "0 0 31 2 *"]
for sample in samples:
r = self.post(self.check.code, {"api_key": "X" * 32, "schedule": sample})
self.assertEqual(r.status_code, 400, "Did not reject '%s'" % sample)
r = self.post(self.check.code, {"schedule": sample})
self.assertEqual(r.status_code, 400, f"Did not reject '{sample}'")
# Schedule should be unchanged
self.check.refresh_from_db()
@ -275,11 +264,11 @@ class UpdateCheckTestCase(BaseTestCase):
self.project.api_key_readonly = "R" * 32
self.project.save()
r = self.post(self.check.code, {"api_key": "R" * 32, "name": "Foo"})
r = self.post(self.check.code, {"name": "Foo"}, api_key="R" * 32)
self.assertEqual(r.status_code, 401)
def test_it_sets_manual_resume_to_true(self) -> None:
r = self.post(self.check.code, {"api_key": "X" * 32, "manual_resume": True})
r = self.post(self.check.code, {"manual_resume": True})
self.assertEqual(r.status_code, 200)
self.check.refresh_from_db()
@ -289,14 +278,14 @@ class UpdateCheckTestCase(BaseTestCase):
self.check.manual_resume = True
self.check.save()
r = self.post(self.check.code, {"api_key": "X" * 32, "manual_resume": False})
r = self.post(self.check.code, {"manual_resume": False})
self.assertEqual(r.status_code, 200)
self.check.refresh_from_db()
self.assertFalse(self.check.manual_resume)
def test_it_sets_methods(self) -> None:
r = self.post(self.check.code, {"api_key": "X" * 32, "methods": "POST"})
r = self.post(self.check.code, {"methods": "POST"})
self.assertEqual(r.status_code, 200)
self.check.refresh_from_db()
@ -307,7 +296,7 @@ class UpdateCheckTestCase(BaseTestCase):
self.check.save()
# Client supplies an empty string: we should save it
r = self.post(self.check.code, {"api_key": "X" * 32, "methods": ""})
r = self.post(self.check.code, {"methods": ""})
self.assertEqual(r.status_code, 200)
self.check.refresh_from_db()
@ -318,20 +307,18 @@ class UpdateCheckTestCase(BaseTestCase):
self.check.save()
# Client omits the methods key: we should leave it unchanged
r = self.post(self.check.code, {"api_key": "X" * 32})
r = self.post(self.check.code, {})
self.assertEqual(r.status_code, 200)
self.check.refresh_from_db()
self.assertEqual(self.check.methods, "POST")
def test_it_rejects_bad_methods_value(self) -> None:
r = self.post(self.check.code, {"api_key": "X" * 32, "methods": "bad-value"})
r = self.post(self.check.code, {"methods": "bad-value"})
self.assertEqual(r.status_code, 400)
def test_it_sets_success_kw(self) -> None:
r = self.post(
self.check.code, {"api_key": "X" * 32, "subject": "SUCCESS,COMPLETE"}
)
r = self.post(self.check.code, {"subject": "SUCCESS,COMPLETE"})
self.assertEqual(r.status_code, 200)
self.check.refresh_from_db()
@ -339,8 +326,7 @@ class UpdateCheckTestCase(BaseTestCase):
self.assertEqual(self.check.success_kw, "SUCCESS,COMPLETE")
def test_it_sets_failure_kw(self) -> None:
payload = {"api_key": "X" * 32, "subject_fail": "FAILED,FAILURE"}
r = self.post(self.check.code, payload)
r = self.post(self.check.code, {"subject_fail": "FAILED,FAILURE"})
self.assertEqual(r.status_code, 200)
self.check.refresh_from_db()
@ -352,7 +338,7 @@ class UpdateCheckTestCase(BaseTestCase):
self.check.success_kw = "SUCCESS"
self.check.save()
r = self.post(self.check.code, {"api_key": "X" * 32, "subject": ""})
r = self.post(self.check.code, {"subject": ""})
self.assertEqual(r.status_code, 200)
self.check.refresh_from_db()
@ -360,21 +346,18 @@ class UpdateCheckTestCase(BaseTestCase):
self.assertEqual(self.check.success_kw, "")
def test_it_accepts_60_days_timeout(self) -> None:
payload = {"api_key": "X" * 32, "timeout": 60 * 24 * 3600}
r = self.post(self.check.code, payload)
r = self.post(self.check.code, {"timeout": 60 * 24 * 3600})
self.assertEqual(r.status_code, 200)
self.check.refresh_from_db()
self.assertEqual(self.check.timeout.total_seconds(), 60 * 24 * 3600)
def test_it_rejects_out_of_range_timeout(self) -> None:
payload = {"api_key": "X" * 32, "timeout": 500 * 24 * 3600}
r = self.post(self.check.code, payload)
r = self.post(self.check.code, {"timeout": 500 * 24 * 3600})
self.assertEqual(r.status_code, 400)
def test_it_prioritizes_filter_subject_field(self) -> None:
payload = {"api_key": "X" * 32, "subject": "SUCCESS", "filter_subject": False}
r = self.post(self.check.code, payload)
r = self.post(self.check.code, {"subject": "SUCCESS", "filter_subject": False})
self.assertEqual(r.status_code, 200)
self.check.refresh_from_db()
@ -385,7 +368,7 @@ class UpdateCheckTestCase(BaseTestCase):
self.check.last_start = now()
self.check.save()
r = self.post(self.check.code, {"api_key": "X" * 32})
r = self.post(self.check.code, {})
doc = r.json()
self.assertEqual(doc["status"], "started")
self.assertTrue(doc["started"])
@ -394,14 +377,13 @@ class UpdateCheckTestCase(BaseTestCase):
self.check.last_start = now()
self.check.save()
r = self.post(self.check.code, {"api_key": "X" * 32}, v=2)
r = self.post(self.check.code, {}, v=2)
doc = r.json()
self.assertEqual(doc["status"], "new")
self.assertTrue(doc["started"])
def test_v3_saves_slug(self) -> None:
payload = {"slug": "updated-slug", "api_key": "X" * 32}
r = self.post(self.check.code, payload, v=3)
r = self.post(self.check.code, {"slug": "updated-slug"}, v=3)
self.assertEqual(r.status_code, 200)
self.check.refresh_from_db()
@ -411,8 +393,7 @@ class UpdateCheckTestCase(BaseTestCase):
self.check.slug = "foo"
self.check.save()
payload = {"name": "Bar", "api_key": "X" * 32}
r = self.post(self.check.code, payload, v=3)
r = self.post(self.check.code, {"name": "Bar"}, v=3)
self.assertEqual(r.status_code, 200)
self.check.refresh_from_db()

View file

@ -1,11 +1,23 @@
from __future__ import annotations
from typing import TYPE_CHECKING
from django.contrib.auth.models import User
from django.core.signing import TimestampSigner
from django.test import Client, TestCase
from hc.accounts.models import Member, Profile, Project
if TYPE_CHECKING:
# _MonkeyPatchedWSGIResponse is defined in django-stubs,
# we import with a "TestHttpResponse" alias.
# We list it in __all__ so subclasses can import and use it.
from django.test.client import _MonkeyPatchedWSGIResponse as TestHttpResponse
else:
from django.http import HttpResponse as TestHttpResponse
__all__ = ["BaseTestCase", "TestHttpResponse"]
class BaseTestCase(TestCase):
def setUp(self) -> None:

View file

@ -22,8 +22,5 @@ ignore_missing_imports = True
[mypy-urllib3.*]
ignore_missing_imports = True
[mypy-cron_descriptor.*]
ignore_missing_imports = True
[mypy-pygments.*]
ignore_missing_imports = True