Skip to content

Commit d4782a1

Browse files
committed
feat: DomainGroup은 최소 1개 이상 존재하도록 수정
1 parent 162f8c1 commit d4782a1

2 files changed

Lines changed: 24 additions & 3 deletions

File tree

app/admin_api/test/cms_test.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -211,8 +211,16 @@ def test_updating_non_empty_group_does_not_create_extra_sitemap(api_client, supe
211211
# ---- DomainGroup destroy ----------------------------------------------------
212212

213213

214+
@pytest.fixture
215+
def guard_group(superuser):
216+
# destroy 테스트들이 "마지막 그룹 삭제 불가" 규칙에 걸리지 않도록 별도의 그룹을 시드.
217+
return DomainGroup.objects.create(
218+
name="guard", domains=["guard.pycon.kr"], created_by=superuser, updated_by=superuser
219+
)
220+
221+
214222
@pytest.mark.django_db
215-
def test_destroy_domain_group_with_lone_root_succeeds_leaving_page(api_client, superuser):
223+
def test_destroy_domain_group_with_lone_root_succeeds_leaving_page(api_client, superuser, guard_group):
216224
# lone root만 함께 삭제. Page/Section은 보존 (dangling이 되더라도 의도적 삭제 회피로 안전성 우선).
217225
group = DomainGroup.objects.create(name="A", domains=["a.pycon.kr"], created_by=superuser, updated_by=superuser)
218226
page = Page.objects.create(title="A", subtitle="A", created_by=superuser, updated_by=superuser)
@@ -235,7 +243,7 @@ def test_destroy_domain_group_with_lone_root_succeeds_leaving_page(api_client, s
235243

236244

237245
@pytest.mark.django_db
238-
def test_destroy_domain_group_with_multiple_sitemaps_rejected(api_client, superuser):
246+
def test_destroy_domain_group_with_multiple_sitemaps_rejected(api_client, superuser, guard_group):
239247
group = DomainGroup.objects.create(name="A", domains=["a.pycon.kr"], created_by=superuser, updated_by=superuser)
240248
Sitemap.objects.create(name="r1", domain_group=group, route_code="", created_by=superuser, updated_by=superuser)
241249
Sitemap.objects.create(
@@ -250,7 +258,7 @@ def test_destroy_domain_group_with_multiple_sitemaps_rejected(api_client, superu
250258

251259

252260
@pytest.mark.django_db
253-
def test_destroy_domain_group_with_sitemap_having_children_rejected(api_client, superuser):
261+
def test_destroy_domain_group_with_sitemap_having_children_rejected(api_client, superuser, guard_group):
254262
group = DomainGroup.objects.create(name="A", domains=["a.pycon.kr"], created_by=superuser, updated_by=superuser)
255263
parent = Sitemap.objects.create(
256264
name="parent", domain_group=group, route_code="", created_by=superuser, updated_by=superuser
@@ -271,6 +279,16 @@ def test_destroy_domain_group_with_sitemap_having_children_rejected(api_client,
271279
assert group.deleted_at is None
272280

273281

282+
@pytest.mark.django_db
283+
def test_destroy_last_domain_group_rejected(api_client, domain_group):
284+
# 유일한 그룹은 삭제 불가
285+
assert DomainGroup.objects.filter_active().count() == 1
286+
response = api_client.delete(reverse("v1:admin-domain-group-detail", kwargs={"pk": domain_group.id}))
287+
assert response.status_code == http.HTTPStatus.BAD_REQUEST
288+
domain_group.refresh_from_db()
289+
assert domain_group.deleted_at is None
290+
291+
274292
# ---- Sitemap admin serializer exposes domain_group --------------------------
275293

276294

app/admin_api/views/cms.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ class DomainGroupAdminViewSet(JsonSchemaViewSet, viewsets.ModelViewSet):
3232
queryset = DomainGroup.objects.filter_active().select_related_with_user()
3333

3434
def perform_destroy(self, instance: DomainGroup) -> None:
35+
if DomainGroup.objects.filter_active().count() <= 1:
36+
raise exceptions.ValidationError("마지막 DomainGroup은 삭제할 수 없습니다.")
37+
3538
active = list(instance.sitemaps.filter_active())
3639
is_lone_root = (
3740
len(active) == 1 and active[0].parent_sitemap_id is None and not active[0].children.filter_active().exists()

0 commit comments

Comments
 (0)