mirror of
https://gitee.com/milvus-io/milvus.git
synced 2024-12-02 03:48:37 +08:00
test: add some restful negative case to ci (#36479)
/kind improvement Signed-off-by: zhuwenxing <wenxing.zhu@zilliz.com>
This commit is contained in:
parent
3cd0b26285
commit
aee046e52c
@ -602,22 +602,6 @@ class TestCreateCollectionNegative(TestBase):
|
||||
rsp = client.collection_create(payload)
|
||||
assert rsp['code'] == 1100
|
||||
|
||||
def test_create_collections_with_invalid_api_key(self):
|
||||
"""
|
||||
target: test create collection with invalid api key(wrong username and password)
|
||||
method: create collections with invalid api key
|
||||
expected: create collection failed
|
||||
"""
|
||||
name = gen_collection_name()
|
||||
dim = 128
|
||||
client = self.collection_client
|
||||
client.api_key = "illegal_api_key"
|
||||
payload = {
|
||||
"collectionName": name,
|
||||
"dimension": dim,
|
||||
}
|
||||
rsp = client.collection_create(payload)
|
||||
assert rsp['code'] == 1800
|
||||
|
||||
@pytest.mark.parametrize("name",
|
||||
[" ", "test_collection_" * 100, "test collection", "test/collection", "test\collection"])
|
||||
@ -727,7 +711,7 @@ class TestGetCollectionStats(TestBase):
|
||||
rsp = client.collection_stats(collection_name=name)
|
||||
assert rsp['data']['rowCount'] == nb
|
||||
|
||||
|
||||
@pytest.mark.L0
|
||||
class TestLoadReleaseCollection(TestBase):
|
||||
|
||||
def test_load_and_release_collection(self):
|
||||
@ -849,34 +833,6 @@ class TestListCollections(TestBase):
|
||||
assert name in all_collections
|
||||
|
||||
|
||||
@pytest.mark.L1
|
||||
class TestListCollectionsNegative(TestBase):
|
||||
def test_list_collections_with_invalid_api_key(self):
|
||||
"""
|
||||
target: test list collection with an invalid api key
|
||||
method: list collection with invalid api key
|
||||
expected: raise error with right error code and message
|
||||
"""
|
||||
client = self.collection_client
|
||||
name_list = []
|
||||
for i in range(2):
|
||||
name = gen_collection_name()
|
||||
dim = 128
|
||||
payload = {
|
||||
"collectionName": name,
|
||||
"metricType": "L2",
|
||||
"dimension": dim,
|
||||
}
|
||||
time.sleep(1)
|
||||
rsp = client.collection_create(payload)
|
||||
assert rsp['code'] == 0
|
||||
name_list.append(name)
|
||||
client = self.collection_client
|
||||
client.api_key = "illegal_api_key"
|
||||
rsp = client.collection_list()
|
||||
assert rsp['code'] == 1800
|
||||
|
||||
|
||||
@pytest.mark.L0
|
||||
class TestDescribeCollection(TestBase):
|
||||
|
||||
@ -954,30 +910,8 @@ class TestDescribeCollection(TestBase):
|
||||
assert rsp['data']['enableDynamicField'] is True
|
||||
|
||||
|
||||
@pytest.mark.L1
|
||||
@pytest.mark.L0
|
||||
class TestDescribeCollectionNegative(TestBase):
|
||||
def test_describe_collections_with_invalid_api_key(self):
|
||||
"""
|
||||
target: test describe collection with invalid api key
|
||||
method: describe collection with invalid api key
|
||||
expected: raise error with right error code and message
|
||||
"""
|
||||
name = gen_collection_name()
|
||||
dim = 128
|
||||
client = self.collection_client
|
||||
payload = {
|
||||
"collectionName": name,
|
||||
"dimension": dim,
|
||||
}
|
||||
rsp = client.collection_create(payload)
|
||||
assert rsp['code'] == 0
|
||||
rsp = client.collection_list()
|
||||
all_collections = rsp['data']
|
||||
assert name in all_collections
|
||||
# describe collection
|
||||
illegal_client = CollectionClient(self.endpoint, "illegal_api_key")
|
||||
rsp = illegal_client.collection_describe(name)
|
||||
assert rsp['code'] == 1800
|
||||
|
||||
def test_describe_collections_with_invalid_collection_name(self):
|
||||
"""
|
||||
@ -1042,36 +976,8 @@ class TestDropCollection(TestBase):
|
||||
assert name not in all_collections
|
||||
|
||||
|
||||
@pytest.mark.L1
|
||||
@pytest.mark.L0
|
||||
class TestDropCollectionNegative(TestBase):
|
||||
def test_drop_collections_with_invalid_api_key(self):
|
||||
"""
|
||||
target: test drop collection with invalid api key
|
||||
method: drop collection with invalid api key
|
||||
expected: raise error with right error code and message; collection still in collection list
|
||||
"""
|
||||
name = gen_collection_name()
|
||||
dim = 128
|
||||
client = self.collection_client
|
||||
payload = {
|
||||
"collectionName": name,
|
||||
"dimension": dim,
|
||||
}
|
||||
rsp = client.collection_create(payload)
|
||||
assert rsp['code'] == 0
|
||||
rsp = client.collection_list()
|
||||
all_collections = rsp['data']
|
||||
assert name in all_collections
|
||||
# drop collection
|
||||
payload = {
|
||||
"collectionName": name,
|
||||
}
|
||||
illegal_client = CollectionClient(self.endpoint, "invalid_api_key")
|
||||
rsp = illegal_client.collection_drop(payload)
|
||||
assert rsp['code'] == 1800
|
||||
rsp = client.collection_list()
|
||||
all_collections = rsp['data']
|
||||
assert name in all_collections
|
||||
|
||||
def test_drop_collections_with_invalid_collection_name(self):
|
||||
"""
|
||||
@ -1133,3 +1039,99 @@ class TestRenameCollection(TestBase):
|
||||
all_collections = rsp['data']
|
||||
assert new_name in all_collections
|
||||
assert name not in all_collections
|
||||
|
||||
@pytest.mark.L1
|
||||
class TestCollectionWithAuth(TestBase):
|
||||
def test_drop_collections_with_invalid_api_key(self):
|
||||
"""
|
||||
target: test drop collection with invalid api key
|
||||
method: drop collection with invalid api key
|
||||
expected: raise error with right error code and message; collection still in collection list
|
||||
"""
|
||||
name = gen_collection_name()
|
||||
dim = 128
|
||||
client = self.collection_client
|
||||
payload = {
|
||||
"collectionName": name,
|
||||
"dimension": dim,
|
||||
}
|
||||
rsp = client.collection_create(payload)
|
||||
assert rsp['code'] == 0
|
||||
rsp = client.collection_list()
|
||||
all_collections = rsp['data']
|
||||
assert name in all_collections
|
||||
# drop collection
|
||||
payload = {
|
||||
"collectionName": name,
|
||||
}
|
||||
illegal_client = CollectionClient(self.endpoint, "invalid_api_key")
|
||||
rsp = illegal_client.collection_drop(payload)
|
||||
assert rsp['code'] == 1800
|
||||
rsp = client.collection_list()
|
||||
all_collections = rsp['data']
|
||||
assert name in all_collections
|
||||
|
||||
def test_describe_collections_with_invalid_api_key(self):
|
||||
"""
|
||||
target: test describe collection with invalid api key
|
||||
method: describe collection with invalid api key
|
||||
expected: raise error with right error code and message
|
||||
"""
|
||||
name = gen_collection_name()
|
||||
dim = 128
|
||||
client = self.collection_client
|
||||
payload = {
|
||||
"collectionName": name,
|
||||
"dimension": dim,
|
||||
}
|
||||
rsp = client.collection_create(payload)
|
||||
assert rsp['code'] == 0
|
||||
rsp = client.collection_list()
|
||||
all_collections = rsp['data']
|
||||
assert name in all_collections
|
||||
# describe collection
|
||||
illegal_client = CollectionClient(self.endpoint, "illegal_api_key")
|
||||
rsp = illegal_client.collection_describe(name)
|
||||
assert rsp['code'] == 1800
|
||||
|
||||
def test_list_collections_with_invalid_api_key(self):
|
||||
"""
|
||||
target: test list collection with an invalid api key
|
||||
method: list collection with invalid api key
|
||||
expected: raise error with right error code and message
|
||||
"""
|
||||
client = self.collection_client
|
||||
name_list = []
|
||||
for i in range(2):
|
||||
name = gen_collection_name()
|
||||
dim = 128
|
||||
payload = {
|
||||
"collectionName": name,
|
||||
"metricType": "L2",
|
||||
"dimension": dim,
|
||||
}
|
||||
time.sleep(1)
|
||||
rsp = client.collection_create(payload)
|
||||
assert rsp['code'] == 0
|
||||
name_list.append(name)
|
||||
client = self.collection_client
|
||||
client.api_key = "illegal_api_key"
|
||||
rsp = client.collection_list()
|
||||
assert rsp['code'] == 1800
|
||||
|
||||
def test_create_collections_with_invalid_api_key(self):
|
||||
"""
|
||||
target: test create collection with invalid api key(wrong username and password)
|
||||
method: create collections with invalid api key
|
||||
expected: create collection failed
|
||||
"""
|
||||
name = gen_collection_name()
|
||||
dim = 128
|
||||
client = self.collection_client
|
||||
client.api_key = "illegal_api_key"
|
||||
payload = {
|
||||
"collectionName": name,
|
||||
"dimension": dim,
|
||||
}
|
||||
rsp = client.collection_create(payload)
|
||||
assert rsp['code'] == 1800
|
||||
|
@ -628,40 +628,8 @@ class TestInsertVector(TestBase):
|
||||
|
||||
|
||||
|
||||
@pytest.mark.L1
|
||||
@pytest.mark.L0
|
||||
class TestInsertVectorNegative(TestBase):
|
||||
def test_insert_vector_with_invalid_api_key(self):
|
||||
"""
|
||||
Insert a vector with invalid api key
|
||||
"""
|
||||
# create a collection
|
||||
name = gen_collection_name()
|
||||
dim = 128
|
||||
payload = {
|
||||
"collectionName": name,
|
||||
"dimension": dim,
|
||||
}
|
||||
rsp = self.collection_client.collection_create(payload)
|
||||
assert rsp['code'] == 0
|
||||
rsp = self.collection_client.collection_describe(name)
|
||||
assert rsp['code'] == 0
|
||||
# insert data
|
||||
nb = 10
|
||||
data = [
|
||||
{
|
||||
"vector": [np.float64(random.random()) for _ in range(dim)],
|
||||
} for _ in range(nb)
|
||||
]
|
||||
payload = {
|
||||
"collectionName": name,
|
||||
"data": data,
|
||||
}
|
||||
body_size = sys.getsizeof(json.dumps(payload))
|
||||
logger.info(f"body size: {body_size / 1024 / 1024} MB")
|
||||
client = self.vector_client
|
||||
client.api_key = "invalid_api_key"
|
||||
rsp = client.vector_insert(payload)
|
||||
assert rsp['code'] == 1800
|
||||
|
||||
def test_insert_vector_with_invalid_collection_name(self):
|
||||
"""
|
||||
@ -753,6 +721,7 @@ class TestInsertVectorNegative(TestBase):
|
||||
assert "fail to deal the insert data" in rsp['message']
|
||||
|
||||
|
||||
@pytest.mark.L0
|
||||
class TestUpsertVector(TestBase):
|
||||
|
||||
@pytest.mark.parametrize("insert_round", [2])
|
||||
@ -920,6 +889,38 @@ class TestUpsertVector(TestBase):
|
||||
logger.info(f"res: {res}")
|
||||
|
||||
|
||||
@pytest.mark.L0
|
||||
class TestUpsertVectorNegative(TestBase):
|
||||
|
||||
def test_upsert_vector_with_invalid_collection_name(self):
|
||||
"""
|
||||
upsert a vector with an invalid collection name
|
||||
"""
|
||||
|
||||
# create a collection
|
||||
name = gen_collection_name()
|
||||
dim = 128
|
||||
payload = {
|
||||
"collectionName": name,
|
||||
"dimension": dim,
|
||||
}
|
||||
rsp = self.collection_client.collection_create(payload)
|
||||
assert rsp['code'] == 0
|
||||
rsp = self.collection_client.collection_describe(name)
|
||||
assert rsp['code'] == 0
|
||||
# insert data
|
||||
nb = 100
|
||||
data = get_data_by_payload(payload, nb)
|
||||
payload = {
|
||||
"collectionName": "invalid_collection_name",
|
||||
"data": data,
|
||||
}
|
||||
body_size = sys.getsizeof(json.dumps(payload))
|
||||
logger.info(f"body size: {body_size / 1024 / 1024} MB")
|
||||
rsp = self.vector_client.vector_upsert(payload)
|
||||
assert rsp['code'] == 100
|
||||
assert "can't find collection" in rsp['message']
|
||||
|
||||
@pytest.mark.L0
|
||||
class TestSearchVector(TestBase):
|
||||
|
||||
@ -1653,7 +1654,7 @@ class TestSearchVector(TestBase):
|
||||
|
||||
|
||||
|
||||
@pytest.mark.L1
|
||||
@pytest.mark.L0
|
||||
class TestSearchVectorNegative(TestBase):
|
||||
|
||||
@pytest.mark.parametrize("metric_type", ["L2"])
|
||||
@ -1722,6 +1723,30 @@ class TestSearchVectorNegative(TestBase):
|
||||
rsp = self.vector_client.vector_search(payload)
|
||||
assert rsp['code'] == 65535
|
||||
|
||||
def test_search_vector_with_invalid_collection_name(self):
|
||||
"""
|
||||
Search a vector with invalid collection name
|
||||
"""
|
||||
name = gen_collection_name()
|
||||
self.name = name
|
||||
dim = 128
|
||||
schema_payload, data = self.init_collection(name, dim=dim)
|
||||
vector_field = schema_payload.get("vectorField")
|
||||
# search data
|
||||
vector_to_search = preprocessing.normalize([np.array([random.random() for i in range(dim)])])[0].tolist()
|
||||
output_fields = get_common_fields_by_data(data, exclude_fields=[vector_field])
|
||||
payload = {
|
||||
"collectionName": "invalid_collection_name",
|
||||
"data": [vector_to_search],
|
||||
"outputFields": output_fields,
|
||||
"filter": "uid >= 0",
|
||||
"limit": 100,
|
||||
"offset": 0,
|
||||
}
|
||||
rsp = self.vector_client.vector_search(payload)
|
||||
assert rsp['code'] == 100
|
||||
assert "can't find collection" in rsp['message']
|
||||
|
||||
|
||||
@pytest.mark.L0
|
||||
class TestAdvancedSearchVector(TestBase):
|
||||
@ -2339,7 +2364,7 @@ class TestQueryVector(TestBase):
|
||||
assert name.startswith(prefix)
|
||||
|
||||
|
||||
@pytest.mark.L1
|
||||
@pytest.mark.L0
|
||||
class TestQueryVectorNegative(TestBase):
|
||||
|
||||
def test_query_with_wrong_filter_expr(self):
|
||||
@ -2756,44 +2781,8 @@ class TestDeleteVector(TestBase):
|
||||
assert len(rsp["data"]) == 0
|
||||
|
||||
|
||||
@pytest.mark.L1
|
||||
@pytest.mark.L0
|
||||
class TestDeleteVectorNegative(TestBase):
|
||||
def test_delete_vector_with_invalid_api_key(self):
|
||||
"""
|
||||
Delete a vector with an invalid api key
|
||||
"""
|
||||
name = gen_collection_name()
|
||||
self.name = name
|
||||
nb = 200
|
||||
dim = 128
|
||||
schema_payload, data = self.init_collection(name, dim=dim, nb=nb)
|
||||
output_fields = get_common_fields_by_data(data)
|
||||
uids = []
|
||||
for item in data:
|
||||
uids.append(item.get("uid"))
|
||||
payload = {
|
||||
"collectionName": name,
|
||||
"outputFields": output_fields,
|
||||
"filter": f"uid in {uids}",
|
||||
}
|
||||
rsp = self.vector_client.vector_query(payload)
|
||||
assert rsp['code'] == 0
|
||||
res = rsp['data']
|
||||
logger.info(f"res: {len(res)}")
|
||||
ids = []
|
||||
for r in res:
|
||||
ids.append(r['id'])
|
||||
logger.info(f"ids: {len(ids)}")
|
||||
id_to_get = ids
|
||||
# delete by id list
|
||||
payload = {
|
||||
"collectionName": name,
|
||||
"filter": f"uid in {uids}"
|
||||
}
|
||||
client = self.vector_client
|
||||
client.api_key = "invalid_api_key"
|
||||
rsp = client.vector_delete(payload)
|
||||
assert rsp['code'] == 1800
|
||||
|
||||
def test_delete_vector_with_invalid_collection_name(self):
|
||||
"""
|
||||
@ -2839,3 +2828,106 @@ class TestDeleteVectorNegative(TestBase):
|
||||
rsp = self.vector_client.vector_delete(payload)
|
||||
assert rsp['code'] == 100
|
||||
assert "can't find collection" in rsp['message']
|
||||
|
||||
@pytest.mark.L1
|
||||
class TestVectorWithAuth(TestBase):
|
||||
def test_upsert_vector_with_invalid_api_key(self):
|
||||
"""
|
||||
Insert a vector with invalid api key
|
||||
"""
|
||||
# create a collection
|
||||
name = gen_collection_name()
|
||||
dim = 128
|
||||
payload = {
|
||||
"collectionName": name,
|
||||
"dimension": dim,
|
||||
}
|
||||
rsp = self.collection_client.collection_create(payload)
|
||||
assert rsp['code'] == 0
|
||||
rsp = self.collection_client.collection_describe(name)
|
||||
assert rsp['code'] == 0
|
||||
# insert data
|
||||
nb = 10
|
||||
data = [
|
||||
{
|
||||
"vector": [np.float64(random.random()) for _ in range(dim)],
|
||||
} for _ in range(nb)
|
||||
]
|
||||
payload = {
|
||||
"collectionName": name,
|
||||
"data": data,
|
||||
}
|
||||
body_size = sys.getsizeof(json.dumps(payload))
|
||||
logger.info(f"body size: {body_size / 1024 / 1024} MB")
|
||||
client = self.vector_client
|
||||
client.api_key = "invalid_api_key"
|
||||
rsp = client.vector_insert(payload)
|
||||
assert rsp['code'] == 1800
|
||||
def test_insert_vector_with_invalid_api_key(self):
|
||||
"""
|
||||
Insert a vector with invalid api key
|
||||
"""
|
||||
# create a collection
|
||||
name = gen_collection_name()
|
||||
dim = 128
|
||||
payload = {
|
||||
"collectionName": name,
|
||||
"dimension": dim,
|
||||
}
|
||||
rsp = self.collection_client.collection_create(payload)
|
||||
assert rsp['code'] == 0
|
||||
rsp = self.collection_client.collection_describe(name)
|
||||
assert rsp['code'] == 0
|
||||
# insert data
|
||||
nb = 10
|
||||
data = [
|
||||
{
|
||||
"vector": [np.float64(random.random()) for _ in range(dim)],
|
||||
} for _ in range(nb)
|
||||
]
|
||||
payload = {
|
||||
"collectionName": name,
|
||||
"data": data,
|
||||
}
|
||||
body_size = sys.getsizeof(json.dumps(payload))
|
||||
logger.info(f"body size: {body_size / 1024 / 1024} MB")
|
||||
client = self.vector_client
|
||||
client.api_key = "invalid_api_key"
|
||||
rsp = client.vector_insert(payload)
|
||||
assert rsp['code'] == 1800
|
||||
def test_delete_vector_with_invalid_api_key(self):
|
||||
"""
|
||||
Delete a vector with an invalid api key
|
||||
"""
|
||||
name = gen_collection_name()
|
||||
self.name = name
|
||||
nb = 200
|
||||
dim = 128
|
||||
schema_payload, data = self.init_collection(name, dim=dim, nb=nb)
|
||||
output_fields = get_common_fields_by_data(data)
|
||||
uids = []
|
||||
for item in data:
|
||||
uids.append(item.get("uid"))
|
||||
payload = {
|
||||
"collectionName": name,
|
||||
"outputFields": output_fields,
|
||||
"filter": f"uid in {uids}",
|
||||
}
|
||||
rsp = self.vector_client.vector_query(payload)
|
||||
assert rsp['code'] == 0
|
||||
res = rsp['data']
|
||||
logger.info(f"res: {len(res)}")
|
||||
ids = []
|
||||
for r in res:
|
||||
ids.append(r['id'])
|
||||
logger.info(f"ids: {len(ids)}")
|
||||
id_to_get = ids
|
||||
# delete by id list
|
||||
payload = {
|
||||
"collectionName": name,
|
||||
"filter": f"uid in {uids}"
|
||||
}
|
||||
client = self.vector_client
|
||||
client.api_key = "invalid_api_key"
|
||||
rsp = client.vector_delete(payload)
|
||||
assert rsp['code'] == 1800
|
||||
|
Loading…
Reference in New Issue
Block a user