From a009786f3c84f16f28a3a69f1fd54e76435189d4 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Fri, 9 Sep 2022 11:57:34 +0100 Subject: [PATCH 1/2] Support Django 4.1 --- .github/workflows/ci.yml | 13 ++++++++----- setup.cfg | 1 + tests/testapp/settings.py | 6 +++++- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4e08a8cf..abde664c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -50,12 +50,15 @@ jobs: - "3.8" - "3.9" django-version: - - "2.2.0" - - "3.2.0" - - "4.0a1" + - "2.2" + - "3.2" + - "4.0" + - "4.1" exclude: - python-version: "3.7" - django-version: "4.0a1" + django-version: "4.0" + - python-version: "3.7" + django-version: "4.1" runs-on: ubuntu-latest steps: - name: Set up Python ${{ matrix.python-version }} @@ -76,7 +79,7 @@ jobs: pip install -e .[test] pip install django~=${{ matrix.django-version }} - name: Run tests - run: PATH=$PATH:$(pwd)/bin py.test + run: PATH=$PATH:$(pwd)/bin pytest - run: codecov env: CODECOV_TOKEN: ${{secrets.CODECOV_TOKEN}} diff --git a/setup.cfg b/setup.cfg index 638154f0..ec11807a 100644 --- a/setup.cfg +++ b/setup.cfg @@ -24,6 +24,7 @@ classifier = Framework :: Django :: 2.2 Framework :: Django :: 3.1 Framework :: Django :: 4.0 + Framework :: Django :: 4.1 [options] include_package_data = True diff --git a/tests/testapp/settings.py b/tests/testapp/settings.py index f46d128d..15b29b59 100644 --- a/tests/testapp/settings.py +++ b/tests/testapp/settings.py @@ -1,5 +1,7 @@ import os.path +import django + BASE_DIR = os.path.dirname(os.path.abspath(__file__)) DEBUG = True @@ -37,5 +39,7 @@ SECRET_KEY = "123456" -USE_L10N = True +if django.VERSION < (4, 0): + USE_L10N = True USE_I18N = True +USE_TZ = True From 8c09928751fcd09f904e1b5edb67871376722719 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Fri, 9 Sep 2022 12:10:40 +0100 Subject: [PATCH 2/2] Python 3.10, fix for removals in selenium --- .github/workflows/ci.yml | 1 + setup.cfg | 1 + tests/test_forms.py | 64 ++++++++++++++++++++-------------------- 3 files changed, 34 insertions(+), 32 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index abde664c..8e9a0ccf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -49,6 +49,7 @@ jobs: - "3.7" - "3.8" - "3.9" + - "3.10" django-version: - "2.2" - "3.2" diff --git a/setup.cfg b/setup.cfg index ec11807a..e75f3704 100644 --- a/setup.cfg +++ b/setup.cfg @@ -20,6 +20,7 @@ classifier = Programming Language :: Python :: 3.7 Programming Language :: Python :: 3.8 Programming Language :: Python :: 3.9 + Programming Language :: Python :: 3.10 Framework :: Django Framework :: Django :: 2.2 Framework :: Django :: 3.1 diff --git a/tests/test_forms.py b/tests/test_forms.py index dc991ed2..70a89d55 100644 --- a/tests/test_forms.py +++ b/tests/test_forms.py @@ -85,22 +85,22 @@ def test_allow_clear(self, db): def test_no_js_error(self, db, live_server, driver): driver.get(live_server + self.url) with pytest.raises(NoSuchElementException): - error = driver.find_element_by_xpath("//body[@JSError]") + error = driver.find_element(By.XPATH, "//body[@JSError]") pytest.fail(error.get_attribute("JSError")) def test_selecting(self, db, live_server, driver): driver.get(live_server + self.url) with pytest.raises(NoSuchElementException): - driver.find_element_by_css_selector(".select2-results") - elem = driver.find_element_by_css_selector(".select2-selection") + driver.find_element(By.CSS_SELECTOR, ".select2-results") + elem = driver.find_element(By.CSS_SELECTOR, ".select2-selection") elem.click() - results = driver.find_element_by_css_selector(".select2-results") + results = driver.find_element(By.CSS_SELECTOR, ".select2-results") assert results.is_displayed() is True - elem = results.find_element_by_css_selector(".select2-results__option") + elem = results.find_element(By.CSS_SELECTOR, ".select2-results__option") elem.click() with pytest.raises(NoSuchElementException): - error = driver.find_element_by_xpath("//body[@JSError]") + error = driver.find_element(By.XPATH, "//body[@JSError]") pytest.fail(error.get_attribute("JSError")) def test_data_url(self): @@ -301,12 +301,12 @@ def test_many_selected_option(self, db, genres): def test_multiple_widgets(self, db, live_server, driver): driver.get(live_server + self.url) with pytest.raises(NoSuchElementException): - driver.find_element_by_css_selector(".select2-results") + driver.find_element(By.CSS_SELECTOR, ".select2-results") - elem1, elem2 = driver.find_elements_by_css_selector(".select2-selection") + elem1, elem2 = driver.find_elements(By.CSS_SELECTOR, ".select2-selection") elem1.click() - search1 = driver.find_element_by_css_selector(".select2-search__field") + search1 = driver.find_element(By.CSS_SELECTOR, ".select2-search__field") search1.send_keys("fo") result1 = ( WebDriverWait(driver, 60) @@ -319,7 +319,7 @@ def test_multiple_widgets(self, db, live_server, driver): ) elem2.click() - search2 = driver.find_element_by_css_selector(".select2-search__field") + search2 = driver.find_element(By.CSS_SELECTOR, ".select2-search__field") search2.send_keys("fo") result2 = ( WebDriverWait(driver, 60) @@ -334,7 +334,7 @@ def test_multiple_widgets(self, db, live_server, driver): assert result1 != result2 with pytest.raises(NoSuchElementException): - error = driver.find_element_by_xpath("//body[@JSError]") + error = driver.find_element(By.XPATH, "//body[@JSError]") pytest.fail(error.get_attribute("JSError")) def test_get_url(self): @@ -646,15 +646,15 @@ def test_widgets_selected_after_validation_error(self, db, live_server, driver): WebDriverWait(driver, 3).until( expected_conditions.presence_of_element_located((By.ID, "id_title")) ) - title = driver.find_element_by_id("id_title") + title = driver.find_element(By.ID, "id_title") title.send_keys("fo") - genres, fartists = driver.find_elements_by_css_selector( - ".select2-selection--multiple" + genres, fartists = driver.find_elements( + By.CSS_SELECTOR, ".select2-selection--multiple" ) genres.click() genres.send_keys("o") # results are Zero One Two Four # select second element - One - driver.find_element_by_css_selector(".select2-results li:nth-child(2)").click() + driver.find_element(By.CSS_SELECTOR, ".select2-results li:nth-child(2)").click() genres.submit() # there is a ValidationError raised, check for it errstring = ( @@ -668,8 +668,8 @@ def test_widgets_selected_after_validation_error(self, db, live_server, driver): ) assert errstring == "Title must have more than 3 characters." # genres should still have One as selected option - result_title = driver.find_element_by_css_selector( - ".select2-selection--multiple li" + result_title = driver.find_element( + By.CSS_SELECTOR, ".select2-selection--multiple li" ).get_attribute("title") assert result_title == "One" @@ -692,7 +692,7 @@ def test_widgets_selected_after_validation_error( country_container, city_container, city2_container, - ) = driver.find_elements_by_css_selector(".select2-selection--single") + ) = driver.find_elements(By.CSS_SELECTOR, ".select2-selection--single") # clicking city select2 lists all available cities city_container.click() @@ -701,7 +701,7 @@ def test_widgets_selected_after_validation_error( (By.CSS_SELECTOR, ".select2-results li") ) ) - city_options = driver.find_elements_by_css_selector(".select2-results li") + city_options = driver.find_elements(By.CSS_SELECTOR, ".select2-results li") city_names_from_browser = {option.text for option in city_options} city_names_from_db = set(City.objects.values_list("name", flat=True)) assert len(city_names_from_browser) == City.objects.count() @@ -714,8 +714,8 @@ def test_widgets_selected_after_validation_error( (By.CSS_SELECTOR, ".select2-results li:nth-child(2)") ) ) - country_option = driver.find_element_by_css_selector( - ".select2-results li:nth-child(2)" + country_option = driver.find_element( + By.CSS_SELECTOR, ".select2-results li:nth-child(2)" ) country_name = country_option.text country_option.click() @@ -728,7 +728,7 @@ def test_widgets_selected_after_validation_error( (By.CSS_SELECTOR, ".select2-results li") ) ) - city_options = driver.find_elements_by_css_selector(".select2-results li") + city_options = driver.find_elements(By.CSS_SELECTOR, ".select2-results li") city_names_from_browser = {option.text for option in city_options} city_names_from_db = set( Country.objects.get(name=country_name).cities.values_list("name", flat=True) @@ -737,8 +737,8 @@ def test_widgets_selected_after_validation_error( assert city_names_from_browser == city_names_from_db # selecting a city reaaly does it - city_option = driver.find_element_by_css_selector( - ".select2-results li:nth-child(2)" + city_option = driver.find_element( + By.CSS_SELECTOR, ".select2-results li:nth-child(2)" ) city_name = city_option.text city_option.click() @@ -751,7 +751,7 @@ def test_widgets_selected_after_validation_error( (By.CSS_SELECTOR, ".select2-results li") ) ) - country_options = driver.find_elements_by_css_selector(".select2-results li") + country_options = driver.find_elements(By.CSS_SELECTOR, ".select2-results li") country_names_from_browser = {option.text for option in country_options} country_names_from_db = {City.objects.get(name=city_name).country.name} assert len(country_names_from_browser) != Country.objects.count() @@ -765,7 +765,7 @@ def test_dependent_fields_clear_after_change_parent( country_container, city_container, city2_container, - ) = driver.find_elements_by_css_selector(".select2-selection--single") + ) = driver.find_elements(By.CSS_SELECTOR, ".select2-selection--single") # selecting a country really does it country_container.click() @@ -774,8 +774,8 @@ def test_dependent_fields_clear_after_change_parent( (By.CSS_SELECTOR, ".select2-results li:nth-child(2)") ) ) - country_option = driver.find_element_by_css_selector( - ".select2-results li:nth-child(2)" + country_option = driver.find_element( + By.CSS_SELECTOR, ".select2-results li:nth-child(2)" ) country_name = country_option.text country_option.click() @@ -788,8 +788,8 @@ def test_dependent_fields_clear_after_change_parent( (By.CSS_SELECTOR, ".select2-results li") ) ) - city2_option = driver.find_element_by_css_selector( - ".select2-results li:nth-child(2)" + city2_option = driver.find_element( + By.CSS_SELECTOR, ".select2-results li:nth-child(2)" ) city2_name = city2_option.text city2_option.click() @@ -802,8 +802,8 @@ def test_dependent_fields_clear_after_change_parent( (By.CSS_SELECTOR, ".select2-results li:nth-child(3)") ) ) - country_option = driver.find_element_by_css_selector( - ".select2-results li:nth-child(3)" + country_option = driver.find_element( + By.CSS_SELECTOR, ".select2-results li:nth-child(3)" ) country_name = country_option.text country_option.click()