From 89f40e36246100df6a11316c31a76712ebc6c501 Mon Sep 17 00:00:00 2001 From: Florian Apolloner Date: Tue, 26 Feb 2013 09:53:47 +0100 Subject: Merged regressiontests and modeltests into the test root. --- tests/regressiontests/admin_widgets/tests.py | 744 --------------------------- 1 file changed, 744 deletions(-) delete mode 100644 tests/regressiontests/admin_widgets/tests.py (limited to 'tests/regressiontests/admin_widgets/tests.py') diff --git a/tests/regressiontests/admin_widgets/tests.py b/tests/regressiontests/admin_widgets/tests.py deleted file mode 100644 index d559b53531..0000000000 --- a/tests/regressiontests/admin_widgets/tests.py +++ /dev/null @@ -1,744 +0,0 @@ -# encoding: utf-8 -from __future__ import absolute_import, unicode_literals - -from datetime import datetime - -from django import forms -from django.conf import settings -from django.contrib import admin -from django.contrib.admin import widgets -from django.contrib.admin.tests import AdminSeleniumWebDriverTestCase -from django.core.files.storage import default_storage -from django.core.files.uploadedfile import SimpleUploadedFile -from django.db.models import CharField, DateField -from django.test import TestCase as DjangoTestCase -from django.test.utils import override_settings -from django.utils import translation -from django.utils.html import conditional_escape -from django.utils.unittest import TestCase - -from . import models -from .widgetadmin import site as widget_admin_site - - -admin_static_prefix = lambda: { - 'ADMIN_STATIC_PREFIX': "%sadmin/" % settings.STATIC_URL, -} - -class AdminFormfieldForDBFieldTests(TestCase): - """ - Tests for correct behavior of ModelAdmin.formfield_for_dbfield - """ - - def assertFormfield(self, model, fieldname, widgetclass, **admin_overrides): - """ - Helper to call formfield_for_dbfield for a given model and field name - and verify that the returned formfield is appropriate. - """ - # Override any settings on the model admin - class MyModelAdmin(admin.ModelAdmin): - pass - for k in admin_overrides: - setattr(MyModelAdmin, k, admin_overrides[k]) - - # Construct the admin, and ask it for a formfield - ma = MyModelAdmin(model, admin.site) - ff = ma.formfield_for_dbfield(model._meta.get_field(fieldname), request=None) - - # "unwrap" the widget wrapper, if needed - if isinstance(ff.widget, widgets.RelatedFieldWidgetWrapper): - widget = ff.widget.widget - else: - widget = ff.widget - - # Check that we got a field of the right type - self.assertTrue( - isinstance(widget, widgetclass), - "Wrong widget for %s.%s: expected %s, got %s" % \ - (model.__class__.__name__, fieldname, widgetclass, type(widget)) - ) - - # Return the formfield so that other tests can continue - return ff - - def testDateField(self): - self.assertFormfield(models.Event, 'start_date', widgets.AdminDateWidget) - - def testDateTimeField(self): - self.assertFormfield(models.Member, 'birthdate', widgets.AdminSplitDateTime) - - def testTimeField(self): - self.assertFormfield(models.Event, 'start_time', widgets.AdminTimeWidget) - - def testTextField(self): - self.assertFormfield(models.Event, 'description', widgets.AdminTextareaWidget) - - def testURLField(self): - self.assertFormfield(models.Event, 'link', widgets.AdminURLFieldWidget) - - def testIntegerField(self): - self.assertFormfield(models.Event, 'min_age', widgets.AdminIntegerFieldWidget) - - def testCharField(self): - self.assertFormfield(models.Member, 'name', widgets.AdminTextInputWidget) - - def testFileField(self): - self.assertFormfield(models.Album, 'cover_art', widgets.AdminFileWidget) - - def testForeignKey(self): - self.assertFormfield(models.Event, 'band', forms.Select) - - def testRawIDForeignKey(self): - self.assertFormfield(models.Event, 'band', widgets.ForeignKeyRawIdWidget, - raw_id_fields=['band']) - - def testRadioFieldsForeignKey(self): - ff = self.assertFormfield(models.Event, 'band', widgets.AdminRadioSelect, - radio_fields={'band':admin.VERTICAL}) - self.assertEqual(ff.empty_label, None) - - def testManyToMany(self): - self.assertFormfield(models.Band, 'members', forms.SelectMultiple) - - def testRawIDManyTOMany(self): - self.assertFormfield(models.Band, 'members', widgets.ManyToManyRawIdWidget, - raw_id_fields=['members']) - - def testFilteredManyToMany(self): - self.assertFormfield(models.Band, 'members', widgets.FilteredSelectMultiple, - filter_vertical=['members']) - - def testFormfieldOverrides(self): - self.assertFormfield(models.Event, 'start_date', forms.TextInput, - formfield_overrides={DateField: {'widget': forms.TextInput}}) - - def testFormfieldOverridesWidgetInstances(self): - """ - Test that widget instances in formfield_overrides are not shared between - different fields. (#19423) - """ - class BandAdmin(admin.ModelAdmin): - formfield_overrides = { - CharField: {'widget': forms.TextInput(attrs={'size':'10'})} - } - ma = BandAdmin(models.Band, admin.site) - f1 = ma.formfield_for_dbfield(models.Band._meta.get_field('name'), request=None) - f2 = ma.formfield_for_dbfield(models.Band._meta.get_field('style'), request=None) - self.assertNotEqual(f1.widget, f2.widget) - self.assertEqual(f1.widget.attrs['maxlength'], '100') - self.assertEqual(f2.widget.attrs['maxlength'], '20') - self.assertEqual(f2.widget.attrs['size'], '10') - - def testFieldWithChoices(self): - self.assertFormfield(models.Member, 'gender', forms.Select) - - def testChoicesWithRadioFields(self): - self.assertFormfield(models.Member, 'gender', widgets.AdminRadioSelect, - radio_fields={'gender':admin.VERTICAL}) - - def testInheritance(self): - self.assertFormfield(models.Album, 'backside_art', widgets.AdminFileWidget) - - -@override_settings(PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',)) -class AdminFormfieldForDBFieldWithRequestTests(DjangoTestCase): - fixtures = ["admin-widgets-users.xml"] - - def testFilterChoicesByRequestUser(self): - """ - Ensure the user can only see their own cars in the foreign key dropdown. - """ - self.client.login(username="super", password="secret") - response = self.client.get("/widget_admin/admin_widgets/cartire/add/") - self.assertNotContains(response, "BMW M3") - self.assertContains(response, "Volkswagon Passat") - - -@override_settings(PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',)) -class AdminForeignKeyWidgetChangeList(DjangoTestCase): - fixtures = ["admin-widgets-users.xml"] - admin_root = '/widget_admin' - - def setUp(self): - self.client.login(username="super", password="secret") - - def tearDown(self): - self.client.logout() - - def test_changelist_foreignkey(self): - response = self.client.get('%s/admin_widgets/car/' % self.admin_root) - self.assertContains(response, '%s/auth/user/add/' % self.admin_root) - - -@override_settings(PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',)) -class AdminForeignKeyRawIdWidget(DjangoTestCase): - fixtures = ["admin-widgets-users.xml"] - admin_root = '/widget_admin' - - def setUp(self): - self.client.login(username="super", password="secret") - - def tearDown(self): - self.client.logout() - - def test_nonexistent_target_id(self): - band = models.Band.objects.create(name='Bogey Blues') - pk = band.pk - band.delete() - post_data = { - "band": '%s' % pk, - } - # Try posting with a non-existent pk in a raw id field: this - # should result in an error message, not a server exception. - response = self.client.post('%s/admin_widgets/event/add/' % self.admin_root, - post_data) - self.assertContains(response, - 'Select a valid choice. That choice is not one of the available choices.') - - def test_invalid_target_id(self): - - for test_str in ('Iñtërnâtiônàlizætiøn', "1234'", -1234): - # This should result in an error message, not a server exception. - response = self.client.post('%s/admin_widgets/event/add/' % self.admin_root, - {"band": test_str}) - - self.assertContains(response, - 'Select a valid choice. That choice is not one of the available choices.') - - def test_url_params_from_lookup_dict_any_iterable(self): - lookup1 = widgets.url_params_from_lookup_dict({'color__in': ('red', 'blue')}) - lookup2 = widgets.url_params_from_lookup_dict({'color__in': ['red', 'blue']}) - self.assertEqual(lookup1, {'color__in': 'red,blue'}) - self.assertEqual(lookup1, lookup2) - - -class FilteredSelectMultipleWidgetTest(DjangoTestCase): - def test_render(self): - w = widgets.FilteredSelectMultiple('test', False) - self.assertHTMLEqual( - conditional_escape(w.render('test', 'test')), - '\n' % admin_static_prefix() - ) - - def test_stacked_render(self): - w = widgets.FilteredSelectMultiple('test', True) - self.assertHTMLEqual( - conditional_escape(w.render('test', 'test')), - '\n' % admin_static_prefix() - ) - -class AdminDateWidgetTest(DjangoTestCase): - def test_attrs(self): - """ - Ensure that user-supplied attrs are used. - Refs #12073. - """ - w = widgets.AdminDateWidget() - self.assertHTMLEqual( - conditional_escape(w.render('test', datetime(2007, 12, 1, 9, 30))), - '', - ) - # pass attrs to widget - w = widgets.AdminDateWidget(attrs={'size': 20, 'class': 'myDateField'}) - self.assertHTMLEqual( - conditional_escape(w.render('test', datetime(2007, 12, 1, 9, 30))), - '', - ) - -class AdminTimeWidgetTest(DjangoTestCase): - def test_attrs(self): - """ - Ensure that user-supplied attrs are used. - Refs #12073. - """ - w = widgets.AdminTimeWidget() - self.assertHTMLEqual( - conditional_escape(w.render('test', datetime(2007, 12, 1, 9, 30))), - '', - ) - # pass attrs to widget - w = widgets.AdminTimeWidget(attrs={'size': 20, 'class': 'myTimeField'}) - self.assertHTMLEqual( - conditional_escape(w.render('test', datetime(2007, 12, 1, 9, 30))), - '', - ) - -class AdminSplitDateTimeWidgetTest(DjangoTestCase): - def test_render(self): - w = widgets.AdminSplitDateTime() - self.assertHTMLEqual( - conditional_escape(w.render('test', datetime(2007, 12, 1, 9, 30))), - '

