Bug 1527020 - Travis: Enable unit tests under Python 3 (#4619)

To help prevent regressions whilst the remaining xfailed tests are fixed.
This commit is contained in:
Ed Morley 2019-02-11 20:31:20 +00:00 коммит произвёл GitHub
Родитель 35687e9578
Коммит 7060eef007
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
9 изменённых файлов: 52 добавлений и 19 удалений

Просмотреть файл

@ -71,9 +71,9 @@ matrix:
# https://docs.python.org/2/using/cmdline.html#cmdoption-3 # https://docs.python.org/2/using/cmdline.html#cmdoption-3
- python -3 -m pytest tests/selenium/ --driver Firefox - python -3 -m pytest tests/selenium/ --driver Firefox
- env: python3-smoketest - env: python3-main
language: python language: python
python: '3.6.5' python: '3.7.2'
cache: cache:
directories: directories:
- ${HOME}/venv - ${HOME}/venv
@ -83,11 +83,27 @@ matrix:
- mysql -u root -e 'create database test_treeherder;' - mysql -u root -e 'create database test_treeherder;'
script: script:
- pip check - pip check
- python lints/queuelint.py
- flake8 --show-source - flake8 --show-source
- isort --check-only --diff --quiet
- SITE_URL='https://treeherder.dev' TREEHERDER_DEBUG='False' ./manage.py check --deploy --fail-level WARNING - SITE_URL='https://treeherder.dev' TREEHERDER_DEBUG='False' ./manage.py check --deploy --fail-level WARNING
# Remove these once we get the roughly equivalent pytest sanity tests working under Python 3. - pytest tests/ --runslow --ignore=tests/selenium/
- ./manage.py migrate
- ./manage.py makemigrations --check - env: python3-tests-selenium
language: python
python: '3.7.2'
cache:
directories:
- ${HOME}/venv
- node_modules
install:
- nvm install 11
- source ./bin/travis-setup.sh services python_env geckodriver js_env
before_script:
# Run in `before_script` to prevent the selenium tests from still being run if the UI build fails.
- yarn build
script:
- pytest tests/selenium/ --driver Firefox
notifications: notifications:
email: email:

Просмотреть файл

@ -5,6 +5,7 @@ import pytest
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.urls import reverse from django.urls import reverse
from six import PY3
from treeherder.auth.backends import (AuthBackend, from treeherder.auth.backends import (AuthBackend,
AuthenticationFailed) AuthenticationFailed)
@ -35,16 +36,17 @@ def test_get_username_from_userinfo(user_info, exp_username, exp_exception):
@pytest.mark.django_db @pytest.mark.django_db
@pytest.mark.parametrize( @pytest.mark.parametrize(
('exp_username', 'email', 'exp_create_user'), ('exp_username', 'email', 'exp_create_user'),
[('email/user@foo.com', [
'user@foo.com', ('email/user@foo.com', 'user@foo.com', True),
True), ('email/emailaddressexceeding30chars@foo.com', 'emailaddressexceeding30chars@foo.com', True),
('email/emailaddressexceeding30chars@foo.com', pytest.param(
'emailaddressexceeding30chars@foo.com', 'email/foo@bar.net', 'foo@bar.net', False,
True), marks=pytest.mark.xfail(
('email/foo@bar.net', PY3, reason='Python 3: < not supported between instances of str and int (bug 1453837)'
'foo@bar.net', )
False), ),
]) ]
)
def test_existing_email_create_user(test_user, client, monkeypatch, exp_username, email, exp_create_user): def test_existing_email_create_user(test_user, client, monkeypatch, exp_username, email, exp_create_user):
""" """
Test whether a user was created or not, despite an existing user with Test whether a user was created or not, despite an existing user with

Просмотреть файл

@ -4,6 +4,7 @@ import json
import pytest import pytest
from django.forms import model_to_dict from django.forms import model_to_dict
from mock import MagicMock from mock import MagicMock
from six import PY3
from tests.test_utils import add_log_response from tests.test_utils import add_log_response
from treeherder.client.thclient import client from treeherder.client.thclient import client
@ -53,6 +54,7 @@ def check_job_log(test_repository, job_guid, parse_status):
assert job_logs[0].status == parse_status assert job_logs[0].status == parse_status
@pytest.mark.xfail(PY3, reason='Python 3: a bytes-like object is required, not str (bug 1526743)')
def test_store_job_with_unparsed_log(test_repository, failure_classifications, def test_store_job_with_unparsed_log(test_repository, failure_classifications,
push_stored, monkeypatch, activate_responses): push_stored, monkeypatch, activate_responses):
""" """
@ -97,6 +99,7 @@ def test_store_job_with_unparsed_log(test_repository, failure_classifications,
assert len(get_error_summary(Job.objects.get(id=1))) == 2 assert len(get_error_summary(Job.objects.get(id=1))) == 2
@pytest.mark.xfail(PY3, reason='Python 3: a bytes-like object is required, not str (bug 1526743)')
def test_store_job_pending_to_completed_with_unparsed_log(test_repository, push_stored, def test_store_job_pending_to_completed_with_unparsed_log(test_repository, push_stored,
failure_classifications, failure_classifications,
activate_responses): activate_responses):

Просмотреть файл

@ -2,15 +2,11 @@ from __future__ import unicode_literals
import json import json
import pytest
from treeherder.etl.artifact import store_job_artifacts from treeherder.etl.artifact import store_job_artifacts
from treeherder.model.models import (JobDetail, from treeherder.model.models import (JobDetail,
TextLogError, TextLogError,
TextLogStep) TextLogStep)
xfail = pytest.mark.xfail
def test_load_long_job_details(test_job): def test_load_long_job_details(test_job):
def max_length(field): def max_length(field):

Просмотреть файл

@ -1,10 +1,14 @@
import pytest
import responses import responses
from six import PY3
from tests import test_utils from tests import test_utils
from tests.test_utils import add_log_response from tests.test_utils import add_log_response
from treeherder.log_parser.artifactbuildercollection import ArtifactBuilderCollection from treeherder.log_parser.artifactbuildercollection import ArtifactBuilderCollection
from treeherder.log_parser.artifactbuilders import BuildbotJobArtifactBuilder from treeherder.log_parser.artifactbuilders import BuildbotJobArtifactBuilder
pytestmark = pytest.mark.xfail(PY3, reason='Python 3: a bytes-like object is required, not str (bug 1526743)')
@responses.activate @responses.activate
def do_test(log): def do_test(log):

Просмотреть файл

@ -1,5 +1,6 @@
import pytest import pytest
import responses import responses
from six import PY3
from tests import test_utils from tests import test_utils
from tests.test_utils import add_log_response from tests.test_utils import add_log_response
@ -8,6 +9,8 @@ from treeherder.log_parser.artifactbuilders import BuildbotLogViewArtifactBuilde
slow = pytest.mark.slow slow = pytest.mark.slow
pytestmark = pytest.mark.xfail(PY3, reason='Python 3: a bytes-like object is required, not str (bug 1526743)')
@responses.activate @responses.activate
def do_test(log): def do_test(log):

Просмотреть файл

@ -1,5 +1,7 @@
import pytest
import responses import responses
from jsonschema import validate from jsonschema import validate
from six import PY3
from tests.test_utils import add_log_response from tests.test_utils import add_log_response
from treeherder.etl.perf import PERFHERDER_SCHEMA from treeherder.etl.perf import PERFHERDER_SCHEMA
@ -7,6 +9,7 @@ from treeherder.log_parser.artifactbuildercollection import ArtifactBuilderColle
from treeherder.log_parser.artifactbuilders import BuildbotPerformanceDataArtifactBuilder from treeherder.log_parser.artifactbuilders import BuildbotPerformanceDataArtifactBuilder
@pytest.mark.xfail(PY3, reason='Python 3: a bytes-like object is required, not str (bug 1526743)')
@responses.activate @responses.activate
def test_performance_log_parsing(): def test_performance_log_parsing():
""" """

Просмотреть файл

@ -1,6 +1,7 @@
from __future__ import print_function from __future__ import print_function
import pytest import pytest
from six import PY3
from tests.test_utils import add_log_response from tests.test_utils import add_log_response
from treeherder.etl.jobs import store_job_data from treeherder.etl.jobs import store_job_data
@ -27,6 +28,7 @@ def jobs_with_local_log(activate_responses):
return [job] return [job]
@pytest.mark.xfail(PY3, reason='Python 3: a bytes-like object is required, not str (bug 1526743)')
def test_parse_log(test_repository, failure_classifications, jobs_with_local_log, sample_push): def test_parse_log(test_repository, failure_classifications, jobs_with_local_log, sample_push):
""" """
check that 2 job_artifacts get inserted when running a parse_log task for check that 2 job_artifacts get inserted when running a parse_log task for
@ -47,6 +49,7 @@ def test_parse_log(test_repository, failure_classifications, jobs_with_local_log
print(JobDetail.objects.count() == 4) print(JobDetail.objects.count() == 4)
@pytest.mark.xfail(PY3, reason='Python 3: a bytes-like object is required, not str (bug 1526743)')
def test_create_error_summary(failure_classifications, def test_create_error_summary(failure_classifications,
jobs_with_local_log, sample_push, jobs_with_local_log, sample_push,
test_repository): test_repository):

Просмотреть файл

@ -8,6 +8,7 @@ from rest_framework import status
from rest_framework.decorators import APIView from rest_framework.decorators import APIView
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.test import APIRequestFactory from rest_framework.test import APIRequestFactory
from six import PY3
from treeherder.auth.backends import AuthBackend from treeherder.auth.backends import AuthBackend
from treeherder.model.models import User from treeherder.model.models import User
@ -47,6 +48,7 @@ def test_post_no_auth():
# Auth Login and Logout Tests # Auth Login and Logout Tests
@pytest.mark.xfail(PY3, reason='Python 3: < not supported between instances of str and int (bug 1453837)')
def test_auth_login_and_logout(test_ldap_user, client, monkeypatch): def test_auth_login_and_logout(test_ldap_user, client, monkeypatch):
"""LDAP login user exists, has scope: find by email""" """LDAP login user exists, has scope: find by email"""
def userinfo_mock(selfless, request): def userinfo_mock(selfless, request):
@ -136,6 +138,7 @@ def test_login_no_email(test_user, client, monkeypatch):
assert resp.json()["detail"] == "Unrecognized identity" assert resp.json()["detail"] == "Unrecognized identity"
@pytest.mark.xfail(PY3, reason='Python 3: < not supported between instances of str and int (bug 1453837)')
@pytest.mark.django_db @pytest.mark.django_db
def test_login_not_active(test_ldap_user, client, monkeypatch): def test_login_not_active(test_ldap_user, client, monkeypatch):
"""LDAP login, user not active""" """LDAP login, user not active"""