jit-utils-backend 0.0.2__py3-none-any.whl → 0.0.3__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.
- jit_utils/__init__.py +1 -1
- {jit_utils_backend-0.0.2.dist-info → jit_utils_backend-0.0.3.dist-info}/METADATA +2 -2
- {jit_utils_backend-0.0.2.dist-info → jit_utils_backend-0.0.3.dist-info}/RECORD +5 -11
- {jit_utils_backend-0.0.2.dist-info → jit_utils_backend-0.0.3.dist-info}/top_level.txt +0 -1
- tests/__init__.py +0 -4
- tests/run_tests.py +0 -102
- tests/test_package_imports.py +0 -190
- tests/test_qrcode_barcode.py +0 -182
- tests/test_string_utils.py +0 -174
- tests/test_time_utils.py +0 -185
- {jit_utils_backend-0.0.2.dist-info → jit_utils_backend-0.0.3.dist-info}/WHEEL +0 -0
jit_utils/__init__.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
jit_utils/__init__.py,sha256=
|
1
|
+
jit_utils/__init__.py,sha256=uiOH1XdTzqKkXJZ0B5RbTZzJCP0Yvl5l48Lu2rmIRH8,473
|
2
2
|
jit_utils/apiAuthSign.py,sha256=TzYe3tDVQw0LYcE82IPcibtt_qyGTJ3XbWVjti5lGx0,2323
|
3
3
|
jit_utils/barcode.py,sha256=PuSHqxttr4rOGMAfojK7Ii72z4CoqxUQR_hmMOaElN8,1102
|
4
4
|
jit_utils/clsTool.py,sha256=tfMy3ITwfbfBLE6cjTrrRwMWB0aFh4fAYGJBZJ3vmCE,2316
|
@@ -20,13 +20,7 @@ jit_utils/config/case.py,sha256=sFs5NvFaga7lbjlSDRwMKkufiIEYFSYSG3ha8PB1-58,2591
|
|
20
20
|
jit_utils/config/config.py,sha256=kH0u0eTwQR0shS0KwYd9f8c9uDxKPyjxYpYQ0rKZLXc,2713
|
21
21
|
jit_utils/config/exception.py,sha256=wrok-q14bTl8afClYgX649F2Qk0vrwl6LiWGgpkKDY0,378
|
22
22
|
jit_utils/config/field.py,sha256=5cq0M7zAtJrFkEHQ2H-1x95ypQxMyg07JjHnIAzSPQg,4759
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
tests/test_string_utils.py,sha256=i1Q98PwMrPbjc4nkb1O3Z4pwvu0SMZrSOYbgDdeU4D4,5845
|
28
|
-
tests/test_time_utils.py,sha256=nl9k_g0HmILHYTANMMRQgOF_vO4qGkfMzs6XiEJEnYA,6944
|
29
|
-
jit_utils_backend-0.0.2.dist-info/METADATA,sha256=3m1frtfoG_EKKM0EaUcaIsRbbs6GFA8gjn1y61NY6Ow,3710
|
30
|
-
jit_utils_backend-0.0.2.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
|
31
|
-
jit_utils_backend-0.0.2.dist-info/top_level.txt,sha256=SvmeRMPwBF2UwUtkhHAzXWSPhwVATqN2FFmZp2pJHjA,16
|
32
|
-
jit_utils_backend-0.0.2.dist-info/RECORD,,
|
23
|
+
jit_utils_backend-0.0.3.dist-info/METADATA,sha256=_O6Fe1jHYjVuDRmariTZttqI0tH9ul_DEClQRIJSwAI,3710
|
24
|
+
jit_utils_backend-0.0.3.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
|
25
|
+
jit_utils_backend-0.0.3.dist-info/top_level.txt,sha256=r9DXZkwpqwiisjnpeWfLj01h_M6yxlF_DvjprlPJmco,10
|
26
|
+
jit_utils_backend-0.0.3.dist-info/RECORD,,
|
tests/__init__.py
DELETED
tests/run_tests.py
DELETED
@@ -1,102 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
# -*-coding:utf-8-*-
|
3
|
-
"""
|
4
|
-
JIT Utils Backend 测试运行器
|
5
|
-
|
6
|
-
运行所有测试并生成报告
|
7
|
-
"""
|
8
|
-
import sys
|
9
|
-
import unittest
|
10
|
-
import os
|
11
|
-
|
12
|
-
# 添加项目根目录到Python路径
|
13
|
-
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
14
|
-
sys.path.insert(0, project_root)
|
15
|
-
|
16
|
-
|
17
|
-
def run_all_tests():
|
18
|
-
"""运行所有测试"""
|
19
|
-
# 发现测试目录中的所有测试
|
20
|
-
test_dir = os.path.dirname(os.path.abspath(__file__))
|
21
|
-
|
22
|
-
# 创建测试套件
|
23
|
-
loader = unittest.TestLoader()
|
24
|
-
suite = loader.discover(test_dir, pattern='test_*.py')
|
25
|
-
|
26
|
-
# 运行测试
|
27
|
-
runner = unittest.TextTestRunner(verbosity=2, stream=sys.stdout)
|
28
|
-
result = runner.run(suite)
|
29
|
-
|
30
|
-
# 打印总结
|
31
|
-
print("\n" + "="*60)
|
32
|
-
print("测试总结:")
|
33
|
-
print(f"运行测试数: {result.testsRun}")
|
34
|
-
print(f"失败数: {len(result.failures)}")
|
35
|
-
print(f"错误数: {len(result.errors)}")
|
36
|
-
print(f"跳过数: {len(result.skipped)}")
|
37
|
-
|
38
|
-
if result.failures:
|
39
|
-
print("\n失败的测试:")
|
40
|
-
for test, traceback in result.failures:
|
41
|
-
print(f" - {test}: {traceback.split('AssertionError:')[-1].strip()}")
|
42
|
-
|
43
|
-
if result.errors:
|
44
|
-
print("\n出错的测试:")
|
45
|
-
for test, traceback in result.errors:
|
46
|
-
print(f" - {test}: {traceback.split('Error:')[-1].strip()}")
|
47
|
-
|
48
|
-
if result.skipped:
|
49
|
-
print("\n跳过的测试:")
|
50
|
-
for test, reason in result.skipped:
|
51
|
-
print(f" - {test}: {reason}")
|
52
|
-
|
53
|
-
success_rate = ((result.testsRun - len(result.failures) - len(result.errors)) / result.testsRun * 100) if result.testsRun > 0 else 0
|
54
|
-
print(f"\n成功率: {success_rate:.1f}%")
|
55
|
-
|
56
|
-
return result.wasSuccessful()
|
57
|
-
|
58
|
-
|
59
|
-
def run_specific_test(test_name):
|
60
|
-
"""运行特定的测试模块"""
|
61
|
-
test_dir = os.path.dirname(os.path.abspath(__file__))
|
62
|
-
|
63
|
-
try:
|
64
|
-
# 动态导入测试模块
|
65
|
-
test_module = __import__(f'tests.{test_name}', fromlist=[test_name])
|
66
|
-
|
67
|
-
# 创建测试套件
|
68
|
-
loader = unittest.TestLoader()
|
69
|
-
suite = loader.loadTestsFromModule(test_module)
|
70
|
-
|
71
|
-
# 运行测试
|
72
|
-
runner = unittest.TextTestRunner(verbosity=2)
|
73
|
-
result = runner.run(suite)
|
74
|
-
|
75
|
-
return result.wasSuccessful()
|
76
|
-
|
77
|
-
except ImportError as e:
|
78
|
-
print(f"无法导入测试模块 '{test_name}': {e}")
|
79
|
-
return False
|
80
|
-
|
81
|
-
|
82
|
-
def main():
|
83
|
-
"""主函数"""
|
84
|
-
if len(sys.argv) > 1:
|
85
|
-
# 运行特定测试
|
86
|
-
test_name = sys.argv[1]
|
87
|
-
if not test_name.startswith('test_'):
|
88
|
-
test_name = f'test_{test_name}'
|
89
|
-
|
90
|
-
print(f"运行测试模块: {test_name}")
|
91
|
-
success = run_specific_test(test_name)
|
92
|
-
else:
|
93
|
-
# 运行所有测试
|
94
|
-
print("运行所有测试...")
|
95
|
-
success = run_all_tests()
|
96
|
-
|
97
|
-
# 根据测试结果设置退出码
|
98
|
-
sys.exit(0 if success else 1)
|
99
|
-
|
100
|
-
|
101
|
-
if __name__ == '__main__':
|
102
|
-
main()
|
tests/test_package_imports.py
DELETED
@@ -1,190 +0,0 @@
|
|
1
|
-
# -*-coding:utf-8-*-
|
2
|
-
"""
|
3
|
-
测试包的子模块导入功能
|
4
|
-
"""
|
5
|
-
import unittest
|
6
|
-
|
7
|
-
|
8
|
-
class TestPackageImports(unittest.TestCase):
|
9
|
-
"""包导入测试类"""
|
10
|
-
|
11
|
-
def test_main_package_import(self):
|
12
|
-
"""测试主包导入"""
|
13
|
-
try:
|
14
|
-
import jit_utils
|
15
|
-
self.assertTrue(hasattr(jit_utils, '__version__'))
|
16
|
-
self.assertTrue(hasattr(jit_utils, '__author__'))
|
17
|
-
self.assertEqual(jit_utils.__version__, '0.0.2')
|
18
|
-
self.assertEqual(jit_utils.__author__, 'zangtao')
|
19
|
-
except ImportError as e:
|
20
|
-
self.fail(f"主包导入失败: {e}")
|
21
|
-
|
22
|
-
def test_string_module_import(self):
|
23
|
-
"""测试字符串模块导入"""
|
24
|
-
try:
|
25
|
-
from jit_utils.string import randomString, getUuidStr, md5Str
|
26
|
-
|
27
|
-
# 测试函数是否可调用
|
28
|
-
self.assertTrue(callable(randomString))
|
29
|
-
self.assertTrue(callable(getUuidStr))
|
30
|
-
self.assertTrue(callable(md5Str))
|
31
|
-
|
32
|
-
# 简单功能测试
|
33
|
-
random_str = randomString(6)
|
34
|
-
self.assertEqual(len(random_str), 6)
|
35
|
-
|
36
|
-
uuid_str = getUuidStr()
|
37
|
-
self.assertEqual(len(uuid_str), 32)
|
38
|
-
|
39
|
-
md5_hash = md5Str("test")
|
40
|
-
self.assertEqual(len(md5_hash), 32)
|
41
|
-
|
42
|
-
except ImportError as e:
|
43
|
-
self.skipTest(f"字符串模块导入失败: {e}")
|
44
|
-
|
45
|
-
def test_time_module_import(self):
|
46
|
-
"""测试时间模块导入"""
|
47
|
-
try:
|
48
|
-
from jit_utils.time import now, getTimestamp, formatNow
|
49
|
-
|
50
|
-
# 测试函数是否可调用
|
51
|
-
self.assertTrue(callable(now))
|
52
|
-
self.assertTrue(callable(getTimestamp))
|
53
|
-
self.assertTrue(callable(formatNow))
|
54
|
-
|
55
|
-
# 简单功能测试
|
56
|
-
current_time = now()
|
57
|
-
self.assertIsNotNone(current_time)
|
58
|
-
|
59
|
-
timestamp = getTimestamp()
|
60
|
-
self.assertIsInstance(timestamp, (int, float))
|
61
|
-
|
62
|
-
formatted_time = formatNow()
|
63
|
-
self.assertIsInstance(formatted_time, str)
|
64
|
-
|
65
|
-
except ImportError as e:
|
66
|
-
self.skipTest(f"时间模块导入失败(可能缺少依赖): {e}")
|
67
|
-
|
68
|
-
def test_qrcode_module_import(self):
|
69
|
-
"""测试二维码模块导入"""
|
70
|
-
try:
|
71
|
-
from jit_utils.qrcode import Qrcode
|
72
|
-
|
73
|
-
# 测试类是否可实例化
|
74
|
-
self.assertTrue(callable(Qrcode))
|
75
|
-
|
76
|
-
# 创建实例
|
77
|
-
qr = Qrcode("test")
|
78
|
-
self.assertEqual(qr.value, "test")
|
79
|
-
|
80
|
-
except ImportError as e:
|
81
|
-
self.skipTest(f"二维码模块导入失败(可能缺少依赖): {e}")
|
82
|
-
|
83
|
-
def test_barcode_module_import(self):
|
84
|
-
"""测试条形码模块导入"""
|
85
|
-
try:
|
86
|
-
from jit_utils.barcode import Barcode
|
87
|
-
|
88
|
-
# 测试类是否可实例化
|
89
|
-
self.assertTrue(callable(Barcode))
|
90
|
-
|
91
|
-
# 创建实例
|
92
|
-
bc = Barcode("123456789")
|
93
|
-
self.assertEqual(bc.value, "123456789")
|
94
|
-
|
95
|
-
except ImportError as e:
|
96
|
-
self.skipTest(f"条形码模块导入失败(可能缺少依赖): {e}")
|
97
|
-
|
98
|
-
def test_validator_module_import(self):
|
99
|
-
"""测试验证器模块导入"""
|
100
|
-
try:
|
101
|
-
from jit_utils.validator import ParamsValidator
|
102
|
-
self.assertTrue(callable(ParamsValidator))
|
103
|
-
except ImportError as e:
|
104
|
-
self.skipTest(f"验证器模块导入失败(可能缺少依赖): {e}")
|
105
|
-
|
106
|
-
def test_network_module_import(self):
|
107
|
-
"""测试网络模块导入"""
|
108
|
-
try:
|
109
|
-
import jit_utils.network
|
110
|
-
# 网络模块应该可以导入
|
111
|
-
self.assertIsNotNone(jit_utils.network)
|
112
|
-
except ImportError as e:
|
113
|
-
self.skipTest(f"网络模块导入失败: {e}")
|
114
|
-
|
115
|
-
def test_signature_module_import(self):
|
116
|
-
"""测试签名模块导入"""
|
117
|
-
try:
|
118
|
-
import jit_utils.signature
|
119
|
-
self.assertIsNotNone(jit_utils.signature)
|
120
|
-
except ImportError as e:
|
121
|
-
self.skipTest(f"签名模块导入失败: {e}")
|
122
|
-
|
123
|
-
def test_exceptions_module_import(self):
|
124
|
-
"""测试异常模块导入"""
|
125
|
-
try:
|
126
|
-
import jit_utils.exceptions
|
127
|
-
self.assertIsNotNone(jit_utils.exceptions)
|
128
|
-
except ImportError as e:
|
129
|
-
self.skipTest(f"异常模块导入失败(可能缺少依赖): {e}")
|
130
|
-
|
131
|
-
def test_config_module_import(self):
|
132
|
-
"""测试配置模块导入"""
|
133
|
-
try:
|
134
|
-
import jit_utils.config
|
135
|
-
self.assertIsNotNone(jit_utils.config)
|
136
|
-
except ImportError as e:
|
137
|
-
self.skipTest(f"配置模块导入失败(可能缺少依赖): {e}")
|
138
|
-
|
139
|
-
def test_workday_constants_import(self):
|
140
|
-
"""测试工作日常量导入"""
|
141
|
-
try:
|
142
|
-
import jit_utils.workday_constants
|
143
|
-
self.assertIsNotNone(jit_utils.workday_constants)
|
144
|
-
# 检查是否有工作日相关的常量
|
145
|
-
self.assertTrue(hasattr(jit_utils.workday_constants, 'holidayDict') or
|
146
|
-
hasattr(jit_utils.workday_constants, 'workdayDict'))
|
147
|
-
except ImportError as e:
|
148
|
-
self.skipTest(f"工作日常量模块导入失败: {e}")
|
149
|
-
|
150
|
-
def test_decorator_import(self):
|
151
|
-
"""测试装饰器导入"""
|
152
|
-
try:
|
153
|
-
from jit_utils.decorator import forward
|
154
|
-
self.assertTrue(callable(forward))
|
155
|
-
except ImportError as e:
|
156
|
-
self.skipTest(f"装饰器模块导入失败(可能缺少依赖): {e}")
|
157
|
-
|
158
|
-
def test_convert_module_import(self):
|
159
|
-
"""测试转换器模块导入"""
|
160
|
-
try:
|
161
|
-
from jit_utils.convert import Converter, MemoryCompiler
|
162
|
-
self.assertTrue(callable(Converter))
|
163
|
-
self.assertTrue(callable(MemoryCompiler))
|
164
|
-
except ImportError as e:
|
165
|
-
self.skipTest(f"转换器模块导入失败(可能缺少依赖): {e}")
|
166
|
-
|
167
|
-
def test_package_structure(self):
|
168
|
-
"""测试包结构"""
|
169
|
-
import jit_utils
|
170
|
-
|
171
|
-
# 检查主要模块是否存在
|
172
|
-
modules_to_check = [
|
173
|
-
'string', 'time', 'qrcode', 'barcode', 'validator',
|
174
|
-
'network', 'signature', 'exceptions', 'config',
|
175
|
-
'workday_constants', 'decorator', 'convert'
|
176
|
-
]
|
177
|
-
|
178
|
-
for module_name in modules_to_check:
|
179
|
-
try:
|
180
|
-
# 尝试导入模块
|
181
|
-
__import__(f'jit_utils.{module_name}')
|
182
|
-
# 如果导入成功,则通过测试
|
183
|
-
self.assertTrue(True, f"模块 {module_name} 可以导入")
|
184
|
-
except ImportError:
|
185
|
-
# 如果导入失败,跳过(可能是依赖问题)
|
186
|
-
self.skipTest(f"模块 {module_name} 导入失败(可能缺少依赖)")
|
187
|
-
|
188
|
-
|
189
|
-
if __name__ == '__main__':
|
190
|
-
unittest.main()
|
tests/test_qrcode_barcode.py
DELETED
@@ -1,182 +0,0 @@
|
|
1
|
-
# -*-coding:utf-8-*-
|
2
|
-
"""
|
3
|
-
测试二维码和条形码模块
|
4
|
-
"""
|
5
|
-
import unittest
|
6
|
-
import base64
|
7
|
-
import re
|
8
|
-
|
9
|
-
|
10
|
-
class TestQrcodeBarcode(unittest.TestCase):
|
11
|
-
"""二维码和条形码测试类"""
|
12
|
-
|
13
|
-
def setUp(self):
|
14
|
-
"""测试设置"""
|
15
|
-
try:
|
16
|
-
from jit_utils.qrcode import Qrcode
|
17
|
-
from jit_utils.barcode import Barcode
|
18
|
-
self.qrcode_available = True
|
19
|
-
self.barcode_available = True
|
20
|
-
self.Qrcode = Qrcode
|
21
|
-
self.Barcode = Barcode
|
22
|
-
except ImportError as e:
|
23
|
-
self.qrcode_available = False
|
24
|
-
self.barcode_available = False
|
25
|
-
self.import_error = str(e)
|
26
|
-
|
27
|
-
def test_qrcode_creation(self):
|
28
|
-
"""测试二维码创建"""
|
29
|
-
if not self.qrcode_available:
|
30
|
-
self.skipTest(f"二维码模块导入失败: {self.import_error}")
|
31
|
-
|
32
|
-
# 创建二维码
|
33
|
-
qr = self.Qrcode("Hello World")
|
34
|
-
self.assertEqual(qr.value, "Hello World")
|
35
|
-
self.assertEqual(qr.row, 200) # 默认行数
|
36
|
-
self.assertEqual(qr.col, 200) # 默认列数
|
37
|
-
|
38
|
-
# 自定义尺寸
|
39
|
-
qr_custom = self.Qrcode("Test", row=300, col=300)
|
40
|
-
self.assertEqual(qr_custom.row, 300)
|
41
|
-
self.assertEqual(qr_custom.col, 300)
|
42
|
-
|
43
|
-
def test_qrcode_toByte(self):
|
44
|
-
"""测试二维码转字节"""
|
45
|
-
if not self.qrcode_available:
|
46
|
-
self.skipTest(f"二维码模块导入失败: {self.import_error}")
|
47
|
-
|
48
|
-
qr = self.Qrcode("Hello World")
|
49
|
-
try:
|
50
|
-
byte_data = qr.toByte()
|
51
|
-
self.assertIsInstance(byte_data, bytes)
|
52
|
-
self.assertGreater(len(byte_data), 0)
|
53
|
-
except Exception as e:
|
54
|
-
self.skipTest(f"二维码生成失败: {str(e)}")
|
55
|
-
|
56
|
-
def test_qrcode_toStr(self):
|
57
|
-
"""测试二维码转base64字符串"""
|
58
|
-
if not self.qrcode_available:
|
59
|
-
self.skipTest(f"二维码模块导入失败: {self.import_error}")
|
60
|
-
|
61
|
-
# 测试正常值
|
62
|
-
qr = self.Qrcode("Hello World")
|
63
|
-
try:
|
64
|
-
str_data = qr.toStr()
|
65
|
-
self.assertIsInstance(str_data, str)
|
66
|
-
self.assertTrue(str_data.startswith("<image:"))
|
67
|
-
self.assertTrue(str_data.endswith(">"))
|
68
|
-
|
69
|
-
# 提取base64部分
|
70
|
-
base64_part = str_data[7:-1] # 去掉 "<image:" 和 ">"
|
71
|
-
# 验证是否为有效的base64
|
72
|
-
base64.b64decode(base64_part) # 如果无效会抛出异常
|
73
|
-
except Exception as e:
|
74
|
-
self.skipTest(f"二维码字符串生成失败: {str(e)}")
|
75
|
-
|
76
|
-
# 测试空值
|
77
|
-
qr_empty = self.Qrcode("")
|
78
|
-
result = qr_empty.toStr()
|
79
|
-
self.assertEqual(result, "")
|
80
|
-
|
81
|
-
def test_qrcode_str_method(self):
|
82
|
-
"""测试二维码__str__方法"""
|
83
|
-
if not self.qrcode_available:
|
84
|
-
self.skipTest(f"二维码模块导入失败: {self.import_error}")
|
85
|
-
|
86
|
-
qr = self.Qrcode("Test")
|
87
|
-
try:
|
88
|
-
str_result = str(qr)
|
89
|
-
expected = qr.toStr()
|
90
|
-
self.assertEqual(str_result, expected)
|
91
|
-
except Exception as e:
|
92
|
-
self.skipTest(f"二维码__str__方法失败: {str(e)}")
|
93
|
-
|
94
|
-
def test_barcode_creation(self):
|
95
|
-
"""测试条形码创建"""
|
96
|
-
if not self.barcode_available:
|
97
|
-
self.skipTest(f"条形码模块导入失败: {self.import_error}")
|
98
|
-
|
99
|
-
# 创建条形码
|
100
|
-
bc = self.Barcode("123456789")
|
101
|
-
self.assertEqual(bc.value, "123456789")
|
102
|
-
self.assertEqual(bc.codeType, "code128") # 默认类型
|
103
|
-
|
104
|
-
# 自定义类型
|
105
|
-
bc_custom = self.Barcode("123456789", "code39")
|
106
|
-
self.assertEqual(bc_custom.codeType, "code39")
|
107
|
-
|
108
|
-
def test_barcode_toByte(self):
|
109
|
-
"""测试条形码转字节"""
|
110
|
-
if not self.barcode_available:
|
111
|
-
self.skipTest(f"条形码模块导入失败: {self.import_error}")
|
112
|
-
|
113
|
-
bc = self.Barcode("123456789")
|
114
|
-
try:
|
115
|
-
byte_data = bc.toByte()
|
116
|
-
self.assertIsInstance(byte_data, bytes)
|
117
|
-
self.assertGreater(len(byte_data), 0)
|
118
|
-
except Exception as e:
|
119
|
-
self.skipTest(f"条形码生成失败: {str(e)}")
|
120
|
-
|
121
|
-
def test_barcode_toStr(self):
|
122
|
-
"""测试条形码转base64字符串"""
|
123
|
-
if not self.barcode_available:
|
124
|
-
self.skipTest(f"条形码模块导入失败: {self.import_error}")
|
125
|
-
|
126
|
-
# 测试正常值
|
127
|
-
bc = self.Barcode("123456789")
|
128
|
-
try:
|
129
|
-
str_data = bc.toStr()
|
130
|
-
self.assertIsInstance(str_data, str)
|
131
|
-
|
132
|
-
# 如果成功,应该是base64格式
|
133
|
-
if not str_data.startswith("ERROR:"):
|
134
|
-
self.assertTrue(str_data.startswith("<image:"))
|
135
|
-
self.assertTrue(str_data.endswith(">"))
|
136
|
-
|
137
|
-
# 提取base64部分
|
138
|
-
base64_part = str_data[7:-1] # 去掉 "<image:" 和 ">"
|
139
|
-
# 验证是否为有效的base64
|
140
|
-
base64.b64decode(base64_part)
|
141
|
-
except Exception as e:
|
142
|
-
self.skipTest(f"条形码字符串生成失败: {str(e)}")
|
143
|
-
|
144
|
-
# 测试空值
|
145
|
-
bc_empty = self.Barcode("")
|
146
|
-
result = bc_empty.toStr()
|
147
|
-
self.assertEqual(result, "")
|
148
|
-
|
149
|
-
def test_barcode_invalid_data(self):
|
150
|
-
"""测试条形码无效数据处理"""
|
151
|
-
if not self.barcode_available:
|
152
|
-
self.skipTest(f"条形码模块导入失败: {self.import_error}")
|
153
|
-
|
154
|
-
# 测试可能导致错误的数据
|
155
|
-
bc = self.Barcode("invalid_barcode_data!@#$%^&*()")
|
156
|
-
try:
|
157
|
-
result = bc.toStr()
|
158
|
-
# 如果出错,应该返回ERROR:开头的字符串
|
159
|
-
if result.startswith("ERROR:"):
|
160
|
-
self.assertIn("ERROR:", result)
|
161
|
-
else:
|
162
|
-
# 如果没出错,应该是正常的base64格式
|
163
|
-
self.assertTrue(result.startswith("<image:"))
|
164
|
-
except Exception as e:
|
165
|
-
self.skipTest(f"条形码错误处理测试失败: {str(e)}")
|
166
|
-
|
167
|
-
def test_barcode_str_method(self):
|
168
|
-
"""测试条形码__str__方法"""
|
169
|
-
if not self.barcode_available:
|
170
|
-
self.skipTest(f"条形码模块导入失败: {self.import_error}")
|
171
|
-
|
172
|
-
bc = self.Barcode("123456789")
|
173
|
-
try:
|
174
|
-
str_result = str(bc)
|
175
|
-
expected = bc.toStr()
|
176
|
-
self.assertEqual(str_result, expected)
|
177
|
-
except Exception as e:
|
178
|
-
self.skipTest(f"条形码__str__方法失败: {str(e)}")
|
179
|
-
|
180
|
-
|
181
|
-
if __name__ == '__main__':
|
182
|
-
unittest.main()
|
tests/test_string_utils.py
DELETED
@@ -1,174 +0,0 @@
|
|
1
|
-
# -*-coding:utf-8-*-
|
2
|
-
"""
|
3
|
-
测试字符串工具模块
|
4
|
-
"""
|
5
|
-
import unittest
|
6
|
-
import re
|
7
|
-
import os
|
8
|
-
import tempfile
|
9
|
-
from jit_utils.string import (
|
10
|
-
randomString, randomNum, getUuidStr, md5Bytes, md5Str,
|
11
|
-
lowercase, capitalize, getFileMd5, getRandomField, getRandom,
|
12
|
-
genrSublist, renderTemplateString
|
13
|
-
)
|
14
|
-
|
15
|
-
|
16
|
-
class TestStringUtils(unittest.TestCase):
|
17
|
-
"""字符串工具测试类"""
|
18
|
-
|
19
|
-
def test_randomString(self):
|
20
|
-
"""测试随机字符串生成"""
|
21
|
-
# 测试默认长度
|
22
|
-
result = randomString()
|
23
|
-
self.assertEqual(len(result), 8)
|
24
|
-
self.assertTrue(result.isalnum())
|
25
|
-
|
26
|
-
# 测试自定义长度
|
27
|
-
result = randomString(12)
|
28
|
-
self.assertEqual(len(result), 12)
|
29
|
-
self.assertTrue(result.isalnum())
|
30
|
-
|
31
|
-
# 测试两次生成的结果不同(概率很高)
|
32
|
-
result1 = randomString(20)
|
33
|
-
result2 = randomString(20)
|
34
|
-
self.assertNotEqual(result1, result2)
|
35
|
-
|
36
|
-
def test_randomNum(self):
|
37
|
-
"""测试随机数字生成"""
|
38
|
-
# 测试默认6位数字
|
39
|
-
result = randomNum()
|
40
|
-
self.assertEqual(len(result), 6)
|
41
|
-
self.assertTrue(result.isdigit())
|
42
|
-
|
43
|
-
# 测试自定义位数
|
44
|
-
result = randomNum(4)
|
45
|
-
self.assertEqual(len(result), 4)
|
46
|
-
self.assertTrue(result.isdigit())
|
47
|
-
|
48
|
-
# 测试两次生成的结果不同(概率很高)
|
49
|
-
result1 = randomNum(8)
|
50
|
-
result2 = randomNum(8)
|
51
|
-
self.assertNotEqual(result1, result2)
|
52
|
-
|
53
|
-
def test_getUuidStr(self):
|
54
|
-
"""测试UUID字符串生成"""
|
55
|
-
result = getUuidStr()
|
56
|
-
# UUID去掉连字符后应该是32位十六进制字符串
|
57
|
-
self.assertEqual(len(result), 32)
|
58
|
-
self.assertTrue(re.match(r'^[a-f0-9]{32}$', result))
|
59
|
-
|
60
|
-
# 测试两次生成的UUID不同
|
61
|
-
result1 = getUuidStr()
|
62
|
-
result2 = getUuidStr()
|
63
|
-
self.assertNotEqual(result1, result2)
|
64
|
-
|
65
|
-
def test_md5Bytes(self):
|
66
|
-
"""测试字节数据MD5加密"""
|
67
|
-
test_data = b"hello world"
|
68
|
-
result = md5Bytes(test_data)
|
69
|
-
expected = "5eb63bbbe01eeed093cb22bb8f5acdc3"
|
70
|
-
self.assertEqual(result, expected)
|
71
|
-
|
72
|
-
# 测试空字节
|
73
|
-
result = md5Bytes(b"")
|
74
|
-
expected = "d41d8cd98f00b204e9800998ecf8427e"
|
75
|
-
self.assertEqual(result, expected)
|
76
|
-
|
77
|
-
def test_md5Str(self):
|
78
|
-
"""测试字符串MD5加密"""
|
79
|
-
test_str = "hello world"
|
80
|
-
result = md5Str(test_str)
|
81
|
-
expected = "5eb63bbbe01eeed093cb22bb8f5acdc3"
|
82
|
-
self.assertEqual(result, expected)
|
83
|
-
|
84
|
-
# 测试不同编码
|
85
|
-
result = md5Str("你好", "utf-8")
|
86
|
-
self.assertEqual(len(result), 32)
|
87
|
-
self.assertTrue(re.match(r'^[a-f0-9]{32}$', result))
|
88
|
-
|
89
|
-
def test_lowercase(self):
|
90
|
-
"""测试首字母小写"""
|
91
|
-
self.assertEqual(lowercase("Hello"), "hello")
|
92
|
-
self.assertEqual(lowercase("WORLD"), "wORLD")
|
93
|
-
self.assertEqual(lowercase("a"), "a")
|
94
|
-
self.assertEqual(lowercase(""), "")
|
95
|
-
|
96
|
-
def test_capitalize(self):
|
97
|
-
"""测试首字母大写"""
|
98
|
-
self.assertEqual(capitalize("hello"), "Hello")
|
99
|
-
self.assertEqual(capitalize("world"), "World")
|
100
|
-
self.assertEqual(capitalize("A"), "A")
|
101
|
-
self.assertEqual(capitalize(""), "")
|
102
|
-
|
103
|
-
def test_getFileMd5(self):
|
104
|
-
"""测试文件MD5计算"""
|
105
|
-
# 创建临时文件
|
106
|
-
with tempfile.NamedTemporaryFile(mode='w', delete=False) as f:
|
107
|
-
f.write("hello world")
|
108
|
-
temp_file = f.name
|
109
|
-
|
110
|
-
try:
|
111
|
-
result = getFileMd5(temp_file)
|
112
|
-
expected = "5eb63bbbe01eeed093cb22bb8f5acdc3"
|
113
|
-
self.assertEqual(result, expected)
|
114
|
-
finally:
|
115
|
-
os.unlink(temp_file)
|
116
|
-
|
117
|
-
# 测试不存在的文件
|
118
|
-
result = getFileMd5("non_existent_file.txt")
|
119
|
-
self.assertIsNone(result)
|
120
|
-
|
121
|
-
def test_getRandomField(self):
|
122
|
-
"""测试随机字段名生成"""
|
123
|
-
result = getRandomField()
|
124
|
-
self.assertTrue(result.startswith("fk"))
|
125
|
-
self.assertEqual(len(result), 6) # "fk" + 4个字符
|
126
|
-
|
127
|
-
result = getRandomField(6)
|
128
|
-
self.assertTrue(result.startswith("fk"))
|
129
|
-
self.assertEqual(len(result), 8) # "fk" + 6个字符
|
130
|
-
|
131
|
-
def test_getRandom(self):
|
132
|
-
"""测试随机字符串生成(小写字母+数字)"""
|
133
|
-
result = getRandom()
|
134
|
-
self.assertEqual(len(result), 8)
|
135
|
-
self.assertTrue(re.match(r'^[a-z0-9]+$', result))
|
136
|
-
|
137
|
-
result = getRandom(12)
|
138
|
-
self.assertEqual(len(result), 12)
|
139
|
-
self.assertTrue(re.match(r'^[a-z0-9]+$', result))
|
140
|
-
|
141
|
-
def test_genrSublist(self):
|
142
|
-
"""测试列表分割"""
|
143
|
-
test_list = list(range(10))
|
144
|
-
result = list(genrSublist(test_list, 3))
|
145
|
-
|
146
|
-
expected = [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]
|
147
|
-
self.assertEqual(result, expected)
|
148
|
-
|
149
|
-
# 测试整除的情况
|
150
|
-
test_list = list(range(9))
|
151
|
-
result = list(genrSublist(test_list, 3))
|
152
|
-
expected = [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
|
153
|
-
self.assertEqual(result, expected)
|
154
|
-
|
155
|
-
def test_renderTemplateString(self):
|
156
|
-
"""测试模板字符串渲染"""
|
157
|
-
template = "Hello {{name}}, you are {{age}} years old"
|
158
|
-
result = renderTemplateString(template, name="Alice", age=25)
|
159
|
-
expected = "Hello Alice, you are 25 years old"
|
160
|
-
self.assertEqual(result, expected)
|
161
|
-
|
162
|
-
# 测试缺失变量
|
163
|
-
result = renderTemplateString("Hello {{name}}", age=25)
|
164
|
-
expected = "Hello "
|
165
|
-
self.assertEqual(result, expected)
|
166
|
-
|
167
|
-
# 测试无变量
|
168
|
-
result = renderTemplateString("Hello World")
|
169
|
-
expected = "Hello World"
|
170
|
-
self.assertEqual(result, expected)
|
171
|
-
|
172
|
-
|
173
|
-
if __name__ == '__main__':
|
174
|
-
unittest.main()
|
tests/test_time_utils.py
DELETED
@@ -1,185 +0,0 @@
|
|
1
|
-
# -*-coding:utf-8-*-
|
2
|
-
"""
|
3
|
-
测试时间工具模块
|
4
|
-
"""
|
5
|
-
import unittest
|
6
|
-
import datetime
|
7
|
-
import time
|
8
|
-
from unittest.mock import patch
|
9
|
-
|
10
|
-
|
11
|
-
class TestTimeUtils(unittest.TestCase):
|
12
|
-
"""时间工具测试类"""
|
13
|
-
|
14
|
-
def setUp(self):
|
15
|
-
"""测试设置"""
|
16
|
-
# 由于时间模块可能有导包问题,我们使用try-except来导入
|
17
|
-
try:
|
18
|
-
from jit_utils.time import (
|
19
|
-
getTimestamp, timeStampToDateTime, strToTimestamp,
|
20
|
-
formatNow, datetime2string, string2datetime,
|
21
|
-
timestamp2date, timestamp2string, cmpTsSameDay
|
22
|
-
)
|
23
|
-
self.time_module_available = True
|
24
|
-
self.getTimestamp = getTimestamp
|
25
|
-
self.timeStampToDateTime = timeStampToDateTime
|
26
|
-
self.strToTimestamp = strToTimestamp
|
27
|
-
self.formatNow = formatNow
|
28
|
-
self.datetime2string = datetime2string
|
29
|
-
self.string2datetime = string2datetime
|
30
|
-
self.timestamp2date = timestamp2date
|
31
|
-
self.timestamp2string = timestamp2string
|
32
|
-
self.cmpTsSameDay = cmpTsSameDay
|
33
|
-
except ImportError as e:
|
34
|
-
self.time_module_available = False
|
35
|
-
self.import_error = str(e)
|
36
|
-
|
37
|
-
def test_getTimestamp(self):
|
38
|
-
"""测试获取时间戳"""
|
39
|
-
if not self.time_module_available:
|
40
|
-
self.skipTest(f"时间模块导入失败: {self.import_error}")
|
41
|
-
|
42
|
-
timestamp = self.getTimestamp()
|
43
|
-
self.assertIsInstance(timestamp, int)
|
44
|
-
# 时间戳应该是13位数字(毫秒级)
|
45
|
-
self.assertGreater(timestamp, 1000000000000)
|
46
|
-
self.assertLess(timestamp, 9999999999999)
|
47
|
-
|
48
|
-
def test_timeStampToDateTime(self):
|
49
|
-
"""测试时间戳转datetime"""
|
50
|
-
if not self.time_module_available:
|
51
|
-
self.skipTest(f"时间模块导入失败: {self.import_error}")
|
52
|
-
|
53
|
-
try:
|
54
|
-
# 测试秒级时间戳
|
55
|
-
timestamp_sec = 1640995200 # 2022-01-01 00:00:00
|
56
|
-
result = self.timeStampToDateTime(timestamp_sec)
|
57
|
-
self.assertIsInstance(result, datetime.datetime)
|
58
|
-
self.assertEqual(result.year, 2022)
|
59
|
-
self.assertEqual(result.month, 1)
|
60
|
-
self.assertEqual(result.day, 1)
|
61
|
-
|
62
|
-
# 测试毫秒级时间戳
|
63
|
-
timestamp_ms = 1640995200000
|
64
|
-
result = self.timeStampToDateTime(timestamp_ms)
|
65
|
-
self.assertIsInstance(result, datetime.datetime)
|
66
|
-
self.assertEqual(result.year, 2022)
|
67
|
-
except Exception as e:
|
68
|
-
self.skipTest(f"时间戳转换函数出错: {str(e)}")
|
69
|
-
|
70
|
-
def test_formatNow(self):
|
71
|
-
"""测试格式化当前时间"""
|
72
|
-
if not self.time_module_available:
|
73
|
-
self.skipTest(f"时间模块导入失败: {self.import_error}")
|
74
|
-
|
75
|
-
# 测试默认格式
|
76
|
-
result = self.formatNow()
|
77
|
-
self.assertIsInstance(result, str)
|
78
|
-
# 应该匹配 YYYY-MM-DD 格式
|
79
|
-
import re
|
80
|
-
self.assertTrue(re.match(r'^\d{4}-\d{2}-\d{2}$', result))
|
81
|
-
|
82
|
-
# 测试自定义格式
|
83
|
-
result = self.formatNow("%Y%m%d")
|
84
|
-
self.assertTrue(re.match(r'^\d{8}$', result))
|
85
|
-
|
86
|
-
def test_datetime2string(self):
|
87
|
-
"""测试datetime转字符串"""
|
88
|
-
if not self.time_module_available:
|
89
|
-
self.skipTest(f"时间模块导入失败: {self.import_error}")
|
90
|
-
|
91
|
-
# 测试正常的datetime对象
|
92
|
-
dt = datetime.datetime(2022, 1, 1, 12, 30, 45)
|
93
|
-
result = self.datetime2string(dt)
|
94
|
-
expected = "2022-01-01"
|
95
|
-
self.assertEqual(result, expected)
|
96
|
-
|
97
|
-
# 测试自定义格式
|
98
|
-
result = self.datetime2string(dt, "%Y-%m-%d %H:%M:%S")
|
99
|
-
expected = "2022-01-01 12:30:45"
|
100
|
-
self.assertEqual(result, expected)
|
101
|
-
|
102
|
-
# 测试非datetime对象
|
103
|
-
result = self.datetime2string("not_datetime")
|
104
|
-
self.assertEqual(result, "")
|
105
|
-
|
106
|
-
def test_string2datetime(self):
|
107
|
-
"""测试字符串转datetime"""
|
108
|
-
if not self.time_module_available:
|
109
|
-
self.skipTest(f"时间模块导入失败: {self.import_error}")
|
110
|
-
|
111
|
-
# 测试默认格式
|
112
|
-
date_str = "2022-01-01"
|
113
|
-
result = self.string2datetime(date_str)
|
114
|
-
self.assertIsInstance(result, datetime.datetime)
|
115
|
-
self.assertEqual(result.year, 2022)
|
116
|
-
self.assertEqual(result.month, 1)
|
117
|
-
self.assertEqual(result.day, 1)
|
118
|
-
|
119
|
-
# 测试自定义格式
|
120
|
-
date_str = "01/01/2022"
|
121
|
-
result = self.string2datetime(date_str, "%m/%d/%Y")
|
122
|
-
self.assertIsInstance(result, datetime.datetime)
|
123
|
-
self.assertEqual(result.year, 2022)
|
124
|
-
|
125
|
-
def test_timestamp2date(self):
|
126
|
-
"""测试时间戳转日期字符串"""
|
127
|
-
if not self.time_module_available:
|
128
|
-
self.skipTest(f"时间模块导入失败: {self.import_error}")
|
129
|
-
|
130
|
-
timestamp = 1640995200 # 2022-01-01 00:00:00
|
131
|
-
result = self.timestamp2date(timestamp)
|
132
|
-
self.assertEqual(result, "2022-01-01")
|
133
|
-
|
134
|
-
def test_timestamp2string(self):
|
135
|
-
"""测试时间戳转格式化字符串"""
|
136
|
-
if not self.time_module_available:
|
137
|
-
self.skipTest(f"时间模块导入失败: {self.import_error}")
|
138
|
-
|
139
|
-
timestamp = 1640995200000 # 毫秒级时间戳
|
140
|
-
result = self.timestamp2string(timestamp)
|
141
|
-
self.assertIsInstance(result, str)
|
142
|
-
# 应该包含日期和时间
|
143
|
-
self.assertIn("2022-01-01", result)
|
144
|
-
|
145
|
-
# 测试自定义格式
|
146
|
-
result = self.timestamp2string(timestamp, "%Y%m%d")
|
147
|
-
self.assertEqual(result, "20220101")
|
148
|
-
|
149
|
-
def test_cmpTsSameDay(self):
|
150
|
-
"""测试比较两个时间戳是否同一天"""
|
151
|
-
if not self.time_module_available:
|
152
|
-
self.skipTest(f"时间模块导入失败: {self.import_error}")
|
153
|
-
|
154
|
-
# 同一天的不同时间
|
155
|
-
ts1 = 1640995200000 # 2022-01-01 00:00:00
|
156
|
-
ts2 = 1641038400000 # 2022-01-01 12:00:00
|
157
|
-
result = self.cmpTsSameDay(ts1, ts2)
|
158
|
-
self.assertTrue(result)
|
159
|
-
|
160
|
-
# 不同天
|
161
|
-
ts3 = 1641081600000 # 2022-01-02 00:00:00
|
162
|
-
result = self.cmpTsSameDay(ts1, ts3)
|
163
|
-
self.assertFalse(result)
|
164
|
-
|
165
|
-
def test_basic_time_functions(self):
|
166
|
-
"""测试基本时间函数(不依赖外部导入)"""
|
167
|
-
# 这些测试直接使用Python标准库,不依赖可能有问题的导入
|
168
|
-
|
169
|
-
# 测试当前时间戳
|
170
|
-
now_ts = int(time.time() * 1000)
|
171
|
-
self.assertIsInstance(now_ts, int)
|
172
|
-
self.assertGreater(now_ts, 1000000000000)
|
173
|
-
|
174
|
-
# 测试datetime操作
|
175
|
-
now_dt = datetime.datetime.now()
|
176
|
-
formatted = now_dt.strftime("%Y-%m-%d")
|
177
|
-
self.assertIsInstance(formatted, str)
|
178
|
-
|
179
|
-
# 测试日期计算
|
180
|
-
tomorrow = now_dt + datetime.timedelta(days=1)
|
181
|
-
self.assertGreater(tomorrow, now_dt)
|
182
|
-
|
183
|
-
|
184
|
-
if __name__ == '__main__':
|
185
|
-
unittest.main()
|
File without changes
|