import pytest from base.client_v2_base import TestMilvusClientV2Base from utils.util_log import test_log as log from common import common_func as cf from common import common_type as ct from common.common_type import CaseLabel, CheckTasks from utils.util_pymilvus import * from common.constants import * from pymilvus import DataType prefix = "client_search" partition_prefix = "client_partition" db_prefix = "client_database" epsilon = ct.epsilon default_nb = ct.default_nb default_nb_medium = ct.default_nb_medium default_nq = ct.default_nq default_dim = ct.default_dim default_limit = ct.default_limit default_search_exp = "id >= 0" exp_res = "exp_res" default_search_string_exp = "varchar >= \"0\"" default_search_mix_exp = "int64 >= 0 && varchar >= \"0\"" default_invaild_string_exp = "varchar >= 0" default_json_search_exp = "json_field[\"number\"] >= 0" perfix_expr = 'varchar like "0%"' default_search_field = ct.default_float_vec_field_name default_search_params = ct.default_search_params default_primary_key_field_name = "id" default_vector_field_name = "vector" default_float_field_name = ct.default_float_field_name default_bool_field_name = ct.default_bool_field_name default_string_field_name = ct.default_string_field_name default_int32_array_field_name = ct.default_int32_array_field_name default_string_array_field_name = ct.default_string_array_field_name class TestMilvusClientDatabaseInvalid(TestMilvusClientV2Base): """ Test case of database """ """ ****************************************************************** # The following are invalid base cases ****************************************************************** """ @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("db_name", ["12-s", "12 s", "(mn)", "中文", "%$#", " "]) def test_milvus_client_create_database_invalid_db_name(self, db_name): """ target: test fast create database with invalid db name method: create database with invalid db name expected: raise exception """ client = self._client() # 1. create database error = {ct.err_code: 802, ct.err_msg: f"the first character of a database name must be an underscore or letter: " f"invalid database name[database={db_name}]"} self.create_database(client, db_name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_create_database_name_over_max_length(self): """ target: test fast create database with over max db name length method: create database with over max db name length expected: raise exception """ client = self._client() # 1. create database db_name = "a".join("a" for i in range(256)) error = {ct.err_code: 802, ct.err_msg: f"the length of a database name must be less than 255 characters"} self.create_database(client, db_name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_create_database_name_with_default(self): """ target: test fast create db name with default method: create db name with default expected: raise exception """ client = self._client() # 1. create database db_name = "default" error = {ct.err_code: 65535, ct.err_msg: f"database already exist: {db_name}"} self.create_database(client, db_name, default_dim, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_create_database_with_existed_name(self): """ target: test fast create db name with existed name method: create db name with existed name expected: raise exception """ client = self._client() # 1. create database db_name = cf.gen_unique_str(db_prefix) self.create_database(client, db_name) dbs = self.list_databases(client)[0] assert db_name in dbs error = {ct.err_code: 65535, ct.err_msg: f"database already exist: {db_name}"} self.create_database(client, db_name, default_dim, check_task=CheckTasks.err_res, check_items=error) self.drop_database(client, db_name) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.skip(reason="pymilvus issue 2683") @pytest.mark.parametrize("properties", ["hhh", []]) def test_milvus_client_create_database_with_invalid_properties(self, properties): """ target: test fast create db name with invalid properties method: create db name with invalid properties expected: raise exception actual: Currently such errors are not very readable, and entries of numeric types such as 1.11, 111 are not blocked """ client = self._client() # 1. create database db_name = cf.gen_unique_str(db_prefix) error = {ct.err_code: 1, ct.err_msg: f"Unexpected error, message="} self.create_database(client, db_name, properties, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("properties", [{"database.rep.number": 3}]) @pytest.mark.skip("A param that does not currently exist will simply have no effect, " "but it would be better if an error were reported.") def test_milvus_client_create_database_with_nonexistent_property_params(self, properties): """ target: test fast create db name with nonexistent property params method: create db name with nonexistent property params expected: raise exception """ client = self._client() # 1. create database db_name = cf.gen_unique_str(db_prefix) error = {ct.err_code: 1, ct.err_msg: f""} self.create_database(client, db_name, properties=properties, check_task=CheckTasks.err_res, check_items=error) self.drop_database(client, db_name) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("db_name", ["12-s", "12 s", "(mn)", "中文", "%$#", " "]) def test_milvus_client_drop_database_invalid_db_name(self, db_name): """ target: test drop database with invalid db name method: drop database with invalid db name expected: raise exception """ client = self._client() error = {ct.err_code: 802, ct.err_msg: f"the first character of a database name must be an underscore or letter: " f"invalid database name[database={db_name}]"} self.drop_database(client, db_name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) @pytest.mark.parametrize("db_name", ["nonexistent"]) @pytest.mark.skip("Deleting a db that does not exist does not report an error, " "but it would be better if an error were reported.") def test_milvus_client_drop_database_nonexistent_db_name(self, db_name): """ target: test drop database with nonexistent db name method: drop database with nonexistent db name expected: raise exception """ client = self._client() error = {ct.err_code: 802, ct.err_msg: f""} self.drop_database(client, db_name, check_task=CheckTasks.err_res, check_items=error) @pytest.mark.tags(CaseLabel.L1) def test_milvus_client_drop_database_has_collections(self): """ target: test drop database which has collections method: drop database which has collections expected: raise exception """ client = self._client() # 1. create database db_name = cf.gen_unique_str(db_prefix) self.create_database(client, db_name) dbs = self.list_databases(client)[0] assert db_name in dbs # 2. create collection self.use_database(client, db_name) collection_name = cf.gen_unique_str(prefix) self.create_collection(client, collection_name, default_dim) collections = self.list_collections(client)[0] assert collection_name in collections #3. drop database error = {ct.err_code: 65535, ct.err_msg: f"{db_name} not empty, must drop all collections before drop database"} self.drop_database(client, db_name, check_task=CheckTasks.err_res, check_items=error) self.drop_collection(client, collection_name) self.drop_database(client, db_name) @pytest.mark.tags(CaseLabel.L2) @pytest.mark.parametrize("db_name", ["default"]) def test_milvus_client_list_databases_with_params(self, db_name): """ target: test list database with params method: list database with params expected: raise exception """ client = self._client() error = {ct.err_code: 1, ct.err_msg: f"Unexpected error, message=