Skip to content
This repository has been archived by the owner on Nov 10, 2017. It is now read-only.

Commit

Permalink
bug 1216786 - Make cascade deletion tests generic
Browse files Browse the repository at this point in the history
Move identical cascade deletion test code to a generic TestCase, and run
API-specific tests for each namespace.
  • Loading branch information
jwhitlock committed Feb 25, 2016
1 parent ef0395f commit 9836212
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 135 deletions.
68 changes: 67 additions & 1 deletion webplatformcompat/tests/test_viewsets.py
Expand Up @@ -9,11 +9,77 @@
from webplatformcompat.view_serializers import (
ViewFeatureListSerializer, ViewFeatureRowChildrenSerializer,
ViewFeatureSerializer)
from webplatformcompat.models import Feature
from webplatformcompat.models import (
Browser, Feature, Maturity, Section, Specification, Support, Version)

from .base import APITestCase


class TestCascadeDeleteGeneric(APITestCase):
__test__ = False # Don't test against an unversioned API

def setUp(self):
super(TestCascadeDeleteGeneric, self).setUp()
self.login_user(groups=['change-resource', 'delete-resource'])
self.parent = self.create(Feature, slug='parent')
self.child = self.create(Feature, slug='doomed', parent=self.parent)
self.browser = self.create(Browser, slug='browser')
self.version = self.create(
Version, version='1.0', browser=self.browser)
self.support = self.create(
Support, version=self.version, feature=self.child)
self.maturity = self.create(Maturity, slug='MAT')
self.specification = self.create(
Specification, slug='Spec', maturity=self.maturity)
self.section = self.create(
Section, specification=self.specification)
self.section.features.add(self.child)

def assert_counts_after_delete(
self, url, browsers=1, versions=1, supports=1, maturities=1,
specifications=1, sections=1, features=2):
response = self.client.delete(url)
self.assertEqual(204, response.status_code)
self.assertEqual(browsers, Browser.objects.count())
self.assertEqual(versions, Version.objects.count())
self.assertEqual(supports, Support.objects.count())
self.assertEqual(maturities, Maturity.objects.count())
self.assertEqual(specifications, Specification.objects.count())
self.assertEqual(sections, Section.objects.count())
self.assertEqual(features, Feature.objects.count())

def test_delete_browser(self):
url = self.api_reverse('browser-detail', pk=self.browser.pk)
self.assert_counts_after_delete(
url, browsers=0, versions=0, supports=0)

def test_delete_version(self):
url = self.api_reverse('version-detail', pk=self.version.pk)
self.assert_counts_after_delete(url, versions=0, supports=0)

def test_delete_support(self):
url = self.api_reverse('support-detail', pk=self.support.pk)
self.assert_counts_after_delete(url, supports=0)

def test_delete_maturity(self):
url = self.api_reverse('maturity-detail', pk=self.maturity.pk)
self.assert_counts_after_delete(
url, maturities=0, specifications=0, sections=0)

def test_delete_specification(self):
url = self.api_reverse(
'specification-detail', pk=self.specification.pk)
self.assert_counts_after_delete(url, specifications=0, sections=0)

def test_delete_section(self):
url = self.api_reverse('section-detail', pk=self.section.pk)
self.assert_counts_after_delete(url, sections=0)

def test_delete_feature(self):
url = self.api_reverse('feature-detail', pk=self.parent.pk)
self.assert_counts_after_delete(url, features=0, supports=0)


class TestUserBaseViewset(APITestCase):
"""Test users resource viewset."""

Expand Down
75 changes: 8 additions & 67 deletions webplatformcompat/tests/v1/test_viewsets.py
Expand Up @@ -8,12 +8,12 @@
import mock

from webplatformcompat.history import Changeset
from webplatformcompat.models import (
Browser, Feature, Maturity, Section, Specification, Support, Version)

from webplatformcompat.models import Browser, Feature
from webplatformcompat.v1.viewsets import ViewFeaturesViewSet

from .base import APITestCase, NamespaceMixin
from ..test_viewsets import TestUserBaseViewset, TestViewFeatureBaseViewset
from ..test_viewsets import (
TestCascadeDeleteGeneric, TestUserBaseViewset, TestViewFeatureBaseViewset)


class TestBrowserViewset(APITestCase):
Expand Down Expand Up @@ -294,69 +294,6 @@ def test_options(self):
self.assertEqual(set(response.data.keys()), expected_keys)


class TestCascadeDelete(APITestCase):
def setUp(self):
super(TestCascadeDelete, self).setUp()
self.login_user(groups=['change-resource', 'delete-resource'])
self.parent = self.create(Feature, slug='parent')
self.child = self.create(Feature, slug='doomed', parent=self.parent)
self.browser = self.create(Browser, slug='browser')
self.version = self.create(
Version, version='1.0', browser=self.browser)
self.support = self.create(
Support, version=self.version, feature=self.child)
self.maturity = self.create(Maturity, slug='MAT')
self.specification = self.create(
Specification, slug='Spec', maturity=self.maturity)
self.section = self.create(
Section, specification=self.specification)
self.section.features.add(self.child)

def assert_counts_after_delete(
self, url, browsers=1, versions=1, supports=1, maturities=1,
specifications=1, sections=1, features=2):
response = self.client.delete(url)
self.assertEqual(204, response.status_code)
self.assertEqual(browsers, Browser.objects.count())
self.assertEqual(versions, Version.objects.count())
self.assertEqual(supports, Support.objects.count())
self.assertEqual(maturities, Maturity.objects.count())
self.assertEqual(specifications, Specification.objects.count())
self.assertEqual(sections, Section.objects.count())
self.assertEqual(features, Feature.objects.count())

