⬆️ 升级至 NoneBug 0.3

* 🚧 第一次尝试 50/82

* 62/82 调整了清除数据库的位置

* 🚧 pytest-mock

* 🚧 fix test_send

* 🚧 intruduce app request

* 🚧 close and remove tinydb after each test

* 🚧 clean ScheduleTimeWeight table

* 🚧 reload http module to test proxy

*  合并 main 的代码

* 🚧 在每次测试结束后关闭browser

* 🧑‍💻 在mcbbsnews渲染异常时添加logger

---------

Co-authored-by: hemengyang <hmy0119@gmail.com>
Co-authored-by: Azide <rukuy@qq.com>
This commit is contained in:
felinae98 2023-03-03 15:12:25 +08:00 committed by GitHub
parent bc521cd38a
commit 0201d5b316
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 258 additions and 171 deletions

221
poetry.lock generated
View File

@ -421,63 +421,63 @@ files = [
[[package]] [[package]]
name = "coverage" name = "coverage"
version = "7.1.0" version = "7.2.1"
description = "Code coverage measurement for Python" description = "Code coverage measurement for Python"
category = "dev" category = "dev"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "coverage-7.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3b946bbcd5a8231383450b195cfb58cb01cbe7f8949f5758566b881df4b33baf"}, {file = "coverage-7.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49567ec91fc5e0b15356da07a2feabb421d62f52a9fff4b1ec40e9e19772f5f8"},
{file = "coverage-7.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ec8e767f13be637d056f7e07e61d089e555f719b387a7070154ad80a0ff31801"}, {file = "coverage-7.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d2ef6cae70168815ed91388948b5f4fcc69681480a0061114db737f957719f03"},
{file = "coverage-7.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4a5a5879a939cb84959d86869132b00176197ca561c664fc21478c1eee60d75"}, {file = "coverage-7.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3004765bca3acd9e015794e5c2f0c9a05587f5e698127ff95e9cfba0d3f29339"},
{file = "coverage-7.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b643cb30821e7570c0aaf54feaf0bfb630b79059f85741843e9dc23f33aaca2c"}, {file = "coverage-7.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cca7c0b7f5881dfe0291ef09ba7bb1582cb92ab0aeffd8afb00c700bf692415a"},
{file = "coverage-7.1.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32df215215f3af2c1617a55dbdfb403b772d463d54d219985ac7cd3bf124cada"}, {file = "coverage-7.2.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2167d116309f564af56f9aa5e75ef710ef871c5f9b313a83050035097b56820"},
{file = "coverage-7.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:33d1ae9d4079e05ac4cc1ef9e20c648f5afabf1a92adfaf2ccf509c50b85717f"}, {file = "coverage-7.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cb5f152fb14857cbe7f3e8c9a5d98979c4c66319a33cad6e617f0067c9accdc4"},
{file = "coverage-7.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:29571503c37f2ef2138a306d23e7270687c0efb9cab4bd8038d609b5c2393a3a"}, {file = "coverage-7.2.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:87dc37f16fb5e3a28429e094145bf7c1753e32bb50f662722e378c5851f7fdc6"},
{file = "coverage-7.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:63ffd21aa133ff48c4dff7adcc46b7ec8b565491bfc371212122dd999812ea1c"}, {file = "coverage-7.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e191a63a05851f8bce77bc875e75457f9b01d42843f8bd7feed2fc26bbe60833"},
{file = "coverage-7.1.0-cp310-cp310-win32.whl", hash = "sha256:4b14d5e09c656de5038a3f9bfe5228f53439282abcab87317c9f7f1acb280352"}, {file = "coverage-7.2.1-cp310-cp310-win32.whl", hash = "sha256:e3ea04b23b114572b98a88c85379e9e9ae031272ba1fb9b532aa934c621626d4"},
{file = "coverage-7.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:8361be1c2c073919500b6601220a6f2f98ea0b6d2fec5014c1d9cfa23dd07038"}, {file = "coverage-7.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:0cf557827be7eca1c38a2480484d706693e7bb1929e129785fe59ec155a59de6"},
{file = "coverage-7.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:da9b41d4539eefd408c46725fb76ecba3a50a3367cafb7dea5f250d0653c1040"}, {file = "coverage-7.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:570c21a29493b350f591a4b04c158ce1601e8d18bdcd21db136fbb135d75efa6"},
{file = "coverage-7.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c5b15ed7644ae4bee0ecf74fee95808dcc34ba6ace87e8dfbf5cb0dc20eab45a"}, {file = "coverage-7.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e872b082b32065ac2834149dc0adc2a2e6d8203080501e1e3c3c77851b466f9"},
{file = "coverage-7.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d12d076582507ea460ea2a89a8c85cb558f83406c8a41dd641d7be9a32e1274f"}, {file = "coverage-7.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fac6343bae03b176e9b58104a9810df3cdccd5cfed19f99adfa807ffbf43cf9b"},
{file = "coverage-7.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2617759031dae1bf183c16cef8fcfb3de7617f394c813fa5e8e46e9b82d4222"}, {file = "coverage-7.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abacd0a738e71b20e224861bc87e819ef46fedba2fb01bc1af83dfd122e9c319"},
{file = "coverage-7.1.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4e4881fa9e9667afcc742f0c244d9364d197490fbc91d12ac3b5de0bf2df146"}, {file = "coverage-7.2.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9256d4c60c4bbfec92721b51579c50f9e5062c21c12bec56b55292464873508"},
{file = "coverage-7.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9d58885215094ab4a86a6aef044e42994a2bd76a446dc59b352622655ba6621b"}, {file = "coverage-7.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:80559eaf6c15ce3da10edb7977a1548b393db36cbc6cf417633eca05d84dd1ed"},
{file = "coverage-7.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ffeeb38ee4a80a30a6877c5c4c359e5498eec095878f1581453202bfacc8fbc2"}, {file = "coverage-7.2.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0bd7e628f6c3ec4e7d2d24ec0e50aae4e5ae95ea644e849d92ae4805650b4c4e"},
{file = "coverage-7.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3baf5f126f30781b5e93dbefcc8271cb2491647f8283f20ac54d12161dff080e"}, {file = "coverage-7.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:09643fb0df8e29f7417adc3f40aaf379d071ee8f0350ab290517c7004f05360b"},
{file = "coverage-7.1.0-cp311-cp311-win32.whl", hash = "sha256:ded59300d6330be27bc6cf0b74b89ada58069ced87c48eaf9344e5e84b0072f7"}, {file = "coverage-7.2.1-cp311-cp311-win32.whl", hash = "sha256:1b7fb13850ecb29b62a447ac3516c777b0e7a09ecb0f4bb6718a8654c87dfc80"},
{file = "coverage-7.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:6a43c7823cd7427b4ed763aa7fb63901ca8288591323b58c9cd6ec31ad910f3c"}, {file = "coverage-7.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:617a94ada56bbfe547aa8d1b1a2b8299e2ec1ba14aac1d4b26a9f7d6158e1273"},
{file = "coverage-7.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7a726d742816cb3a8973c8c9a97539c734b3a309345236cd533c4883dda05b8d"}, {file = "coverage-7.2.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8649371570551d2fd7dee22cfbf0b61f1747cdfb2b7587bb551e4beaaa44cb97"},
{file = "coverage-7.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc7c85a150501286f8b56bd8ed3aa4093f4b88fb68c0843d21ff9656f0009d6a"}, {file = "coverage-7.2.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d2b9b5e70a21474c105a133ba227c61bc95f2ac3b66861143ce39a5ea4b3f84"},
{file = "coverage-7.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5b4198d85a3755d27e64c52f8c95d6333119e49fd001ae5798dac872c95e0f8"}, {file = "coverage-7.2.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae82c988954722fa07ec5045c57b6d55bc1a0890defb57cf4a712ced65b26ddd"},
{file = "coverage-7.1.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddb726cb861c3117a553f940372a495fe1078249ff5f8a5478c0576c7be12050"}, {file = "coverage-7.2.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:861cc85dfbf55a7a768443d90a07e0ac5207704a9f97a8eb753292a7fcbdfcfc"},
{file = "coverage-7.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:51b236e764840a6df0661b67e50697aaa0e7d4124ca95e5058fa3d7cbc240b7c"}, {file = "coverage-7.2.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0339dc3237c0d31c3b574f19c57985fcbe494280153bbcad33f2cdf469f4ac3e"},
{file = "coverage-7.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7ee5c9bb51695f80878faaa5598040dd6c9e172ddcf490382e8aedb8ec3fec8d"}, {file = "coverage-7.2.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5928b85416a388dd557ddc006425b0c37e8468bd1c3dc118c1a3de42f59e2a54"},
{file = "coverage-7.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c31b75ae466c053a98bf26843563b3b3517b8f37da4d47b1c582fdc703112bc3"}, {file = "coverage-7.2.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8d3843ca645f62c426c3d272902b9de90558e9886f15ddf5efe757b12dd376f5"},
{file = "coverage-7.1.0-cp37-cp37m-win32.whl", hash = "sha256:3b155caf3760408d1cb903b21e6a97ad4e2bdad43cbc265e3ce0afb8e0057e73"}, {file = "coverage-7.2.1-cp37-cp37m-win32.whl", hash = "sha256:6a034480e9ebd4e83d1aa0453fd78986414b5d237aea89a8fdc35d330aa13bae"},
{file = "coverage-7.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2a60d6513781e87047c3e630b33b4d1e89f39836dac6e069ffee28c4786715f5"}, {file = "coverage-7.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6fce673f79a0e017a4dc35e18dc7bb90bf6d307c67a11ad5e61ca8d42b87cbff"},
{file = "coverage-7.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2cba5c6db29ce991029b5e4ac51eb36774458f0a3b8d3137241b32d1bb91f06"}, {file = "coverage-7.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7f099da6958ddfa2ed84bddea7515cb248583292e16bb9231d151cd528eab657"},
{file = "coverage-7.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:beeb129cacea34490ffd4d6153af70509aa3cda20fdda2ea1a2be870dfec8d52"}, {file = "coverage-7.2.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:97a3189e019d27e914ecf5c5247ea9f13261d22c3bb0cfcfd2a9b179bb36f8b1"},
{file = "coverage-7.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c45948f613d5d18c9ec5eaa203ce06a653334cf1bd47c783a12d0dd4fd9c851"}, {file = "coverage-7.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a81dbcf6c6c877986083d00b834ac1e84b375220207a059ad45d12f6e518a4e3"},
{file = "coverage-7.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef382417db92ba23dfb5864a3fc9be27ea4894e86620d342a116b243ade5d35d"}, {file = "coverage-7.2.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d2c3dde4c0b9be4b02067185136b7ee4681978228ad5ec1278fa74f5ca3e99"},
{file = "coverage-7.1.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c7c0d0827e853315c9bbd43c1162c006dd808dbbe297db7ae66cd17b07830f0"}, {file = "coverage-7.2.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a209d512d157379cc9ab697cbdbb4cfd18daa3e7eebaa84c3d20b6af0037384"},
{file = "coverage-7.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e5cdbb5cafcedea04924568d990e20ce7f1945a1dd54b560f879ee2d57226912"}, {file = "coverage-7.2.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f3d07edb912a978915576a776756069dede66d012baa503022d3a0adba1b6afa"},
{file = "coverage-7.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9817733f0d3ea91bea80de0f79ef971ae94f81ca52f9b66500c6a2fea8e4b4f8"}, {file = "coverage-7.2.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8dca3c1706670297851bca1acff9618455122246bdae623be31eca744ade05ec"},
{file = "coverage-7.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:218fe982371ac7387304153ecd51205f14e9d731b34fb0568181abaf7b443ba0"}, {file = "coverage-7.2.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b1991a6d64231a3e5bbe3099fb0dd7c9aeaa4275ad0e0aeff4cb9ef885c62ba2"},
{file = "coverage-7.1.0-cp38-cp38-win32.whl", hash = "sha256:04481245ef966fbd24ae9b9e537ce899ae584d521dfbe78f89cad003c38ca2ab"}, {file = "coverage-7.2.1-cp38-cp38-win32.whl", hash = "sha256:22c308bc508372576ffa3d2dbc4824bb70d28eeb4fcd79d4d1aed663a06630d0"},
{file = "coverage-7.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:8ae125d1134bf236acba8b83e74c603d1b30e207266121e76484562bc816344c"}, {file = "coverage-7.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:b0c0d46de5dd97f6c2d1b560bf0fcf0215658097b604f1840365296302a9d1fb"},
{file = "coverage-7.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2bf1d5f2084c3932b56b962a683074a3692bce7cabd3aa023c987a2a8e7612f6"}, {file = "coverage-7.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4dd34a935de268a133e4741827ae951283a28c0125ddcdbcbba41c4b98f2dfef"},
{file = "coverage-7.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:98b85dd86514d889a2e3dd22ab3c18c9d0019e696478391d86708b805f4ea0fa"}, {file = "coverage-7.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0f8318ed0f3c376cfad8d3520f496946977abde080439d6689d7799791457454"},
{file = "coverage-7.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38da2db80cc505a611938d8624801158e409928b136c8916cd2e203970dde4dc"}, {file = "coverage-7.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:834c2172edff5a08d78e2f53cf5e7164aacabeb66b369f76e7bb367ca4e2d993"},
{file = "coverage-7.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3164d31078fa9efe406e198aecd2a02d32a62fecbdef74f76dad6a46c7e48311"}, {file = "coverage-7.2.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4d70c853f0546855f027890b77854508bdb4d6a81242a9d804482e667fff6e6"},
{file = "coverage-7.1.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db61a79c07331e88b9a9974815c075fbd812bc9dbc4dc44b366b5368a2936063"}, {file = "coverage-7.2.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a6450da4c7afc4534305b2b7d8650131e130610cea448ff240b6ab73d7eab63"},
{file = "coverage-7.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ccb092c9ede70b2517a57382a601619d20981f56f440eae7e4d7eaafd1d1d09"}, {file = "coverage-7.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:99f4dd81b2bb8fc67c3da68b1f5ee1650aca06faa585cbc6818dbf67893c6d58"},
{file = "coverage-7.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:33ff26d0f6cc3ca8de13d14fde1ff8efe1456b53e3f0273e63cc8b3c84a063d8"}, {file = "coverage-7.2.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bdd3f2f285ddcf2e75174248b2406189261a79e7fedee2ceeadc76219b6faa0e"},
{file = "coverage-7.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d47dd659a4ee952e90dc56c97d78132573dc5c7b09d61b416a9deef4ebe01a0c"}, {file = "coverage-7.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f29351393eb05e6326f044a7b45ed8e38cb4dcc38570d12791f271399dc41431"},
{file = "coverage-7.1.0-cp39-cp39-win32.whl", hash = "sha256:d248cd4a92065a4d4543b8331660121b31c4148dd00a691bfb7a5cdc7483cfa4"}, {file = "coverage-7.2.1-cp39-cp39-win32.whl", hash = "sha256:e2b50ebc2b6121edf352336d503357321b9d8738bb7a72d06fc56153fd3f4cd8"},
{file = "coverage-7.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:7ed681b0f8e8bcbbffa58ba26fcf5dbc8f79e7997595bf071ed5430d8c08d6f3"}, {file = "coverage-7.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:bd5a12239c0006252244f94863f1c518ac256160cd316ea5c47fb1a11b25889a"},
{file = "coverage-7.1.0-pp37.pp38.pp39-none-any.whl", hash = "sha256:755e89e32376c850f826c425ece2c35a4fc266c081490eb0a841e7c1cb0d3bda"}, {file = "coverage-7.2.1-pp37.pp38.pp39-none-any.whl", hash = "sha256:436313d129db7cf5b4ac355dd2bd3f7c7e5294af077b090b85de75f8458b8616"},
{file = "coverage-7.1.0.tar.gz", hash = "sha256:10188fe543560ec4874f974b5305cd1a8bdcfa885ee00ea3a03733464c4ca265"}, {file = "coverage-7.2.1.tar.gz", hash = "sha256:c77f2a9093ccf329dd523a9b2b3c854c20d2a3d968b6def3b820272ca6732242"},
] ]
[package.dependencies] [package.dependencies]
@ -905,14 +905,14 @@ tomli = {version = "*", markers = "python_version > \"3.6\" and python_version <
[[package]] [[package]]
name = "ipython" name = "ipython"
version = "8.10.0" version = "8.11.0"
description = "IPython: Productive Interactive Computing" description = "IPython: Productive Interactive Computing"
category = "dev" category = "dev"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "ipython-8.10.0-py3-none-any.whl", hash = "sha256:b38c31e8fc7eff642fc7c597061fff462537cf2314e3225a19c906b7b0d8a345"}, {file = "ipython-8.11.0-py3-none-any.whl", hash = "sha256:5b54478e459155a326bf5f42ee4f29df76258c0279c36f21d71ddb560f88b156"},
{file = "ipython-8.10.0.tar.gz", hash = "sha256:b13a1d6c1f5818bd388db53b7107d17454129a70de2b87481d555daede5eb49e"}, {file = "ipython-8.11.0.tar.gz", hash = "sha256:735cede4099dbc903ee540307b9171fbfef4aa75cfcacc5a273b2cda2f02be04"},
] ]
[package.dependencies] [package.dependencies]
@ -924,7 +924,7 @@ jedi = ">=0.16"
matplotlib-inline = "*" matplotlib-inline = "*"
pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""}
pickleshare = "*" pickleshare = "*"
prompt-toolkit = ">=3.0.30,<3.1.0" prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0"
pygments = ">=2.4.0" pygments = ">=2.4.0"
stack-data = "*" stack-data = "*"
traitlets = ">=5" traitlets = ">=5"
@ -1381,20 +1381,20 @@ nonebot2 = ">=2.0.0-rc.1,<3.0.0"
[[package]] [[package]]
name = "nonebot-plugin-datastore" name = "nonebot-plugin-datastore"
version = "0.5.8" version = "0.5.10"
description = "适用于 Nonebot2 的数据存储插件" description = "适用于 Nonebot2 的数据存储插件"
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.8,<4.0" python-versions = ">=3.8,<4.0"
files = [ files = [
{file = "nonebot_plugin_datastore-0.5.8-py3-none-any.whl", hash = "sha256:4a5635d2b5e6fc9646602b165f18661d4cb8b53e465b76fa30ed96a516cf4bf9"}, {file = "nonebot_plugin_datastore-0.5.10-py3-none-any.whl", hash = "sha256:123ca84efc5eec1fc3d5b34f36ba255c2e2ae11f860be95ee3191982a7e13377"},
{file = "nonebot_plugin_datastore-0.5.8.tar.gz", hash = "sha256:f71c1c185012c0ba0f2a3b3fd13f5814c84f8a08aaf81691ec550862d1d118d7"}, {file = "nonebot_plugin_datastore-0.5.10.tar.gz", hash = "sha256:3b40a53dd4c7a84d967031f782128b50353c4364febfadaf81cf152fc5f82353"},
] ]
[package.dependencies] [package.dependencies]
aiosqlite = ">=0.17,<0.19" aiosqlite = ">=0.17,<0.19"
alembic = ">=1.9.1,<2.0.0" alembic = ">=1.9.1,<2.0.0"
nonebot-plugin-localstore = ">=0.2.0,<0.3.0 || >0.3.0,<0.4.0" nonebot-plugin-localstore = ">=0.2.0,<0.3.0 || >0.3.0,<0.4.0 || >0.4.0,<0.5.0"
nonebot2 = {version = ">=2.0.0-rc.1,<3.0.0", extras = ["httpx"]} nonebot2 = {version = ">=2.0.0-rc.1,<3.0.0", extras = ["httpx"]}
sqlmodel = ">=0.0.8,<0.1.0" sqlmodel = ">=0.0.8,<0.1.0"
@ -1425,18 +1425,19 @@ python-markdown-math = ">=0.8"
[[package]] [[package]]
name = "nonebot-plugin-localstore" name = "nonebot-plugin-localstore"
version = "0.3.1" version = "0.4.1"
description = "Local Storage Support for NoneBot2" description = "Local Storage Support for NoneBot2"
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.8,<4.0" python-versions = ">=3.8,<4.0"
files = [ files = [
{file = "nonebot_plugin_localstore-0.3.1-py3-none-any.whl", hash = "sha256:5a03e731a354105741852121fa6fa30508ad9c1b93eb9f42f8ba02924128a985"}, {file = "nonebot_plugin_localstore-0.4.1-py3-none-any.whl", hash = "sha256:dea442fcf8baa5898c15ccea761703cdde46e6fc6bb1c886261b0ab793db8193"},
{file = "nonebot_plugin_localstore-0.3.1.tar.gz", hash = "sha256:fa332f5b887d8a77aaffc48a30e8f57a8c668bb761b678822f64075eec3dfa4e"}, {file = "nonebot_plugin_localstore-0.4.1.tar.gz", hash = "sha256:9b6dcb98f6a4e48c5c80b2319acc2e1c424462261a210491d437f5b96abb5d67"},
] ]
[package.dependencies] [package.dependencies]
nonebot2 = ">=2.0.0-rc.1,<3.0.0" nonebot2 = ">=2.0.0-rc.1,<3.0.0"
typing-extensions = ">=4.0.0"
[[package]] [[package]]
name = "nonebot2" name = "nonebot2"
@ -1471,22 +1472,26 @@ websockets = ["websockets (>=10.0,<11.0)"]
[[package]] [[package]]
name = "nonebug" name = "nonebug"
version = "0.2.3" version = "0.3.1"
description = "nonebot2 test framework" description = "nonebot2 test framework"
category = "dev" category = "dev"
optional = false optional = false
python-versions = ">=3.8,<4.0" python-versions = "^3.8"
files = [ files = []
{file = "nonebug-0.2.3-py3-none-any.whl", hash = "sha256:5c83bd885899b2857323fa19eff6bbc3f160729453b2f289d8305a99b7b95fc9"}, develop = false
{file = "nonebug-0.2.3.tar.gz", hash = "sha256:3e59757b32b6b96cd8c36c4c9fd6050e611b1ffad058ec5fa82cba3f86495c61"},
]
[package.dependencies] [package.dependencies]
asgiref = ">=3.4.0,<4.0.0" asgiref = "^3.4.0"
async-asgi-testclient = ">=1.4.8,<2.0.0" async-asgi-testclient = "^1.4.8"
nonebot2 = ">=2.0.0-beta.1,<3.0.0" nonebot2 = "^2.0.0-rc.2"
pytest = ">=7.0.0,<8.0.0" pytest = "^7.0.0"
typing-extensions = ">=4.0.0,<5.0.0" typing-extensions = "^4.0.0"
[package.source]
type = "git"
url = "https://github.com/nonebot/nonebug.git"
reference = "master"
resolved_reference = "026d0765124958739c0abf915db82cc75f0fb55c"
[[package]] [[package]]
name = "packaging" name = "packaging"
@ -1664,19 +1669,19 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2.1)", "pytes
[[package]] [[package]]
name = "playwright" name = "playwright"
version = "1.30.0" version = "1.31.1"
description = "A high-level API to automate web browsers" description = "A high-level API to automate web browsers"
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "playwright-1.30.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:2ea5d88880fbfa69f05ab758ddd66310079828d6c5c8efe497485c341d147a4e"}, {file = "playwright-1.31.1-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:225ff39ff29219caab242a562e6a5efa486d4659ac10d16421ad5904c7f23b25"},
{file = "playwright-1.30.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:228e07e1b2ef0790ec6d258897c50b83b0e8055b318fa2d33fcb86a8c5ba3525"}, {file = "playwright-1.31.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c51029b8837f3533277718ff003a6fc1b512e7879ef4880306c69048345d04ac"},
{file = "playwright-1.30.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:115f5d77a21597200428411186ec72e10fed1cc4d7de3e6e705c415b781d344a"}, {file = "playwright-1.31.1-py3-none-macosx_11_0_universal2.whl", hash = "sha256:d74ee6b7de96ddaf3af91a90d6160beda68b281b1027b8afec46945062c25aec"},
{file = "playwright-1.30.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:24bb8fe1d7ae60ec971668812c0c6c21b2b12d320ff24da59cbb544a6a15a53c"}, {file = "playwright-1.31.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:12c73e6a10ba8a1ddac4849a6f06c753e38de60bec6db5f50f7580ade5772d97"},
{file = "playwright-1.30.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62032a1da59524a7f8d8cb4ed998cf793310b67693d3df94d00ceb13b5a9eced"}, {file = "playwright-1.31.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f032c87b918a0b348b15065d5a67693cd70f39861ea65b8c9f0b63c991bf1a75"},
{file = "playwright-1.30.0-py3-none-win32.whl", hash = "sha256:07249da8375fa7d52cbcdbfc36f5773f91fa8305aa340215db173101d289e210"}, {file = "playwright-1.31.1-py3-none-win32.whl", hash = "sha256:5a3eefb7bbe5fb90c89b31ac52a6d78dde94cf82d5fbe0a999789a37d414a92f"},
{file = "playwright-1.30.0-py3-none-win_amd64.whl", hash = "sha256:198c1d816e802c4c9bc048232ec344f4bdfe3229e73a3a28a8eac33c46dab201"}, {file = "playwright-1.31.1-py3-none-win_amd64.whl", hash = "sha256:5cb681c1bfc05e49dfe5299b9bf2f51300e60ed077d47c927c8f056938972565"},
] ]
[package.dependencies] [package.dependencies]
@ -1720,14 +1725,14 @@ virtualenv = ">=20.10.0"
[[package]] [[package]]
name = "prompt-toolkit" name = "prompt-toolkit"
version = "3.0.36" version = "3.0.38"
description = "Library for building powerful interactive command lines in Python" description = "Library for building powerful interactive command lines in Python"
category = "dev" category = "dev"
optional = false optional = false
python-versions = ">=3.6.2" python-versions = ">=3.7.0"
files = [ files = [
{file = "prompt_toolkit-3.0.36-py3-none-any.whl", hash = "sha256:aa64ad242a462c5ff0363a7b9cfe696c20d55d9fc60c11fd8e632d064804d305"}, {file = "prompt_toolkit-3.0.38-py3-none-any.whl", hash = "sha256:45ea77a2f7c60418850331366c81cf6b5b9cf4c7fd34616f733c5427e6abbb1f"},
{file = "prompt_toolkit-3.0.36.tar.gz", hash = "sha256:3e163f254bef5a03b146397d7c1963bd3e2812f0964bb9a24e6ec761fd28db63"}, {file = "prompt_toolkit-3.0.38.tar.gz", hash = "sha256:23ac5d50538a9a38c8bde05fecb47d0b403ecd0662857a86f886f798563d5b9b"},
] ]
[package.dependencies] [package.dependencies]
@ -1952,15 +1957,33 @@ pytest = ">=4.6"
testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"]
[[package]] [[package]]
name = "python-dotenv" name = "pytest-mock"
version = "0.21.1" version = "3.10.0"
description = "Read key-value pairs from a .env file and set them as environment variables" description = "Thin-wrapper around the mock package for easier use with pytest"
category = "main" category = "dev"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "python-dotenv-0.21.1.tar.gz", hash = "sha256:1c93de8f636cde3ce377292818d0e440b6e45a82f215c3744979151fa8151c49"}, {file = "pytest-mock-3.10.0.tar.gz", hash = "sha256:fbbdb085ef7c252a326fd8cdcac0aa3b1333d8811f131bdcc701002e1be7ed4f"},
{file = "python_dotenv-0.21.1-py3-none-any.whl", hash = "sha256:41e12e0318bebc859fcc4d97d4db8d20ad21721a6aa5047dd59f090391cb549a"}, {file = "pytest_mock-3.10.0-py3-none-any.whl", hash = "sha256:f4c973eeae0282963eb293eb173ce91b091a79c1334455acfac9ddee8a1c784b"},
]
[package.dependencies]
pytest = ">=5.0"
[package.extras]
dev = ["pre-commit", "pytest-asyncio", "tox"]
[[package]]
name = "python-dotenv"
version = "1.0.0"
description = "Read key-value pairs from a .env file and set them as environment variables"
category = "main"
optional = false
python-versions = ">=3.8"
files = [
{file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"},
{file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"},
] ]
[package.extras] [package.extras]
@ -2151,14 +2174,14 @@ idna2008 = ["idna"]
[[package]] [[package]]
name = "setuptools" name = "setuptools"
version = "67.3.2" version = "67.4.0"
description = "Easily download, build, install, upgrade, and uninstall Python packages" description = "Easily download, build, install, upgrade, and uninstall Python packages"
category = "main" category = "main"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "setuptools-67.3.2-py3-none-any.whl", hash = "sha256:bb6d8e508de562768f2027902929f8523932fcd1fb784e6d573d2cafac995a48"}, {file = "setuptools-67.4.0-py3-none-any.whl", hash = "sha256:f106dee1b506dee5102cc3f3e9e68137bbad6d47b616be7991714b0c62204251"},
{file = "setuptools-67.3.2.tar.gz", hash = "sha256:95f00380ef2ffa41d9bba85d95b27689d923c93dfbafed4aecd7cf988a25e012"}, {file = "setuptools-67.4.0.tar.gz", hash = "sha256:e5fd0a713141a4a105412233c63dc4e17ba0090c8e8334594ac790ec97792330"},
] ]
[package.extras] [package.extras]
@ -2560,14 +2583,14 @@ test = ["Cython (>=0.29.32,<0.30.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "my
[[package]] [[package]]
name = "virtualenv" name = "virtualenv"
version = "20.19.0" version = "20.20.0"
description = "Virtual Python Environment builder" description = "Virtual Python Environment builder"
category = "dev" category = "dev"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "virtualenv-20.19.0-py3-none-any.whl", hash = "sha256:54eb59e7352b573aa04d53f80fc9736ed0ad5143af445a1e539aada6eb947dd1"}, {file = "virtualenv-20.20.0-py3-none-any.whl", hash = "sha256:3c22fa5a7c7aa106ced59934d2c20a2ecb7f49b4130b8bf444178a16b880fa45"},
{file = "virtualenv-20.19.0.tar.gz", hash = "sha256:37a640ba82ed40b226599c522d411e4be5edb339a0c0de030c0dc7b646d61590"}, {file = "virtualenv-20.20.0.tar.gz", hash = "sha256:a8a4b8ca1e28f864b7514a253f98c1d62b64e31e77325ba279248c65fb4fcef4"},
] ]
[package.dependencies] [package.dependencies]
@ -2807,4 +2830,4 @@ multidict = ">=4.0"
[metadata] [metadata]
lock-version = "2.0" lock-version = "2.0"
python-versions = ">=3.10,<4.0.0" python-versions = ">=3.10,<4.0.0"
content-hash = "15a585b44a2065b8e7faaa7215d525d839d67b3d349da69eaf84dec6c0ba68e3" content-hash = "1235a5dd8c759eeff697bcc5572ac8b83a3882636fafa943a3274914a7041060"

