Skip to content

Commit

Permalink
Adapt flow parameter value's multiplexing (#714)
Browse files Browse the repository at this point in the history
* Add 'tojson' to flow's response data to adapt flow parameter value's multiplexing

* 更改目标字符串的匹配方式,改用re.sub实现

* 增加对配置config.value.tojsonKey的遍历,优化正则匹配规则

* 简化匹配规则

* 功能代码调整;增加单测用例;修改版本号;调整日志输出

* 修改注释,去除单测用例中的真实数据

* 修改注释

* 修改注释

* 解决版本冲突

* 修改单测用例
  • Loading branch information
codefly67 authored Dec 9, 2022
1 parent 028f56e commit 96ccea2
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 6 deletions.
9 changes: 8 additions & 1 deletion lyrebird/mock/dm/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -274,11 +274,18 @@ def get_matched_data(self, flow):
def _format_respose_data(self, flow):
# TODO render mock data before response, support more functions
origin_response_data = flow['response']['data']

try:
flow['response']['data'] = utils.render_data_with_tojson(flow['response']['data'])
except Exception:
flow['response']['data'] = origin_response_data
logger.warning(f'Format response string to json error! {flow["request"]["url"]}')

try:
flow['response']['data'] = utils.render(flow['response']['data'])
except Exception:
flow['response']['data'] = origin_response_data
logger.warning(f'Format response data error! {flow["request"]["url"]}')
logger.warning(f'Format response data error! {flow["request"]["url"]}')

def _is_match_rule(self, flow, rules):
return MatchRules.match(flow, rules)
Expand Down
21 changes: 19 additions & 2 deletions lyrebird/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,10 +132,27 @@ def download(link, input_path):
for chunck in resp.iter_content():
f.write(chunck)

def render_data_with_tojson(data):
config_value_tojson_key = config.get('config.value.tojsonKey')
data_with_tojson = data
for tojson_key in config_value_tojson_key:

# EXAMPLE
# response_data = `"key1":"value1","key2":"{{config.get('model.id')}}","key3":"value3"`
# target_match_data = `"{{config.get('model.id')}}"`
# Divide target_match_data into three parts `"{{` and `config.get('model.id')` and `}}"`
# In the second part, `model.id` is a matching rule from Lyrebird configuration
# The final return response_data is `"key1":"value1","key2":{{config.get('model.id') | tojson}},"key3":"value3"`

pattern = '[^:]*' + tojson_key + '[^,]*'
# The format of the group is required
pattern_group = '(' + pattern + ')'
data_with_tojson = re.sub('("{{)'+pattern_group+'(}}")', r'{{\2 | tojson}}', data_with_tojson)
return data_with_tojson

def render(data):
if not isinstance(data, str):
logger.warning(f'Format error! Expected str, found {type(data)}')
logger.warning(f'Format error! Expected str, found {type(data)}')
return