def test_delete_browser(self):
url = self.api_reverse('browser-detail', pk=self.browser.pk)
self.assert_counts_after_delete(
url, browsers=0, versions=0, supports=0)

def test_delete_version(self):
url = self.api_reverse('version-detail', pk=self.version.pk)
self.assert_counts_after_delete(url, versions=0, supports=0)

def test_delete_support(self):
url = self.api_reverse('support-detail', pk=self.support.pk)
self.assert_counts_after_delete(url, supports=0)

def test_delete_maturity(self):
url = self.api_reverse('maturity-detail', pk=self.maturity.pk)
self.assert_counts_after_delete(
url, maturities=0, specifications=0, sections=0)

def test_delete_specification(self):
url = self.api_reverse(
'specification-detail', pk=self.specification.pk)
self.assert_counts_after_delete(url, specifications=0, sections=0)

def test_delete_section(self):
url = self.api_reverse('section-detail', pk=self.section.pk)
self.assert_counts_after_delete(url, sections=0)

def test_delete_feature(self):
url = self.api_reverse('feature-detail', pk=self.parent.pk)
self.assert_counts_after_delete(url, features=0, supports=0)


class TestFeatureViewSet(APITestCase):
"""Test FeatureViewSet."""

Expand Down Expand Up @@ -449,6 +386,10 @@ def test_get_historical_browser_detail(self):
self.assertDataEqual(expected_json, actual_json)


class TestCascadeDelete(NamespaceMixin, TestCascadeDeleteGeneric):
"""Test cascading deletes."""


class TestUserViewset(NamespaceMixin, TestUserBaseViewset):
"""Test users/me UserViewSet."""

Expand Down
75 changes: 8 additions & 67 deletions webplatformcompat/tests/v2/test_viewsets.py
Expand Up @@ -8,12 +8,12 @@
import mock

from webplatformcompat.history import Changeset
from webplatformcompat.models import (
Browser, Feature, Maturity, Section, Specification, Support, Version)

from webplatformcompat.models import Browser, Feature, Version
from webplatformcompat.v2.viewsets import ViewFeaturesViewSet

from .base import APITestCase, NamespaceMixin
from ..test_viewsets import TestUserBaseViewset, TestViewFeatureBaseViewset
from ..test_viewsets import (
TestCascadeDeleteGeneric, TestUserBaseViewset, TestViewFeatureBaseViewset)


class TestBrowserViewset(APITestCase):
Expand Down Expand Up @@ -517,69 +517,6 @@ def test_options(self):
self.assertEqual(set(response.data.keys()), expected_keys)


class TestCascadeDelete(APITestCase):
def setUp(self):
super(TestCascadeDelete, self).setUp()
self.login_user(groups=['change-resource', 'delete-resource'])
self.parent = self.create(Feature, slug='parent')
self.child = self.create(Feature, slug='doomed', parent=self.parent)
self.browser = self.create(Browser, slug='browser')
self.version = self.create(
Version, version='1.0', browser=self.browser)
self.support = self.create(
Support, version=self.version, feature=self.child)
self.maturity = self.create(Maturity, slug='MAT')
self.specification = self.create(
Specification, slug='Spec', maturity=self.maturity)
self.section = self.create(
Section, specification=self.specification)
self.section.features.add(self.child)

def assert_counts_after_delete(
self, url, browsers=1, versions=1, supports=1, maturities=1,
specifications=1, sections=1, features=2):
response = self.client.delete(url)
self.assertEqual(204, response.status_code)
self.assertEqual(browsers, Browser.objects.count())
self.assertEqual(versions, Version.objects.count())
self.assertEqual(supports, Support.objects.count())
self.assertEqual(maturities, Maturity.objects.count())
self.assertEqual(specifications, Specification.objects.count())
self.assertEqual(sections, Section.objects.count())
self.assertEqual(features, Feature.objects.count())

def test_delete_browser(self):
url = self.api_reverse('browser-detail', pk=self.browser.pk)
self.assert_counts_after_delete(
url, browsers=0, versions=0, supports=0)

def test_delete_version(self):
url = self.api_reverse('version-detail', pk=self.version.pk)
self.assert_counts_after_delete(url, versions=0, supports=0)

def test_delete_support(self):
url = self.api_reverse('support-detail', pk=self.support.pk)
self.assert_counts_after_delete(url, supports=0)

def test_delete_maturity(self):
url = self.api_reverse('maturity-detail', pk=self.maturity.pk)
self.assert_counts_after_delete(
url, maturities=0, specifications=0, sections=0)

def test_delete_specification(self):
url = self.api_reverse(
'specification-detail', pk=self.specification.pk)
self.assert_counts_after_delete(url, specifications=0, sections=0)

def test_delete_section(self):
url = self.api_reverse('section-detail', pk=self.section.pk)
self.assert_counts_after_delete(url, sections=0)

def test_delete_feature(self):
url = self.api_reverse('feature-detail', pk=self.parent.pk)
self.assert_counts_after_delete(url, features=0, supports=0)


class TestFeatureViewSet(APITestCase):
"""Test FeatureViewSet."""

Expand Down Expand Up @@ -982,6 +919,10 @@ def test_relationships_browser(self):
self.assertEqual(200, response.status_code, response.data)


class TestCascadeDelete(NamespaceMixin, TestCascadeDeleteGeneric):
"""Test cascading deletes."""


class TestUserViewset(NamespaceMixin, TestUserBaseViewset):
"""Test users/me UserViewSet."""

Expand Down

0 comments on commit 9836212

Please sign in to comment.