View File

@ -10,14 +10,14 @@ readme = "README.md"
packages = [{ include = "nonebot_bison", from = "./src/plugins/" }] packages = [{ include = "nonebot_bison", from = "./src/plugins/" }]
include = ["src/plugins/nonebot_bison/admin_page/dist/**/*"] include = ["src/plugins/nonebot_bison/admin_page/dist/**/*"]
classifiers = [ classifiers = [
"Development Status :: 4 - Beta", "Development Status :: 4 - Beta",
"Operating System :: POSIX :: Linux", "Operating System :: POSIX :: Linux",
"Operating System :: Microsoft :: Windows", "Operating System :: Microsoft :: Windows",
"Operating System :: MacOS", "Operating System :: MacOS",
"Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.11",
"Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: CPython",
"License :: OSI Approved :: MIT License", "License :: OSI Approved :: MIT License",
] ]
[tool.poetry.dependencies] [tool.poetry.dependencies]
@ -36,19 +36,20 @@ nonebot-plugin-htmlrender = ">=0.2.0"
nonebot-plugin-datastore = ">=0.5.8" nonebot-plugin-datastore = ">=0.5.8"
nonebot-plugin-apscheduler = "^0.2.0" nonebot-plugin-apscheduler = "^0.2.0"
[tool.poetry.dev-dependencies] [tool.poetry.group.dev.dependencies]
ipdb = "^0.13.4" ipdb = "^0.13.4"
pytest = "^7.0.1" pytest = "^7.0.1"
pytest-asyncio = "^0.18.1" pytest-asyncio = "^0.18.1"
respx = "^0.20.0" respx = "^0.20.0"
pytest-cov = "^3.0.0" pytest-cov = "^3.0.0"
nonebug = "^0.2.3"
black = "^22.1.0" black = "^22.1.0"
isort = "^5.10.1" isort = "^5.10.1"
pre-commit = "^2.17.0" pre-commit = "^2.17.0"
flaky = "^3.7.0" flaky = "^3.7.0"
sqlalchemy-stubs = "^0.4" sqlalchemy-stubs = "^0.4"
nonebot2 = { extras = ["fastapi"], version = ">=2.0.0-rc.2" } nonebot2 = { extras = ["fastapi"], version = ">=2.0.0-rc.2" }
pytest-mock = "^3.10.0"
nonebug = { git = "https://github.com/nonebot/nonebug.git", rev = "master" }
[build-system] [build-system]
requires = ["poetry>=0.12"] requires = ["poetry>=0.12"]
@ -56,9 +57,9 @@ build-backend = "poetry.masonry.api"
[tool.pytest.ini_options] [tool.pytest.ini_options]
markers = [ markers = [
"compare: compare fetching result with rsshub", "compare: compare fetching result with rsshub",
"render: render img by chrome", "render: render img by chrome",
"external: use external resources", "external: use external resources",
] ]
asyncio_mode = "auto" asyncio_mode = "auto"
@ -76,3 +77,14 @@ skip_gitignore = true
[tool.nonebot] [tool.nonebot]
plugins = ["src.plugins.nonebot_bison"] plugins = ["src.plugins.nonebot_bison"]
[tool.pyright]
pythonVersion = "3.10"
pythonPlatform = "All"
executionEnvironments = [
{ root = "./tests", extraPaths = [
"./",
"./src/plugins/",
] },
{ root = "./" },
]

