diff --git a/tests/restful_client_v2/testcases/test_collection_operations.py b/tests/restful_client_v2/testcases/test_collection_operations.py index fe86150000..4febe973c0 100644 --- a/tests/restful_client_v2/testcases/test_collection_operations.py +++ b/tests/restful_client_v2/testcases/test_collection_operations.py @@ -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 diff --git a/tests/restful_client_v2/testcases/test_vector_operations.py b/tests/restful_client_v2/testcases/test_vector_operations.py index b3ecfe0808..630a496454 100644 --- a/tests/restful_client_v2/testcases/test_vector_operations.py +++ b/tests/restful_client_v2/testcases/test_vector_operations.py @@ -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