Files
scylladb/test/cluster/test_metadata_id.py
Patryk Jędrzejczak 193a74576a test/cluster/conftest: cluster_con: provide default values for port and use_ssl
Some cluster tests use `cluster_con` when they need a different load
balancing policy or auth provider. However, no test uses a port
other than 9042 or enables SSL, but all tests must pass `9042, False`
because these parameters don't have default values. This makes the code
more verbose. Also, it's quite obvious that 9042 stands for port, but
it's not obvious what `False` is related to, so there is a need to check
the definition of `cluster_con` while reading any test that uses it.

No reason to backport, it's only a minor refactoring.

Closes scylladb/scylladb#25516
2025-08-22 09:51:24 +03:00

88 lines
3.6 KiB
Python

#
# Copyright (C) 2025-present ScyllaDB
#
# SPDX-License-Identifier: LicenseRef-ScyllaDB-Source-Available-1.0
#
import logging
import pytest
from test.cluster.util import new_test_keyspace, new_test_table
from test.cluster.conftest import cluster_con
from cassandra.policies import WhiteListRoundRobinPolicy
logger = logging.getLogger(__name__)
async def create_server_and_cqls(manager, cqls_num):
server = await manager.server_add()
def create_cluster_connection():
return cluster_con([server.ip_addr],
load_balancing_policy=WhiteListRoundRobinPolicy([server.ip_addr])).connect()
return tuple(create_cluster_connection() for _ in range(cqls_num))
@pytest.mark.asyncio
async def test_changed_prepared_statement_metadata_columns(manager):
cql1, cql2, cql3 = await create_server_and_cqls(manager, cqls_num=3)
async with new_test_keyspace(manager, "WITH replication = {'class': 'NetworkTopologyStrategy', 'replication_factor': 1};") as ks:
async with new_test_table(manager, ks, "pk BIGINT PRIMARY KEY, c INT") as table:
cql1.execute(f"INSERT INTO {table} (pk, c) VALUES (0, 0)")
prepared = cql1.prepare(f"SELECT * FROM {table}")
assert len(cql1.execute(prepared).one()) == 2
prepared2 = cql2.prepare(f"SELECT * FROM {table}")
assert len(cql2.execute(prepared2).one()) == 2
cql3.execute(f"ALTER TABLE {table} ADD c2 INT")
cql3.execute(f"INSERT INTO {table} (pk, c, c2) VALUES (1, 1, 1)")
assert len(cql1.execute(prepared).one()) == 3
assert len(cql2.execute(prepared2).one()) == 3
@pytest.mark.asyncio
async def test_changed_prepared_statement_metadata_types(manager):
cql1, cql2, cql3 = await create_server_and_cqls(manager, cqls_num=3)
async with new_test_keyspace(manager, "WITH replication = {'class': 'NetworkTopologyStrategy', 'replication_factor': 1};") as ks:
async with new_test_table(manager, ks, "pk BIGINT PRIMARY KEY, c INT") as table:
await cql1.run_async(f"INSERT INTO {table} (pk, c) VALUES (0, 0)")
prepared = cql1.prepare(f"SELECT * FROM {table}")
cql1.execute(prepared)
prepared2 = cql2.prepare(f"SELECT * FROM {table}")
cql2.execute(prepared2)
cql3.execute(f"ALTER TABLE {table} DROP c")
cql3.execute(f"ALTER TABLE {table} ADD c TEXT")
cql3.execute(f"INSERT INTO {table} (pk, c) VALUES (1, 'abc')")
assert len(cql1.execute(prepared).one()) == 2
assert len(cql2.execute(prepared2).one()) == 2
@pytest.mark.asyncio
async def test_changed_prepared_statement_metadata_udt(manager):
cql1, cql2, cql3 = await create_server_and_cqls(manager, cqls_num=3)
async with new_test_keyspace(manager, "WITH replication = {'class': 'NetworkTopologyStrategy', 'replication_factor': 1};") as ks:
cql1.execute(f"CREATE TYPE {ks}.mytype (i1 int, i2 int)")
async with new_test_table(manager, ks, "pk BIGINT PRIMARY KEY, c mytype") as table:
mytypeval = "{i1: 1, i2: 2}"
cql1.execute(f"INSERT INTO {table} (pk, c) VALUES (0, {mytypeval})")
prepared = cql1.prepare(f"SELECT * FROM {table}")
cql1.execute(prepared)
prepared2 = cql2.prepare(f"SELECT * FROM {table}")
cql2.execute(prepared2)
cql3.execute(f"ALTER TYPE {ks}.mytype ADD i3 INT")
mytypeval = "{i1: 1, i2: 2, i3: 3}"
cql3.execute(f"INSERT INTO {table} (pk, c) VALUES (1, {mytypeval})")
assert "i3" in str(cql1.execute(prepared).one())
assert "i3" in str(cql2.execute(prepared2).one())