Spaces:
Runtime error
Runtime error
| import pytest | |
| from chromadb.api.client import AdminClient, Client | |
| from chromadb.config import DEFAULT_DATABASE, DEFAULT_TENANT | |
| def test_database_tenant_collections(client: Client) -> None: | |
| client.reset() | |
| # Create a new database in the default tenant | |
| admin_client = AdminClient.from_system(client._system) | |
| admin_client.create_database("test_db") | |
| # Create collections in this new database | |
| client.set_tenant(tenant=DEFAULT_TENANT, database="test_db") | |
| client.create_collection("collection", metadata={"database": "test_db"}) | |
| # Create collections in the default database | |
| client.set_tenant(tenant=DEFAULT_TENANT, database=DEFAULT_DATABASE) | |
| client.create_collection("collection", metadata={"database": DEFAULT_DATABASE}) | |
| # List collections in the default database | |
| collections = client.list_collections() | |
| assert len(collections) == 1 | |
| assert collections[0].name == "collection" | |
| assert collections[0].metadata == {"database": DEFAULT_DATABASE} | |
| # List collections in the new database | |
| client.set_tenant(tenant=DEFAULT_TENANT, database="test_db") | |
| collections = client.list_collections() | |
| assert len(collections) == 1 | |
| assert collections[0].metadata == {"database": "test_db"} | |
| # Update the metadata in both databases to different values | |
| client.set_tenant(tenant=DEFAULT_TENANT, database=DEFAULT_DATABASE) | |
| client.list_collections()[0].modify(metadata={"database": "default2"}) | |
| client.set_tenant(tenant=DEFAULT_TENANT, database="test_db") | |
| client.list_collections()[0].modify(metadata={"database": "test_db2"}) | |
| # Validate that the metadata was updated | |
| client.set_tenant(tenant=DEFAULT_TENANT, database=DEFAULT_DATABASE) | |
| collections = client.list_collections() | |
| assert len(collections) == 1 | |
| assert collections[0].metadata == {"database": "default2"} | |
| client.set_tenant(tenant=DEFAULT_TENANT, database="test_db") | |
| collections = client.list_collections() | |
| assert len(collections) == 1 | |
| assert collections[0].metadata == {"database": "test_db2"} | |
| # Delete the collections and make sure databases are isolated | |
| client.set_tenant(tenant=DEFAULT_TENANT, database=DEFAULT_DATABASE) | |
| client.delete_collection("collection") | |
| collections = client.list_collections() | |
| assert len(collections) == 0 | |
| client.set_tenant(tenant=DEFAULT_TENANT, database="test_db") | |
| collections = client.list_collections() | |
| assert len(collections) == 1 | |
| client.delete_collection("collection") | |
| collections = client.list_collections() | |
| assert len(collections) == 0 | |
| def test_database_collections_add(client: Client) -> None: | |
| client.reset() | |
| # Create a new database in the default tenant | |
| admin_client = AdminClient.from_system(client._system) | |
| admin_client.create_database("test_db") | |
| # Create collections in this new database | |
| client.set_database(database="test_db") | |
| coll_new = client.create_collection("collection_new") | |
| # Create collections in the default database | |
| client.set_database(database=DEFAULT_DATABASE) | |
| coll_default = client.create_collection("collection_default") | |
| records_new = { | |
| "ids": ["a", "b", "c"], | |
| "embeddings": [[1.0, 2.0, 3.0] for _ in range(3)], | |
| "documents": ["a", "b", "c"], | |
| } | |
| records_default = { | |
| "ids": ["c", "d", "e"], | |
| "embeddings": [[4.0, 5.0, 6.0] for _ in range(3)], | |
| "documents": ["c", "d", "e"], | |
| } | |
| # Add to the new coll | |
| coll_new.add(**records_new) # type: ignore | |
| # Add to the default coll | |
| coll_default.add(**records_default) # type: ignore | |
| # Make sure the collections are isolated | |
| res = coll_new.get(include=["embeddings", "documents"]) | |
| assert res["ids"] == records_new["ids"] | |
| assert res["embeddings"] == records_new["embeddings"] | |
| assert res["documents"] == records_new["documents"] | |
| res = coll_default.get(include=["embeddings", "documents"]) | |
| assert res["ids"] == records_default["ids"] | |
| assert res["embeddings"] == records_default["embeddings"] | |
| assert res["documents"] == records_default["documents"] | |
| def test_tenant_collections_add(client: Client) -> None: | |
| client.reset() | |
| # Create two databases with same name in different tenants | |
| admin_client = AdminClient.from_system(client._system) | |
| admin_client.create_tenant("test_tenant1") | |
| admin_client.create_tenant("test_tenant2") | |
| admin_client.create_database("test_db", tenant="test_tenant1") | |
| admin_client.create_database("test_db", tenant="test_tenant2") | |
| # Create collections in each database with same name | |
| client.set_tenant(tenant="test_tenant1", database="test_db") | |
| coll_tenant1 = client.create_collection("collection") | |
| client.set_tenant(tenant="test_tenant2", database="test_db") | |
| coll_tenant2 = client.create_collection("collection") | |
| records_tenant1 = { | |
| "ids": ["a", "b", "c"], | |
| "embeddings": [[1.0, 2.0, 3.0] for _ in range(3)], | |
| "documents": ["a", "b", "c"], | |
| } | |
| records_tenant2 = { | |
| "ids": ["c", "d", "e"], | |
| "embeddings": [[4.0, 5.0, 6.0] for _ in range(3)], | |
| "documents": ["c", "d", "e"], | |
| } | |
| # Add to the tenant1 coll | |
| coll_tenant1.add(**records_tenant1) # type: ignore | |
| # Add to the tenant2 coll | |
| coll_tenant2.add(**records_tenant2) # type: ignore | |
| # Make sure the collections are isolated | |
| res = coll_tenant1.get(include=["embeddings", "documents"]) | |
| assert res["ids"] == records_tenant1["ids"] | |
| assert res["embeddings"] == records_tenant1["embeddings"] | |
| assert res["documents"] == records_tenant1["documents"] | |
| res = coll_tenant2.get(include=["embeddings", "documents"]) | |
| assert res["ids"] == records_tenant2["ids"] | |
| assert res["embeddings"] == records_tenant2["embeddings"] | |
| assert res["documents"] == records_tenant2["documents"] | |
| def test_min_len_name(client: Client) -> None: | |
| client.reset() | |
| # Create a new database in the default tenant with a name of length 1 | |
| # and expect an error | |
| admin_client = AdminClient.from_system(client._system) | |
| with pytest.raises(Exception): | |
| admin_client.create_database("a") | |
| # Create a tenant with a name of length 1 and expect an error | |
| with pytest.raises(Exception): | |
| admin_client.create_tenant("a") | |