#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
@version: python2.7
@author: ‘liujiantao‘
@contact: [email protected]
@site: ${SITE}
@software: PyCharm
@file: test_featureDealTimeSvc.py
@time: 18-4-10 下午5:58
"""
import datetime
from unittest import TestCase
import mock
from api.feature_extract_time_node_api_svc import FeatureExtractTimeNodeApiSvc
from biz.consts.biz_consts import BizConsts
from biz.integration_api.revoke.feature_deal_revoke_time_svc import FeatureDealRevokeTimeSvc
from biz.integration_api.revoke.sub.network_features_time import NetworkFeaturesTime
from common.utils.get_time_now_utils import SwapperUtils
from test.test_clean.test_common.test_utils import TestUtils
class TestFeatureDealRevokeTimeSvc(TestCase):
"""
"""
t_u = TestUtils()
@mock.patch.object(SwapperUtils, 'get_time_now')
@mock.patch.object(FeatureExtractTimeNodeApiSvc, 'get_cmp_basic_time_node_api')
@mock.patch.object(FeatureExtractTimeNodeApiSvc, 'get_network_main_cmp_info_api')
@mock.patch.object(FeatureExtractTimeNodeApiSvc, 'get_judgedoc_shinfo_time_node_api')
@mock.patch.object(FeatureExtractTimeNodeApiSvc, 'get_trademark_time_node_api')
@mock.patch.object(NetworkFeaturesTime, 'set_network_feature_time')
@mock.patch.object(FeatureExtractTimeNodeApiSvc, 'get_bidding_statistic_time_node_api')
def test_get_time_feature(self, get_bidding_statistic_time_node_api, set_network_feature_time,
get_trademark_time_node_api, get_judgedoc_shinfo_time_node_api,
get_network_main_cmp_info_api,
get_cmp_basic_time_node_api, get_time_now):
"""
正常营业
"""
# -- given
# mocks
get_time_now.return_value = datetime.datetime(2015, 2, 12)
last_time = get_time_now.return_value.strftime('%Y-%m-%d')
first_time = '2013-02-12'
second_time = '2014-02-12'
get_cmp_basic_time_node_api.return_value, get_network_main_cmp_info_api.return_value = self.__get_cmp_info()
get_judgedoc_shinfo_time_node_api.side_effect = self.__side_effect_judgedoc_shinfo('2009-12-11')
get_trademark_time_node_api.side_effect = self.__side_effect_trademark_time('2009-12-11')
set_network_feature_time.side_effect = self.__side_effect_set_network_feature
get_bidding_statistic_time_node_api.return_value = self.__get_bid_info()
feature_deal_time_svc = FeatureDealRevokeTimeSvc()
self.__assert_normal(feature_deal_time_svc, first_time, second_time, last_time)
self.__assert_no_saic_data(feature_deal_time_svc, get_cmp_basic_time_node_api)
self.__assert_return_cancel(feature_deal_time_svc, get_cmp_basic_time_node_api)
self.__assert_cancel_with_no_dx_time(feature_deal_time_svc, get_cmp_basic_time_node_api,get_network_main_cmp_info_api)
self.__assert_normal_dxtime_equal_opentime(feature_deal_time_svc, get_cmp_basic_time_node_api,get_network_main_cmp_info_api)
def __assert_normal_dxtime_equal_opentime(self,feature_deal_time_svc, get_cmp_basic_time_node_api,get_network_main_cmp_info_api):
"""
常规检查,从网络图获取的两个时间相等
"""
# given
company_name = u'北京龙盛源小额贷款有限公司'
node_num = 3
get_cmp_basic_time_node_api.return_value, get_network_main_cmp_info_api.return_value = self.__get_dxtime_equal_opentime_info()
# when
res = feature_deal_time_svc.get_time_features(company_name, node_num)
# then
self.t_u.assert_equal(BizConsts.DATA_STATE_OTHER_ABNORMAL, res.result_code)
def __assert_cancel_with_no_dx_time(self,feature_deal_time_svc, get_cmp_basic_time_node_api,get_network_main_cmp_info_api):
"""
已吊销,但没有吊销时间
"""
# given
company_name = u'北京龙盛源小额贷款有限公司'
node_num = 3
get_cmp_basic_time_node_api.return_value,get_network_main_cmp_info_api.return_value = self.__get_dx_cmp_no_dx_time_info()
# when
result = feature_deal_time_svc.get_time_features(company_name, node_num)
# then
self.t_u.assert_equal(BizConsts.DATA_STATE_OTHER_ABNORMAL, result.result_code)
def __assert_normal(self, feature_tme_svc, first_time, second_time, last_time):
"""
常规检查
"""
# -- when
res = feature_tme_svc.get_time_features(company_name=u'北京龙盛源小额贷款有限公司', node_num=3)
# -- then
assert res.time_map_features[last_time]
k = res.time_map_features[last_time]
print(type(k))
self.t_u.print_domain(res)
self.assertEqual(3, len(res.time_map_features.keys()))
self.assertEqual(2, res.time_map_features[last_time].address_change_cnt)
self.assertEqual(6, res.time_map_features[last_time].established_years)
self.assertEqual(0, res.time_map_features[last_time].fr_change_cnt)
self.assertEqual(3, res.time_map_features[last_time].regcap_change_cnt)
self.assertEqual(6, res.time_map_features[first_time].bidding_cnt)
self.assertEqual(9, res.time_map_features[second_time].bidding_cnt)
self.assertEqual(11, res.time_map_features[last_time].bidding_cnt)
self.assertEqual(6, res.time_map_features[last_time].judgedoc_cnt)
self.assertEqual(4, res.time_map_features[last_time].trade_mark_cnt)
def __assert_no_saic_data(self, feature_deal_time_svc, get_cmp_basic_time_node_api):
"""
没有工商数据
"""
# given
company_name = u'北京龙盛源小额贷款有限公司'
node_num = 3
get_cmp_basic_time_node_api.return_value = self.__get_cmp_info_no_saic_data()
# when
result = feature_deal_time_svc.get_time_features(company_name, node_num)
# then
self.t_u.assert_equal(BizConsts.OUTPUT_STATUS_NONE_SAIC, result.result_code)
def __assert_return_cancel(self, feature_deal_time_svc, get_cmp_basic_time_node_api):
"""
吊销企业 --通过工商数据判断得知
"""
# given
company_name = u'北京龙盛源小额贷款有限公司'
node_num = 3
get_cmp_basic_time_node_api.return_value = self.__get_cmp_info_cancel()
# when
result = feature_deal_time_svc.get_time_features(company_name, node_num)
# then
self.t_u.assert_equal(BizConsts.DATA_STATE_NORMAL, result.result_code)
self.t_u.assert_equal(True, result.is_cancel_maybe().get())
@staticmethod
def __get_cmp_info():
cmp_info = {
"requestId": "ff937c2e-ceec-4ea1-a8cb-f1d47d7302aa",
"code": 0,
"message": "success",
"data": {
"companyName": "北京龙盛源小额贷款有限公司",
"province": "bj",
"basicList": [
{
"enterpriseName": "北京龙盛源小额贷款有限公司",
"esDate": "2009-12-11",
"openFrom": "2009-12-11",
"openTo": "2059-12-10",
"enterpriseStatus": "开业",
"cancelDate": "",
"revokeDate": "",
"address": "北京市房山区良乡长虹东路2号1号楼一层、二层",
"abuItem": "",
"cbuItem": "",
"industryCode": "6639",
"industryName": "金融业",
"recCap": "",
"auditDate": "2018-01-18"
}
],
"alterList": [
{
"altDate": "2016-04-26",
"altItem": "董事(理事)、经理、监事"
},
{
"altDate": "2015-11-18",
"altItem": "投资人"
},
{
"altDate": "2014-11-17",
"altItem": "股东改变姓名或名称"
},
{
"altDate": "2014-11-17",
"altItem": "投资人"
},
{
"altDate": "2012-07-03",
"altItem": "董事(理事)、经理、监事"
},
{
"altDate": "2012-07-03",
"altItem": "董事(理事)、经理、监事"
},
{
"altDate": "2011-10-12",
"altItem": "注册资本"
},
{
"altDate": "2011-10-12",
"altItem": "实收资本(金)"
},
{
"altDate": "2011-10-12",
"altItem": "注册资本"
},
{
"altDate": "2010-09-01",
"altItem": "住所"
},
{
"altDate": "2010-04-02",
"altItem": "住所"
}
]
}
}
dx_time = {
"earliestActiveTime": "2017-08-02",
"latestActiveTime": "2015-02-12"
}
return cmp_info, dx_time
@staticmethod
def __get_cmp_info_cancel():
return {
"data": {
"basicList": [
{
"enterpriseName": "北京龙盛源小额贷款有限公司",
"esDate": "2009-12-11",
"openFrom": "2009-12-11",
"openTo": "2059-12-10",
"enterpriseStatus": "吊销",
"cancelDate": "",
"revokeDate": "",
"address": "北京市房山区良乡长虹东路2号1号楼一层、二层",
"abuItem": "",
"cbuItem": "",
"industryCode": "6639",
"industryName": "金融业",
"recCap": "",
"auditDate": "2018-01-18"
}
],
"alterList": [
]
}
}
@staticmethod
def __get_dx_cmp_no_dx_time_info():
cmp_info = {
"requestId": "ff937c2e-ceec-4ea1-a8cb-f1d47d7302aa",
"code": 0,
"message": "success",
"data": {
"companyName": "北京龙盛源小额贷款有限公司",
"province": "bj",
"basicList": [
{
"enterpriseName": "北京龙盛源小额贷款有限公司",
"esDate": "2009-12-11",
"openFrom": "2009-12-11",
"openTo": "",
"enterpriseStatus": "吊销",
"cancelDate": "",
"revokeDate": "",
"address": "北京市房山区良乡长虹东路2号1号楼一层、二层",
"abuItem": "",
"cbuItem": "",
"industryCode": "6639",
"industryName": "金融业",
"recCap": "",
"auditDate": "2018-01-18"
}
],
"alterList": [
{
"altDate": "2016-04-26",
"altItem": "董事(理事)、经理、监事"
},
{
"altDate": "2015-11-18",
"altItem": "投资人"
},
{
"altDate": "2014-11-17",
"altItem": "股东改变姓名或名称"
},
{
"altDate": "2014-11-17",
"altItem": "投资人"
},
{
"altDate": "2012-07-03",
"altItem": "董事(理事)、经理、监事"
},
{
"altDate": "2012-07-03",
"altItem": "董事(理事)、经理、监事"
},
{
"altDate": "2011-10-12",
"altItem": "注册资本"
},
{
"altDate": "2011-10-12",
"altItem": "实收资本(金)"
},
{
"altDate": "2011-10-12",
"altItem": "注册资本"
},
{
"altDate": "2010-09-01",
"altItem": "住所"
},
{
"altDate": "2010-04-02",
"altItem": "住所"
}
]
}
}
dx_time = {
"earliestActiveTime": "2017-08-02",
"latestActiveTime": ""
}
return cmp_info, dx_time
@staticmethod
def __get_dxtime_equal_opentime_info():
cmp_info = {
"requestId": "ff937c2e-ceec-4ea1-a8cb-f1d47d7302aa",
"code": 0,
"message": "success",
"data": {
"companyName": "北京龙盛源小额贷款有限公司",
"province": "bj",
"basicList": [
{
"enterpriseName": "北京龙盛源小额贷款有限公司",
"esDate": "",
"openFrom":"",
"openTo":"" ,
"enterpriseStatus": "吊销",
"cancelDate": "",
"revokeDate": "",
"address": "北京市房山区良乡长虹东路2号1号楼一层、二层",
"abuItem": "",
"cbuItem": "",
"industryCode": "6639",
"industryName": "金融业",
"recCap": "",
"auditDate": "2018-01-18"
}
],
"alterList": [
{
"altDate": "2016-04-26",
"altItem": "董事(理事)、经理、监事"
},
{
"altDate": "2015-11-18",
"altItem": "投资人"
},
{
"altDate": "2014-11-17",
"altItem": "股东改变姓名或名称"
},
{
"altDate": "2014-11-17",
"altItem": "投资人"
},
{
"altDate": "2012-07-03",
"altItem": "董事(理事)、经理、监事"
},
{
"altDate": "2012-07-03",
"altItem": "董事(理事)、经理、监事"
},
{
"altDate": "2011-10-12",
"altItem": "注册资本"
},
{
"altDate": "2011-10-12",
"altItem": "实收资本(金)"
},
{
"altDate": "2011-10-12",
"altItem": "注册资本"
},
{
"altDate": "2010-09-01",
"altItem": "住所"
},
{
"altDate": "2010-04-02",
"altItem": "住所"
}
]
}
}
dx_time = {
"earliestActiveTime": "2017-08-02",
"latestActiveTime": "2017-08-02"
}
return cmp_info, dx_time
@staticmethod
def __get_cmp_info_no_saic_data():
return {}
def __side_effect_judgedoc_shinfo(self, verify_open_from):
time_map_judgedoc_shinfo = self.__get_time_map_judgedoc_shinfo()
def inner_effect(*arg):
start_time = arg[1]
self.assertEqual(verify_open_from, start_time)
to_time = arg[2]
return time_map_judgedoc_shinfo[to_time]
return inner_effect
注:此处*arg对应get_trademark_time_node_api(self, company_name, from_time, to_time)
中的company_name, from_time, to_time; 返回的是一个函数,闭包的概念,
函数作为返回值
高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
我们来实现一个可变参数的求和。通常情况下,求和的函数是这样定义的:
def calc_sum(*args):
ax = 0
for n in args:
ax = ax + n
return ax
但是,如果不需要立刻求和,而是在后面的代码中,根据需要再计算怎么办?可以不返回求和的结果,而是返回求和的函数:
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
当我们调用lazy_sum()时,返回的并不是求和结果,而是求和函数:
>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
<function lazy_sum.<locals>.sum at 0x101c6ed90>
调用函数f时,才真正计算求和的结果:
>>> f()
25
在这个例子中,我们在函数lazy_sum中又定义了函数sum,并且,内部函数sum可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。
请再注意一点,当我们调用lazy_sum()时,每次调用都会返回一个新的函数,即使传入相同的参数:
>>> f1 = lazy_sum(1, 3, 5, 7, 9)
>>> f2 = lazy_sum(1, 3, 5, 7, 9)
>>> f1==f2
False
f1()和f2()的调用结果互不影响。
闭包
注意到返回的函数在其定义内部引用了局部变量args,所以,当一个函数返回了一个函数后,其内部的局部变量还被新函数引用,所以,闭包用起来简单,实现起来可不容易。
另一个需要注意的问题是,返回的函数并没有立刻执行,而是直到调用了f()才执行。我们来看一个例子:
def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs
f1, f2, f3 = count()
在上面的例子中,每次循环,都创建了一个新的函数,然后,把创建的3个函数都返回了。
你可能认为调用f1(),f2()和f3()结果应该是1,4,9,但实际结果是:
>>> f1()
9
>>> f2()
9
>>> f3()
9
全部都是9!原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,因此最终结果为9。
返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
如果一定要引用循环变量怎么办?方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变:
def count():
def f(j):
def g():
return j*j
return g
fs = []
for i in range(1, 4):
fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
return fs
再看看结果:
>>> f1, f2, f3 = count()
>>> f1()
1
>>> f2()
4
>>> f3()
9
缺点是代码较长,可利用lambda函数缩短代码。
def __side_effect_trademark_time(self, verify_open_from):
time_map_trademark_time = self.__get_time_map_trademark_time()
def inner_effect(*arg):
start_time = arg[1]
self.assertEqual(verify_open_from, start_time)
to_time = arg[2]
return time_map_trademark_time[to_time]
return inner_effect
@staticmethod
def __side_effect_set_network_feature(*arg):
time_map_features = arg[1]
features = time_map_features['2013-02-12']
features.network_share_cancel_cnt = 1
features.cancel_cnt = 2
features.network_share_zhixing_cnt = 3
features.network_share_judge_doc_cnt = 4
features.net_judgedoc_defendant_cnt = 5
features.judge_doc_cnt = 6
features = time_map_features['2014-02-12']
features.network_share_cancel_cnt = 11
features.cancel_cnt = 21
features.network_share_zhixing_cnt = 31
features.network_share_judge_doc_cnt = 41
features.net_judgedoc_defendant_cnt = 51
features.judge_doc_cnt = 61
features = time_map_features['2015-02-12']
features.network_share_cancel_cnt = 12
features.cancel_cnt = 22
features.network_share_zhixing_cnt = 32
features.network_share_judge_doc_cnt = 42
features.net_judgedoc_defendant_cnt = 52
features.judge_doc_cnt = 62
return time_map_features
注:此处的×arg 对应set_network_feature_time(self, company_name, time_map_features)中的
company_name, time_map_features;跟位置有关系,从0开始;
@staticmethod
def __get_bid_info():
return {'result': {
'201302': {u'statistic': {u'bidCount': 6}},
'201402': {u'statistic': {u'bidCount': 3}},
'201501': {u'statistic': {u'bidCount': 2}}
}}
@staticmethod
def __get_time_map_judgedoc_shinfo():
"""
裁判文书
"""
return {
'2013-02-12': {
"data": {
"reasonCount": [
{
"count": 1
}
]
}
},
'2014-02-12': {
"data": {
"reasonCount": [
{
"count": 2
}
]
}
},
'2015-02-12': {
"data": {
"reasonCount": [
{
"count": 1
},
{
"count": 2
},
{
"count": 3
}
]
}
}
}
@staticmethod
def __get_time_map_trademark_time():
"""
裁判文书
"""
return {
'2013-02-12': {
"data": {
"total": 1
}
},
'2014-02-12': {
"data": {
"total": 2
}
},
'2015-02-12': {
"data": {
"total": 4
}
}
}
mock side_effect有输入和无输入的情况
猜你喜欢
转载自blog.csdn.net/sinat_26566137/article/details/81035275
今日推荐
周排行