Date:
Time:

', - ) - - def test_localization(self): - w = widgets.AdminSplitDateTime() - - with self.settings(USE_L10N=True): - with translation.override('de-at'): - w.is_localized = True - self.assertHTMLEqual( - conditional_escape(w.render('test', datetime(2007, 12, 1, 9, 30))), - '

Datum:
Zeit:

', - ) - - -class AdminURLWidgetTest(DjangoTestCase): - def test_render(self): - w = widgets.AdminURLFieldWidget() - self.assertHTMLEqual( - conditional_escape(w.render('test', '')), - '' - ) - self.assertHTMLEqual( - conditional_escape(w.render('test', 'http://example.com')), - '

Currently:http://example.com
Change:

' - ) - - def test_render_idn(self): - w = widgets.AdminURLFieldWidget() - self.assertHTMLEqual( - conditional_escape(w.render('test', 'http://example-äüö.com')), - '

Currently:http://example-äüö.com
Change:

' - ) - - def test_render_quoting(self): - w = widgets.AdminURLFieldWidget() - self.assertHTMLEqual( - conditional_escape(w.render('test', 'http://example.com/some text')), - '

Currently:http://example.com/<sometag>some text</sometag>
Change:

' - ) - self.assertHTMLEqual( - conditional_escape(w.render('test', 'http://example-äüö.com/some text')), - '

