2026-01-20 14:49:43 -08:00
|
|
|
# Copyright 2026 Google LLC
|
2025-08-12 13:59:05 -07:00
|
|
|
#
|
|
|
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
# you may not use this file except in compliance with the License.
|
|
|
|
|
# You may obtain a copy of the License at
|
|
|
|
|
#
|
|
|
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
#
|
|
|
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
# See the License for the specific language governing permissions and
|
|
|
|
|
# limitations under the License.
|
|
|
|
|
|
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
2025-12-09 11:20:36 -08:00
|
|
|
import warnings
|
|
|
|
|
|
|
|
|
|
from google.adk.features._feature_registry import _WARNED_FEATURES
|
2025-12-05 16:00:09 -08:00
|
|
|
from google.adk.tools.spanner.settings import Capabilities
|
|
|
|
|
from google.adk.tools.spanner.settings import QueryResultMode
|
2025-08-12 13:59:05 -07:00
|
|
|
from google.adk.tools.spanner.settings import SpannerToolSettings
|
2025-12-02 11:18:23 -08:00
|
|
|
from google.adk.tools.spanner.settings import SpannerVectorStoreSettings
|
|
|
|
|
from pydantic import ValidationError
|
2025-08-12 13:59:05 -07:00
|
|
|
import pytest
|
|
|
|
|
|
|
|
|
|
|
2025-12-09 11:20:36 -08:00
|
|
|
@pytest.fixture(autouse=True)
|
|
|
|
|
def reset_warned_features():
|
|
|
|
|
"""Reset warned features before each test."""
|
|
|
|
|
_WARNED_FEATURES.clear()
|
|
|
|
|
|
|
|
|
|
|
2025-12-02 11:18:23 -08:00
|
|
|
def common_spanner_vector_store_settings(vector_length=None):
|
|
|
|
|
return {
|
|
|
|
|
"project_id": "test-project",
|
|
|
|
|
"instance_id": "test-instance",
|
|
|
|
|
"database_id": "test-database",
|
|
|
|
|
"table_name": "test-table",
|
|
|
|
|
"content_column": "test-content-column",
|
|
|
|
|
"embedding_column": "test-embedding-column",
|
|
|
|
|
"vector_length": 128 if vector_length is None else vector_length,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-08-12 13:59:05 -07:00
|
|
|
def test_spanner_tool_settings_experimental_warning():
|
|
|
|
|
"""Test SpannerToolSettings experimental warning."""
|
2025-12-09 11:20:36 -08:00
|
|
|
with warnings.catch_warnings(record=True) as w:
|
2025-08-12 13:59:05 -07:00
|
|
|
SpannerToolSettings()
|
2025-12-09 11:20:36 -08:00
|
|
|
assert len(w) == 1
|
|
|
|
|
assert "SPANNER_TOOL_SETTINGS is enabled." in str(w[0].message)
|
2025-12-02 11:18:23 -08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_spanner_vector_store_settings_all_fields_present():
|
|
|
|
|
"""Test SpannerVectorStoreSettings with all required fields present."""
|
|
|
|
|
settings = SpannerVectorStoreSettings(
|
|
|
|
|
**common_spanner_vector_store_settings(),
|
|
|
|
|
vertex_ai_embedding_model_name="test-embedding-model",
|
|
|
|
|
)
|
|
|
|
|
assert settings is not None
|
|
|
|
|
assert settings.selected_columns == ["test-content-column"]
|
|
|
|
|
assert settings.vertex_ai_embedding_model_name == "test-embedding-model"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_spanner_vector_store_settings_missing_embedding_model_name():
|
|
|
|
|
"""Test SpannerVectorStoreSettings with missing vertex_ai_embedding_model_name."""
|
|
|
|
|
with pytest.raises(ValidationError) as excinfo:
|
|
|
|
|
SpannerVectorStoreSettings(**common_spanner_vector_store_settings())
|
|
|
|
|
assert "Field required" in str(excinfo.value)
|
|
|
|
|
assert "vertex_ai_embedding_model_name" in str(excinfo.value)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_spanner_vector_store_settings_invalid_vector_length():
|
|
|
|
|
"""Test SpannerVectorStoreSettings with invalid vector_length."""
|
|
|
|
|
with pytest.raises(ValidationError) as excinfo:
|
|
|
|
|
SpannerVectorStoreSettings(
|
|
|
|
|
**common_spanner_vector_store_settings(vector_length=0),
|
|
|
|
|
vertex_ai_embedding_model_name="test-embedding-model",
|
|
|
|
|
)
|
|
|
|
|
assert "Invalid vector length in the Spanner vector store settings." in str(
|
|
|
|
|
excinfo.value
|
|
|
|
|
)
|
2025-12-05 16:00:09 -08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
|
"settings_args, expected_rows, expected_mode",
|
|
|
|
|
[
|
|
|
|
|
({}, 50, QueryResultMode.DEFAULT),
|
|
|
|
|
(
|
|
|
|
|
{
|
|
|
|
|
"capabilities": [Capabilities.DATA_READ],
|
|
|
|
|
"max_executed_query_result_rows": 100,
|
|
|
|
|
"query_result_mode": QueryResultMode.DICT_LIST,
|
|
|
|
|
},
|
|
|
|
|
100,
|
|
|
|
|
QueryResultMode.DICT_LIST,
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
)
|
|
|
|
|
def test_spanner_tool_settings(settings_args, expected_rows, expected_mode):
|
|
|
|
|
"""Test SpannerToolSettings with different values."""
|
|
|
|
|
settings = SpannerToolSettings(**settings_args)
|
|
|
|
|
assert settings.capabilities == [Capabilities.DATA_READ]
|
|
|
|
|
assert settings.max_executed_query_result_rows == expected_rows
|
|
|
|
|
assert settings.query_result_mode == expected_mode
|