View File

@ -1,13 +1,12 @@
import re import re
import time import time
import traceback import traceback
from typing import Literal
from bs4 import BeautifulSoup, Tag from bs4 import BeautifulSoup, Tag
from httpx import AsyncClient from httpx import AsyncClient
from nonebot.log import logger
from nonebot.plugin import require from nonebot.plugin import require
from ..plugin_config import plugin_config
from ..post import Post from ..post import Post
from ..types import Category, RawPost, Target from ..types import Category, RawPost, Target
from ..utils import SchedulerConfig, http_client from ..utils import SchedulerConfig, http_client
@ -183,8 +182,11 @@ class McbbsNews(NewMessage):
) )
assert pic_data assert pic_data
except: except:
err_info = traceback.format_exc()
logger.warning(f"渲染错误:{err_info}")
err_pic0 = await text_to_pic("错误发生!") err_pic0 = await text_to_pic("错误发生!")
err_pic1 = await text_to_pic(traceback.format_exc()) err_pic1 = await text_to_pic(err_info)
return [err_pic0, err_pic1] return [err_pic0, err_pic1]
else: else:
return [pic_data] return [pic_data]

View File

@ -1,4 +1,5 @@
import typing import typing
from pathlib import Path
import pytest import pytest
from nonebug.app import App from nonebug.app import App
@ -16,7 +17,11 @@ def config_legacy(app: App, use_legacy_config):
from nonebot_bison.config import config_legacy as config from nonebot_bison.config import config_legacy as config
config.start_up() config.start_up()
return config.Config() yield config.Config()
config.Config().db.close()
legacy_config = Path(config.get_config_path()[0])
legacy_config.unlink(missing_ok=True)
def test_create_and_get(config_legacy: "Config", app: App): def test_create_and_get(config_legacy: "Config", app: App):