Currently:http://example-äüö.com/<sometag>some text</sometag>
Change:

' - ) - - -class AdminFileWidgetTest(DjangoTestCase): - def test_render(self): - band = models.Band.objects.create(name='Linkin Park') - album = band.album_set.create( - name='Hybrid Theory', cover_art=r'albums\hybrid_theory.jpg' - ) - - w = widgets.AdminFileWidget() - self.assertHTMLEqual( - conditional_escape(w.render('test', album.cover_art)), - '

Currently: albums\hybrid_theory.jpg
Change:

' % { 'STORAGE_URL': default_storage.url('') }, - ) - - self.assertHTMLEqual( - conditional_escape(w.render('test', SimpleUploadedFile('test', b'content'))), - '', - ) - - -class ForeignKeyRawIdWidgetTest(DjangoTestCase): - def test_render(self): - band = models.Band.objects.create(name='Linkin Park') - band.album_set.create( - name='Hybrid Theory', cover_art=r'albums\hybrid_theory.jpg' - ) - rel = models.Album._meta.get_field('band').rel - - w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site) - self.assertHTMLEqual( - conditional_escape(w.render('test', band.pk, attrs={})), - ' Lookup Linkin Park' % dict(admin_static_prefix(), bandpk=band.pk) - ) - - def test_relations_to_non_primary_key(self): - # Check that ForeignKeyRawIdWidget works with fields which aren't - # related to the model's primary key. - apple = models.Inventory.objects.create(barcode=86, name='Apple') - models.Inventory.objects.create(barcode=22, name='Pear') - core = models.Inventory.objects.create( - barcode=87, name='Core', parent=apple - ) - rel = models.Inventory._meta.get_field('parent').rel - w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site) - self.assertHTMLEqual( - w.render('test', core.parent_id, attrs={}), - ' Lookup Apple' % admin_static_prefix() - ) - - def test_fk_related_model_not_in_admin(self): - # FK to a model not registered with admin site. Raw ID widget should - # have no magnifying glass link. See #16542 - big_honeycomb = models.Honeycomb.objects.create(location='Old tree') - big_honeycomb.bee_set.create() - rel = models.Bee._meta.get_field('honeycomb').rel - - w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site) - self.assertHTMLEqual( - conditional_escape(w.render('honeycomb_widget', big_honeycomb.pk, attrs={})), - ' Honeycomb object' % {'hcombpk': big_honeycomb.pk} - ) - - def test_fk_to_self_model_not_in_admin(self): - # FK to self, not registered with admin site. Raw ID widget should have - # no magnifying glass link. See #16542 - subject1 = models.Individual.objects.create(name='Subject #1') - models.Individual.objects.create(name='Child', parent=subject1) - rel = models.Individual._meta.get_field('parent').rel - - w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site) - self.assertHTMLEqual( - conditional_escape(w.render('individual_widget', subject1.pk, attrs={})), - ' Individual object' % {'subj1pk': subject1.pk} - ) - - def test_proper_manager_for_label_lookup(self): - # see #9258 - rel = models.Inventory._meta.get_field('parent').rel - w = widgets.ForeignKeyRawIdWidget(rel, widget_admin_site) - - hidden = models.Inventory.objects.create( - barcode=93, name='Hidden', hidden=True - ) - child_of_hidden = models.Inventory.objects.create( - barcode=94, name='Child of hidden', parent=hidden - ) - self.assertHTMLEqual( - w.render('test', child_of_hidden.parent_id, attrs={}), - ' Lookup Hidden' % admin_static_prefix() - ) - - -class ManyToManyRawIdWidgetTest(DjangoTestCase): - def test_render(self): - band = models.Band.objects.create(name='Linkin Park') - - m1 = models.Member.objects.create(name='Chester') - m2 = models.Member.objects.create(name='Mike') - band.members.add(m1, m2) - rel = models.Band._meta.get_field('members').rel - - w = widgets.ManyToManyRawIdWidget(rel, widget_admin_site) - self.assertHTMLEqual( - conditional_escape(w.render('test', [m1.pk, m2.pk], attrs={})), - ' Lookup' % dict(admin_static_prefix(), m1pk=m1.pk, m2pk=m2.pk) - ) - - self.assertHTMLEqual( - conditional_escape(w.render('test', [m1.pk])), - ' Lookup' % dict(admin_static_prefix(), m1pk=m1.pk) - ) - - def test_m2m_related_model_not_in_admin(self): - # M2M relationship with model not registered with admin site. Raw ID - # widget should have no magnifying glass link. See #16542 - consultor1 = models.Advisor.objects.create(name='Rockstar Techie') - - c1 = models.Company.objects.create(name='Doodle') - c2 = models.Company.objects.create(name='Pear') - consultor1.companies.add(c1, c2) - rel = models.Advisor._meta.get_field('companies').rel - - w = widgets.ManyToManyRawIdWidget(rel, widget_admin_site) - self.assertHTMLEqual( - conditional_escape(w.render('company_widget1', [c1.pk, c2.pk], attrs={})), - '' % {'c1pk': c1.pk, 'c2pk': c2.pk} - ) - - self.assertHTMLEqual( - conditional_escape(w.render('company_widget2', [c1.pk])), - '' % {'c1pk': c1.pk} - ) - -class RelatedFieldWidgetWrapperTests(DjangoTestCase): - def test_no_can_add_related(self): - rel = models.Individual._meta.get_field('parent').rel - w = widgets.AdminRadioSelect() - # Used to fail with a name error. - w = widgets.RelatedFieldWidgetWrapper(w, rel, widget_admin_site) - self.assertFalse(w.can_add_related) - - - -@override_settings(PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',)) -class DateTimePickerSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase): - webdriver_class = 'selenium.webdriver.firefox.webdriver.WebDriver' - fixtures = ['admin-widgets-users.xml'] - urls = "regressiontests.admin_widgets.urls" - - def test_show_hide_date_time_picker_widgets(self): - """ - Ensure that pressing the ESC key closes the date and time picker - widgets. - Refs #17064. - """ - from selenium.webdriver.common.keys import Keys - - self.admin_login(username='super', password='secret', login_url='/') - # Open a page that has a date and time picker widgets - self.selenium.get('%s%s' % (self.live_server_url, - '/admin_widgets/member/add/')) - - # First, with the date picker widget --------------------------------- - # Check that the date picker is hidden - self.assertEqual( - self.get_css_value('#calendarbox0', 'display'), 'none') - # Click the calendar icon - self.selenium.find_element_by_id('calendarlink0').click() - # Check that the date picker is visible - self.assertEqual( - self.get_css_value('#calendarbox0', 'display'), 'block') - # Press the ESC key - self.selenium.find_element_by_tag_name('body').send_keys([Keys.ESCAPE]) - # Check that the date picker is hidden again - self.assertEqual( - self.get_css_value('#calendarbox0', 'display'), 'none') - - # Then, with the time picker widget ---------------------------------- - # Check that the time picker is hidden - self.assertEqual( - self.get_css_value('#clockbox0', 'display'), 'none') - # Click the time icon - self.selenium.find_element_by_id('clocklink0').click() - # Check that the time picker is visible - self.assertEqual( - self.get_css_value('#clockbox0', 'display'), 'block') - # Press the ESC key - self.selenium.find_element_by_tag_name('body').send_keys([Keys.ESCAPE]) - # Check that the time picker is hidden again - self.assertEqual( - self.get_css_value('#clockbox0', 'display'), 'none') - -class DateTimePickerSeleniumChromeTests(DateTimePickerSeleniumFirefoxTests): - webdriver_class = 'selenium.webdriver.chrome.webdriver.WebDriver' - -class DateTimePickerSeleniumIETests(DateTimePickerSeleniumFirefoxTests): - webdriver_class = 'selenium.webdriver.ie.webdriver.WebDriver' - - -@override_settings(PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',)) -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 assertActiveButtons(self, mode, field_name, choose, remove, - choose_all=None, remove_all=None): - 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 - self.assertEqual(self.has_css_class(choose_link, 'active'), choose) - self.assertEqual(self.has_css_class(remove_link, 'active'), remove) - if mode == 'horizontal': - self.assertEqual(self.has_css_class(choose_all_link, 'active'), choose_all) - self.assertEqual(self.has_css_class(remove_all_link, 'active'), remove_all) - - def execute_basic_operations(self, mode, field_name): - 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)]) - self.assertActiveButtons(mode, field_name, False, False, True, True) - - # 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)]) - self.assertActiveButtons(mode, field_name, False, False, False, True) - - # 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, []) - self.assertActiveButtons(mode, field_name, False, False, True, False) - - # 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.assertActiveButtons(mode, field_name, True, False, True, False) - self.selenium.find_element_by_id(choose_link).click() - self.assertActiveButtons(mode, field_name, False, False, True, True) - - 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.assertActiveButtons(mode, field_name, False, True, True, True) - self.selenium.find_element_by_id(remove_link).click() - self.assertActiveButtons(mode, field_name, False, False, True, True) - - 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.wait_page_loaded() - self.execute_basic_operations('vertical', 'students') - self.execute_basic_operations('horizontal', 'alumni') - - # Save and check that everything is properly stored in the database --- - self.selenium.find_element_by_xpath('//input[@value="Save"]').click() - self.wait_page_loaded() - 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]) - - def test_filter(self): - """ - Ensure that typing in the search box filters out options displayed in - the 'from' box. - """ - from selenium.webdriver.common.keys import Keys - - 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)) - - - for field_name in ['students', 'alumni']: - from_box = '#id_%s_from' % field_name - to_box = '#id_%s_to' % field_name - choose_link = '#id_%s_add_link' % field_name - remove_link = '#id_%s_remove_link' % field_name - input = self.selenium.find_element_by_css_selector('#id_%s_input' % field_name) - - # Initial values - 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)]) - - # Typing in some characters filters out non-matching options - input.send_keys('a') - self.assertSelectOptions(from_box, [str(self.arthur.id), str(self.jason.id)]) - input.send_keys('R') - self.assertSelectOptions(from_box, [str(self.arthur.id)]) - - # Clearing the text box makes the other options reappear - input.send_keys([Keys.BACK_SPACE]) - self.assertSelectOptions(from_box, [str(self.arthur.id), str(self.jason.id)]) - input.send_keys([Keys.BACK_SPACE]) - 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)]) - - # ----------------------------------------------------------------- - # Check that chosing a filtered option sends it properly to the - # 'to' box. - input.send_keys('a') - self.assertSelectOptions(from_box, [str(self.arthur.id), str(self.jason.id)]) - self.get_select_option(from_box, str(self.jason.id)).click() - self.selenium.find_element_by_css_selector(choose_link).click() - self.assertSelectOptions(from_box, [str(self.arthur.id)]) - self.assertSelectOptions(to_box, - [str(self.lisa.id), str(self.peter.id), - str(self.jason.id)]) - - self.get_select_option(to_box, str(self.lisa.id)).click() - self.selenium.find_element_by_css_selector(remove_link).click() - self.assertSelectOptions(from_box, - [str(self.arthur.id), str(self.lisa.id)]) - self.assertSelectOptions(to_box, - [str(self.peter.id), str(self.jason.id)]) - - input.send_keys([Keys.BACK_SPACE]) # Clear text box - self.assertSelectOptions(from_box, - [str(self.arthur.id), str(self.bob.id), - str(self.cliff.id), str(self.jenny.id), - str(self.john.id), str(self.lisa.id)]) - self.assertSelectOptions(to_box, - [str(self.peter.id), str(self.jason.id)]) - - # Save and check that everything is properly stored in the database --- - self.selenium.find_element_by_xpath('//input[@value="Save"]').click() - self.wait_page_loaded() - self.school = models.School.objects.get(id=self.school.id) # Reload from database - self.assertEqual(list(self.school.students.all()), - [self.jason, self.peter]) - self.assertEqual(list(self.school.alumni.all()), - [self.jason, self.peter]) - -class HorizontalVerticalFilterSeleniumChromeTests(HorizontalVerticalFilterSeleniumFirefoxTests): - webdriver_class = 'selenium.webdriver.chrome.webdriver.WebDriver' - -class HorizontalVerticalFilterSeleniumIETests(HorizontalVerticalFilterSeleniumFirefoxTests): - webdriver_class = 'selenium.webdriver.ie.webdriver.WebDriver' -- cgit v1.3