Files
scylladb/test/rest_api/conftest.py
Andrzej Jackowski 1143acaf5b test: allow json_body in send
Needed to test `/v2/connection_metadata` endpoints that receive
JSON input.

Ref: scylladb/scylla-enterprise#5699
2025-12-15 17:44:48 +01:00

100 lines
4.3 KiB
Python

# Copyright 2021-present ScyllaDB
#
# SPDX-License-Identifier: LicenseRef-ScyllaDB-Source-Available-1.0
# This file configures pytest for all tests in this directory, and also
# defines common test fixtures for all of them to use. A "fixture" is some
# setup which an individual test requires to run; The fixture has setup code
# and teardown code, and if multiple tests require the same fixture, it can
# be set up only once - while still allowing the user to run individual tests
# and automatically setting up the fixtures they need.
import pytest
import requests
from test.cqlpy.conftest import host, cql, this_dc # add required fixtures
from test.cqlpy.util import unique_name, new_test_keyspace, keyspace_has_tablets, is_scylla
from test.pylib.runner import testpy_test_fixture_scope
from test.pylib.suite.python import add_host_option, add_cql_connection_options
# By default, tests run against a Scylla server listening
# on localhost:9042 for CQL and localhost:10000 for the REST API.
# Add the --host, --port, --ssl, or --api-port options to allow overriding these defaults.
def pytest_addoption(parser):
add_host_option(parser)
add_cql_connection_options(parser)
parser.addoption('--api-port', action='store', default='10000',
help='server REST API port to connect to')
class RestApiSession:
def __init__(self, host, port):
self.host = host
self.port = port
self.session = requests.Session()
def send(self, method, path, params={}, json_body=None):
url=f"http://{self.host}:{self.port}/{path}"
if params:
sep = '?'
for key, value in params.items():
if isinstance(value, list):
for v in value:
url += f"{sep}{key}={v}"
sep = '&'
else:
url += f"{sep}{key}={value}"
sep = '&'
req = self.session.prepare_request(requests.Request(method, url, json=json_body))
return self.session.send(req)
# "api" fixture: set up client object for communicating with Scylla API.
# The host/port combination of the server are determined by the --host and
# --port options, and defaults to localhost and 10000, respectively.
@pytest.fixture(scope=testpy_test_fixture_scope)
def rest_api(request, host):
port = request.config.getoption('api_port')
return RestApiSession(host, port)
# The "scylla_only" fixture can be used by tests for Scylla-only features,
# which do not exist on Apache Cassandra. A test using this fixture will be
# skipped if running with "run-cassandra".
@pytest.fixture(scope=testpy_test_fixture_scope)
def scylla_only(cql):
# We recognize Scylla by checking if there is any system table whose name
# contains the word "scylla":
if not is_scylla(cql):
pytest.skip('Scylla-only test skipped')
@pytest.fixture(scope=testpy_test_fixture_scope)
def has_tablets(cql):
with new_test_keyspace(cql, " WITH REPLICATION = {'class' : 'NetworkTopologyStrategy', 'replication_factor': 1}") as keyspace:
return keyspace_has_tablets(cql, keyspace)
@pytest.fixture(scope="function")
def skip_with_tablets(has_tablets):
if has_tablets:
pytest.skip("Test may crash with tablets experimental feature on")
@pytest.fixture(scope="function")
def skip_without_tablets(scylla_only, has_tablets):
if not has_tablets:
pytest.skip("Test needs tablets experimental feature on")
@pytest.fixture(scope=testpy_test_fixture_scope)
def test_keyspace_vnodes(cql, this_dc, has_tablets):
name = unique_name()
if has_tablets:
cql.execute("CREATE KEYSPACE " + name + " WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', '" + this_dc + "' : 1 } AND TABLETS = {'enabled': false}")
else:
# If tablets are not available or not enabled, we just create a regular keyspace
cql.execute("CREATE KEYSPACE " + name + " WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', '" + this_dc + "' : 1 }")
yield name
cql.execute("DROP KEYSPACE " + name)
@pytest.fixture(scope=testpy_test_fixture_scope)
def test_keyspace(cql, this_dc):
name = unique_name()
cql.execute("CREATE KEYSPACE " + name + " WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', '" + this_dc + "' : 1 }")
yield name
cql.execute("DROP KEYSPACE " + name)