diff --git a/TestCase/automation/test_04_workflow.py b/TestCase/automation/test_04_workflow.py new file mode 100644 index 0000000000000000000000000000000000000000..fc50794e5320c7db9699abadebf5421b264b7876 --- /dev/null +++ b/TestCase/automation/test_04_workflow.py @@ -0,0 +1,13 @@ +import pytest +from Utils import yaml_handler +from Utils import req_handler +from TestData.automation.workflow_test_data import workflowData + +class TestWorkflow: + + yaml_path = r'automation/workflow.yaml' + yaml_data = yaml_handler.yaml_handler.get_case(yaml_path) + @pytest.mark.flaky(reruns=workflowData.rerun, reruns_delay=workflowData.rerun_delay) + @pytest.mark.parametrize('case',yaml_data) + def test_workflow(self,case): + req_handler.ReqHandler.send_requests(case=case,var_class=workflowData) diff --git a/TestData/automation/workflow_test_data.py b/TestData/automation/workflow_test_data.py new file mode 100644 index 0000000000000000000000000000000000000000..3cd30ef96a9d2fd8965b96f1adb7393ecd7934eb --- /dev/null +++ b/TestData/automation/workflow_test_data.py @@ -0,0 +1,20 @@ +import Utils.sql_handler +from Utils.global_variate import Global +from Utils.mockData_handler import data_handler +from Utils.sql_handler import SqlHandler +from Utils.config_handler import base_config + +class workflowData(Global): + workflow_name = 'autotest_workflow%s'%data_handler.random_id() + workflow_describe = 'autotest_workflow_describe%s'%data_handler.random_id() + workflow_status = 2 + insert_workflow_id = data_handler.random_id() + brandId = 6052 + workflow_parent_template_id = 'cj6d0n6ein6dsof86ng0' + event_id = 'cmk9m1n73uvgh1rfmho0' + rob_id = 'cjhg9iuein687habss50' + workflow_msg = "Hi autotester~" + workflow_update_msg = "Hi autotester update~" + create_workflow_data = {"logicIf":{"ruleCond":{"condType":2,"robId":event_id,"objName":"ChatBotIncomingMessage","objType":"bool","compOperatorType":"eq","compOperatorValue":"true","nodeFlag":"Triggers","showType":"","showKind":"","extendedAttributes":"{\"x\":212,\"y\":212,\"nodeId\":\"Triggers_35705406543421204\"}"},"result":[{"childRuleObject":None,"extendedAttributes":"{\"showType\":\"next\",\"nodeId\":\"Actions_22978849391260737\"}","inner":[{"robId":rob_id,"objName":"ChatBotMulReply","objType":"string","objValue":"{\"contentList\":\"%s\",\"attachmentList\":[]}"%workflow_msg,"showType":"mulInput","showKind":"chatBotReply","extendedAttributes":"{\"title\":\"Message content\",\"nodeId\":\"Actions_22978849391260737\",\"x\":686,\"y\":212}"}],"resultType":2,"next":None}]}} + create_workflow_data2 = {"logicIf":{"ruleCond":{"condType":2,"robId":event_id,"objName":"ChatBotIncomingMessage","objType":"bool","compOperatorType":"eq","compOperatorValue":"true","nodeFlag":"Triggers","showType":"","showKind":"","extendedAttributes":"{\"x\":212,\"y\":212,\"nodeId\":\"Triggers_35705406543421204\"}"},"result":[{"childRuleObject":None,"extendedAttributes":"{\"showType\":\"next\",\"nodeId\":\"Actions_22978849391260737\"}","inner":[{"robId":rob_id,"objName":"ChatBotMulReply","objType":"string","objValue":"{\"contentList\":\"%s\",\"attachmentList\":[]}"%workflow_update_msg,"showType":"mulInput","showKind":"chatBotReply","extendedAttributes":"{\"title\":\"Message content\",\"nodeId\":\"Actions_22978849391260737\",\"x\":686,\"y\":212}"}],"resultType":2,"next":None}]}} + workflow_db = SqlHandler(address=base_config.get_value('mysql','address'),port=int(base_config.get_value('mysql','port')),account=base_config.get_value('mysql','account'),password=base_config.get_value('mysql','password')) diff --git a/TestFile/automation/workflow/workflow_select.py b/TestFile/automation/workflow/workflow_select.py new file mode 100644 index 0000000000000000000000000000000000000000..ecf738878ecd8e73228e68fb9bb6b11bb4c720c1 --- /dev/null +++ b/TestFile/automation/workflow/workflow_select.py @@ -0,0 +1,33 @@ +from TestData.automation.workflow_test_data import workflowData + +workflow_select_sql = f'select * from `rule_define` where brand_id = {workflowData.brandId} and status != 3 and tpl_id = "{workflowData.workflow_parent_template_id}" and child_rule = 0' +workflow_select_result = workflowData.workflow_db.select_many_value(sql=workflow_select_sql) +if workflow_select_result: + + workflow_num = len(workflow_select_result) + workflow = workflow_select_result[0] + select_workflow_id = workflow['rule_id'] + select_workflow_name = workflow['rule_name'] + select_workflow_status = workflow['status'] + select_workflow_sort = str(workflow['sorts']) + select_workflow_describe = workflow['rule_describe'] +else: + insert_rule_raw = '{"ruleId":"cp5ccqct7rnv226qoavg","tplId":"cj6d0n6ein6dsof86ng0","brandId":6052,"eventId":"cmk9m1n73uvgh1rfmho0","ruleName":"Triage button and assign to different teams","ruleDescribe":"When a customer opens a new conversation, it is assigned according to the type selected by the user, and the issue information is collected synchronously, add the tag.","status":1,"ruleLogic":{"logicIf":{"ruleCond":{"condType":2,"robId":"cmk9m1n73uvgh1rfmho0","objName":"ChatBotIncomingMessage","objType":"bool","compOperatorType":"eq","compOperatorValue":"true","extendedAttributes":"{\\"x\\":212,\\"y\\":212,\\"nodeId\\":\\"Triggers_35705406543421204\\"}"},"result":[{"extendedAttributes":"{\\"showType\\":\\"next\\",\\"nodeId\\":\\"Actions_7500242750723225\\"}","resultType":2,"inner":[{"ruleId":"cp5ccqct7rnv226qoavg","robId":"cjhg9iuein687habss50","objName":"ChatBotMulReply","objType":"string","objKind":2,"objValue":"{\\"contentList\\":\\"Hi👋~\\",\\"attachmentList\\":[]}","showType":"mulInput","showKind":"chatBotReply","extendedAttributes":"{\\"title\\":\\"Message content\\",\\"nodeId\\":\\"Actions_7500242750723225\\",\\"x\\":658.2869318181818,\\"y\\":270.7599431818181}","resultType":1}]}],"index":1}}}' + workflow_insert_sql = f"""INSERT INTO willdesk.rule_define (rule_id,tpl_id,brand_id,event_id,rule_name,rule_describe,rule_dsl,rule_raw,sorts,parent_ruleid,child_rule,dsl_version,json_version,status,create_at,update_at) VALUES + ('{workflowData.insert_workflow_id}','{workflowData.workflow_parent_template_id}',{workflowData.brandId},'{workflowData.event_id}',{workflowData.workflow_name},'{workflowData.workflow_describe}','cnVsZSAiY3A1Y2NxY3Q3cm52MjI2cW9hdmciICJUcmlhZ2UgYnV0dG9uIGFuZCBhc3NpZ24gdG8gZGlmZmVyZW50IHRlYW1zIiBzYWxpZW5jZSAgJFJVTEVfU09SVFNfUExBQ0UkCmJlZ2luCmlmIGNoZWNrUnVsZUluZGV4KGRhdGEuUnVuSW5kZXhzLDEpIHx8ICgoZGF0YS5DaGVja0RhdGEoIkNoYXRCb3RJbmNvbWluZ01lc3NhZ2UiKSAmJiBlcXVhbChkYXRhLkdldERhdGEoIkNoYXRCb3RJbmNvbWluZ01lc3NhZ2UiKSwidHJ1ZSIpKSkgewogIHJldHVybiAiVzNzaWNuVnNaVWxrSWpvaVkzQTFZMk54WTNRM2NtNTJNakkyY1c5aGRtY2lMQ0p5YjJKSlpDSTZJbU5xYUdjNWFYVmxhVzQyT0Rkb1lXSnpjelV3SWl3aWIySnFUbUZ0WlNJNklrTm9ZWFJDYjNSTmRXeFNaWEJzZVNJc0ltOWlhbFI1Y0dVaU9pSnpkSEpwYm1jaUxDSnZZbXBMYVc1a0lqb3lMQ0p2WW1wV1lXeDFaU0k2SW50Y0ltTnZiblJsYm5STWFYTjBYQ0k2WENKSWFmQ2ZrWXQrWENJc1hDSmhkSFJoWTJodFpXNTBUR2x6ZEZ3aU9sdGRmU0lzSW5Ob2IzZFVlWEJsSWpvaWJYVnNTVzV3ZFhRaUxDSnphRzkzUzJsdVpDSTZJbU5vWVhSQ2IzUlNaWEJzZVNJc0ltVjRkR1Z1WkdWa1FYUjBjbWxpZFhSbGN5STZJbnRjSW5ScGRHeGxYQ0k2WENKTlpYTnpZV2RsSUdOdmJuUmxiblJjSWl4Y0ltNXZaR1ZKWkZ3aU9sd2lRV04wYVc5dWMxODNOVEF3TWpReU56VXdOekl6TWpJMVhDSXNYQ0o0WENJNk5qVTRMakk0Tmprek1UZ3hPREU0TVRnc1hDSjVYQ0k2TWpjd0xqYzFPVGswTXpFNE1UZ3hPREY5SWl3aWNtVnpkV3gwVkhsd1pTSTZNWDFkIgp9CnJldHVybiAiVzNzaWJtOWtaVWx1WkdWNElqb3hMQ0p5ZFd4bFNXUWlPaUpqY0RWalkzRmpkRGR5Ym5ZeU1qWnhiMkYyWnlJc0luSnZZa2xrSWpvaVkyMXJPVzB4YmpjemRYWm5hREZ5Wm0xb2J6QWlMQ0p2WW1wT1lXMWxJam9pUTJoaGRFSnZkRWx1WTI5dGFXNW5UV1Z6YzJGblpTSXNJbTlpYWxSNWNHVWlPaUppYjI5c0lpd2liMkpxUzJsdVpDSTZNU3dpY21WemRXeDBWSGx3WlNJNk1YMWQiCmVuZAo=',{insert_rule_raw},35870000,'',0,'v2','v2',{workflowData.workflow_status},'2024-05-20 11:41:29','2024-05-20 11:41:29'); +""" + workflowData.workflow_db.execute_sql(sql=workflow_insert_sql) + select_workflow_id = workflowData.insert_workflow_id + select_workflow_name = workflowData.workflow_name + select_workflow_status = workflowData.workflow_status + workflow_num = 1 + select_workflow_sort = '35870000' + select_workflow_describe = workflowData.workflow_describe +setattr(workflowData, 'select_workflow_id', select_workflow_id) +setattr(workflowData, 'workflow_num', workflow_num) +setattr(workflowData, 'select_workflow_name', select_workflow_name) +setattr(workflowData, 'select_workflow_status', select_workflow_status) +setattr(workflowData, 'select_workflow_sort', select_workflow_sort) +setattr(workflowData, 'select_workflow_describe', select_workflow_describe) +setattr(workflowData, 'workflow_num_less', workflow_num - 1) +workflowData.workflow_db.close_db() \ No newline at end of file diff --git a/TestFile/automation/workflow/workflow_template_select.py b/TestFile/automation/workflow/workflow_template_select.py new file mode 100644 index 0000000000000000000000000000000000000000..e0b65968bee05e0b1c9ac81f10091fc6b8e3c502 --- /dev/null +++ b/TestFile/automation/workflow/workflow_template_select.py @@ -0,0 +1,7 @@ +from Utils.sql_handler import test_env_conn +from TestData.automation.workflow_test_data import workflowData + +template_parent_select_sql = f'select * from rule_template where status = 1 and tpl_category = "autoanswer"' +template_parent_select_result = test_env_conn.select_one_value(sql=template_parent_select_sql) +workflow_parent_template_id = template_parent_select_result['tpl_id'] +setattr(workflowData, 'workflow_parent_template_id', workflow_parent_template_id) \ No newline at end of file diff --git a/YamlCase/automation/workflow.yaml b/YamlCase/automation/workflow.yaml new file mode 100644 index 0000000000000000000000000000000000000000..59b16fa54ae7a7bf7b4137039ea41debf030c911 --- /dev/null +++ b/YamlCase/automation/workflow.yaml @@ -0,0 +1,111 @@ +api1: + title: 新建一个workflow + url: /api/v1/rule/updateRuleDefine + method: post + data: {"tplId":"${workflow_parent_template_id}","ruleName":"${workflow_name}","ruleDescribe":"${workflow_describe}","ruleId":"","status":"${workflow_status}","brandId":"${brandId}","eventId":"${event_id}","childRule":0,"ruleType":"Triggers","ruleLogic":"${create_workflow_data}","v":"${v}"} + before_sql: automation/workflow/workflow_template_select.py + set_value: {"create_workflow_id": "$.data.ruleId"} + expected: + - eq: {"$.code": 0} + + +api2: + title: 检查是否新建成功 + url: /api/v1/rule/ruleList + method: post + data: {"page":1,"pageSize":100,"brandId":"${brandId}","tplId":"${workflow_parent_template_id}","v":"${v}"} + before_sql: automation/workflow/workflow_select.py + expected: + - eq: {"$.code": 0} + - eq: {"$.data.total": "${workflow_num}"} + - eq: {"$.data.ruleList[?(@.ruleId == '${select_workflow_id}')].ruleName": "${select_workflow_name}"} + - eq: {"$.data.ruleList[?(@.ruleId == '${select_workflow_id}')].sorts": "${select_workflow_sort}"} + - eq: {"$.data.ruleList[?(@.ruleId == '${select_workflow_id}')].status": "${select_workflow_status}"} + - in_list: {"$.data.ruleList[*].ruleId": "${create_workflow_id}"} + - eq: {"$.data.ruleList[?(@.ruleId == '${create_workflow_id}')].ruleName": "${workflow_name}"} + - in: {"$.data.ruleList[?(@.ruleId == '${create_workflow_id}')].ruleLogic.logicIf.result[0].inner[0].objValue": "${workflow_msg}"} + + +api3: + title: 更新workflow(只更新名称) + url: /api/v1/rule/updateRuleDefine + method: post + data: {"tplId":"${workflow_parent_template_id}","ruleName":"${workflow_name}","ruleDescribe":"${workflow_describe}","ruleId":"${create_workflow_id}","status":"${workflow_status}","brandId":"${brandId}","eventId":"${event_id}","childRule":0,"ruleType":"Triggers","ruleLogic":"${create_workflow_data2}","v":"${v}"} + expected: + - eq: {"$.code": 0} + +api4: + title: 检查是否更新成功 + url: /api/v1/rule/ruleList + method: post + data: {"page":1,"pageSize":100,"brandId":"${brandId}","tplId":"${workflow_parent_template_id}","v":"${v}"} + expected: + - eq: {"$.code": 0} + - eq: {"$.data.ruleList[?(@.ruleId == '${create_workflow_id}')].ruleName": "${workflow_name}"} + - in: {"$.data.ruleList[?(@.ruleId == '${create_workflow_id}')].ruleLogic.logicIf.result[0].inner[0].objValue": "${workflow_update_msg}"} + +api5: + title: c端主动发起会话触发workflow + ws: customer + action: sendmsg + data: + type: text + +api6: + title: c端检查是否触发workflow + url: /api/v1/chatRecord/customerList + method: post + data: {"uid":"${customerId}","uType":1,"platform":1,"siteId":"${shopId}","sendTime":0,"pageSize":20,"v":"${customer_v}"} + expected: + - eq: {"$.code": 0 } + - not_in: {"$.data.list[0].content": "${workflow_update_msg}"} + +api7: + title: 开启workflow + url: /api/v1/rule/updateRuleStatus + method: post + data: {"status":1,"ruleId":"${create_workflow_id}","v":"${v}"} + expected: + - eq: {"$.code": 0} + +api8: + title: c端主动发起会话触发workflow + ws: customer + action: sendmsg + data: + type: text + +api9: + title: c端检查是否触发workflow + url: /api/v1/chatRecord/customerList + method: post + data: {"uid":"${customerId}","uType":1,"platform":1,"siteId":"${shopId}","sendTime":0,"pageSize":20,"v":"${customer_v}"} + expected: + - eq: {"$.code": 0 } + - in: {"$.data.list[0].content": "${workflow_update_msg}"} + +api10: + title: 关闭workflow + url: /api/v1/rule/updateRuleStatus + method: post + data: {"status":2,"ruleId":"${create_workflow_id}","v":"${v}"} + expected: + - eq: {"$.code": 0} + +api11: + title: 删除workflow + url: /api/v1/rule/updateRuleStatus + method: post + data: {"status":3,"ruleId":"${create_workflow_id}","v": "${v}"} + expected: + - eq: {"$.code": 0} + +api12: + title: 检查是否删除成功 + url: /api/v1/rule/ruleList + method: post + data: {"page":1,"pageSize":100,"brandId":"${brandId}","tplId":"${workflow_parent_template_id}","v":"${v}"} + expected: + - eq: {"$.code": 0} + - eq: {"$.data.total": "${workflow_num_less}"} + - not_in_list: {"$.data.ruleList[*].ruleId": "${create_workflow_id}"}