from django.test import Client, TestCase from hc.api.models import Check, Ping class PingTestCase(TestCase): def setUp(self): super(PingTestCase, self).setUp() self.check = Check.objects.create() def test_it_works(self): r = self.client.get("/ping/%s/" % self.check.code) assert r.status_code == 200 same_check = Check.objects.get(code=self.check.code) assert same_check.status == "up" ping = Ping.objects.latest("id") assert ping.scheme == "http" def test_post_works(self): csrf_client = Client(enforce_csrf_checks=True) r = csrf_client.post("/ping/%s/" % self.check.code) assert r.status_code == 200 def test_head_works(self): csrf_client = Client(enforce_csrf_checks=True) r = csrf_client.head("/ping/%s/" % self.check.code) assert r.status_code == 200 assert Ping.objects.count() == 1 def test_it_handles_bad_uuid(self): r = self.client.get("/ping/not-uuid/") assert r.status_code == 400 def test_it_handles_120_char_ua(self): ua = ("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) " "AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/44.0.2403.89 Safari/537.36") r = self.client.get("/ping/%s/" % self.check.code, HTTP_USER_AGENT=ua) assert r.status_code == 200 ping = Ping.objects.latest("id") assert ping.ua == ua def test_it_truncates_long_ua(self): ua = "01234567890" * 30 r = self.client.get("/ping/%s/" % self.check.code, HTTP_USER_AGENT=ua) assert r.status_code == 200 ping = Ping.objects.latest("id") assert len(ping.ua) == 200 assert ua.startswith(ping.ua) def test_it_reads_forwarded_ip(self): ip = "1.1.1.1" r = self.client.get("/ping/%s/" % self.check.code, HTTP_X_FORWARDED_FOR=ip) ping = Ping.objects.latest("id") assert r.status_code == 200 assert ping.remote_addr == "1.1.1.1" ip = "1.1.1.1, 2.2.2.2" r = self.client.get("/ping/%s/" % self.check.code, HTTP_X_FORWARDED_FOR=ip, REMOTE_ADDR="3.3.3.3") ping = Ping.objects.latest("id") assert r.status_code == 200 assert ping.remote_addr == "1.1.1.1" def test_it_reads_forwarded_protocol(self): r = self.client.get("/ping/%s/" % self.check.code, HTTP_X_FORWARDED_PROTO="https") ping = Ping.objects.latest("id") assert r.status_code == 200 assert ping.scheme == "https" def test_it_never_caches(self): r = self.client.get("/ping/%s/" % self.check.code) assert "no-cache" in r.get("Cache-Control")