mirror of
https://github.com/django/django.git
synced 2025-10-25 14:46:09 +00:00
Fixed #2879 -- Added support for the integration with Selenium and other in-browser testing frameworks. Also added the first Selenium tests for contrib.admin. Many thanks to everyone for their contributions and feedback: Mikeal Rogers, Dirk Datzert, mir, Simon G., Almad, Russell Keith-Magee, Denis Golomazov, devin, robertrv, andrewbadr, Idan Gazit, voidspace, Tom Christie, hjwp2, Adam Nelson, Jannis Leidel, Anssi Kääriäinen, Preston Holmes, Bruno Renié and Jacob Kaplan-Moss.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@17241 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
from __future__ import absolute_import
|
||||
|
||||
from django.contrib.admin.tests import AdminSeleniumWebDriverTestCase
|
||||
from django.contrib.admin.helpers import InlineAdminForm
|
||||
from django.contrib.auth.models import User, Permission
|
||||
from django.contrib.contenttypes.models import ContentType
|
||||
@@ -8,7 +9,8 @@ from django.test import TestCase
|
||||
# local test models
|
||||
from .admin import InnerInline
|
||||
from .models import (Holder, Inner, Holder2, Inner2, Holder3, Inner3, Person,
|
||||
OutfitItem, Fashionista, Teacher, Parent, Child, Author, Book)
|
||||
OutfitItem, Fashionista, Teacher, Parent, Child, Author, Book, Profile,
|
||||
ProfileCollection)
|
||||
|
||||
|
||||
class TestInline(TestCase):
|
||||
@@ -380,3 +382,105 @@ class TestInlinePermissions(TestCase):
|
||||
self.assertContains(response, 'value="4" id="id_inner2_set-TOTAL_FORMS"')
|
||||
self.assertContains(response, '<input type="hidden" name="inner2_set-0-id" value="%i"' % self.inner2_id)
|
||||
self.assertContains(response, 'id="id_inner2_set-0-DELETE"')
|
||||
|
||||
class SeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
|
||||
webdriver_class = 'selenium.webdriver.firefox.webdriver.WebDriver'
|
||||
fixtures = ['admin-views-users.xml']
|
||||
urls = "regressiontests.admin_inlines.urls"
|
||||
|
||||
def test_add_inlines(self):
|
||||
"""
|
||||
Ensure that the "Add another XXX" link correctly adds items to the
|
||||
inline form.
|
||||
"""
|
||||
self.admin_login(username='super', password='secret')
|
||||
self.selenium.get('%s%s' % (self.live_server_url,
|
||||
'/admin/admin_inlines/profilecollection/add/'))
|
||||
|
||||
# Check that there's only one inline to start with and that it has the
|
||||
# correct ID.
|
||||
self.failUnlessEqual(len(self.selenium.find_elements_by_css_selector(
|
||||
'#profile_set-group table tr.dynamic-profile_set')), 1)
|
||||
self.failUnlessEqual(self.selenium.find_element_by_css_selector(
|
||||
'.dynamic-profile_set:nth-of-type(1)').get_attribute('id'),
|
||||
'profile_set-0')
|
||||
self.failUnlessEqual(len(self.selenium.find_elements_by_css_selector(
|
||||
'form#profilecollection_form tr.dynamic-profile_set#profile_set-0 input[name=profile_set-0-first_name]')), 1)
|
||||
self.failUnlessEqual(len(self.selenium.find_elements_by_css_selector(
|
||||
'form#profilecollection_form tr.dynamic-profile_set#profile_set-0 input[name=profile_set-0-last_name]')), 1)
|
||||
|
||||
# Add an inline
|
||||
self.selenium.find_element_by_link_text('Add another Profile').click()
|
||||
|
||||
# Check that the inline has been added, that it has the right id, and
|
||||
# that it contains the right fields.
|
||||
self.failUnlessEqual(len(self.selenium.find_elements_by_css_selector(
|
||||
'#profile_set-group table tr.dynamic-profile_set')), 2)
|
||||
self.failUnlessEqual(self.selenium.find_element_by_css_selector(
|
||||
'.dynamic-profile_set:nth-of-type(2)').get_attribute('id'), 'profile_set-1')
|
||||
self.failUnlessEqual(len(self.selenium.find_elements_by_css_selector(
|
||||
'form#profilecollection_form tr.dynamic-profile_set#profile_set-1 input[name=profile_set-1-first_name]')), 1)
|
||||
self.failUnlessEqual(len(self.selenium.find_elements_by_css_selector(
|
||||
'form#profilecollection_form tr.dynamic-profile_set#profile_set-1 input[name=profile_set-1-last_name]')), 1)
|
||||
|
||||
# Let's add another one to be sure
|
||||
self.selenium.find_element_by_link_text('Add another Profile').click()
|
||||
self.failUnlessEqual(len(self.selenium.find_elements_by_css_selector(
|
||||
'#profile_set-group table tr.dynamic-profile_set')), 3)
|
||||
self.failUnlessEqual(self.selenium.find_element_by_css_selector(
|
||||
'.dynamic-profile_set:nth-of-type(3)').get_attribute('id'), 'profile_set-2')
|
||||
self.failUnlessEqual(len(self.selenium.find_elements_by_css_selector(
|
||||
'form#profilecollection_form tr.dynamic-profile_set#profile_set-2 input[name=profile_set-2-first_name]')), 1)
|
||||
self.failUnlessEqual(len(self.selenium.find_elements_by_css_selector(
|
||||
'form#profilecollection_form tr.dynamic-profile_set#profile_set-2 input[name=profile_set-2-last_name]')), 1)
|
||||
|
||||
# Enter some data and click 'Save'
|
||||
self.selenium.find_element_by_name('profile_set-0-first_name').send_keys('0 first name 1')
|
||||
self.selenium.find_element_by_name('profile_set-0-last_name').send_keys('0 last name 2')
|
||||
self.selenium.find_element_by_name('profile_set-1-first_name').send_keys('1 first name 1')
|
||||
self.selenium.find_element_by_name('profile_set-1-last_name').send_keys('1 last name 2')
|
||||
self.selenium.find_element_by_name('profile_set-2-first_name').send_keys('2 first name 1')
|
||||
self.selenium.find_element_by_name('profile_set-2-last_name').send_keys('2 last name 2')
|
||||
self.selenium.find_element_by_xpath('//input[@value="Save"]').click()
|
||||
|
||||
# Check that the objects have been created in the database
|
||||
self.assertEqual(ProfileCollection.objects.all().count(), 1)
|
||||
self.assertEqual(Profile.objects.all().count(), 3)
|
||||
|
||||
def test_delete_inlines(self):
|
||||
self.admin_login(username='super', password='secret')
|
||||
self.selenium.get('%s%s' % (self.live_server_url,
|
||||
'/admin/admin_inlines/profilecollection/add/'))
|
||||
|
||||
# Add a few inlines
|
||||
self.selenium.find_element_by_link_text('Add another Profile').click()
|
||||
self.selenium.find_element_by_link_text('Add another Profile').click()
|
||||
self.selenium.find_element_by_link_text('Add another Profile').click()
|
||||
self.selenium.find_element_by_link_text('Add another Profile').click()
|
||||
self.failUnlessEqual(len(self.selenium.find_elements_by_css_selector(
|
||||
'#profile_set-group table tr.dynamic-profile_set')), 5)
|
||||
self.failUnlessEqual(len(self.selenium.find_elements_by_css_selector(
|
||||
'form#profilecollection_form tr.dynamic-profile_set#profile_set-0')), 1)
|
||||
self.failUnlessEqual(len(self.selenium.find_elements_by_css_selector(
|
||||
'form#profilecollection_form tr.dynamic-profile_set#profile_set-1')), 1)
|
||||
self.failUnlessEqual(len(self.selenium.find_elements_by_css_selector(
|
||||
'form#profilecollection_form tr.dynamic-profile_set#profile_set-2')), 1)
|
||||
self.failUnlessEqual(len(self.selenium.find_elements_by_css_selector(
|
||||
'form#profilecollection_form tr.dynamic-profile_set#profile_set-3')), 1)
|
||||
self.failUnlessEqual(len(self.selenium.find_elements_by_css_selector(
|
||||
'form#profilecollection_form tr.dynamic-profile_set#profile_set-4')), 1)
|
||||
|
||||
# Click on a few delete buttons
|
||||
self.selenium.find_element_by_css_selector(
|
||||
'form#profilecollection_form tr.dynamic-profile_set#profile_set-1 td.delete a').click()
|
||||
self.selenium.find_element_by_css_selector(
|
||||
'form#profilecollection_form tr.dynamic-profile_set#profile_set-2 td.delete a').click()
|
||||
# Verify that they're gone and that the IDs have been re-sequenced
|
||||
self.failUnlessEqual(len(self.selenium.find_elements_by_css_selector(
|
||||
'#profile_set-group table tr.dynamic-profile_set')), 3)
|
||||
self.failUnlessEqual(len(self.selenium.find_elements_by_css_selector(
|
||||
'form#profilecollection_form tr.dynamic-profile_set#profile_set-0')), 1)
|
||||
self.failUnlessEqual(len(self.selenium.find_elements_by_css_selector(
|
||||
'form#profilecollection_form tr.dynamic-profile_set#profile_set-1')), 1)
|
||||
self.failUnlessEqual(len(self.selenium.find_elements_by_css_selector(
|
||||
'form#profilecollection_form tr.dynamic-profile_set#profile_set-2')), 1)
|
||||
|
||||
Reference in New Issue
Block a user