smartpush 1.4.6__py3-none-any.whl → 1.4.8__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- smartpush/base/__init__.py +0 -0
- smartpush/base/faker_data.py +679 -0
- smartpush/base/request_base.py +22 -0
- smartpush/base/url_enum.py +30 -0
- smartpush/export/basic/ExcelExportChecker.py +67 -3
- smartpush/flow/MockFlow.py +16 -0
- smartpush/form/__init__.py +0 -0
- smartpush/form/form_after.py +143 -0
- smartpush/form/form_assert.py +17 -0
- smartpush/form/form_before.py +9 -0
- smartpush/form/form_client_operation.py +19 -0
- smartpush/utils/form_utils.py +34 -0
- {smartpush-1.4.6.dist-info → smartpush-1.4.8.dist-info}/METADATA +1 -1
- smartpush-1.4.8.dist-info/RECORD +28 -0
- smartpush-1.4.6.dist-info/RECORD +0 -18
- {smartpush-1.4.6.dist-info → smartpush-1.4.8.dist-info}/WHEEL +0 -0
- {smartpush-1.4.6.dist-info → smartpush-1.4.8.dist-info}/top_level.txt +0 -0
File without changes
|
@@ -0,0 +1,679 @@
|
|
1
|
+
from faker import Faker
|
2
|
+
from user_agents import parse
|
3
|
+
import random
|
4
|
+
|
5
|
+
# 中文类型faker
|
6
|
+
fake = Faker(locale='zh_CN')
|
7
|
+
fake_en = Faker(locale='en_US')
|
8
|
+
|
9
|
+
|
10
|
+
# print("可以fake的内容:",dir(fake))
|
11
|
+
|
12
|
+
# """地理信息类"""
|
13
|
+
# city_suffix = fake.city_suffix() # 生成市、县的后缀,例如:'市'
|
14
|
+
# country = fake.country() # 生成国家名称,例如:'中国'
|
15
|
+
# country_code = fake.country_code() # 生成国家编码,例如:'CN'
|
16
|
+
# district = fake.district() # 生成区的名称,例如:'朝阳区'
|
17
|
+
# geo_coordinate = fake.geo_coordinate() # 生成地理坐标,例如:'(31.692720, 88.092434)'
|
18
|
+
# latitude = fake.latitude() # 生成纬度,例如:31.692720
|
19
|
+
# longitude = fake.longitude() # 生成经度,例如:88.092434
|
20
|
+
# postcode = fake.postcode() # 生成邮编,例如:'100000'
|
21
|
+
# province = fake.province() # 生成省份名称,例如:'北京市'
|
22
|
+
# address = fake.address() # 生成详细地址,例如:'北京市朝阳区'
|
23
|
+
# street_address = fake.street_address() # 生成街道地址,例如:'人民路123号'
|
24
|
+
# street_name = fake.street_name() # 生成街道名,例如:'人民路'
|
25
|
+
# street_suffix = fake.street_suffix() # 生成街、路的后缀,例如:'路'
|
26
|
+
|
27
|
+
# """基础信息类"""
|
28
|
+
# ssn = fake.ssn() # 生成身份证号,例如:'510181199503077777'
|
29
|
+
# bs = fake.bs() # 随机公司服务名,例如:'技术支持'
|
30
|
+
# company = fake.company() # 随机公司名(长),例如:'北京百度在线网络技术有限公司'
|
31
|
+
# company_prefix = fake.company_prefix() # 随机公司名(短),例如:'百度'
|
32
|
+
# company_suffix = fake.company_suffix() # 公司性质,例如:'信息有限公司'
|
33
|
+
# credit_card_expire = fake.credit_card_expire() # 随机信用卡到期日,例如:'12/25'
|
34
|
+
# credit_card_full = fake.credit_card_full() # 生成完整信用卡信息,例如:'VISA 16 digits 04/24 CVV:022'
|
35
|
+
# credit_card_number = fake.credit_card_number() # 信用卡号,例如:'4539853637484'
|
36
|
+
# credit_card_provider = fake.credit_card_provider() # 信用卡类型,例如:'VISA 16 digit'
|
37
|
+
# credit_card_security_code = fake.credit_card_security_code() # 信用卡安全码,例如:'356'
|
38
|
+
# job = fake.job() # 随机职位,例如:'市场营销经理'
|
39
|
+
# first_name_female = fake.first_name_female() # 女性名,例如:'丽娜'
|
40
|
+
# first_name_male = fake.first_name_male() # 男性名,例如:'伟'
|
41
|
+
# last_name_female = fake.last_name_female() # 女姓,例如:'王'
|
42
|
+
# last_name_male = fake.last_name_male() # 男姓,例如:'张'
|
43
|
+
# name = fake.name() # 随机生成全名,例如:'张丽'
|
44
|
+
# name_female = fake.name_female() # 男性全名,例如:'杨丽'
|
45
|
+
# name_male = fake.name_male() # 女性全名,例如:'王伟'
|
46
|
+
# phone_number = fake.phone_number() # 随机生成手机号,例如:'13912345678'
|
47
|
+
# phonenumber_prefix = fake.phonenumber_prefix() # 随机生成手机号段,例如:'139'
|
48
|
+
|
49
|
+
# """计算机基础、Internet信息类、Email"""
|
50
|
+
# ascii_company_email = fake.ascii_company_email() # 随机ASCII公司邮箱名,例如:'example_company'
|
51
|
+
# ascii_email = fake.ascii_email() # 随机ASCII邮箱,例如:'example@example.com'
|
52
|
+
# company_email = fake.company_email() # 随机公司邮箱
|
53
|
+
# email = fake.email() # 随机邮箱
|
54
|
+
# safe_email = fake.safe_email() # 安全邮箱
|
55
|
+
|
56
|
+
|
57
|
+
# """网络基础信息类"""
|
58
|
+
# domain_name = fake.domain_name() # 生成域名,例如:'smith.com'
|
59
|
+
# domain_word = fake.domain_word() # 生成域词(即,不包含后缀),例如:'example'
|
60
|
+
# ipv4 = fake.ipv4() # 随机IP4地址,例如:'192.168.1.1'
|
61
|
+
# ipv6 = fake.ipv6() # 随机IP6地址,例如:'2001:0db8:85a3:0000:0000:8a2e:0370:7334'
|
62
|
+
# mac_address = fake.mac_address() # 随机MAC地址,例如:'5e:ff:56:8c:13:5f'
|
63
|
+
# tld = fake.tld() # 网址域名后缀(.com,.net.cn,等等,不包括.),例如:'com'
|
64
|
+
# uri = fake.uri() # 随机URI地址,例如:'http://www.example.com/path/to/page'
|
65
|
+
# uri_extension = fake.uri_extension() # 网址文件后缀,例如:'.html'
|
66
|
+
# uri_page = fake.uri_page() # 网址文件(不包含后缀),例如:'index'
|
67
|
+
# uri_path = fake.uri_path() # 网址文件路径(不包含文件名),例如:'/path/to'
|
68
|
+
# url = fake.url() # 随机URL地址,例如:'http://www.example.com'
|
69
|
+
# user_name = fake.user_name() # 随机用户名,例如:'john_doe'
|
70
|
+
# image_url = fake.image_url() # 随机URL地址,例如:'http://www.example.com/image.jpg'
|
71
|
+
|
72
|
+
# """
|
73
|
+
# 浏览器信息类
|
74
|
+
# """
|
75
|
+
# chrome = fake.chrome() # 随机生成Chrome的浏览器user_agent信息
|
76
|
+
# firefox = fake.firefox() # 随机生成FireFox的浏览器user_agent信息
|
77
|
+
# internet_explorer = fake.internet_explorer() # 随机生成IE的浏览器user_agent信息
|
78
|
+
# opera = fake.opera() # 随机生成Opera的浏览器user_agent信息
|
79
|
+
# safari = fake.safari() # 随机生成Safari的浏览器user_agent信息
|
80
|
+
# linux_platform_token = fake.linux_platform_token() # 随机Linux信息
|
81
|
+
# user_agent = fake.user_agent() # 随机user_agent信息
|
82
|
+
|
83
|
+
# """
|
84
|
+
# 数字类
|
85
|
+
# """
|
86
|
+
# numerify = fake.numerify() # 三位随机数字,例如:'123'
|
87
|
+
# random_digit = fake.random_digit() # 0~9随机数,例如:'7'
|
88
|
+
# random_digit_not_null = fake.random_digit_not_null() # 1~9的随机数,例如:'3'
|
89
|
+
# random_int = fake.random_int() # 随机数字,默认0~9999,可以通过设置min,max来设置,例如:'567'
|
90
|
+
# random_number = fake.random_number(digits=5) # 随机数字,参数digits设置生成的数字位数,例如:'12345'
|
91
|
+
# pyint = fake.pyint() # 随机Int数字,例如:'987'
|
92
|
+
# pyfloat = fake.pyfloat(left_digits=5, right_digits=2, positive=True) # 随机Float数字,例如:'12345.67'
|
93
|
+
# pydecimal = fake.pydecimal() # 随机Decimal数字,例如:Decimal('123.45')
|
94
|
+
|
95
|
+
# """
|
96
|
+
# 文本、加密类
|
97
|
+
# """
|
98
|
+
# pystr = fake.pystr() # 随机字符串,例如:'abc123'
|
99
|
+
# random_element = fake.random_element() # 随机字母,例如:'a'
|
100
|
+
# random_letter = fake.random_letter() # 随机字母,例如:'b'
|
101
|
+
# paragraph = fake.paragraph() # 随机生成
|
102
|
+
|
103
|
+
# """时间信息类"""
|
104
|
+
# date = fake.date() # 随机日期
|
105
|
+
# date_between = fake.date_between(start_date='-30y', end_date='today') # 随机生成指定范围内日期,例如:datetime.date(1998, 4, 3)
|
106
|
+
# date_object = fake.date_object() # 随机生产从1970-1-1到指定日期的随机日期,例如:datetime.date(1985, 3, 19)
|
107
|
+
# date_time = fake.date_time() # 随机生成指定时间(1970年1月1日至今),例如:datetime.datetime(2003, 5, 23, 16, 45, 40)
|
108
|
+
# date_time_ad = fake.date_time_ad() # 生成公元1年到现在的随机时间,例如:datetime.datetime(2005, 12, 2, 19, 25, 46)
|
109
|
+
# date_time_between = fake.date_time_between(start_date='-30y', end_date='now') # 随机生成指定范围内日期,用法同dates
|
110
|
+
# future_date = fake.future_date(end_date='+30d') # 未来日期,例如:datetime.date(2023, 2, 17)
|
111
|
+
# future_datetime = fake.future_datetime(end_date='+30d') # 未来时间,例如:datetime.datetime(2023, 2, 17, 20, 48, 35)
|
112
|
+
# month = fake.month() # 随机月份,例如:'04'
|
113
|
+
# month_name = fake.month_name() # 随机月份(英文),例如:'December'
|
114
|
+
# past_date = fake.past_date(start_date='-30d') # 随机生成已经过去的日期,例如:datetime.date(2023, 1, 18)
|
115
|
+
# past_datetime = fake.past_datetime(start_date='-30d') # 随机生成已经过去的时间,例如:datetime.datetime(2023, 1, 18, 20, 48, 35)
|
116
|
+
# time = fake.time() # 随机24小时时间,例如:datetime.time(13, 20, 10)
|
117
|
+
# timedelta = fake.time_delta() # 随机获取时间差,例如:datetime.timedelta(days=3, seconds=86254)
|
118
|
+
# time_object = fake.time_object() # 随机24小时时间,time对象,例如:datetime.time(21, 47)
|
119
|
+
# time_series = fake.time_series() # 随机TimeSeries对象,例如:<faker.providers.date_time.Provider object at 0x7fc4bca6d9d0>
|
120
|
+
# timezone = fake.timezone() # 随机时区,例如:'Asia/Shanghai'
|
121
|
+
# unix_time = fake.unix_time() # 随机Unix时间,例如:659312340
|
122
|
+
# year = fake.year() # 随机年份,例如:'1998'
|
123
|
+
class FakeDataGenerator:
|
124
|
+
|
125
|
+
def __init__(self, seed=None, locale='zh_CN'):
|
126
|
+
"""初始化Faker实例并设置本地化"""
|
127
|
+
Faker.seed(seed)
|
128
|
+
self.fake = Faker(locale)
|
129
|
+
# fake.seed(seed)
|
130
|
+
self.fake_en = Faker('en_US') # 用于生成英文国家名
|
131
|
+
|
132
|
+
# 生成用户代理并解析
|
133
|
+
self._user_agent = self.fake.user_agent()
|
134
|
+
self._parsed_ua = parse(self._user_agent)
|
135
|
+
|
136
|
+
@property
|
137
|
+
def user_agent(self):
|
138
|
+
return self._user_agent
|
139
|
+
|
140
|
+
@property
|
141
|
+
def fake_currency(self):
|
142
|
+
return self.fake.currency()[0]
|
143
|
+
|
144
|
+
@property
|
145
|
+
def fake_city(self):
|
146
|
+
return self.fake.city()
|
147
|
+
|
148
|
+
@property
|
149
|
+
def fake_city_suffix(self):
|
150
|
+
return self.fake.city_suffix()
|
151
|
+
|
152
|
+
@property
|
153
|
+
def fake_country(self):
|
154
|
+
return self.fake_en.country()
|
155
|
+
|
156
|
+
@property
|
157
|
+
def fake_country_code(self):
|
158
|
+
return self.fake.country_code()
|
159
|
+
|
160
|
+
@property
|
161
|
+
def fake_district(self):
|
162
|
+
return self.fake.district()
|
163
|
+
|
164
|
+
@property
|
165
|
+
def fake_latitude(self):
|
166
|
+
return self.fake.latitude()
|
167
|
+
|
168
|
+
@property
|
169
|
+
def fake_longitude(self):
|
170
|
+
return self.fake.longitude()
|
171
|
+
|
172
|
+
@property
|
173
|
+
def fake_postcode(self):
|
174
|
+
return self.fake.postcode()
|
175
|
+
|
176
|
+
@property
|
177
|
+
def fake_province(self):
|
178
|
+
return self.fake.province()
|
179
|
+
|
180
|
+
@property
|
181
|
+
def fake_address(self):
|
182
|
+
return self.fake.address()
|
183
|
+
|
184
|
+
@property
|
185
|
+
def fake_street_address(self):
|
186
|
+
return self.fake.street_address()
|
187
|
+
|
188
|
+
@property
|
189
|
+
def fake_street_name(self):
|
190
|
+
return self.fake.street_name()
|
191
|
+
|
192
|
+
@property
|
193
|
+
def fake_street_suffix(self):
|
194
|
+
return self.fake.street_suffix()
|
195
|
+
|
196
|
+
@property
|
197
|
+
def fake_ssn(self):
|
198
|
+
return self.fake.ssn()
|
199
|
+
|
200
|
+
@property
|
201
|
+
def fake_bs(self):
|
202
|
+
return self.fake.bs()
|
203
|
+
|
204
|
+
@property
|
205
|
+
def fake_company(self):
|
206
|
+
return self.fake.company()
|
207
|
+
|
208
|
+
@property
|
209
|
+
def fake_company_prefix(self):
|
210
|
+
return self.fake.company_prefix()
|
211
|
+
|
212
|
+
@property
|
213
|
+
def fake_company_suffix(self):
|
214
|
+
return self.fake.company_suffix()
|
215
|
+
|
216
|
+
@property
|
217
|
+
def fake_credit_card_expire(self):
|
218
|
+
return self.fake.credit_card_expire()
|
219
|
+
|
220
|
+
@property
|
221
|
+
def fake_credit_card_full(self):
|
222
|
+
return str(self.fake.credit_card_full())
|
223
|
+
|
224
|
+
@property
|
225
|
+
def fake_credit_card_number(self):
|
226
|
+
return self.fake.credit_card_number()
|
227
|
+
|
228
|
+
@property
|
229
|
+
def fake_credit_card_provider(self):
|
230
|
+
return self.fake.credit_card_provider()
|
231
|
+
|
232
|
+
@property
|
233
|
+
def fake_credit_card_security_code(self):
|
234
|
+
return self.fake.credit_card_security_code()
|
235
|
+
|
236
|
+
@property
|
237
|
+
def fake_job(self):
|
238
|
+
return self.fake.job()
|
239
|
+
|
240
|
+
@property
|
241
|
+
def fake_gender(self):
|
242
|
+
return random.choice(["u", "f", "m"])
|
243
|
+
|
244
|
+
@property
|
245
|
+
def fake_first_name_female(self):
|
246
|
+
return "AutoTest-" + self.fake.first_name_female()
|
247
|
+
|
248
|
+
@property
|
249
|
+
def fake_first_name_male(self):
|
250
|
+
return "AutoTest-" + self.fake.first_name_male()
|
251
|
+
|
252
|
+
@property
|
253
|
+
def fake_last_name_female(self):
|
254
|
+
return "AutoTest-" + self.fake.last_name_female()
|
255
|
+
|
256
|
+
@property
|
257
|
+
def fake_last_name_male(self):
|
258
|
+
return "AutoTest-" + self.fake.last_name_male()
|
259
|
+
|
260
|
+
@property
|
261
|
+
def fake_name(self):
|
262
|
+
return "AutoTest-" + self.fake.name()
|
263
|
+
|
264
|
+
@property
|
265
|
+
def fake_name_female(self):
|
266
|
+
return "AutoTest-" + self.fake.name_female()
|
267
|
+
|
268
|
+
@property
|
269
|
+
def fake_name_male(self):
|
270
|
+
return "AutoTest-" + self.fake.name_male()
|
271
|
+
|
272
|
+
@property
|
273
|
+
def fake_phone_number(self):
|
274
|
+
return self.fake.phone_number()
|
275
|
+
|
276
|
+
@property
|
277
|
+
def fake_phonenumber_prefix(self):
|
278
|
+
return self.fake.phonenumber_prefix()
|
279
|
+
|
280
|
+
@property
|
281
|
+
def fake_ascii_company_email(self):
|
282
|
+
return self.fake.ascii_company_email()
|
283
|
+
|
284
|
+
@property
|
285
|
+
def fake_ascii_email(self):
|
286
|
+
return self.fake.ascii_email()
|
287
|
+
|
288
|
+
@property
|
289
|
+
def fake_company_email(self):
|
290
|
+
return self.fake.company_email()
|
291
|
+
|
292
|
+
@property
|
293
|
+
def fake_email(self):
|
294
|
+
return "AutoTest-" + self.fake.email()
|
295
|
+
|
296
|
+
@property
|
297
|
+
def fake_safe_email(self):
|
298
|
+
return self.fake.safe_email()
|
299
|
+
|
300
|
+
@property
|
301
|
+
def fake_domain_name(self):
|
302
|
+
return self.fake.domain_name()
|
303
|
+
|
304
|
+
@property
|
305
|
+
def fake_domain_word(self):
|
306
|
+
return self.fake.domain_word()
|
307
|
+
|
308
|
+
@property
|
309
|
+
def fake_ipv4(self):
|
310
|
+
return self.fake.ipv4()
|
311
|
+
|
312
|
+
@property
|
313
|
+
def fake_ipv6(self):
|
314
|
+
return self.fake.ipv6()
|
315
|
+
|
316
|
+
@property
|
317
|
+
def fake_mac_address(self):
|
318
|
+
return self.fake.mac_address()
|
319
|
+
|
320
|
+
@property
|
321
|
+
def fake_port_number(self):
|
322
|
+
return self.fake.port_number()
|
323
|
+
|
324
|
+
@property
|
325
|
+
def fake_tld(self):
|
326
|
+
return self.fake.tld()
|
327
|
+
|
328
|
+
@property
|
329
|
+
def fake_uri(self):
|
330
|
+
return self.fake.uri()
|
331
|
+
|
332
|
+
@property
|
333
|
+
def fake_uri_extension(self):
|
334
|
+
return self.fake.uri_extension()
|
335
|
+
|
336
|
+
@property
|
337
|
+
def fake_uri_page(self):
|
338
|
+
return self.fake.uri_page()
|
339
|
+
|
340
|
+
@property
|
341
|
+
def fake_uri_path(self):
|
342
|
+
return self.fake.uri_path()
|
343
|
+
|
344
|
+
@property
|
345
|
+
def fake_url(self):
|
346
|
+
return self.fake.url()
|
347
|
+
|
348
|
+
@property
|
349
|
+
def fake_user_name(self):
|
350
|
+
return "AutoTest-" + self.fake.user_name()
|
351
|
+
|
352
|
+
@property
|
353
|
+
def fake_image_url(self):
|
354
|
+
return self.fake.image_url()
|
355
|
+
|
356
|
+
@property
|
357
|
+
def fake_linux_platform_token(self):
|
358
|
+
return self.fake.linux_platform_token()
|
359
|
+
|
360
|
+
@property
|
361
|
+
def fake_browser(self):
|
362
|
+
return self._parsed_ua.browser.family
|
363
|
+
|
364
|
+
@property
|
365
|
+
def fake_browser_version(self):
|
366
|
+
return '.'.join(map(str, self._parsed_ua.browser.version[:2]))
|
367
|
+
|
368
|
+
@property
|
369
|
+
def fake_os(self):
|
370
|
+
return self._parsed_ua.os.family
|
371
|
+
|
372
|
+
@property
|
373
|
+
def fake_os_version(self):
|
374
|
+
return '.'.join(map(str, self._parsed_ua.os.version[:2]))
|
375
|
+
|
376
|
+
@property
|
377
|
+
def fake_device_type(self):
|
378
|
+
return random.choice(["desktop", "mobile"])
|
379
|
+
|
380
|
+
@property
|
381
|
+
def fake_network(self):
|
382
|
+
return random.choice(["4g", "3g", "2g"])
|
383
|
+
|
384
|
+
@property
|
385
|
+
def fake_numerify(self):
|
386
|
+
return self.fake.numerify()
|
387
|
+
|
388
|
+
@property
|
389
|
+
def fake_random_digit(self):
|
390
|
+
return self.fake.random_digit()
|
391
|
+
|
392
|
+
@property
|
393
|
+
def fake_random_digit_not_null(self):
|
394
|
+
return self.fake.random_digit_not_null()
|
395
|
+
|
396
|
+
@property
|
397
|
+
def fake_random_int(self):
|
398
|
+
return self.fake.random_int()
|
399
|
+
|
400
|
+
@property
|
401
|
+
def fake_random_number(self):
|
402
|
+
return self.fake.random_number(digits=5)
|
403
|
+
|
404
|
+
@property
|
405
|
+
def fake_random_long_number(self):
|
406
|
+
return self.fake.random_number(digits=26)
|
407
|
+
|
408
|
+
@property
|
409
|
+
def fake_random_ten_number(self):
|
410
|
+
return self.fake.random_number(digits=10)
|
411
|
+
|
412
|
+
@property
|
413
|
+
def fake_pyint(self):
|
414
|
+
return self.fake.pyint()
|
415
|
+
|
416
|
+
@property
|
417
|
+
def fake_pyfloat(self):
|
418
|
+
return self.fake.pyfloat(left_digits=5, right_digits=4, positive=True)
|
419
|
+
|
420
|
+
@property
|
421
|
+
def fake_pydecimal(self):
|
422
|
+
return self.fake.pydecimal()
|
423
|
+
|
424
|
+
@property
|
425
|
+
def fake_pystr(self):
|
426
|
+
return self.fake.pystr()
|
427
|
+
|
428
|
+
@property
|
429
|
+
def fake_version(self):
|
430
|
+
return f"AutoTest-1.1.{self.fake.pyfloat(left_digits=8, right_digits=4, positive=True)}{self.fake.pyfloat(left_digits=6, right_digits=8, positive=True)}"
|
431
|
+
|
432
|
+
@property
|
433
|
+
def fake_random_element(self):
|
434
|
+
return self.fake.random_element()
|
435
|
+
|
436
|
+
@property
|
437
|
+
def fake_random_letter(self):
|
438
|
+
return self.fake.random_letter()
|
439
|
+
|
440
|
+
@property
|
441
|
+
def fake_paragraph(self):
|
442
|
+
return self.fake.paragraph()
|
443
|
+
|
444
|
+
@property
|
445
|
+
def fake_sentence(self):
|
446
|
+
return self.fake.sentence()
|
447
|
+
|
448
|
+
@property
|
449
|
+
def fake_word(self):
|
450
|
+
return self.fake.word()
|
451
|
+
|
452
|
+
@property
|
453
|
+
def fake_boolean(self):
|
454
|
+
return self.fake.boolean()
|
455
|
+
|
456
|
+
@property
|
457
|
+
def fake_language(self):
|
458
|
+
return self.fake.language_code()
|
459
|
+
|
460
|
+
@property
|
461
|
+
def fake_locale_language(self):
|
462
|
+
return self.fake.locale()
|
463
|
+
|
464
|
+
@property
|
465
|
+
def fake_md5(self):
|
466
|
+
return self.fake.md5()
|
467
|
+
|
468
|
+
@property
|
469
|
+
def fake_password(self):
|
470
|
+
return self.fake.password()
|
471
|
+
|
472
|
+
@property
|
473
|
+
def fake_sha1(self):
|
474
|
+
return self.fake.sha1()
|
475
|
+
|
476
|
+
@property
|
477
|
+
def fake_sha256(self):
|
478
|
+
return self.fake.sha256()
|
479
|
+
|
480
|
+
@property
|
481
|
+
def fake_uuid4(self):
|
482
|
+
return self.fake.uuid4()
|
483
|
+
|
484
|
+
@property
|
485
|
+
def fake_date(self):
|
486
|
+
return self.fake.date()
|
487
|
+
|
488
|
+
@property
|
489
|
+
def fake_date_between(self):
|
490
|
+
return self.fake.date_between(start_date='-30y', end_date='today')
|
491
|
+
|
492
|
+
@property
|
493
|
+
def fake_date_object(self):
|
494
|
+
return self.fake.date_object()
|
495
|
+
|
496
|
+
@property
|
497
|
+
def fake_date_time(self):
|
498
|
+
return self.fake.date_time()
|
499
|
+
|
500
|
+
@property
|
501
|
+
def fake_date_time_ad(self):
|
502
|
+
return self.fake.date_time_ad()
|
503
|
+
|
504
|
+
@property
|
505
|
+
def fake_date_time_between(self):
|
506
|
+
return self.fake.date_time_between(start_date='-30y', end_date='now')
|
507
|
+
|
508
|
+
@property
|
509
|
+
def fake_future_date(self):
|
510
|
+
return self.fake.future_date(end_date='+30d')
|
511
|
+
|
512
|
+
@property
|
513
|
+
def fake_future_datetime(self):
|
514
|
+
return self.fake.future_datetime(end_date='+30d')
|
515
|
+
|
516
|
+
@property
|
517
|
+
def fake_month(self):
|
518
|
+
return self.fake.month()
|
519
|
+
|
520
|
+
@property
|
521
|
+
def fake_month_name(self):
|
522
|
+
return self.fake.month_name()
|
523
|
+
|
524
|
+
@property
|
525
|
+
def fake_past_date(self):
|
526
|
+
return self.fake.past_date(start_date='-30d')
|
527
|
+
|
528
|
+
@property
|
529
|
+
def fake_past_datetime(self):
|
530
|
+
return self.fake.past_datetime(start_date='-30d')
|
531
|
+
|
532
|
+
@property
|
533
|
+
def fake_time(self):
|
534
|
+
return self.fake.time()
|
535
|
+
|
536
|
+
@property
|
537
|
+
def fake_timedelta(self):
|
538
|
+
return self.fake.time_delta()
|
539
|
+
|
540
|
+
@property
|
541
|
+
def fake_time_object(self):
|
542
|
+
return self.fake.time_object()
|
543
|
+
|
544
|
+
@property
|
545
|
+
def fake_timezone(self):
|
546
|
+
return self.fake.timezone()
|
547
|
+
|
548
|
+
@property
|
549
|
+
def fake_unix_time(self):
|
550
|
+
return self.fake.unix_time()
|
551
|
+
|
552
|
+
@property
|
553
|
+
def fake_year(self):
|
554
|
+
return self.fake.year()
|
555
|
+
|
556
|
+
@property
|
557
|
+
def fake_width(self):
|
558
|
+
return random.randint(800, 4000)
|
559
|
+
|
560
|
+
@property
|
561
|
+
def fake_height(self):
|
562
|
+
return random.randint(600, 2500)
|
563
|
+
|
564
|
+
def generate_user_data(self):
|
565
|
+
"""
|
566
|
+
生成完整的用户测试数据
|
567
|
+
"""
|
568
|
+
user_agent = self.fake.user_agent()
|
569
|
+
parsed_ua = parse(user_agent)
|
570
|
+
|
571
|
+
return {
|
572
|
+
'user_agent': user_agent,
|
573
|
+
'fake_currency': self.fake.currency()[0],
|
574
|
+
'fake_city': self.fake.city(),
|
575
|
+
'fake_city_suffix': self.fake.city_suffix(),
|
576
|
+
'fake_country': self.fake_en.country(),
|
577
|
+
'fake_country_code': self.fake.country_code(),
|
578
|
+
'fake_district': self.fake.district(),
|
579
|
+
'fake_latitude': self.fake.latitude(),
|
580
|
+
'fake_longitude': self.fake.longitude(),
|
581
|
+
'fake_postcode': self.fake.postcode(),
|
582
|
+
'fake_province': self.fake.province(),
|
583
|
+
'fake_address': self.fake.address(),
|
584
|
+
'fake_street_address': self.fake.street_address(),
|
585
|
+
'fake_street_name': self.fake.street_name(),
|
586
|
+
'fake_street_suffix': self.fake.street_suffix(),
|
587
|
+
'fake_ssn': self.fake.ssn(),
|
588
|
+
'fake_bs': self.fake.bs(),
|
589
|
+
'fake_company': self.fake.company(),
|
590
|
+
'fake_company_prefix': self.fake.company_prefix(),
|
591
|
+
'fake_company_suffix': self.fake.company_suffix(),
|
592
|
+
'fake_credit_card_expire': self.fake.credit_card_expire(),
|
593
|
+
'fake_credit_card_full': str(self.fake.credit_card_full()),
|
594
|
+
'fake_credit_card_number': self.fake.credit_card_number(),
|
595
|
+
'fake_credit_card_provider': self.fake.credit_card_provider(),
|
596
|
+
'fake_credit_card_security_code': self.fake.credit_card_security_code(),
|
597
|
+
'fake_job': self.fake.job(),
|
598
|
+
'fake_gender': random.choice(["u", "f", "m"]),
|
599
|
+
'fake_first_name_female': "AutoTest-" + self.fake.first_name_female(),
|
600
|
+
'fake_first_name_male': "AutoTest-" + self.fake.first_name_male(),
|
601
|
+
'fake_last_name_female': "AutoTest-" + self.fake.last_name_female(),
|
602
|
+
'fake_last_name_male': "AutoTest-" + self.fake.last_name_male(),
|
603
|
+
'fake_name': "AutoTest-" + self.fake.name(),
|
604
|
+
'fake_name_female': "AutoTest-" + self.fake.name_female(),
|
605
|
+
'fake_name_male': "AutoTest-" + self.fake.name_male(),
|
606
|
+
'fake_phone_number': self.fake.phone_number(),
|
607
|
+
'fake_phonenumber_prefix': self.fake.phonenumber_prefix(),
|
608
|
+
'fake_ascii_company_email': self.fake.ascii_company_email(),
|
609
|
+
'fake_ascii_email': self.fake.ascii_email(),
|
610
|
+
'fake_company_email': self.fake.company_email(),
|
611
|
+
'fake_email': "AutoTest-" + self.fake.email(),
|
612
|
+
'fake_safe_email': self.fake.safe_email(),
|
613
|
+
'fake_domain_name': self.fake.domain_name(),
|
614
|
+
'fake_domain_word': self.fake.domain_word(),
|
615
|
+
'fake_ipv4': self.fake.ipv4(),
|
616
|
+
'fake_ipv6': self.fake.ipv6(),
|
617
|
+
'fake_mac_address': self.fake.mac_address(),
|
618
|
+
'fake_port_number': self.fake.port_number(),
|
619
|
+
'fake_tld': self.fake.tld(),
|
620
|
+
'fake_uri': self.fake.uri(),
|
621
|
+
'fake_uri_extension': self.fake.uri_extension(),
|
622
|
+
'fake_uri_page': self.fake.uri_page(),
|
623
|
+
'fake_uri_path': self.fake.uri_path(),
|
624
|
+
'fake_url': self.fake.url(),
|
625
|
+
'fake_user_name': "AutoTest-" + self.fake.user_name(),
|
626
|
+
'fake_image_url': self.fake.image_url(),
|
627
|
+
'fake_linux_platform_token': self.fake.linux_platform_token(),
|
628
|
+
'fake_browser': parsed_ua.browser.family,
|
629
|
+
'fake_browser_version': '.'.join(map(str, parsed_ua.browser.version[:2])),
|
630
|
+
'fake_os': parsed_ua.os.family,
|
631
|
+
'fake_os_version': '.'.join(map(str, parsed_ua.os.version[:2])),
|
632
|
+
'fake_device_type': random.choice(["desktop", "mobile"]),
|
633
|
+
'fake_network': random.choice(["4g", "3g", "2g"]),
|
634
|
+
'fake_numerify': self.fake.numerify(),
|
635
|
+
'fake_random_digit': self.fake.random_digit(),
|
636
|
+
'fake_random_digit_not_null': self.fake.random_digit_not_null(),
|
637
|
+
'fake_random_int': self.fake.random_int(),
|
638
|
+
'fake_random_number': self.fake.random_number(digits=5),
|
639
|
+
'fake_random_long_number': self.fake.random_number(digits=26),
|
640
|
+
'fake_random_ten_number': self.fake.random_number(digits=10),
|
641
|
+
'fake_pyint': self.fake.pyint(),
|
642
|
+
'fake_pyfloat': self.fake.pyfloat(left_digits=5, right_digits=4, positive=True),
|
643
|
+
'fake_pydecimal': self.fake.pydecimal(),
|
644
|
+
'fake_pystr': self.fake.pystr(),
|
645
|
+
'fake_version': f"AutoTest-1.1.{self.fake.pyfloat(left_digits=8, right_digits=4, positive=True)}{self.fake.pyfloat(left_digits=6, right_digits=8, positive=True)}",
|
646
|
+
'fake_random_element': self.fake.random_element(),
|
647
|
+
'fake_random_letter': self.fake.random_letter(),
|
648
|
+
'fake_paragraph': self.fake.paragraph(),
|
649
|
+
'fake_sentence': self.fake.sentence(),
|
650
|
+
'fake_word': self.fake.word(),
|
651
|
+
'fake_boolean': self.fake.boolean(),
|
652
|
+
'fake_language': self.fake.language_code(),
|
653
|
+
'fake_locale_language': self.fake.locale(),
|
654
|
+
'fake_md5': self.fake.md5(),
|
655
|
+
'fake_password': self.fake.password(),
|
656
|
+
'fake_sha1': self.fake.sha1(),
|
657
|
+
'fake_sha256': self.fake.sha256(),
|
658
|
+
'fake_uuid4': self.fake.uuid4(),
|
659
|
+
'fake_date': self.fake.date(),
|
660
|
+
'fake_date_between': self.fake.date_between(start_date='-30y', end_date='today'),
|
661
|
+
'fake_date_object': self.fake.date_object(),
|
662
|
+
'fake_date_time': self.fake.date_time(),
|
663
|
+
'fake_date_time_ad': self.fake.date_time_ad(),
|
664
|
+
'fake_date_time_between': self.fake.date_time_between(start_date='-30y', end_date='now'),
|
665
|
+
'fake_future_date': self.fake.future_date(end_date='+30d'),
|
666
|
+
'fake_future_datetime': self.fake.future_datetime(end_date='+30d'),
|
667
|
+
'fake_month': self.fake.month(),
|
668
|
+
'fake_month_name': self.fake.month_name(),
|
669
|
+
'fake_past_date': self.fake.past_date(start_date='-30d'),
|
670
|
+
'fake_past_datetime': self.fake.past_datetime(start_date='-30d'),
|
671
|
+
'fake_time': self.fake.time(),
|
672
|
+
'fake_timedelta': self.fake.time_delta(),
|
673
|
+
'fake_time_object': self.fake.time_object(),
|
674
|
+
'fake_timezone': self.fake.timezone(),
|
675
|
+
'fake_unix_time': self.fake.unix_time(),
|
676
|
+
'fake_year': self.fake.year(),
|
677
|
+
'fake_width': random.randint(800, 4000),
|
678
|
+
'fake_height': random.randint(600, 2500)
|
679
|
+
}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
import requests
|
2
|
+
|
3
|
+
|
4
|
+
class RequestBase:
|
5
|
+
def __init__(self, host, headers):
|
6
|
+
"""
|
7
|
+
|
8
|
+
:param headers: 头,cookie
|
9
|
+
:param host: 域名
|
10
|
+
"""
|
11
|
+
self.host = host
|
12
|
+
self.headers = headers
|
13
|
+
self.request = requests.Request(headers=self.headers)
|
14
|
+
self.post = requests.Request("POST", headers=self.headers)
|
15
|
+
self.get = requests.Request("GET", headers=self.headers)
|
16
|
+
|
17
|
+
|
18
|
+
class FormRequestBase(RequestBase):
|
19
|
+
def __init__(self, form_id, host, headers):
|
20
|
+
super().__init__(host, headers)
|
21
|
+
self.form_id = form_id
|
22
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
from enum import Enum, unique
|
2
|
+
|
3
|
+
|
4
|
+
@unique
|
5
|
+
class URL(Enum):
|
6
|
+
"""
|
7
|
+
:type:表单报告
|
8
|
+
"""
|
9
|
+
pageFormReportDetail = '/formReport/detail/pageFormReportDetail', 'POST' # 获取表单收集数据
|
10
|
+
getFormReportDetail = '/formReport/getFormReportDetail', 'POST' # 获取表单报告数据(曝光/点击)
|
11
|
+
getFormPerformanceTrend = 'formReport/getFormPerformanceTrend', 'POST'
|
12
|
+
|
13
|
+
"""
|
14
|
+
:type 群组
|
15
|
+
"""
|
16
|
+
editCrowdPackage = '/crowdPackage/editCrowdPackage', 'POST'
|
17
|
+
crowdPersonList = '/crowdPackage/crowdPersonList', 'POST'
|
18
|
+
|
19
|
+
@property
|
20
|
+
def method(self):
|
21
|
+
return self.value[1]
|
22
|
+
|
23
|
+
@property
|
24
|
+
def url(self):
|
25
|
+
return self.value[0]
|
26
|
+
|
27
|
+
|
28
|
+
if __name__ == '__main__':
|
29
|
+
print(URL.pageFormReportDetail.method)
|
30
|
+
print(URL.getFormReportDetail.url)
|
@@ -285,6 +285,68 @@ def check_excel_header(actual, expected, **kwargs):
|
|
285
285
|
return False, f"表头校验异常 {e}"
|
286
286
|
|
287
287
|
|
288
|
+
def check_excel_header_by_list(actual, expected, **kwargs):
|
289
|
+
"""
|
290
|
+
比较导出表头是否一致是否一致
|
291
|
+
@param actual: 可以传oss链接
|
292
|
+
@param expected:期望的表头list
|
293
|
+
@return:
|
294
|
+
@return:
|
295
|
+
"""
|
296
|
+
|
297
|
+
global diff
|
298
|
+
try:
|
299
|
+
if not isinstance(actual, io.BytesIO):
|
300
|
+
actual = read_excel_from_oss(actual)
|
301
|
+
actual1, expected1 = read_excel_header(actual, **kwargs)[0], get_header_map_data(
|
302
|
+
expected)
|
303
|
+
actual1.sort()
|
304
|
+
try:
|
305
|
+
diff = compare_lists(actual1, expected1)
|
306
|
+
assert not diff # 为空则错误
|
307
|
+
return True, "表头校验值与顺序一致"
|
308
|
+
except AssertionError as e:
|
309
|
+
print("actual:", actual1)
|
310
|
+
print("expected:", expected1)
|
311
|
+
return False, f"表头校验值与顺序失败 {diff}"
|
312
|
+
except Exception as e:
|
313
|
+
return False, e
|
314
|
+
|
315
|
+
|
316
|
+
def get_header_map_data(name_list):
|
317
|
+
"""
|
318
|
+
获取头映射关系--中文
|
319
|
+
:param name_list:
|
320
|
+
:return:
|
321
|
+
"""
|
322
|
+
header_dict_zh_cn = {
|
323
|
+
"sendTypeName": "活动类型",
|
324
|
+
"activityName": "活动名称",
|
325
|
+
"sendTotal": "发送数",
|
326
|
+
"deliveryTotal": "送达数",
|
327
|
+
"deliveryRate": "送达率",
|
328
|
+
"openRate": ["打开率(打开数/送达数)", "打开数"],
|
329
|
+
"noRepeatOpenRate": ["不重复打开率", "不重复打开"],
|
330
|
+
"clickRate": ["点击率(点击数/送达数)", "点击数"],
|
331
|
+
"noRepeatClickRate": ["不重复点击率", "不重复点击"],
|
332
|
+
"salesPriceTotal": "销售额",
|
333
|
+
"orderTotal": "订单数",
|
334
|
+
"averageOrderValue": "平均订单价值",
|
335
|
+
"conversionRate": "转化率",
|
336
|
+
"unsubTotal": "退订数",
|
337
|
+
"unsubRate": "退订率",
|
338
|
+
"complainRate": "弹回率",
|
339
|
+
"bounceRate": "投诉率",
|
340
|
+
"sendStartTime": "发送时间"
|
341
|
+
}
|
342
|
+
header_list = []
|
343
|
+
for key, value in header_dict_zh_cn.items():
|
344
|
+
if key in name_list:
|
345
|
+
header_list.append(value) if not isinstance(value, list) else header_list.extend(value)
|
346
|
+
header_list.sort()
|
347
|
+
return header_list
|
348
|
+
|
349
|
+
|
288
350
|
def del_temp_file(file_name=""):
|
289
351
|
"""删除temp下临时文件"""
|
290
352
|
file_path = os.path.join(os.path.dirname(os.getcwd()) + "/temp_file/" + file_name)
|
@@ -378,12 +440,14 @@ def check_field_format(actual_oss, **kwargs):
|
|
378
440
|
if kwargs["fileds"][key][filed_key] == "email":
|
379
441
|
fool = DataTypeUtils.DataTypeUtils().check_email_format(email=row[filed_key])
|
380
442
|
if not fool:
|
381
|
-
errors.append(
|
443
|
+
errors.append(
|
444
|
+
f"{actual_dict_key[key]} 表, 第{num}行{filed_key}列{kwargs['fileds'][key][filed_key]}格式不符合规范, 值为:{row[filed_key]}")
|
382
445
|
elif kwargs["fileds"][key][filed_key] == "time":
|
383
|
-
fool = DataTypeUtils.DataTypeUtils().check_time_format(time_str=row[filed_key],
|
446
|
+
fool = DataTypeUtils.DataTypeUtils().check_time_format(time_str=row[filed_key],
|
447
|
+
precision=kwargs.get('precision', 's'))
|
384
448
|
if not fool:
|
385
449
|
errors.append(
|
386
450
|
f"{actual_dict_key[key]} 表, 第{num}行{filed_key}列{kwargs['fileds'][key][filed_key]}格式不符合规范, 值为:{row[filed_key]}")
|
387
451
|
num += 1
|
388
452
|
print(errors if len(errors) > 0 else "都校验成功")
|
389
|
-
return False if len(errors) > 0 else True
|
453
|
+
return False if len(errors) > 0 else True
|
smartpush/flow/MockFlow.py
CHANGED
@@ -109,6 +109,22 @@ def mock_pulsar(mock_domain, pulsar, limit=1):
|
|
109
109
|
return json.loads(result)
|
110
110
|
|
111
111
|
|
112
|
+
def disable_flow(host_domain, cookies, flow_ids, version):
|
113
|
+
"""关闭flow"""
|
114
|
+
_url = host_domain + "flow/disableFlow"
|
115
|
+
headers = {
|
116
|
+
"cookie": cookies,
|
117
|
+
"Content-Type": "application/json"
|
118
|
+
}
|
119
|
+
for flow_id in flow_ids:
|
120
|
+
params = {
|
121
|
+
"flowId": flow_id,
|
122
|
+
"version": str(version),
|
123
|
+
"continueRun": False
|
124
|
+
}
|
125
|
+
result = requests.request(method="post", url=_url, headers=headers, json=params).text
|
126
|
+
|
127
|
+
|
112
128
|
def check_flow(host_domain, cookies, mock_domain="", **kwargs):
|
113
129
|
"""
|
114
130
|
完整触发流程
|
File without changes
|
@@ -0,0 +1,143 @@
|
|
1
|
+
import json
|
2
|
+
from tenacity import retry, stop_after_attempt, wait_fixed
|
3
|
+
from smartpush.base.request_base import RequestBase
|
4
|
+
from smartpush.base.url_enum import URL
|
5
|
+
from smartpush.export.basic.GetOssUrl import log_attempt
|
6
|
+
|
7
|
+
|
8
|
+
class FormAfter(RequestBase):
|
9
|
+
def __init__(self, form_id, headers, host):
|
10
|
+
super().__init__(headers, host)
|
11
|
+
self.form_id = form_id
|
12
|
+
|
13
|
+
@retry(stop=stop_after_attempt(3), wait=wait_fixed(2), after=log_attempt)
|
14
|
+
def callPageFormReportDetail(self, reportDetailType, start_time=None, end_time=None):
|
15
|
+
"""
|
16
|
+
获取PageFormReportDetail数据
|
17
|
+
:param end_time:
|
18
|
+
:param start_time:
|
19
|
+
:param reportDetailType:
|
20
|
+
:return:
|
21
|
+
"""
|
22
|
+
requestParam = {"page": 1, "pageSize": 20, "reportDetailType": reportDetailType, "formId": self.form_id}
|
23
|
+
if start_time is not None and end_time is not None:
|
24
|
+
requestParam["startTime"] = start_time
|
25
|
+
requestParam["endTime"] = end_time
|
26
|
+
result = self.post(url=self.host + URL.pageFormReportDetail.url, data=json.dumps(requestParam)).json()
|
27
|
+
result.raise_for_status()
|
28
|
+
persons_list = result["resultData"]["reportDetailData"]["datas"]
|
29
|
+
return persons_list
|
30
|
+
|
31
|
+
@retry(stop=stop_after_attempt(3), wait=wait_fixed(2), after=log_attempt)
|
32
|
+
def callGetFormReportDetail(self):
|
33
|
+
requestParam = {"formId": self.form_id}
|
34
|
+
result = self.post(url=self.host + URL.getFormReportDetail.url, data=json.dumps(requestParam)).json()
|
35
|
+
result.raise_for_status()
|
36
|
+
resultData = result["resultData"]
|
37
|
+
return resultData
|
38
|
+
|
39
|
+
@retry(stop=stop_after_attempt(3), wait=wait_fixed(2), after=log_attempt)
|
40
|
+
def callGetFormPerformanceTrend(self):
|
41
|
+
requestParam = {"formId": self.form_id}
|
42
|
+
result = self.post(url=self.host + URL.getFormPerformanceTrend.url, data=json.dumps(requestParam)).json()
|
43
|
+
result.raise_for_status()
|
44
|
+
resultData = result["resultData"]
|
45
|
+
return resultData
|
46
|
+
|
47
|
+
@retry(stop=stop_after_attempt(3), wait=wait_fixed(2), after=log_attempt)
|
48
|
+
def callEditCrowdPackage(self, _id=None, groupRules=None, groupRelation="$AND"):
|
49
|
+
"""
|
50
|
+
更新群组条件id
|
51
|
+
:param _id:
|
52
|
+
:param groupRules:
|
53
|
+
:param groupRelation:
|
54
|
+
:return:
|
55
|
+
"""
|
56
|
+
requestParam = {"id": _id, "crowdName": "表单查询群组-自动化", "groupRelation": groupRelation,
|
57
|
+
"groupRules": groupRules, "triggerStock": False}
|
58
|
+
result = self.post(url=self.host + URL.editCrowdPackage.url, data=json.dumps(requestParam)).json()
|
59
|
+
result.raise_for_status()
|
60
|
+
assert result.get("code") == 1
|
61
|
+
resultData = result["resultData"]
|
62
|
+
assert resultData.get("status") == 2
|
63
|
+
return resultData["id"]
|
64
|
+
|
65
|
+
def callCrowdPersonList(self, _id, page, pageSize, filter_type, filter_value):
|
66
|
+
requestParam = {"id": _id, "page": page, "pageSize": pageSize}
|
67
|
+
if filter_value is not None:
|
68
|
+
requestParam["filter"] = {filter_type: {"in": filter_value}}
|
69
|
+
result = self.post(url=self.host + URL.crowdPersonList.url, data=json.dumps(requestParam)).json()
|
70
|
+
result.raise_for_status()
|
71
|
+
return result['resultData']
|
72
|
+
|
73
|
+
# -------- 处理数据 --------------
|
74
|
+
def collectFormDetails(self, key, start_time=None, end_time=None):
|
75
|
+
"""
|
76
|
+
从表单收集明细中获取信息,判断是否收集成功
|
77
|
+
:param self:
|
78
|
+
:param key: 关键词
|
79
|
+
:param start_time: 开始时间
|
80
|
+
:param end_time: 结束时间
|
81
|
+
"""
|
82
|
+
persons_list = self.callPageFormReportDetail("FORM_COLLECT", start_time, end_time)
|
83
|
+
if persons_list:
|
84
|
+
for person in persons_list:
|
85
|
+
if person['email'] == key:
|
86
|
+
return True, person
|
87
|
+
elif person['phone'] == key:
|
88
|
+
return True, person
|
89
|
+
else:
|
90
|
+
return False, None
|
91
|
+
|
92
|
+
def FormReportNumQuery(self, num_type="viewNum", assertNum=None):
|
93
|
+
"""
|
94
|
+
表单数据数据统计
|
95
|
+
:param assertNum:
|
96
|
+
:param num_type:viewNum/clickNum/collectNum/orderNum
|
97
|
+
"""
|
98
|
+
data = self.callGetFormReportDetail()
|
99
|
+
if data is not None:
|
100
|
+
if assertNum is None:
|
101
|
+
var = data.get(num_type)
|
102
|
+
return var
|
103
|
+
else:
|
104
|
+
return data.get(num_type) == assertNum
|
105
|
+
|
106
|
+
def getFormAttributionSales(self, key, start_time=None, end_time=None):
|
107
|
+
"""
|
108
|
+
判断折扣码是否能正确归因
|
109
|
+
:param key:
|
110
|
+
:param start_time:
|
111
|
+
:param end_time:
|
112
|
+
:return:
|
113
|
+
"""
|
114
|
+
order_list = self.callPageFormReportDetail("FORM_SALES", start_time, end_time)
|
115
|
+
if order_list:
|
116
|
+
for order in order_list:
|
117
|
+
if order['email'] == key:
|
118
|
+
return True, order
|
119
|
+
elif order['phone'] == key:
|
120
|
+
return True, order
|
121
|
+
elif order['orderId'] == key:
|
122
|
+
return True, order
|
123
|
+
else:
|
124
|
+
return False, None
|
125
|
+
|
126
|
+
def getFormLineChart(self, date=None, num_type="viewNum", assertNum=None):
|
127
|
+
"""
|
128
|
+
获取表单折线图
|
129
|
+
:param assertNum:
|
130
|
+
:param date:
|
131
|
+
:param num_type:viewNum/clickNum/collectNum
|
132
|
+
"""
|
133
|
+
datas = dict(self.callGetFormPerformanceTrend())
|
134
|
+
if datas is not None:
|
135
|
+
for data in datas:
|
136
|
+
if data.get(date):
|
137
|
+
if assertNum is not None:
|
138
|
+
assert data.get(num_type) == assertNum
|
139
|
+
else:
|
140
|
+
return data.get(num_type)
|
141
|
+
|
142
|
+
def getCrowdPersonList(self, _id, page=1, pageSize=20, filter_type="email", filter_value=""):
|
143
|
+
self.callCrowdPersonList(self,_id,page,pageSize,filter_type,filter_value)
|
@@ -0,0 +1,34 @@
|
|
1
|
+
import base64
|
2
|
+
from Crypto.Cipher import AES
|
3
|
+
from Crypto.Util.Padding import pad, unpad
|
4
|
+
|
5
|
+
|
6
|
+
def aes_encrypt(data, key, iv):
|
7
|
+
"""
|
8
|
+
参数加密
|
9
|
+
:param data:
|
10
|
+
:param key:
|
11
|
+
:param iv:
|
12
|
+
:return:
|
13
|
+
"""
|
14
|
+
key = key.encode('utf-8')
|
15
|
+
iv = iv.encode('utf-8')
|
16
|
+
cipher = AES.new(key, AES.MODE_CBC, iv)
|
17
|
+
ciphertext = cipher.encrypt(pad(data.encode('utf-8'), AES.block_size))
|
18
|
+
return base64.b64encode(ciphertext).decode('utf-8')
|
19
|
+
|
20
|
+
|
21
|
+
def aes_decrypt(ciphertext, key, iv):
|
22
|
+
"""
|
23
|
+
参数解密
|
24
|
+
:param ciphertext:
|
25
|
+
:param key:
|
26
|
+
:param iv:
|
27
|
+
:return:
|
28
|
+
"""
|
29
|
+
key = key.encode('utf-8')
|
30
|
+
iv = iv.encode('utf-8')
|
31
|
+
ciphertext = base64.b64decode(ciphertext)
|
32
|
+
cipher = AES.new(key, AES.MODE_CBC, iv)
|
33
|
+
decrypted_data = unpad(cipher.decrypt(ciphertext), AES.block_size)
|
34
|
+
return decrypted_data.decode('utf-8')
|
@@ -0,0 +1,28 @@
|
|
1
|
+
smartpush/__init__.py,sha256=XJrl1vhGATHSeSVqKmPXxYqxyseriUpvY5tLIXir3EE,24
|
2
|
+
smartpush/get_jira_info.py,sha256=OYaDV6VPAmkGKYLlRnsi1ZyKHU8xEiVnjsYrc41ZR0U,17910
|
3
|
+
smartpush/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
4
|
+
smartpush/base/faker_data.py,sha256=TOd5EKVImxZpsKEW_dtKa2iqiUGqU7OBkOM8pvqKVUc,24643
|
5
|
+
smartpush/base/request_base.py,sha256=Fn1uPWgaZQZdu8yyi2n13nuiKPVeR95iwx99sG6XGVU,574
|
6
|
+
smartpush/base/url_enum.py,sha256=REHYP_aa0xumLg8El-yrNRpablLnPEQpss8ZNPdkNtg,787
|
7
|
+
smartpush/export/__init__.py,sha256=D9GbWcmwnetEndFDty5XbVienFK1WjqV2yYcQp3CM84,99
|
8
|
+
smartpush/export/basic/ExcelExportChecker.py,sha256=CFTytcowwf1xfoRE5DZayY8kKJqppYQ0smVIokfxitM,19833
|
9
|
+
smartpush/export/basic/GetOssUrl.py,sha256=LeF1y1_uJaYXth1KvO6mEDS29ezb9tliBv5SrbqYkXc,6136
|
10
|
+
smartpush/export/basic/ReadExcel.py,sha256=ZnG2mtYqLY-xuYx9SyulbdYUP_0E5jIeKDewfakAsTw,7342
|
11
|
+
smartpush/export/basic/__init__.py,sha256=6tcrS-2NSlsJo-UwEsnGUmwCf7jgOsh_UEbM0FD-gYE,70
|
12
|
+
smartpush/flow/MockFlow.py,sha256=MI8WIMZyKlxrV5QVs8rXX6iD07Ldl37_L5Yb5FWqHzU,8595
|
13
|
+
smartpush/flow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
14
|
+
smartpush/form/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
15
|
+
smartpush/form/form_after.py,sha256=a7d5G8Es3gRIzXiFDkI2McW_zq3FACfMxjRVBwSmK24,5866
|
16
|
+
smartpush/form/form_assert.py,sha256=wPIRfQHhr7lN1fFd-mp0z_qKMtF4jfrNxRWvp2xfqCg,257
|
17
|
+
smartpush/form/form_before.py,sha256=CCvAC_2yWPlnQGtjEA8LPLy9853Nq3nNjcL2GewFWIs,175
|
18
|
+
smartpush/form/form_client_operation.py,sha256=gg-5uHXCyMa_ypBSYPYFVxXdwZdYBJsNtUCqayknMBw,303
|
19
|
+
smartpush/utils/DataTypeUtils.py,sha256=BC7ioztO3vAfKd1EOoNvXdVuXYY8qjNskV1DP7LhW-M,1082
|
20
|
+
smartpush/utils/EmailUtlis.py,sha256=DAHd73bJ8hiJCLEXtD0xcwxPD7SOPSmBB7Jvlf6gN6s,11201
|
21
|
+
smartpush/utils/ListDictUtils.py,sha256=Fm5_d7UyY6xB8gySMPdl5jIFSRhXZcYXdYW-_L1alcE,1640
|
22
|
+
smartpush/utils/StringUtils.py,sha256=n8mo9k0JQN63MReImgv-66JxmmymOGknR8pH2fkQrAo,4139
|
23
|
+
smartpush/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
24
|
+
smartpush/utils/form_utils.py,sha256=ld-g_Dm_ZlnagQt7imYfUc87bcBRVlTctywuLtzmjXQ,849
|
25
|
+
smartpush-1.4.8.dist-info/METADATA,sha256=_Fh1DOsWYzvBYYvSbFzc98qbWwEGBrsGgC3RjmStBno,131
|
26
|
+
smartpush-1.4.8.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
|
27
|
+
smartpush-1.4.8.dist-info/top_level.txt,sha256=5_CXqu08EfbPaKLjuSAOAqCmGU6shiatwDU_ViBGCmg,10
|
28
|
+
smartpush-1.4.8.dist-info/RECORD,,
|
smartpush-1.4.6.dist-info/RECORD
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
smartpush/__init__.py,sha256=XJrl1vhGATHSeSVqKmPXxYqxyseriUpvY5tLIXir3EE,24
|
2
|
-
smartpush/get_jira_info.py,sha256=OYaDV6VPAmkGKYLlRnsi1ZyKHU8xEiVnjsYrc41ZR0U,17910
|
3
|
-
smartpush/export/__init__.py,sha256=D9GbWcmwnetEndFDty5XbVienFK1WjqV2yYcQp3CM84,99
|
4
|
-
smartpush/export/basic/ExcelExportChecker.py,sha256=R_1gFy69vE2V5pY20zFsnhqWgJ42Vtf35zBtOPfhUpU,17590
|
5
|
-
smartpush/export/basic/GetOssUrl.py,sha256=LeF1y1_uJaYXth1KvO6mEDS29ezb9tliBv5SrbqYkXc,6136
|
6
|
-
smartpush/export/basic/ReadExcel.py,sha256=ZnG2mtYqLY-xuYx9SyulbdYUP_0E5jIeKDewfakAsTw,7342
|
7
|
-
smartpush/export/basic/__init__.py,sha256=6tcrS-2NSlsJo-UwEsnGUmwCf7jgOsh_UEbM0FD-gYE,70
|
8
|
-
smartpush/flow/MockFlow.py,sha256=T8tZuJ9FLF0arbdu0PvbwXk-Ca-wjH46P-HCEW5aq2Y,8124
|
9
|
-
smartpush/flow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
10
|
-
smartpush/utils/DataTypeUtils.py,sha256=BC7ioztO3vAfKd1EOoNvXdVuXYY8qjNskV1DP7LhW-M,1082
|
11
|
-
smartpush/utils/EmailUtlis.py,sha256=DAHd73bJ8hiJCLEXtD0xcwxPD7SOPSmBB7Jvlf6gN6s,11201
|
12
|
-
smartpush/utils/ListDictUtils.py,sha256=Fm5_d7UyY6xB8gySMPdl5jIFSRhXZcYXdYW-_L1alcE,1640
|
13
|
-
smartpush/utils/StringUtils.py,sha256=n8mo9k0JQN63MReImgv-66JxmmymOGknR8pH2fkQrAo,4139
|
14
|
-
smartpush/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
15
|
-
smartpush-1.4.6.dist-info/METADATA,sha256=OCcDkSLig4J8-iAA82yLZGRdn5rc4XwmlqNsPQErhjE,131
|
16
|
-
smartpush-1.4.6.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
|
17
|
-
smartpush-1.4.6.dist-info/top_level.txt,sha256=5_CXqu08EfbPaKLjuSAOAqCmGU6shiatwDU_ViBGCmg,10
|
18
|
-
smartpush-1.4.6.dist-info/RECORD,,
|
File without changes
|
File without changes
|