params = {
Expand All @@ -158,7 +175,7 @@ class CaseInsensitiveDict(dict):
A dict data-structure that ignore key's case.
Any read or write related operations will igonre key's case.
Example:
Example:
<key: 'abc'> & <key: 'ABC'> will be treated as the same key, only one exists in this dict.
'''

Expand Down
2 changes: 1 addition & 1 deletion lyrebird/version.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
IVERSION = (2, 10, 3)
IVERSION = (2, 11, 0)
VERSION = ".".join(str(i) for i in IVERSION)
LYREBIRD = "Lyrebird " + VERSION
47 changes: 45 additions & 2 deletions tests/test_dm.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,20 @@
}
}

dataJ = {
'id': 'dataJ-UUID',
'name': 'dataJ',
'rule': {
'request.url': '/api/search'
},
'request': {
'url': 'http://unittest.com/api/search'
},
'response': {
'data': '"keyA":"valueA","keyB":"{{config.get(\'custom.8df051be-4381-41b6-9252-120d9b558bf6\')}}","keyC":"valueC"'
}
}

label_a = {'name':'label_a','color':'red','description':'description label_a'}
label_b = {'name':'label_b','color':'green','description':'description label_b'}

Expand Down Expand Up @@ -263,6 +277,20 @@
'parent_id': 'groupJ-UUID'
},
]
},
{
'id': 'groupK-UUID',
'name': 'groupK',
'type': 'group',
'parent_id': 'root',
'children': [
{
'id': 'dataJ-UUID',
'name': 'dataJ',
'type': 'data',
'parent_id': 'groupK-UUID'
},
]
}
]
}
Expand Down Expand Up @@ -322,6 +350,8 @@ def root(tmpdir):
json.dump(dataH, f)
with codecs.open(tmpdir / 'dataI-UUID', 'w') as f:
json.dump(dataI, f)
with codecs.open(tmpdir / 'dataJ-UUID', 'w') as f:
json.dump(dataJ, f)
with codecs.open(tmpdir / '.lyrebird_prop', 'w') as f:
json.dump(prop, f)
return tmpdir
Expand All @@ -331,7 +361,9 @@ def root(tmpdir):
def data_manager(root, tmpdir):
_conf = {
'ip': '127.0.0.1',
'mock.port': 9090
'mock.port': 9090,
'config.value.tojsonKey': ['custom.[a-z0-9]{8}(-[a-z0-9]{4}){3}-[a-z0-9]{12}'],
'custom.8df051be-4381-41b6-9252-120d9b558bf6': {"key": "value"}
}
application._cm = MockConfigManager(config=_conf)
lyrebird.mock.context.application.socket_io = FakeSocketio()
Expand Down Expand Up @@ -387,6 +419,17 @@ def test_activate_with_super_id(data_manager):
assert 'dataC-UUID' in data_manager.activated_data
assert 'dataD-UUID' in data_manager.activated_data

def test_activate_with_tojson(data_manager):
flow = {
'request': {
'url': 'http://somehost/api/search'
}
}
data_manager.activate('groupK-UUID')
mock_data_list = data_manager.get_matched_data(flow)
response_data = mock_data_list[0]['response']['data']
tojson_str = '{"key": "value"}'
assert tojson_str in response_data

def test_mock_rule(data_manager):
flow = {
Expand Down Expand Up @@ -959,7 +1002,7 @@ def test_prop_writer():


def test_prop_writer_with_dict_ignore_key(data_manager):
prop_str_correct = '{"id":"root","name":"root","type":"group","parent_id":null,"children":[\n {"id":"groupA-UUID","name":"groupA","type":"group","parent_id":"root","super_id":"groupB-UUID","children":[\n {"id":"dataA-UUID","name":"dataA","type":"data","parent_id":"groupA-UUID"},\n {"id":"dataB-UUID","name":"dataB","type":"data","parent_id":"groupA-UUID"}]},\n {"id":"groupB-UUID","name":"groupB","type":"group","parent_id":"root","super_id":"groupC-UUID","children":[\n {"id":"dataC-UUID","name":"dataC","type":"data","parent_id":"groupB-UUID"}]},\n {"id":"groupC-UUID","name":"groupC","type":"group","parent_id":"root","super_id":"groupD-UUID","children":[]},\n {"id":"groupD-UUID","name":"groupD","type":"group","parent_id":"root","super_id":"groupE-UUID","children":[\n {"id":"dataD-UUID","name":"dataD","type":"data","parent_id":"groupD-UUID"}]},\n {"id":"groupE-UUID","name":"groupE","type":"group","parent_id":"root","children":[\n {"id":"dataC-UUID","name":"dataC","type":"data","parent_id":"groupE-UUID"},\n {"id":"dataD-UUID","name":"dataD","type":"data","parent_id":"groupE-UUID"}]},\n {"id":"groupF-UUID","name":"groupF","type":"group","parent_id":"root","children":[\n {"id":"groupG-UUID","name":"groupG","type":"group","parent_id":"groupF-UUID","children":[\n {"id":"groupH-UUID","label":[{"name":"label_a","color":"red","description":"description label_a"},{"name":"label_b","color":"green","description":"description label_b"}],"name":"groupH","type":"group","parent_id":"groupG-UUID","children":[]}]},\n {"id":"groupI-UUID","label":[{"name":"label_a","color":"red","description":"description label_a"}],"name":"groupI","type":"group","parent_id":"groupF-UUID","children":[\n {"id":"dataD-UUID","name":"dataD","type":"data","parent_id":"groupI-UUID"}]}]},\n {"id":"groupJ-UUID","name":"groupJ","type":"group","parent_id":"root","children":[\n {"id":"dataF-UUID","name":"dataF","type":"data","parent_id":"groupJ-UUID"},\n {"id":"dataG-UUID","name":"dataG","type":"data","parent_id":"groupJ-UUID"},\n {"id":"dataH-UUID","name":"dataH","type":"data","parent_id":"groupJ-UUID"},\n {"id":"dataI-UUID","name":"dataI","type":"data","parent_id":"groupJ-UUID"}]}]}'
prop_str_correct = '{"id":"root","name":"root","type":"group","parent_id":null,"children":[\n {"id":"groupA-UUID","name":"groupA","type":"group","parent_id":"root","super_id":"groupB-UUID","children":[\n {"id":"dataA-UUID","name":"dataA","type":"data","parent_id":"groupA-UUID"},\n {"id":"dataB-UUID","name":"dataB","type":"data","parent_id":"groupA-UUID"}]},\n {"id":"groupB-UUID","name":"groupB","type":"group","parent_id":"root","super_id":"groupC-UUID","children":[\n {"id":"dataC-UUID","name":"dataC","type":"data","parent_id":"groupB-UUID"}]},\n {"id":"groupC-UUID","name":"groupC","type":"group","parent_id":"root","super_id":"groupD-UUID","children":[]},\n {"id":"groupD-UUID","name":"groupD","type":"group","parent_id":"root","super_id":"groupE-UUID","children":[\n {"id":"dataD-UUID","name":"dataD","type":"data","parent_id":"groupD-UUID"}]},\n {"id":"groupE-UUID","name":"groupE","type":"group","parent_id":"root","children":[\n {"id":"dataC-UUID","name":"dataC","type":"data","parent_id":"groupE-UUID"},\n {"id":"dataD-UUID","name":"dataD","type":"data","parent_id":"groupE-UUID"}]},\n {"id":"groupF-UUID","name":"groupF","type":"group","parent_id":"root","children":[\n {"id":"groupG-UUID","name":"groupG","type":"group","parent_id":"groupF-UUID","children":[\n {"id":"groupH-UUID","label":[{"name":"label_a","color":"red","description":"description label_a"},{"name":"label_b","color":"green","description":"description label_b"}],"name":"groupH","type":"group","parent_id":"groupG-UUID","children":[]}]},\n {"id":"groupI-UUID","label":[{"name":"label_a","color":"red","description":"description label_a"}],"name":"groupI","type":"group","parent_id":"groupF-UUID","children":[\n {"id":"dataD-UUID","name":"dataD","type":"data","parent_id":"groupI-UUID"}]}]},\n {"id":"groupJ-UUID","name":"groupJ","type":"group","parent_id":"root","children":[\n {"id":"dataF-UUID","name":"dataF","type":"data","parent_id":"groupJ-UUID"},\n {"id":"dataG-UUID","name":"dataG","type":"data","parent_id":"groupJ-UUID"},\n {"id":"dataH-UUID","name":"dataH","type":"data","parent_id":"groupJ-UUID"},\n {"id":"dataI-UUID","name":"dataI","type":"data","parent_id":"groupJ-UUID"}]},\n {"id":"groupK-UUID","name":"groupK","type":"group","parent_id":"root","children":[\n {"id":"dataJ-UUID","name":"dataJ","type":"data","parent_id":"groupK-UUID"}]}]}'

prop_writer = dm.file_data_adapter.PropWriter()
prop_writer.dict_ignore_key.update(data_manager.unsave_keys)
Expand Down

0 comments on commit 96ccea2

Please sign in to comment.