summaryrefslogtreecommitdiff
path: root/tests/admin_views
diff options
context:
space:
mode:
authorYash Jhunjhunwala <yash@jhunjhunwalaadvisors.com>2021-09-01 17:31:40 +0530
committerCarlton Gibson <carlton.gibson@noumenal.es>2021-09-30 15:42:30 +0200
commit492ed60f236d770eb9a6d56d85ff2550bb1ecfff (patch)
tree3462f5450dc2f6ea831ea6d44892fd92c6d94cfe /tests/admin_views
parent37d9ea5d5c010d54a416417399344c39f4e9f93e (diff)
Fixed #33029 -- Allowed multiple popups for self-related fields in admin.
Diffstat (limited to 'tests/admin_views')
-rw-r--r--tests/admin_views/admin.py5
-rw-r--r--tests/admin_views/models.py6
-rw-r--r--tests/admin_views/tests.py74
3 files changed, 81 insertions, 4 deletions
diff --git a/tests/admin_views/admin.py b/tests/admin_views/admin.py
index dac4517b2b..9238c7fabf 100644
--- a/tests/admin_views/admin.py
+++ b/tests/admin_views/admin.py
@@ -22,8 +22,8 @@ from .forms import MediaActionForm
from .models import (
Actor, AdminOrderedAdminMethod, AdminOrderedCallable, AdminOrderedField,
AdminOrderedModelMethod, Album, Answer, Answer2, Article, BarAccount, Book,
- Bookmark, Category, Chapter, ChapterXtra1, Child, ChildOfReferer, Choice,
- City, Collector, Color, Color2, ComplexSortedPerson, CoverLetter,
+ Bookmark, Box, Category, Chapter, ChapterXtra1, Child, ChildOfReferer,
+ Choice, City, Collector, Color, Color2, ComplexSortedPerson, CoverLetter,
CustomArticle, CyclicOne, CyclicTwo, DependentChild, DooHickey, EmptyModel,
EmptyModelHidden, EmptyModelMixin, EmptyModelVisible, ExplicitlyProvidedPK,
ExternalSubscriber, Fabric, FancyDoodad, FieldOverridePost,
@@ -1125,6 +1125,7 @@ site.register(NotReferenced)
site.register(ExplicitlyProvidedPK, GetFormsetsArgumentCheckingAdmin)
site.register(ImplicitlyGeneratedPK, GetFormsetsArgumentCheckingAdmin)
site.register(UserProxy)
+site.register(Box)
# Register core models we need in our tests
site.register(User, UserAdmin)
diff --git a/tests/admin_views/models.py b/tests/admin_views/models.py
index 73459e2995..c2972e0940 100644
--- a/tests/admin_views/models.py
+++ b/tests/admin_views/models.py
@@ -1050,3 +1050,9 @@ class ReadOnlyRelatedField(models.Model):
class Héllo(models.Model):
pass
+
+
+class Box(models.Model):
+ title = models.CharField(max_length=100)
+ next_box = models.ForeignKey("self", null=True, on_delete=models.SET_NULL, blank=True)
+ next_box = models.ForeignKey("self", null=True, on_delete=models.SET_NULL, blank=True)
diff --git a/tests/admin_views/tests.py b/tests/admin_views/tests.py
index 337b5469f7..863521bee5 100644
--- a/tests/admin_views/tests.py
+++ b/tests/admin_views/tests.py
@@ -48,8 +48,8 @@ from .admin import CityAdmin, site, site2
from .models import (
Actor, AdminOrderedAdminMethod, AdminOrderedCallable, AdminOrderedField,
AdminOrderedModelMethod, Album, Answer, Answer2, Article, BarAccount, Book,
- Bookmark, Category, Chapter, ChapterXtra1, ChapterXtra2, Character, Child,
- Choice, City, Collector, Color, ComplexSortedPerson, CoverLetter,
+ Bookmark, Box, Category, Chapter, ChapterXtra1, ChapterXtra2, Character,
+ Child, Choice, City, Collector, Color, ComplexSortedPerson, CoverLetter,
CustomArticle, CyclicOne, CyclicTwo, DooHickey, Employee, EmptyModel,
Fabric, FancyDoodad, FieldOverridePost, FilteredManager, FooAccount,
FoodDelivery, FunkyTag, Gallery, Grommet, Inquisition, Language, Link,
@@ -4983,6 +4983,76 @@ class SeleniumTests(AdminSeleniumTestCase):
50,
)
+ def test_related_popup_index(self):
+ """
+ Create a chain of 'self' related objects via popups.
+ """
+ from selenium.webdriver.support.ui import Select
+ self.admin_login(username='super', password='secret', login_url=reverse('admin:index'))
+ add_url = reverse('admin:admin_views_box_add', current_app=site.name)
+ self.selenium.get(self.live_server_url + add_url)
+
+ self.selenium.find_element_by_id('add_id_next_box').click()
+ self.wait_for_and_switch_to_popup()
+
+ self.selenium.find_element_by_id('id_title').send_keys('test')
+ self.selenium.find_element_by_id('add_id_next_box').click()
+ self.wait_for_and_switch_to_popup(num_windows=3)
+
+ self.selenium.find_element_by_id('id_title').send_keys('test2')
+ self.selenium.find_element_by_id('add_id_next_box').click()
+ self.wait_for_and_switch_to_popup(num_windows=4)
+
+ self.selenium.find_element_by_id('id_title').send_keys('test3')
+ self.selenium.find_element_by_xpath('//input[@value="Save"]').click()
+ self.selenium.switch_to.window(self.selenium.window_handles[-1])
+ select = Select(self.selenium.find_element_by_id('id_next_box'))
+ next_box_id = str(Box.objects.get(title="test3").id)
+ self.assertEqual(select.first_selected_option.get_attribute('value'), next_box_id)
+
+ self.selenium.find_element_by_xpath('//input[@value="Save"]').click()
+ self.selenium.switch_to.window(self.selenium.window_handles[-1])
+ select = Select(self.selenium.find_element_by_id('id_next_box'))
+ next_box_id = str(Box.objects.get(title="test2").id)
+ self.assertEqual(select.first_selected_option.get_attribute('value'), next_box_id)
+
+ self.selenium.find_element_by_xpath('//input[@value="Save"]').click()
+ self.selenium.switch_to.window(self.selenium.window_handles[-1])
+ select = Select(self.selenium.find_element_by_id('id_next_box'))
+ next_box_id = str(Box.objects.get(title="test").id)
+ self.assertEqual(select.first_selected_option.get_attribute('value'), next_box_id)
+
+ def test_related_popup_incorrect_close(self):
+ """
+ Cleanup child popups when closing a parent popup.
+ """
+ self.admin_login(username='super', password='secret', login_url=reverse('admin:index'))
+ add_url = reverse('admin:admin_views_box_add', current_app=site.name)
+ self.selenium.get(self.live_server_url + add_url)
+
+ self.selenium.find_element_by_id('add_id_next_box').click()
+ self.wait_for_and_switch_to_popup()
+
+ test_window = self.selenium.current_window_handle
+ self.selenium.find_element_by_id('id_title').send_keys('test')
+ self.selenium.find_element_by_id('add_id_next_box').click()
+ self.wait_for_and_switch_to_popup(num_windows=3)
+
+ test2_window = self.selenium.current_window_handle
+ self.selenium.find_element_by_id('id_title').send_keys('test2')
+ self.selenium.find_element_by_id('add_id_next_box').click()
+ self.wait_for_and_switch_to_popup(num_windows=4)
+ self.assertEqual(len(self.selenium.window_handles), 4)
+
+ self.selenium.switch_to.window(test2_window)
+ self.selenium.find_element_by_xpath('//input[@value="Save"]').click()
+ self.assertEqual(len(self.selenium.window_handles), 2)
+
+ # Close final popup to clean up test.
+ self.selenium.switch_to.window(test_window)
+ self.selenium.find_element_by_xpath('//input[@value="Save"]').click()
+ self.selenium.switch_to.window(self.selenium.window_handles[-1])
+
@override_settings(ROOT_URLCONF='admin_views.urls')
class ReadonlyTest(AdminFieldExtractionMixin, TestCase):