Files
behavior-tree/tests/test_http_api.py
T

39 lines
2.3 KiB
Python
Raw Normal View History

import http.client
import json
import sys
import tempfile
import threading
import unittest
from pathlib import Path
sys.path.insert(0,str(Path(__file__).resolve().parents[1]/'coordinator'))
from robot_bt_coordinator.service import Coordinator
from robot_bt_coordinator.backends import ManualBackend
from robot_bt_coordinator.http_api import make_server
class HttpTest(unittest.TestCase):
def setUp(self):
self.tmp=tempfile.TemporaryDirectory();self.c=Coordinator(str(Path(self.tmp.name)/'db'),ManualBackend(),{'robot_01'})
self.server=make_server(self.c,'127.0.0.1',0,'test-secret','operator-secret')
self.thread=threading.Thread(target=self.server.serve_forever,daemon=True);self.thread.start()
def tearDown(self):
self.server.shutdown();self.server.server_close();self.thread.join();self.c.close();self.tmp.cleanup()
def request(self,method,path,body=None,token='test-secret'):
conn=http.client.HTTPConnection('127.0.0.1',self.server.server_port,timeout=3)
headers={'Authorization':'Bearer '+token,'Content-Type':'application/json'}
conn.request(method,path,body,headers);r=conn.getresponse();result=(r.status,json.loads(r.read()));conn.close();return result
def test_auth_required_and_health_allowed(self):
self.assertEqual(self.request('GET','/v1/capabilities',token='wrong')[0],401)
self.assertEqual(self.request('GET','/healthz',token='wrong')[0],200)
def test_submit_get_cancel_and_event_cursor(self):
req=dict(client_request_id='http1',robot_id='robot_01',instruction='move water',known_info={})
code,t=self.request('POST','/v1/tasks',json.dumps(req));self.assertEqual(code,202)
tid=t['task_id'];self.assertEqual(self.request('GET','/v1/tasks/'+tid)[1]['status'],'QUEUED')
self.assertEqual(self.request('POST',f'/v1/tasks/{tid}/cancel','{}')[1]['status'],'CANCELED')
self.assertEqual(self.request('GET',f'/v1/tasks/{tid}/events?after=0')[0],200)
def test_duplicate_json_keys_nonfinite_and_unknown_endpoint_rejected(self):
for payload in ['{"robot_id":"a","robot_id":"b"}','{"quantity":NaN}']:
self.assertEqual(self.request('POST','/v1/tasks',payload)[0],400)
self.assertEqual(self.request('GET','/not-found')[0],404)
if __name__=='__main__':unittest.main()