View File

@ -1,9 +1,10 @@
from datetime import time from datetime import time
from nonebug import App from nonebug import App
from pytest_mock import MockerFixture
async def test_create_config(app: App, init_scheduler): async def test_create_config(init_scheduler):
from nonebot_bison.config.db_config import TimeWeightConfig, WeightConfig, config from nonebot_bison.config.db_config import TimeWeightConfig, WeightConfig, config
from nonebot_bison.config.db_model import Subscribe, Target, User from nonebot_bison.config.db_model import Subscribe, Target, User
from nonebot_bison.types import Target as T_Target from nonebot_bison.types import Target as T_Target
@ -52,7 +53,7 @@ async def test_create_config(app: App, init_scheduler):
assert test_config1.time_config == [] assert test_config1.time_config == []
async def test_get_current_weight(app: App, init_scheduler): async def test_get_current_weight(init_scheduler, mocker: MockerFixture):
from datetime import time from datetime import time
from nonebot_bison.config import db_config from nonebot_bison.config import db_config
@ -99,19 +100,19 @@ async def test_get_current_weight(app: App, init_scheduler):
], ],
), ),
) )
app.monkeypatch.setattr(db_config, "_get_time", lambda: time(1, 30)) mocker.patch.object(db_config, "_get_time", return_value=time(1, 30))
weight = await config.get_current_weight_val(["weibo", "bilibili"]) weight = await config.get_current_weight_val(["weibo", "bilibili"])
assert len(weight) == 3 assert len(weight) == 3
assert weight["weibo-weibo_id"] == 20 assert weight["weibo-weibo_id"] == 20
assert weight["weibo-weibo_id1"] == 10 assert weight["weibo-weibo_id1"] == 10
assert weight["bilibili-weibo_id1"] == 10 assert weight["bilibili-weibo_id1"] == 10
app.monkeypatch.setattr(db_config, "_get_time", lambda: time(4, 0)) mocker.patch.object(db_config, "_get_time", return_value=time(4, 0))
weight = await config.get_current_weight_val(["weibo", "bilibili"]) weight = await config.get_current_weight_val(["weibo", "bilibili"])
assert len(weight) == 3 assert len(weight) == 3
assert weight["weibo-weibo_id"] == 30 assert weight["weibo-weibo_id"] == 30
assert weight["weibo-weibo_id1"] == 10 assert weight["weibo-weibo_id1"] == 10
assert weight["bilibili-weibo_id1"] == 10 assert weight["bilibili-weibo_id1"] == 10
app.monkeypatch.setattr(db_config, "_get_time", lambda: time(5, 0)) mocker.patch.object(db_config, "_get_time", return_value=time(5, 0))
weight = await config.get_current_weight_val(["weibo", "bilibili"]) weight = await config.get_current_weight_val(["weibo", "bilibili"])
assert len(weight) == 3 assert len(weight) == 3
assert weight["weibo-weibo_id"] == 10 assert weight["weibo-weibo_id"] == 10

