Merge pull request #5949 from wRAR/tests-as-installed

Allow running tests against the installed version
This commit is contained in:
Andrey Rakhmatullin 2023-06-14 23:15:04 +04:00 committed by GitHub
commit 58300e066f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 26 additions and 10 deletions

View File

@ -1,11 +1,13 @@
import argparse
import json
import os
import random
import sys
from pathlib import Path
from shutil import rmtree
from subprocess import PIPE, Popen
from tempfile import mkdtemp
from typing import Dict
from urllib.parse import urlencode
from OpenSSL import SSL
@ -20,7 +22,6 @@ from twisted.web.static import File
from twisted.web.util import redirectTo
from scrapy.utils.python import to_bytes, to_unicode
from scrapy.utils.test import get_testenv
def getarg(request, name, default=None, type=None):
@ -32,6 +33,16 @@ def getarg(request, name, default=None, type=None):
return default
def get_mockserver_env() -> Dict[str, str]:
"""Return a OS environment dict suitable to run mockserver processes."""
tests_path = Path(__file__).parent.parent
pythonpath = str(tests_path) + os.pathsep + os.environ.get("PYTHONPATH", "")
env = os.environ.copy()
env["PYTHONPATH"] = pythonpath
return env
# most of the following resources are copied from twisted.web.test.test_webclient
class ForeverTakingResource(resource.Resource):
"""
@ -264,7 +275,7 @@ class MockServer:
self.proc = Popen(
[sys.executable, "-u", "-m", "tests.mockserver", "-t", "http"],
stdout=PIPE,
env=get_testenv(),
env=get_mockserver_env(),
)
http_address = self.proc.stdout.readline().strip().decode("ascii")
https_address = self.proc.stdout.readline().strip().decode("ascii")
@ -308,7 +319,7 @@ class MockDNSServer:
self.proc = Popen(
[sys.executable, "-u", "-m", "tests.mockserver", "-t", "dns"],
stdout=PIPE,
env=get_testenv(),
env=get_mockserver_env(),
)
self.host = "127.0.0.1"
self.port = int(
@ -331,7 +342,7 @@ class MockFTPServer:
self.proc = Popen(
[sys.executable, "-u", "-m", "tests.ftpserver", "-d", str(self.path)],
stderr=PIPE,
env=get_testenv(),
env=get_mockserver_env(),
)
for line in self.proc.stderr:
if b"starting FTP server" in line:

View File

@ -1,4 +1,5 @@
import json
import os
import pstats
import shutil
import sys
@ -14,6 +15,8 @@ from scrapy.utils.test import get_testenv
class CmdlineTest(unittest.TestCase):
def setUp(self):
self.env = get_testenv()
tests_path = Path(__file__).parent.parent
self.env["PYTHONPATH"] += os.pathsep + str(tests_path.parent)
self.env["SCRAPY_SETTINGS_MODULE"] = "tests.test_cmdline.settings"
def _execute(self, *new_args, **kwargs):

View File

@ -1,4 +1,5 @@
import logging
import os
import platform
import subprocess
import sys
@ -23,8 +24,8 @@ from scrapy.spiderloader import SpiderLoader
from scrapy.utils.log import configure_logging, get_scrapy_root_handler
from scrapy.utils.misc import load_object
from scrapy.utils.spider import DefaultSpider
from scrapy.utils.test import get_crawler, get_testenv
from tests.mockserver import MockServer
from scrapy.utils.test import get_crawler
from tests.mockserver import MockServer, get_mockserver_env
class BaseCrawlerTest(unittest.TestCase):
@ -289,12 +290,16 @@ class CrawlerRunnerHasSpider(unittest.TestCase):
class ScriptRunnerMixin:
script_dir: Path
cwd = os.getcwd()
def run_script(self, script_name: str, *script_args):
script_path = self.script_dir / script_name
args = [sys.executable, str(script_path)] + list(script_args)
p = subprocess.Popen(
args, env=get_testenv(), stdout=subprocess.PIPE, stderr=subprocess.PIPE
args,
env=get_mockserver_env(),
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
stdout, stderr = p.communicate()
return stderr.decode("utf-8")

View File

@ -21,8 +21,6 @@ class MitmProxy:
auth_pass = "scrapy"
def start(self):
from scrapy.utils.test import get_testenv
script = """
import sys
from mitmproxy.tools.main import mitmdump
@ -46,7 +44,6 @@ sys.exit(mitmdump())
"--ssl-insecure",
],
stdout=PIPE,
env=get_testenv(),
)
line = self.proc.stdout.readline().decode("utf-8")
host_port = re.search(r"listening at http://([^:]+:\d+)", line).group(1)