fix(ISSUE-8): try using admin form (#16)
* Remove casting to list in _get_form_data * feat(ISSUE-8): Use Django's form and hide with css * feat(ISSUE-8): Updated dev release on testpypi Co-authored-by: Thu Trang Pham <thu@joinmodernhealth.com>
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
from django.test import TestCase, RequestFactory
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
|
||||
class ConfirmAdminTestCase(TestCase):
|
||||
@classmethod
|
||||
def setUpTestData(cls):
|
||||
cls.superuser = User.objects.create_superuser(
|
||||
username="super", email="super@email.org", password="pass"
|
||||
)
|
||||
|
||||
def setUp(self):
|
||||
self.client.force_login(self.superuser)
|
||||
self.factory = RequestFactory()
|
||||
|
||||
def _assertManyToManyFormHtml(self, rendered_content, options, selected_ids):
|
||||
# Form data should be embedded and hidden on confirmation page
|
||||
# Should have the correct ManyToMany options selected
|
||||
for option in options:
|
||||
self.assertIn(
|
||||
f'<option value="{option.id}"{" selected" if option.id in selected_ids else ""}>{str(option)}</option>',
|
||||
rendered_content,
|
||||
)
|
||||
# ManyToManyField should be embedded
|
||||
self.assertIn("related-widget-wrapper", rendered_content)
|
||||
|
||||
def _assertSubmitHtml(self, rendered_content, save_action="_save"):
|
||||
# Submit should conserve the save action
|
||||
self.assertIn(
|
||||
f'<input type="submit" value="Yes, I’m sure" name="{save_action}">',
|
||||
rendered_content,
|
||||
)
|
||||
# There should not be _confirm_add or _confirm_change sent in the form on confirmaiton page
|
||||
self.assertNotIn("_confirm_add", rendered_content)
|
||||
self.assertNotIn("_confirm_change", rendered_content)
|
||||
|
||||
def _assertSimpleFieldFormHtml(self, rendered_content, fields):
|
||||
for k, v in fields.items():
|
||||
self.assertIn(f'name="{k}"', rendered_content)
|
||||
self.assertIn(f'value="{v}"', rendered_content)
|
||||
@@ -1,27 +1,16 @@
|
||||
from django.test import TestCase, RequestFactory
|
||||
from django.contrib.auth.models import User
|
||||
from django.contrib.admin.sites import AdminSite
|
||||
from django.contrib.admin.options import TO_FIELD_VAR
|
||||
from django.http import HttpResponseForbidden, HttpResponseBadRequest
|
||||
from django.urls import reverse
|
||||
|
||||
|
||||
from admin_confirm.tests.helpers import ConfirmAdminTestCase
|
||||
from tests.market.admin import ItemAdmin, InventoryAdmin
|
||||
from tests.market.models import Item, Inventory
|
||||
from tests.factories import ItemFactory, ShopFactory, InventoryFactory
|
||||
|
||||
|
||||
class TestConfirmChangeAndAdd(TestCase):
|
||||
@classmethod
|
||||
def setUpTestData(cls):
|
||||
cls.superuser = User.objects.create_superuser(
|
||||
username="super", email="super@email.org", password="pass"
|
||||
)
|
||||
|
||||
def setUp(self):
|
||||
self.client.force_login(self.superuser)
|
||||
self.factory = RequestFactory()
|
||||
|
||||
class TestConfirmChangeAndAdd(ConfirmAdminTestCase):
|
||||
def test_get_add_without_confirm_add(self):
|
||||
response = self.client.get(reverse("admin:market_item_add"))
|
||||
self.assertFalse(response.context_data.get("confirm_add"))
|
||||
@@ -53,7 +42,13 @@ class TestConfirmChangeAndAdd(TestCase):
|
||||
def test_post_add_with_confirm_add(self):
|
||||
item = ItemFactory()
|
||||
shop = ShopFactory()
|
||||
data = {"shop": shop.id, "item": item.id, "quantity": 5, "_confirm_add": True}
|
||||
data = {
|
||||
"shop": shop.id,
|
||||
"item": item.id,
|
||||
"quantity": 5,
|
||||
"_confirm_add": True,
|
||||
"_continue": True,
|
||||
}
|
||||
response = self.client.post(reverse("admin:market_inventory_add"), data)
|
||||
# Ensure not redirected (confirmation page does not redirect)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
@@ -63,12 +58,14 @@ class TestConfirmChangeAndAdd(TestCase):
|
||||
"admin/change_confirmation.html",
|
||||
]
|
||||
self.assertEqual(response.template_name, expected_templates)
|
||||
|
||||
form_data = {"shop": str(shop.id), "item": str(item.id), "quantity": str(5)}
|
||||
for k, v in form_data.items():
|
||||
self.assertIn(
|
||||
f'<input type="hidden" name="{ k }" value="{ v }">',
|
||||
response.rendered_content,
|
||||
)
|
||||
self._assertSimpleFieldFormHtml(
|
||||
rendered_content=response.rendered_content, fields=form_data
|
||||
)
|
||||
self._assertSubmitHtml(
|
||||
rendered_content=response.rendered_content, save_action="_continue"
|
||||
)
|
||||
|
||||
# Should not have been added yet
|
||||
self.assertEqual(Inventory.objects.count(), 0)
|
||||
@@ -96,14 +93,14 @@ class TestConfirmChangeAndAdd(TestCase):
|
||||
form_data = {
|
||||
"name": "name",
|
||||
"price": str(2.0),
|
||||
"id": str(item.id),
|
||||
# "id": str(item.id),
|
||||
"currency": Item.VALID_CURRENCIES[0][0],
|
||||
}
|
||||
for k, v in form_data.items():
|
||||
self.assertIn(
|
||||
f'<input type="hidden" name="{ k }" value="{ v }">',
|
||||
response.rendered_content,
|
||||
)
|
||||
|
||||
self._assertSimpleFieldFormHtml(
|
||||
rendered_content=response.rendered_content, fields=form_data
|
||||
)
|
||||
self._assertSubmitHtml(rendered_content=response.rendered_content)
|
||||
|
||||
# Hasn't changed item yet
|
||||
item.refresh_from_db()
|
||||
|
||||
@@ -1,24 +1,12 @@
|
||||
from django.test import TestCase, RequestFactory
|
||||
from django.contrib.auth.models import User
|
||||
from django.urls import reverse
|
||||
|
||||
|
||||
from admin_confirm.tests.helpers import ConfirmAdminTestCase
|
||||
from tests.market.admin import ShoppingMallAdmin
|
||||
from tests.market.models import ShoppingMall
|
||||
from tests.factories import ShopFactory
|
||||
|
||||
|
||||
class TestConfirmChangeAndAddM2MField(TestCase):
|
||||
@classmethod
|
||||
def setUpTestData(cls):
|
||||
cls.superuser = User.objects.create_superuser(
|
||||
username="super", email="super@email.org", password="pass"
|
||||
)
|
||||
|
||||
def setUp(self):
|
||||
self.client.force_login(self.superuser)
|
||||
self.factory = RequestFactory()
|
||||
|
||||
class TestConfirmChangeAndAddM2MField(ConfirmAdminTestCase):
|
||||
def test_post_add_without_confirm_add_m2m(self):
|
||||
shops = [ShopFactory() for i in range(3)]
|
||||
|
||||
@@ -50,19 +38,13 @@ class TestConfirmChangeAndAddM2MField(TestCase):
|
||||
"admin/change_confirmation.html",
|
||||
]
|
||||
self.assertEqual(response.template_name, expected_templates)
|
||||
form_data = [("name", "name")] + [("shops", s.id) for s in shops]
|
||||
for k, v in form_data:
|
||||
self.assertIn(
|
||||
f'<input type="hidden" name="{ k }" value="{ v }">',
|
||||
response.rendered_content,
|
||||
)
|
||||
# Submit should conserve the save action
|
||||
self.assertIn(
|
||||
'<input type="submit" value="Yes, I’m sure" name="_save">',
|
||||
response.rendered_content,
|
||||
|
||||
self._assertManyToManyFormHtml(
|
||||
rendered_content=response.rendered_content,
|
||||
options=shops,
|
||||
selected_ids=data["shops"],
|
||||
)
|
||||
# There should not be _confirm_add sent in the form on confirmaiton page
|
||||
self.assertNotIn("_confirm_add", response.rendered_content)
|
||||
self._assertSubmitHtml(rendered_content=response.rendered_content)
|
||||
|
||||
# Should not have been added yet
|
||||
self.assertEqual(ShoppingMall.objects.count(), 0)
|
||||
@@ -84,7 +66,7 @@ class TestConfirmChangeAndAddM2MField(TestCase):
|
||||
# Currently ShoppingMall configured with confirmation_fields = ['name']
|
||||
data = {
|
||||
"name": "Not My Mall",
|
||||
"shops": ["1", "2"],
|
||||
"shops": [1, 2],
|
||||
"id": shopping_mall.id,
|
||||
"_confirm_change": True,
|
||||
"csrfmiddlewaretoken": "fake token",
|
||||
@@ -101,25 +83,15 @@ class TestConfirmChangeAndAddM2MField(TestCase):
|
||||
"admin/change_confirmation.html",
|
||||
]
|
||||
self.assertEqual(response.template_name, expected_templates)
|
||||
form_data = {
|
||||
"name": "Not My Mall",
|
||||
"shops": "1",
|
||||
"shops": "2",
|
||||
"id": str(shopping_mall.id),
|
||||
}
|
||||
|
||||
for k, v in form_data.items():
|
||||
self.assertIn(
|
||||
f'<input type="hidden" name="{ k }" value="{ v }">',
|
||||
response.rendered_content,
|
||||
)
|
||||
# Submit should conserve the save action
|
||||
self.assertIn(
|
||||
'<input type="submit" value="Yes, I’m sure" name="_continue">',
|
||||
response.rendered_content,
|
||||
self._assertManyToManyFormHtml(
|
||||
rendered_content=response.rendered_content,
|
||||
options=shops,
|
||||
selected_ids=data["shops"],
|
||||
)
|
||||
self._assertSubmitHtml(
|
||||
rendered_content=response.rendered_content, save_action="_continue"
|
||||
)
|
||||
# There should not be _confirm_change sent in the form on confirmaiton page
|
||||
self.assertNotIn("_confirm_change", response.rendered_content)
|
||||
|
||||
# Hasn't changed item yet
|
||||
shopping_mall.refresh_from_db()
|
||||
@@ -148,7 +120,7 @@ class TestConfirmChangeAndAddM2MField(TestCase):
|
||||
# Currently ShoppingMall configured with confirmation_fields = ['name']
|
||||
data = {
|
||||
"name": "Not My Mall",
|
||||
"shops": ["1", "2", "3"],
|
||||
"shops": [1, 2, 3],
|
||||
"id": shopping_mall.id,
|
||||
"_confirm_change": True,
|
||||
"csrfmiddlewaretoken": "fake token",
|
||||
@@ -165,19 +137,6 @@ class TestConfirmChangeAndAddM2MField(TestCase):
|
||||
"admin/change_confirmation.html",
|
||||
]
|
||||
self.assertEqual(response.template_name, expected_templates)
|
||||
form_data = [
|
||||
("name", "Not My Mall"),
|
||||
("shops", "1"),
|
||||
("shops", "2"),
|
||||
("shops", "3"),
|
||||
("id", str(shopping_mall.id)),
|
||||
]
|
||||
|
||||
for k, v in form_data:
|
||||
self.assertIn(
|
||||
f'<input type="hidden" name="{ k }" value="{ v }">',
|
||||
response.rendered_content,
|
||||
)
|
||||
|
||||
# Hasn't changed item yet
|
||||
shopping_mall.refresh_from_db()
|
||||
@@ -209,7 +168,7 @@ class TestConfirmChangeAndAddM2MField(TestCase):
|
||||
data = {
|
||||
"id": shopping_mall.id,
|
||||
"name": "name",
|
||||
"shops": ["1", "2", "3"], # These shops don't exist
|
||||
"shops": [1, 2, 3], # These shops don't exist
|
||||
"_confirm_change": True,
|
||||
"csrfmiddlewaretoken": "fake token",
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user