View File

@ -1,29 +1,67 @@
import asyncio import sys
import typing
from pathlib import Path from pathlib import Path
import nonebot import nonebot
import pytest import pytest
from nonebug.app import App from nonebug import NONEBOT_INIT_KWARGS, App
from sqlalchemy.ext.asyncio.session import AsyncSession from pytest_mock.plugin import MockerFixture
from sqlalchemy.sql.expression import delete from sqlalchemy import delete
from .utils import AppReq
def pytest_configure(config: pytest.Config) -> None:
config.stash[NONEBOT_INIT_KWARGS] = {
"datastore_database_url": "sqlite+aiosqlite:///:memory:",
"superusers": {"10001"},
"command_start": {""},
"log_level": "TRACE",
}
@pytest.fixture @pytest.fixture
async def app(nonebug_init: None, tmp_path: Path, monkeypatch: pytest.MonkeyPatch): async def app(tmp_path: Path, request: pytest.FixtureRequest, mocker: MockerFixture):
import nonebot sys.path.append(str(Path(__file__).parent.parent / "src" / "plugins"))
config = nonebot.get_driver().config
config.bison_config_path = str(tmp_path / "legacy_config")
config.datastore_config_dir = str(tmp_path / "config")
config.datastore_cache_dir = str(tmp_path / "cache")
config.datastore_data_dir = str(tmp_path / "data")
config.command_start = {""}
config.superusers = {"10001"}
config.log_level = "TRACE"
config.bison_filter_log = False
nonebot.require("nonebot_bison") nonebot.require("nonebot_bison")
return App(monkeypatch) from nonebot_bison import plugin_config
from nonebot_bison.config.db_model import (
ScheduleTimeWeight,
Subscribe,
Target,
User,
)
from nonebot_plugin_datastore.config import plugin_config as datastore_config
from nonebot_plugin_datastore.db import create_session, init_db
from nonebot_plugin_htmlrender.browser import shutdown_browser
plugin_config.bison_config_path = str(tmp_path / "legacy_config")
plugin_config.bison_filter_log = False
datastore_config.datastore_config_dir = tmp_path / "config"
datastore_config.datastore_cache_dir = tmp_path / "cache"
datastore_config.datastore_data_dir = tmp_path / "data"
param: AppReq = getattr(request, "param", AppReq())
if not param.get("no_init_db"):
await init_db()
if not param.get("refresh_bot"):
import nonebot_bison.utils.get_bot
mocker.patch.object(nonebot_bison.utils.get_bot, "refresh_bots")
yield App()
# cleanup
async with create_session() as session, session.begin():
await session.execute(delete(User))
await session.execute(delete(Subscribe))
await session.execute(delete(Target))
await session.execute(delete(ScheduleTimeWeight))
# 关闭渲染图片时打开的浏览器
await shutdown_browser()
@pytest.fixture @pytest.fixture
@ -35,21 +73,7 @@ def dummy_user_subinfo(app: App):
@pytest.fixture @pytest.fixture
async def db_migration(app: App): async def init_scheduler(app: App):
from nonebot_bison.config.db_model import Subscribe, Target, User
from nonebot_plugin_datastore.db import get_engine, init_db
await init_db()
async with AsyncSession(get_engine()) as sess:
await sess.execute(delete(User))
await sess.execute(delete(Subscribe))
await sess.execute(delete(Target))
await sess.commit()
await sess.close()
@pytest.fixture
async def init_scheduler(db_migration):
from nonebot_bison.scheduler.manager import init_scheduler from nonebot_bison.scheduler.manager import init_scheduler
await init_scheduler() await init_scheduler()

