@@ -100,10 +100,76 @@ def handler(request: Request) -> Response:
100100
101101 assert isinstance (ns , Namespace )
102102 assert ns .name == "myns"
103+ assert ns .home_node is None
104+ assert ns .state is None
103105 assert captured ["body" ] == {}
104106 server .check_assertions ()
105107
106108
109+ def test_namespaces_create_sends_home_node_when_provided (
110+ ns_client : Tuple [weaviate .WeaviateClient , HTTPServer ],
111+ ) -> None :
112+ """When ``home_node`` is provided, ``create`` must carry it in the request body.
113+
114+ Dropping ``body['home_node'] = home_node`` would silently ignore the caller's
115+ placement choice and let the server auto-select instead.
116+ """
117+ client , server = ns_client
118+ captured : Dict [str , Any ] = {}
119+
120+ def handler (request : Request ) -> Response :
121+ captured ["body" ] = json .loads (request .get_data (as_text = True ) or "{}" )
122+ return Response (
123+ json .dumps ({"name" : "myns" , "home_node" : "node1" , "state" : "active" }),
124+ status = 201 ,
125+ )
126+
127+ server .expect_request ("/v1/namespaces/myns" , method = "POST" ).respond_with_handler (handler )
128+
129+ ns = client .namespaces .create (name = "myns" , home_node = "node1" )
130+
131+ assert ns .name == "myns"
132+ assert ns .home_node == "node1"
133+ assert ns .state == "active"
134+ assert captured ["body" ] == {"home_node" : "node1" }
135+ server .check_assertions ()
136+
137+
138+ # ---------------------------------------------------------------------------
139+ # update
140+ # ---------------------------------------------------------------------------
141+
142+
143+ def test_namespaces_update_sends_put_and_parses_response (
144+ ns_client : Tuple [weaviate .WeaviateClient , HTTPServer ],
145+ ) -> None :
146+ """``update`` must PUT ``{"home_node": ...}`` and return the updated namespace.
147+
148+ The server requires ``home_node`` in the body; sending anything else (or the
149+ wrong HTTP verb) would break the modify-placement contract.
150+ """
151+ client , server = ns_client
152+ captured : Dict [str , Any ] = {}
153+
154+ def handler (request : Request ) -> Response :
155+ captured ["body" ] = json .loads (request .get_data (as_text = True ) or "{}" )
156+ return Response (
157+ json .dumps ({"name" : "myns" , "home_node" : "node2" , "state" : "active" }),
158+ status = 200 ,
159+ )
160+
161+ server .expect_request ("/v1/namespaces/myns" , method = "PUT" ).respond_with_handler (handler )
162+
163+ ns = client .namespaces .update (name = "myns" , home_node = "node2" )
164+
165+ assert isinstance (ns , Namespace )
166+ assert ns .name == "myns"
167+ assert ns .home_node == "node2"
168+ assert ns .state == "active"
169+ assert captured ["body" ] == {"home_node" : "node2" }
170+ server .check_assertions ()
171+
172+
107173# ---------------------------------------------------------------------------
108174# get
109175# ---------------------------------------------------------------------------
@@ -121,6 +187,30 @@ def test_namespaces_get_returns_namespace_when_found(
121187
122188 assert ns is not None
123189 assert ns .name == "customer1"
190+ assert ns .home_node is None
191+ assert ns .state is None
192+ server .check_assertions ()
193+
194+
195+ def test_namespaces_get_parses_home_node_and_state (
196+ ns_client : Tuple [weaviate .WeaviateClient , HTTPServer ],
197+ ) -> None :
198+ """``get`` must surface the ``home_node`` and ``state`` fields from the response.
199+
200+ These fields were added to the server's namespace object after the client's
201+ initial implementation; this guards against the parser silently ignoring them.
202+ """
203+ client , server = ns_client
204+ server .expect_request ("/v1/namespaces/customer1" , method = "GET" ).respond_with_json (
205+ {"name" : "customer1" , "home_node" : "node1" , "state" : "deleting" }, status = 200
206+ )
207+
208+ ns = client .namespaces .get (name = "customer1" )
209+
210+ assert ns is not None
211+ assert ns .name == "customer1"
212+ assert ns .home_node == "node1"
213+ assert ns .state == "deleting"
124214 server .check_assertions ()
125215
126216
@@ -161,6 +251,28 @@ def test_namespaces_list_all_parses_array(
161251 server .check_assertions ()
162252
163253
254+ def test_namespaces_list_all_parses_home_node_and_state (
255+ ns_client : Tuple [weaviate .WeaviateClient , HTTPServer ],
256+ ) -> None :
257+ """``list_all`` must surface ``home_node`` and ``state`` for each namespace."""
258+ client , server = ns_client
259+ server .expect_request ("/v1/namespaces" , method = "GET" ).respond_with_json (
260+ [
261+ {"name" : "ns1" , "home_node" : "node1" , "state" : "active" },
262+ {"name" : "ns2" },
263+ ],
264+ status = 200 ,
265+ )
266+
267+ namespaces = client .namespaces .list_all ()
268+
269+ assert namespaces [0 ].home_node == "node1"
270+ assert namespaces [0 ].state == "active"
271+ assert namespaces [1 ].home_node is None
272+ assert namespaces [1 ].state is None
273+ server .check_assertions ()
274+
275+
164276def test_namespaces_list_all_handles_null_response (
165277 ns_client : Tuple [weaviate .WeaviateClient , HTTPServer ],
166278) -> None :
@@ -216,11 +328,12 @@ def test_namespaces_delete_accepts_202(
216328 "method_call" ,
217329 [
218330 lambda c : c .namespaces .create (name = "x" ),
331+ lambda c : c .namespaces .update (name = "x" , home_node = "n" ),
219332 lambda c : c .namespaces .get (name = "x" ),
220333 lambda c : c .namespaces .list_all (),
221334 lambda c : c .namespaces .delete (name = "x" ),
222335 ],
223- ids = ["create" , "get" , "list_all" , "delete" ],
336+ ids = ["create" , "update" , " get" , "list_all" , "delete" ],
224337)
225338def test_namespaces_methods_require_1_38 (
226339 ns_client_old : weaviate .WeaviateClient ,
0 commit comments