Files
dashboard-cpsp-executive/backend/apps/sync/tests_register.py
T

222 lines
8.9 KiB
Python

from django.test import TestCase
from rest_framework.test import APIClient
from apps.accounts.models import User
from apps.farms.models import Site
from apps.sync.models import ActiveSite
class RegisterFromSiteTests(TestCase):
def setUp(self):
self.client = APIClient()
self.machine = User.objects.create_user(
user_name="site-bot", password="x", status=User.STATUS_GM
)
self.gm = User.objects.create_user(
user_name="gm1", password="x", status=User.STATUS_GM
)
self.gm_other = User.objects.create_user(
user_name="gm2", password="x", status=User.STATUS_GM
)
def test_register_creates_unclaimed_active_site(self):
self.client.force_authenticate(self.machine)
response = self.client.post(
"/api/v1/active-sites/register-from-site/",
{
"code": "Sukawarna!",
"site_id": "sukawarna-0001",
"name": "Sukawarna",
"api_base_url": "https://sukawarna.example/api/v1",
"api_key": "site-secret",
},
format="json",
)
self.assertEqual(response.status_code, 201, response.data)
self.assertEqual(response.data["code"], "sukawarna")
self.assertEqual(response.data["name"], "Sukawarna")
self.assertEqual(response.data["source_site_id"], "sukawarna-0001")
self.assertEqual(response.data["api_base_url"], "https://sukawarna.example/api/v1")
self.assertTrue(response.data["has_api_key"])
self.assertIsNone(response.data["managed_by"])
row = ActiveSite.objects.get(code="sukawarna")
self.assertEqual(row.api_key, "site-secret")
self.assertEqual(row.source_site_id, "sukawarna-0001")
self.assertIsNone(row.managed_by_id)
def test_re_register_by_site_id_updates_even_if_code_changes(self):
active = ActiveSite.objects.create(
code="old-code",
name="Old",
source_site_id="sukawarna-0001",
api_base_url="https://old.example/api/v1",
api_key="old-key",
managed_by=self.gm,
)
self.client.force_authenticate(self.machine)
response = self.client.post(
"/api/v1/active-sites/register-from-site/",
{
"code": "new-code",
"site_id": "sukawarna-0001",
"name": "Sukawarna",
"api_base_url": "https://new.example/api/v1",
"api_key": "new-key",
},
format="json",
)
self.assertEqual(response.status_code, 200, response.data)
active.refresh_from_db()
self.assertEqual(active.code, "new-code")
self.assertEqual(active.name, "Sukawarna")
self.assertEqual(active.source_site_id, "sukawarna-0001")
self.assertEqual(active.api_base_url, "https://new.example/api/v1")
self.assertEqual(active.api_key, "new-key")
self.assertEqual(active.managed_by_id, self.gm.pk)
self.assertEqual(ActiveSite.objects.count(), 1)
def test_second_register_same_site_id_never_creates_second_row(self):
self.client.force_authenticate(self.machine)
first = self.client.post(
"/api/v1/active-sites/register-from-site/",
{
"code": "code-a",
"site_id": "sukawarna-0001",
"name": "Sukawarna",
"api_base_url": "https://a.example/api/v1",
"api_key": "key-a",
},
format="json",
)
self.assertEqual(first.status_code, 201, first.data)
second = self.client.post(
"/api/v1/active-sites/register-from-site/",
{
"code": "code-b",
"site_id": "sukawarna-0001",
"name": "Sukawarna",
"api_base_url": "https://b.example/api/v1",
"api_key": "key-b",
},
format="json",
)
self.assertEqual(second.status_code, 200, second.data)
self.assertEqual(second.data["id"], first.data["id"])
self.assertEqual(ActiveSite.objects.filter(source_site_id="sukawarna-0001").count(), 1)
self.assertEqual(ActiveSite.objects.count(), 1)
row = ActiveSite.objects.get(source_site_id="sukawarna-0001")
self.assertEqual(row.code, "code-b")
self.assertEqual(row.api_key, "key-b")
def test_re_register_updates_credentials_keeps_claim(self):
active = ActiveSite.objects.create(
code="sukawarna",
name="Old",
source_site_id="sukawarna-0001",
api_base_url="https://old.example/api/v1",
api_key="old-key",
managed_by=self.gm,
)
self.client.force_authenticate(self.machine)
response = self.client.post(
"/api/v1/active-sites/register-from-site/",
{
"code": "sukawarna",
"site_id": "sukawarna-0001",
"name": "Sukawarna",
"api_base_url": "https://new.example/api/v1",
"api_key": "new-key",
},
format="json",
)
self.assertEqual(response.status_code, 200, response.data)
active.refresh_from_db()
self.assertEqual(active.name, "Sukawarna")
self.assertEqual(active.api_base_url, "https://new.example/api/v1")
self.assertEqual(active.api_key, "new-key")
self.assertEqual(active.managed_by_id, self.gm.pk)
class ClaimActiveSiteTests(TestCase):
def setUp(self):
self.client = APIClient()
self.gm = User.objects.create_user(
user_name="gm1", password="x", status=User.STATUS_GM
)
self.gm_other = User.objects.create_user(
user_name="gm2", password="x", status=User.STATUS_GM
)
self.active = ActiveSite.objects.create(
code="sukawarna",
name="Sukawarna",
source_site_id="sukawarna-0001",
api_base_url="https://sukawarna.example/api/v1",
api_key="site-secret",
managed_by=None,
)
def test_gm_claims_registered_site_by_code(self):
self.client.force_authenticate(self.gm)
response = self.client.post(
"/api/v1/active-sites/",
{"code": "sukawarna"},
format="json",
)
self.assertEqual(response.status_code, 200, response.data)
self.active.refresh_from_db()
self.assertEqual(self.active.managed_by_id, self.gm.pk)
hq = Site.objects.get(active_site=self.active, user=self.gm)
self.assertEqual(hq.pk, "sukawarna-0001")
self.assertEqual(hq.site_id, self.active.source_site_id)
def test_claimed_site_api_id_is_farm_slug_string(self):
self.client.force_authenticate(self.gm)
self.client.post("/api/v1/active-sites/", {"code": "sukawarna"}, format="json")
listed = self.client.get("/api/v1/sites/")
self.assertEqual(listed.status_code, 200)
row = next(r for r in listed.data["results"] if r["site_name"] == "Sukawarna")
self.assertEqual(row["id"], "sukawarna-0001")
self.assertIsInstance(row["id"], str)
def test_claim_unknown_code_404(self):
self.client.force_authenticate(self.gm)
response = self.client.post(
"/api/v1/active-sites/",
{"code": "missing"},
format="json",
)
self.assertEqual(response.status_code, 404)
def test_claim_owned_by_other_gm_409(self):
self.active.managed_by = self.gm_other
self.active.save(update_fields=["managed_by"])
self.client.force_authenticate(self.gm)
response = self.client.post(
"/api/v1/active-sites/",
{"code": "sukawarna"},
format="json",
)
self.assertEqual(response.status_code, 409)
def test_hapus_unclaims_without_deleting_active_site(self):
self.active.managed_by = self.gm
self.active.source_site_id = "sukawarna-0001"
self.active.save(update_fields=["managed_by", "source_site_id"])
hq_site = Site.objects.create(
site_id="sukawarna-0001",
site_name="Sukawarna",
user=self.gm,
active_site=self.active,
)
self.client.force_authenticate(self.gm)
response = self.client.delete(f"/api/v1/active-sites/{self.active.pk}/")
self.assertEqual(response.status_code, 204, response.data)
self.assertTrue(ActiveSite.objects.filter(pk=self.active.pk).exists())
self.active.refresh_from_db()
self.assertIsNone(self.active.managed_by_id)
self.assertEqual(self.active.api_key, "site-secret")
self.assertEqual(self.active.source_site_id, "sukawarna-0001")
hq_site.refresh_from_db()
self.assertIsNone(hq_site.active_site_id)
self.assertTrue(Site.objects.filter(pk=hq_site.pk).exists())