View File

@ -65,7 +65,6 @@ async def test_fetch_new(weibo, dummy_user_subinfo):
assert not detail_router.called assert not detail_router.called
mock_data = get_json("weibo_ak_list_1.json") mock_data = get_json("weibo_ak_list_1.json")
ak_list_router.mock(return_value=Response(200, json=mock_data)) ak_list_router.mock(return_value=Response(200, json=mock_data))
# import ipdb; ipdb.set_trace()
res2 = await weibo.fetch_new_post(target, [dummy_user_subinfo]) res2 = await weibo.fetch_new_post(target, [dummy_user_subinfo])
assert len(res2) == 0 assert len(res2) == 0
mock_data["data"]["cards"][1]["mblog"]["created_at"] = datetime.now( mock_data["data"]["cards"][1]["mblog"]["created_at"] = datetime.now(

View File

@ -3,6 +3,7 @@ from datetime import time
from typing import Type from typing import Type
from nonebug import App from nonebug import App
from pytest_mock import MockerFixture
if typing.TYPE_CHECKING: if typing.TYPE_CHECKING:
from nonebot_bison.utils.scheduler_config import SchedulerConfig from nonebot_bison.utils.scheduler_config import SchedulerConfig
@ -60,7 +61,7 @@ async def test_scheduler_without_time(init_scheduler):
assert static_res["bilibili-live-t2"] == 3 assert static_res["bilibili-live-t2"] == 3
async def test_scheduler_with_time(app: App, init_scheduler): async def test_scheduler_with_time(app: App, init_scheduler, mocker: MockerFixture):
from nonebot_bison.config import config, db_config from nonebot_bison.config import config, db_config
from nonebot_bison.config.db_config import TimeWeightConfig, WeightConfig from nonebot_bison.config.db_config import TimeWeightConfig, WeightConfig
from nonebot_bison.platform.bilibili import BilibiliSchedConf from nonebot_bison.platform.bilibili import BilibiliSchedConf
@ -93,7 +94,8 @@ async def test_scheduler_with_time(app: App, init_scheduler):
await init_scheduler() await init_scheduler()
app.monkeypatch.setattr(db_config, "_get_time", lambda: time(1, 30)) mocker.patch.object(db_config, "_get_time", return_value=time(1, 30))
static_res = await get_schedule_times(BilibiliSchedConf, 6) static_res = await get_schedule_times(BilibiliSchedConf, 6)
assert static_res["bilibili-t1"] == 1 assert static_res["bilibili-t1"] == 1
assert static_res["bilibili-t2"] == 2 assert static_res["bilibili-t2"] == 2
@ -104,7 +106,7 @@ async def test_scheduler_with_time(app: App, init_scheduler):
assert static_res["bilibili-t2"] == 2 assert static_res["bilibili-t2"] == 2
assert static_res["bilibili-live-t2"] == 3 assert static_res["bilibili-live-t2"] == 3
app.monkeypatch.setattr(db_config, "_get_time", lambda: time(10, 30)) mocker.patch.object(db_config, "_get_time", return_value=time(10, 30))
static_res = await get_schedule_times(BilibiliSchedConf, 6) static_res = await get_schedule_times(BilibiliSchedConf, 6)
assert static_res["bilibili-t2"] == 6 assert static_res["bilibili-t2"] == 6

View File

@ -2,6 +2,7 @@ import pytest
import respx import respx
from httpx import Response from httpx import Response
from nonebug.app import App from nonebug.app import App
from pytest_mock import MockerFixture
from .platforms.utils import get_json from .platforms.utils import get_json
from .utils import BotReply, fake_admin_user, fake_group_message_event from .utils import BotReply, fake_admin_user, fake_group_message_event
@ -289,7 +290,7 @@ async def test_add_no_target(app: App, init_scheduler):
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_platform_name_err(app: App, db_migration): async def test_platform_name_err(app: App):
from nonebot.adapters.onebot.v11.event import Sender from nonebot.adapters.onebot.v11.event import Sender
from nonebot.adapters.onebot.v11.message import Message from nonebot.adapters.onebot.v11.message import Message
from nonebot_bison.config_manager import add_sub_matcher, common_platform from nonebot_bison.config_manager import add_sub_matcher, common_platform
@ -324,7 +325,7 @@ async def test_platform_name_err(app: App, db_migration):
@pytest.mark.asyncio @pytest.mark.asyncio
@respx.mock @respx.mock
async def test_add_with_get_id(app: App, db_migration): async def test_add_with_get_id(app: App):
from nonebot.adapters.onebot.v11.event import Sender from nonebot.adapters.onebot.v11.event import Sender
from nonebot.adapters.onebot.v11.message import Message, MessageSegment from nonebot.adapters.onebot.v11.message import Message, MessageSegment
from nonebot_bison.config import config from nonebot_bison.config import config

View File

@ -1,8 +1,11 @@
import pytest import pytest
from nonebug import App from nonebug import App
from .utils import AppReq
@pytest.mark.asyncio @pytest.mark.asyncio
@pytest.mark.parametrize("app", [{"refresh_bot": True}], indirect=True)
async def test_get_bots(app: App) -> None: async def test_get_bots(app: App) -> None:
from nonebot import get_driver from nonebot import get_driver
from nonebot.adapters.onebot.v11 import Bot as BotV11 from nonebot.adapters.onebot.v11 import Bot as BotV11
@ -23,6 +26,7 @@ async def test_get_bots(app: App) -> None:
@pytest.mark.asyncio @pytest.mark.asyncio
@pytest.mark.parametrize("app", [{"refresh_bot": True}], indirect=True)
async def test_refresh_bots(app: App) -> None: async def test_refresh_bots(app: App) -> None:
from nonebot import get_driver from nonebot import get_driver
from nonebot.adapters.onebot.v11 import Bot as BotV11 from nonebot.adapters.onebot.v11 import Bot as BotV11
@ -57,6 +61,7 @@ async def test_refresh_bots(app: App) -> None:
@pytest.mark.asyncio @pytest.mark.asyncio
@pytest.mark.parametrize("app", [{"refresh_bot": True}], indirect=True)
async def test_get_bot_two_bots(app: App) -> None: async def test_get_bot_two_bots(app: App) -> None:
from nonebot import get_driver from nonebot import get_driver
from nonebot.adapters.onebot.v11 import Bot as BotV11 from nonebot.adapters.onebot.v11 import Bot as BotV11

View File

@ -1,5 +1,7 @@
import pytest import importlib
from nonebug import App from nonebug import App
from pytest_mock import MockerFixture
async def test_without_proxy(app: App): async def test_without_proxy(app: App):
@ -11,11 +13,15 @@ async def test_without_proxy(app: App):
assert "Chrome" in req.headers["User-Agent"] assert "Chrome" in req.headers["User-Agent"]
@pytest.mark.parametrize( async def test_with_proxy(app: App, mocker: MockerFixture):
"nonebug_init", [{"bison_proxy": "http://example.com"}], indirect=True from nonebot_bison.plugin_config import plugin_config
)
async def test_with_proxy(app: App): mocker.patch.object(plugin_config, "bison_proxy", "http://example.com")
from nonebot_bison.utils import http_client from nonebot_bison.utils import http
importlib.reload(http)
from nonebot_bison.utils.http import http_client
c = http_client() c = http_client()
assert c._mounts assert c._mounts

View File

@ -4,20 +4,21 @@ import typing
import pytest import pytest
from flaky import flaky from flaky import flaky
from nonebug import App from nonebug import App
from pytest_mock.plugin import MockerFixture
if typing.TYPE_CHECKING: if typing.TYPE_CHECKING:
from nonebot.adapters.onebot.v11.message import Message, MessageSegment from nonebot.adapters.onebot.v11.message import Message, MessageSegment
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_send_no_queue(app: App): async def test_send_no_queue(app: App, mocker: MockerFixture):
from nonebot.adapters.onebot.v11.bot import Bot from nonebot.adapters.onebot.v11.bot import Bot
from nonebot.adapters.onebot.v11.message import Message from nonebot.adapters.onebot.v11.message import Message
from nonebot_bison.plugin_config import plugin_config from nonebot_bison.plugin_config import plugin_config
from nonebot_bison.send import send_msgs from nonebot_bison.send import send_msgs
mocker.patch.object(plugin_config, "bison_use_queue", False)
async with app.test_api() as ctx: async with app.test_api() as ctx:
app.monkeypatch.setattr(plugin_config, "bison_use_queue", False, True)
bot = ctx.create_bot(base=Bot) bot = ctx.create_bot(base=Bot)
assert isinstance(bot, Bot) assert isinstance(bot, Bot)
ctx.should_call_api( ctx.should_call_api(
@ -35,17 +36,18 @@ async def test_send_no_queue(app: App):
@pytest.mark.asyncio @pytest.mark.asyncio
@pytest.mark.parametrize("nonebug_init", [{"bison_use_queue": True}], indirect=True) async def test_send_queue(app: App, mocker: MockerFixture):
async def test_send_queue(app: App):
import nonebot import nonebot
from nonebot.adapters.onebot.v11.bot import Bot from nonebot.adapters.onebot.v11.bot import Bot
from nonebot.adapters.onebot.v11.message import Message, MessageSegment from nonebot.adapters.onebot.v11.message import Message, MessageSegment
from nonebot_bison import send from nonebot_bison import send
from nonebot_bison.plugin_config import plugin_config
from nonebot_bison.send import MESSGE_SEND_INTERVAL, do_send_msgs, send_msgs from nonebot_bison.send import MESSGE_SEND_INTERVAL, do_send_msgs, send_msgs
mocker.patch.object(plugin_config, "bison_use_queue", True)
async with app.test_api() as ctx: async with app.test_api() as ctx:
new_bot = ctx.create_bot(base=Bot) new_bot = ctx.create_bot(base=Bot)
app.monkeypatch.setattr(nonebot, "get_bot", lambda: new_bot, True) mocker.patch.object(nonebot, "get_bot", lambda: new_bot)
bot = nonebot.get_bot() bot = nonebot.get_bot()
assert isinstance(bot, Bot) assert isinstance(bot, Bot)
assert bot == new_bot assert bot == new_bot

View File

@ -1,4 +1,4 @@
from typing import TYPE_CHECKING from typing import TYPE_CHECKING, TypedDict
from typing_extensions import Literal from typing_extensions import Literal
@ -6,6 +6,11 @@ if TYPE_CHECKING:
from nonebot.adapters.onebot.v11 import GroupMessageEvent, PrivateMessageEvent from nonebot.adapters.onebot.v11 import GroupMessageEvent, PrivateMessageEvent
class AppReq(TypedDict, total=False):
refresh_bot: bool
no_init_db: bool
def fake_group_message_event(**field) -> "GroupMessageEvent": def fake_group_message_event(**field) -> "GroupMessageEvent":
from nonebot.adapters.onebot.v11 import GroupMessageEvent, Message from nonebot.adapters.onebot.v11 import GroupMessageEvent, Message
from nonebot.adapters.onebot.v11.event import Sender from nonebot.adapters.onebot.v11.event import Sender