def make_requirement(sr: Sequence[SubmissionRequirements], descriptors: Sequence[InputDescriptors]) -> Requirement: if not sr: sr = [] if not descriptors: descriptors = [] if len(sr) == 0: requirement = Requirement( count=len(descriptors), input_descriptors=descriptors, ) return requirement requirement = Requirement( count=len(sr), nested_req=[], ) for tmp_sub_req in sr: try: requirement.nested_req.append( to_requirement(tmp_sub_req, descriptors)) except Exception as err: print( f"Error creating requirement inside to_requirement function, {err}" ) return requirement
def test_job_transmission(self): self.awake_single() # campaignをセット campaign = Campaign(author="cxxx0", requirement=Requirement(values=["zero", "random"], trigger={"timer": 1}), trigger={"timer": 5}, place="All", purpose="test_purpose", destination="mongodb://localhost:27017/") clients["cxxx0"].post('/commander/campaigns', data=json.dumps(campaign.to_dict()), content_type='application/json') time.sleep(1.5) # heartbeatを待つ; 0.7 + 0.4 + alpha # missionを確認 mission = Mission(author="lxxx0", requirement=Requirement(values=["zero", "random"], trigger={"timer": 1}), trigger={"timer": 5}, place="All", purpose=campaign.get_id()) self.assertIn(mission, self.models["lxxx0"].missions.values()) # orderを確認 order = Order(author="sxxx0", values=["zero", "random"], trigger={"timer": 1}, purpose=mission.get_id()) self.assertIn(order, self.models["sxxx0"].orders.values())
def test_get_campaigns_single(self): # add a campaigns campaign = Campaign(author='cxxx0', destination='mongoserv', place='S101', purpose='A great app', requirement=Requirement(values=["zero", "random"], trigger={"timer": 10}), trigger={"timer": 30}) self.app.post('/commander/campaigns', data=json.dumps(campaign.to_dict()), content_type='application/json') # get subordinates response = self.app.get('/commander/campaigns') self.assertEqual(response.status_code, 200) actual = json.loads(response.data.decode("utf-8")) # assert expected = { "_status": { 'success': True, 'msg': "status is ok" }, 'campaigns': [campaign.to_dict()] } self.assertEqual(actual, expected)
def test_add_campaign(self): # 各種パラメータの詳細が決まっていないため、暫定値を採用。 # 最終的には、API自体に無効な入力パラメータをハネる機能を搭載したうえで # TODO: 無効値を確認する用のテストを作成すべき campaign = Campaign(author='cxxx0', destination='mongoserv', place='S101', purpose='A great app', requirement=Requirement(values=["zero", "random"], trigger={"timer": 10}), trigger={"timer": 30}) response = self.app.post('/commander/campaigns', data=json.dumps(campaign.to_dict()), content_type='application/json') self.assertEqual(response.status_code, 200) actual = json.loads(response.data.decode("utf-8")) expected = { "_status": { 'success': True, 'msg': "status is ok" }, "accepted": campaign.to_dict() } self.assertEqual(actual, expected)
def create_requirement(type): """Create and return requirement""" requirement = Requirement(type=type) db.session.add(requirement) db.session.commit() return requirement
def test_get_missions_multi(self): # add some missions mission_base = Mission(author='lxxx0', place='on desk', purpose='A great app', requirement=Requirement( values=["zero", "random"], trigger={"timer": 10}), trigger={"timer": 30}) mission_list = [] for purpose in ['on chair', 'front of door', 'on desk', 'living room']: m = copy.deepcopy(mission_base) m.purpose = purpose mission_list.append(m) for m in mission_list: self.leader_obj.accept_mission(m) # get missions response = self.app.get('/leader/missions') self.assertEqual(response.status_code, 200) actual = loads(response.data.decode("utf-8")) actual_list = actual['missions'] # assert status expected_status = {'success': True, 'msg': "status is ok"} self.assertEqual(actual['_status'], expected_status) # assert items expected_list = [c.to_dict() for c in mission_list] self.assertEqual(len(actual_list), len(expected_list)) for exp in expected_list: if exp not in actual_list: self.fail('{0} is not found.'.format(exp)) pass
def to_requirement(sr: SubmissionRequirements, descriptors: Sequence[InputDescriptors]) -> Requirement: input_descriptors = [] nested = [] total_count = 0 if sr._from: if sr._from != "": for tmp_descriptor in descriptors: if contains(tmp_descriptor.groups, sr._from): input_descriptors.append(tmp_descriptor) total_count = len(input_descriptors) if total_count == 0: raise Exception(f"No descriptors for from: {sr._from}") else: for tmp_sub_req in sr.from_nested: try: # recursion logic tmp_req = to_requirement(tmp_sub_req, descriptors) nested.append(tmp_req) except Exception as err: print( f"Error creating requirement from nested submission_requirements, {err}" ) total_count = len(nested) count = sr.count if sr.rule == "all": count = total_count requirement = Requirement(count=count, maximum=sr.maximum, minimum=sr.minimum, input_descriptors=input_descriptors, nested_req=nested) return requirement
def test_get_campaigns_multi(self): # add some campaigns campaign_base = Campaign(author='cxxx0', destination='mongoserv', place='S101', purpose='A great app', requirement=Requirement( values=["zero", "random"], trigger={"timer": 10}), trigger={"timer": 30}) campaign_list = [] for place in ['S101', 'S102', 'S103', 'S104']: c = copy.deepcopy(campaign_base) c.place = place campaign_list.append(c) for c in campaign_list: self.app.post('/commander/campaigns', data=json.dumps(c.to_dict()), content_type='application/json') # get campaigns response = self.app.get('/commander/campaigns') self.assertEqual(response.status_code, 200) actual = json.loads(response.data.decode("utf-8")) actual_list = actual['campaigns'] # assert status expected_status = {'success': True, 'msg': "status is ok"} self.assertEqual(actual['_status'], expected_status) # assert items expected_list = [c.to_dict() for c in campaign_list] self.assertEqual(len(actual_list), len(expected_list)) for exp in expected_list: if exp not in actual_list: self.fail('{0} is not found.'.format(exp)) pass
def test_get_missions_single(self): # add a mission mission = Mission(author='lxxx0', place='on desk', purpose='A great app', requirement=Requirement(values=["zero", "random"], trigger={"timer": 10}), trigger={"timer": 30}) self.leader_obj.accept_mission(mission) # get subordinates response = self.app.get('/leader/missions') self.assertEqual(response.status_code, 200) actual = loads(response.data.decode("utf-8")) # assert expected = { "_status": { 'success': True, 'msg': "status is ok" }, 'missions': [mission.to_dict()] } self.assertEqual(actual, expected)
def test_missoin_do(self): def post_report(url, data=None, json=None, etag=None, **kwargs): res = requests.Response() res.status_code = 200 res_dict = { "_status": { "msg": "ok", "success": True }, "accepted": json } res._content = dumps(res_dict).encode() return res, None self.leader_obj.superior_ep = "test://cxxx0/commander/" soldier = SoldierInfo(id="sxxx0", name="sol-test", place="left", weapons=[], orders=[]) self.leader_obj.accept_subordinate(soldier) mission = Mission(author="sxxx0", requirement=Requirement(values=["zero", "random"], trigger={"timer": 0.4}), trigger={"timer": 0.7}, place="All", purpose="some purpose hash") work_1 = Work(time=datetime.utcnow().isoformat(), purpose=mission.get_id(), values=[0, 0.584249]) work_2 = Work(time=datetime.utcnow().isoformat(), purpose=mission.get_id(), values=[0, 0.238491]) work_3 = Work( time=datetime.utcnow().isoformat(), purpose="0" + mission.get_id()[:-1], # 上2つとずらす values=[0, 0.045066]) self.leader_obj.accept_work("sxxx0", work_1) self.leader_obj.accept_work("sxxx0", work_2) self.leader_obj.accept_work("sxxx0", work_3) with patch("utils.rest.post", side_effect=post_report) as m: self.leader_obj.accept_mission(mission) time.sleep(1) self.assertEqual(m.call_count, 1) self.assertEqual( m.call_args[0][0], "test://cxxx0/commander/subordinates/lxxx0/report") # reportのチェック actual = m.call_args[1]["json"] self.assertEqual(set(actual.keys()), {"time", "place", "purpose", "values"}) self.assertEqual(actual["purpose"], "some purpose hash") self.assertEqual(len(actual["values"]), 2) # report.valuesのチェック work_in_1 = work_1.to_dict() del work_in_1["purpose"] work_in_1["place"] = "left" work_in_2 = work_2.to_dict() del work_in_2["purpose"] work_in_2["place"] = "left" self.assertIn(work_in_1, actual["values"]) self.assertIn(work_in_2, actual["values"]) self.leader_obj.superior_ep = "" # shutdownでDELETEを送信するのを阻止