summaryrefslogtreecommitdiff
path: root/tests/regressiontests/admin_widgets
diff options
context:
space:
mode:
authorJulien Phalip <jphalip@gmail.com>2012-02-23 08:07:07 +0000
committerJulien Phalip <jphalip@gmail.com>2012-02-23 08:07:07 +0000
commitf2de5f4caba819fad10a78bfec47ae6f29cc2c29 (patch)
tree283180d05e849bc9406127dee1b03f8fd370d8e5 /tests/regressiontests/admin_widgets
parent6daad896fb616bbcd3171a04c00442294fa84173 (diff)
Added some Selenium tests for the admin's filter_horizontal and filter_vertical widgets. Ref #13614, #15220.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@17579 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'tests/regressiontests/admin_widgets')
-rw-r--r--tests/regressiontests/admin_widgets/models.py18
-rw-r--r--tests/regressiontests/admin_widgets/tests.py132
-rw-r--r--tests/regressiontests/admin_widgets/widgetadmin.py7
3 files changed, 155 insertions, 2 deletions
diff --git a/tests/regressiontests/admin_widgets/models.py b/tests/regressiontests/admin_widgets/models.py
index c4489e07c7..1973d5069f 100644
--- a/tests/regressiontests/admin_widgets/models.py
+++ b/tests/regressiontests/admin_widgets/models.py
@@ -99,3 +99,21 @@ class Advisor(models.Model):
"""
name = models.CharField(max_length=20)
companies = models.ManyToManyField(Company)
+
+
+class Student(models.Model):
+ name = models.CharField(max_length=255)
+
+ def __unicode__(self):
+ return self.name
+
+ class Meta:
+ ordering = ('name',)
+
+class School(models.Model):
+ name = models.CharField(max_length=255)
+ students = models.ManyToManyField(Student, related_name='current_schools')
+ alumni = models.ManyToManyField(Student, related_name='previous_schools')
+
+ def __unicode__(self):
+ return self.name \ No newline at end of file
diff --git a/tests/regressiontests/admin_widgets/tests.py b/tests/regressiontests/admin_widgets/tests.py
index ded75f235c..b0b32095d2 100644
--- a/tests/regressiontests/admin_widgets/tests.py
+++ b/tests/regressiontests/admin_widgets/tests.py
@@ -410,7 +410,8 @@ class RelatedFieldWidgetWrapperTests(DjangoTestCase):
self.assertFalse(w.can_add_related)
-class SeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
+
+class DateTimePickerSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
webdriver_class = 'selenium.webdriver.firefox.webdriver.WebDriver'
fixtures = ['admin-widgets-users.xml']
urls = "regressiontests.admin_widgets.urls"
@@ -458,5 +459,132 @@ class SeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
self.assertEqual(
self.get_css_value('#clockbox0', 'display'), 'none')
-class SeleniumChromeTests(SeleniumFirefoxTests):
+class DateTimePickerSeleniumChromeTests(DateTimePickerSeleniumFirefoxTests):
+ webdriver_class = 'selenium.webdriver.chrome.webdriver.WebDriver'
+
+
+class HorizontalVerticalFilterSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
+ webdriver_class = 'selenium.webdriver.firefox.webdriver.WebDriver'
+ fixtures = ['admin-widgets-users.xml']
+ urls = "regressiontests.admin_widgets.urls"
+
+ def setUp(self):
+ self.lisa = models.Student.objects.create(name='Lisa')
+ self.john = models.Student.objects.create(name='John')
+ self.bob = models.Student.objects.create(name='Bob')
+ self.peter = models.Student.objects.create(name='Peter')
+ self.jenny = models.Student.objects.create(name='Jenny')
+ self.jason = models.Student.objects.create(name='Jason')
+ self.cliff = models.Student.objects.create(name='Cliff')
+ self.arthur = models.Student.objects.create(name='Arthur')
+ self.school = models.School.objects.create(name='School of Awesome')
+ super(HorizontalVerticalFilterSeleniumFirefoxTests, self).setUp()
+
+ def execute_basic_operations(self, field_name, mode):
+ from_box = '#id_%s_from' % field_name
+ to_box = '#id_%s_to' % field_name
+ choose_link = 'id_%s_add_link' % field_name
+ choose_all_link = 'id_%s_add_all_link' % field_name
+ remove_link = 'id_%s_remove_link' % field_name
+ remove_all_link = 'id_%s_remove_all_link' % field_name
+
+ # Initial positions ---------------------------------------------------
+ self.assertSelectOptions(from_box,
+ [str(self.arthur.id), str(self.bob.id),
+ str(self.cliff.id), str(self.jason.id),
+ str(self.jenny.id), str(self.john.id)])
+ self.assertSelectOptions(to_box,
+ [str(self.lisa.id), str(self.peter.id)])
+
+ # Click 'Choose all' --------------------------------------------------
+ if mode == 'horizontal':
+ self.selenium.find_element_by_id(choose_all_link).click()
+ elif mode == 'vertical':
+ # There 's no 'Choose all' button in vertical mode, so individually
+ # select all options and click 'Choose'.
+ for option in self.selenium.find_elements_by_css_selector(from_box + ' option'):
+ option.click()
+ self.selenium.find_element_by_id(choose_link).click()
+ self.assertSelectOptions(from_box, [])
+ self.assertSelectOptions(to_box,
+ [str(self.lisa.id), str(self.peter.id),
+ str(self.arthur.id), str(self.bob.id),
+ str(self.cliff.id), str(self.jason.id),
+ str(self.jenny.id), str(self.john.id)])
+
+ # Click 'Remove all' --------------------------------------------------
+ if mode == 'horizontal':
+ self.selenium.find_element_by_id(remove_all_link).click()
+ elif mode == 'vertical':
+ # There 's no 'Remove all' button in vertical mode, so individually
+ # select all options and click 'Remove'.
+ for option in self.selenium.find_elements_by_css_selector(to_box + ' option'):
+ option.click()
+ self.selenium.find_element_by_id(remove_link).click()
+ self.assertSelectOptions(from_box,
+ [str(self.lisa.id), str(self.peter.id),
+ str(self.arthur.id), str(self.bob.id),
+ str(self.cliff.id), str(self.jason.id),
+ str(self.jenny.id), str(self.john.id)])
+ self.assertSelectOptions(to_box, [])
+
+ # Choose some options ------------------------------------------------
+ self.get_select_option(from_box, str(self.lisa.id)).click()
+ self.get_select_option(from_box, str(self.jason.id)).click()
+ self.get_select_option(from_box, str(self.bob.id)).click()
+ self.get_select_option(from_box, str(self.john.id)).click()
+ self.selenium.find_element_by_id(choose_link).click()
+
+ self.assertSelectOptions(from_box,
+ [str(self.peter.id), str(self.arthur.id),
+ str(self.cliff.id), str(self.jenny.id)])
+ self.assertSelectOptions(to_box,
+ [str(self.lisa.id), str(self.bob.id),
+ str(self.jason.id), str(self.john.id)])
+
+ # Remove some options -------------------------------------------------
+ self.get_select_option(to_box, str(self.lisa.id)).click()
+ self.get_select_option(to_box, str(self.bob.id)).click()
+ self.selenium.find_element_by_id(remove_link).click()
+
+ self.assertSelectOptions(from_box,
+ [str(self.peter.id), str(self.arthur.id),
+ str(self.cliff.id), str(self.jenny.id),
+ str(self.lisa.id), str(self.bob.id)])
+ self.assertSelectOptions(to_box,
+ [str(self.jason.id), str(self.john.id)])
+
+ # Choose some more options --------------------------------------------
+ self.get_select_option(from_box, str(self.arthur.id)).click()
+ self.get_select_option(from_box, str(self.cliff.id)).click()
+ self.selenium.find_element_by_id(choose_link).click()
+
+ self.assertSelectOptions(from_box,
+ [str(self.peter.id), str(self.jenny.id),
+ str(self.lisa.id), str(self.bob.id)])
+ self.assertSelectOptions(to_box,
+ [str(self.jason.id), str(self.john.id),
+ str(self.arthur.id), str(self.cliff.id)])
+
+ def test_basic(self):
+ self.school.students = [self.lisa, self.peter]
+ self.school.alumni = [self.lisa, self.peter]
+ self.school.save()
+
+ self.admin_login(username='super', password='secret', login_url='/')
+ self.selenium.get(
+ '%s%s' % (self.live_server_url, '/admin_widgets/school/%s/' % self.school.id))
+
+ self.execute_basic_operations('students', 'vertical')
+ self.execute_basic_operations('alumni', 'horizontal')
+
+ # Save and check that everything is properly stored in the database ---
+ self.selenium.find_element_by_xpath('//input[@value="Save"]').click()
+ self.school = models.School.objects.get(id=self.school.id) # Reload from database
+ self.assertEqual(list(self.school.students.all()),
+ [self.arthur, self.cliff, self.jason, self.john])
+ self.assertEqual(list(self.school.alumni.all()),
+ [self.arthur, self.cliff, self.jason, self.john])
+
+class HorizontalVerticalFilterSeleniumChromeTests(HorizontalVerticalFilterSeleniumFirefoxTests):
webdriver_class = 'selenium.webdriver.chrome.webdriver.WebDriver' \ No newline at end of file
diff --git a/tests/regressiontests/admin_widgets/widgetadmin.py b/tests/regressiontests/admin_widgets/widgetadmin.py
index 5b8cec6e2d..1cdeeb9f67 100644
--- a/tests/regressiontests/admin_widgets/widgetadmin.py
+++ b/tests/regressiontests/admin_widgets/widgetadmin.py
@@ -25,6 +25,11 @@ class CarTireAdmin(admin.ModelAdmin):
class EventAdmin(admin.ModelAdmin):
raw_id_fields = ['band']
+
+class SchoolAdmin(admin.ModelAdmin):
+ filter_vertical = ('students',)
+ filter_horizontal = ('alumni',)
+
site = WidgetAdmin(name='widget-admin')
site.register(models.User)
@@ -41,3 +46,5 @@ site.register(models.Inventory)
site.register(models.Bee)
site.register(models.Advisor)
+
+site.register(models.School, SchoolAdmin) \ No newline at end of file