test_dealer.py 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import simplejson as json
  4. from django.conf import settings
  5. from django.core.urlresolvers import reverse
  6. from hypothesis import given, strategies as st
  7. from pytest_mock import MockFixture
  8. from typing import Dict, Union
  9. from apilib.monetary import RMB
  10. from apilib.utils_datetime import generate_timestamp_ex
  11. from apps.web.agent.define import AGENT_INCOME_TYPE
  12. from apps.web.agent.models import Agent
  13. from apps.web.common.models import WithdrawRecord
  14. from apps.web.common.transaction import WITHDRAW_PAY_TYPE, WithdrawStatus
  15. from apps.web.core.payment.wechat import WechatWithdrawGateway
  16. from apps.web.dealer.define import DEALER_INCOME_TYPE
  17. from apps.web.dealer.models import Dealer
  18. from apps.web.dealer.urls import urlpatterns
  19. from library.wechatbase.exceptions import WeChatPayException, WechatNetworkException
  20. from testcase.unit.base import RequestTestClient
  21. from testcase.unit.common import url_fn, BANK_ACCOUNT_CODE
  22. from testcase.unit.responses import WECHAT_WITHDRAW_ERROR, BANK_WITHDRAW_SUCCEEDED, BANK_WITHDRAW_ERROR
  23. ViewName = str
  24. Url = str
  25. urls = {} # type: Dict[ViewName, Url]
  26. for _ in urlpatterns:
  27. try:
  28. if reverse(_.callback).startswith('/dealer'):
  29. urls[_.callback.func_name] = reverse(_.callback)
  30. except:
  31. pass
  32. # def test_views_are_protected(mocker, client, dealer_client):
  33. # from apps.web.core.messages.sms import GenericSMSProvider
  34. # from apps.web.core.auth.wechat import WechatAuthBridge
  35. #
  36. # mocker.patch.object(GenericSMSProvider, 'get', return_value = (True, ''))
  37. # mocker.patch.object(GenericSMSProvider, 'verify', return_value = (True, ''))
  38. #
  39. # mocker.patch.object(WechatAuthBridge, 'get_user_info', return_value = {})
  40. #
  41. # excluded = [
  42. # urls['verifyForgetCode'],
  43. # urls['getOwnerAgents'],
  44. # urls['dealerRegister'],
  45. # urls['getCheckCode'],
  46. # urls['login'],
  47. # urls['getDealerRegisterSMSCode'],
  48. # urls['getSubAccountCheckCode'],
  49. # urls['getDealerListByAgent'],
  50. # urls['getDealerDetailList'],
  51. # urls['verifySubAccountForgetCode'],
  52. # urls['payGateway'],
  53. # urls['getJoinerDetailList'],
  54. # urls['getJoinRecordList'],
  55. # urls['getCardPwd'],
  56. # urls['setCardPwd'],
  57. # urls['setCardMode'],
  58. # urls['getCardMode'],
  59. # urls['updateDealerOrderAddr'],
  60. # urls['sendCoinsForCard'],
  61. # urls['watchLogin'],
  62. # urls['getUserCardTicketDetail'],
  63. # urls['dealerWithdraw'],
  64. # urls['saveAutoWithdrawConfig'],
  65. # urls['getDeviceFunctionForIC'],
  66. # urls['addEditItemType'],
  67. # urls['getDevicePort'],
  68. # urls['getDeviceFunction'],
  69. # urls['exportBusinessStats'],
  70. # urls['saveEntityCard'],
  71. # urls['swapCardNo'],
  72. # urls['deviceOfflineTrend'],
  73. # urls['setElecFeeConf'],
  74. # urls['adjustUserVirtualCardQuota'],
  75. # urls['deleteBattery'],
  76. # urls['getDeviceStatistics'],
  77. # urls['deviceOfflineTrend'],
  78. # urls['addEditSubAccount'],
  79. # urls['handlerKeepingOrder'],
  80. # urls['setSelfRechargeCardPrice'],
  81. # urls['createEmptyCardTicket'],
  82. # urls['selfRechargeCardRecords'],
  83. # urls['exportGroupStatistics'],
  84. # urls['addEditCell'],
  85. # urls['subAccountRegisterCode'],
  86. # urls['updateExchangeOrder'],
  87. # urls['getDashboard'],
  88. # urls['getDeviceCells'],
  89. # urls['remarkUserVirtual'],
  90. # urls['saveAccountPermission'],
  91. # urls['exportIncomeOrderList'],
  92. # urls['setDeviceFunctionByKey'],
  93. # urls['messageRead'],
  94. # urls['paymentOrderRecords'],
  95. # urls['getDeviceCellsFromDB'],
  96. # urls['updateInfo'],
  97. # urls['getUserCardRecord'],
  98. # urls['toggleOnsale'],
  99. # urls['deleteOnsale'],
  100. # urls['getPeakValueTrendByDevice'],
  101. # urls['exportIncomeAggregate'],
  102. # urls['getGroupStatistics'],
  103. # urls['exportConsumptionOrderList'],
  104. # urls['getAccountPermissionById'],
  105. # urls['getFeatureList'],
  106. # urls['deleteSubAccount'],
  107. # urls['getCheckCodeForNewTel'],
  108. # urls['equipmentList'],
  109. # urls['getUserIdentifyList'],
  110. # urls['addGoodsForStock'],
  111. # urls['setDeviceFunction'],
  112. # urls['adjustUserVirtualCardTime'],
  113. # urls['updateStockQuantity'],
  114. # urls['bindVirtualCardToRechargeIDCard'],
  115. # urls['asyncBatterySnByEnter'],
  116. # urls['exportAPIOrderList'],
  117. # urls['saveDeviceElcPrice'],
  118. # urls['freezeCard'],
  119. # urls['deleteElcPriceMod'],
  120. # urls['deleteAddress'],
  121. # urls['getDeviceList'],
  122. # urls['adjustUserVirtualState'],
  123. # urls['addGoodsToDeviceCell'],
  124. # urls['finishedOrder'],
  125. # urls['withdrawEntry'],
  126. # urls['asyncBatterySnByDevice'],
  127. # urls['createJoinOrder'],
  128. # urls['editDefaultJoiner'],
  129. # urls['updateStockQuantityForGoods'],
  130. # urls['saveElcPriceMod'],
  131. # urls['deleteCell'],
  132. # urls['getConsumptionOrderList'],
  133. # urls['getAPIOrderList'],
  134. # urls['getIncomeOrderList'],
  135. # urls['delUserActiveInfo'],
  136. # urls['handleAlarm'],
  137. # urls['deleteItemStock'],
  138. # urls['getOnPointsOrderList'],
  139. # urls['getOrderStatistics'],
  140. # urls['getOrderTrendByGroup'],
  141. # urls['getDefaultJoiner'],
  142. # urls['setDeviceFunctionParam'],
  143. # urls['getWalletWithdrawInfo'],
  144. # urls['getJoinerDetailList'],
  145. # urls['getJoinRecordList'],
  146. # urls['getDealerDetailList'],
  147. # urls['getDealerListByAgent'],
  148. # urls['editDefaultJoiner'],
  149. # urls['getDefaultJoiner'],
  150. # urls['getJoinerDetailList'],
  151. # urls['getSignalTrendByDevice'],
  152. # urls['unlockCell'],
  153. # urls['getDeviceFunctionByKey'],
  154. # urls['unbindVirtualCardToRechargeIDCard'],
  155. # urls['quitJoin'],
  156. # urls['ActivateUser'],
  157. # urls['getUserCardTicketList'],
  158. # urls['delUserVirtualCard'],
  159. # urls['editCard']
  160. # ]
  161. #
  162. # for url in (_ for _ in urls.values() if _ not in excluded):
  163. # assert client.get(url).status_code in (401, 405), '%s is not protected' % (url,)
  164. # dealer_client._re_login()
  165. # assert dealer_client.get(url).status_code in (200, 405, 302), '%s cannot be viewed with dealer client' % (url,)
  166. #
  167. ##
  168. ## Withdraw related
  169. ##
  170. @given(income_type = st.sampled_from([DEALER_INCOME_TYPE.DEVICE_INCOME, DEALER_INCOME_TYPE.AD_INCOME]),
  171. amount = st.one_of(st.floats(min_value = 10, max_value = 1000), st.integers(min_value = 10, max_value = 1000)))
  172. def test_dealer_incr_fund(dealer, source_key, income_type, amount):
  173. # type:(Dealer, str, str, Union[int, float])->None
  174. """
  175. :return:
  176. """
  177. added = RMB(amount)
  178. left = dealer.sub_balance(income_type, source_key) + added
  179. dealer.incr_fund(income_type, source_key, added)
  180. assert dealer.reload().sub_balance(income_type, source_key) == left
  181. ##
  182. ## Withdraw related
  183. ##
  184. @given(income_type = st.sampled_from([DEALER_INCOME_TYPE.DEVICE_INCOME, DEALER_INCOME_TYPE.AD_INCOME]),
  185. amount = st.one_of(st.floats(min_value = 10, max_value = 1000), st.integers(min_value = 10, max_value = 1000)))
  186. def test_dealer_decr_fund(dealer, source_key, income_type, amount):
  187. # type:(Dealer, str, str, Union[int, float])->None
  188. """
  189. :return:
  190. """
  191. sub = RMB(amount)
  192. left = dealer.sub_balance(income_type, source_key) - sub
  193. dealer.decr_fund(income_type, source_key, sub)
  194. assert dealer.reload().sub_balance(income_type, source_key) == left
  195. ##
  196. ## Withdraw related
  197. ##
  198. @given(income_type = st.sampled_from([DEALER_INCOME_TYPE.DEVICE_INCOME, DEALER_INCOME_TYPE.AD_INCOME]),
  199. amount = st.one_of(st.floats(min_value = 10, max_value = 1000), st.integers(min_value = 10, max_value = 1000)))
  200. def test_dealer_set_balance(dealer, source_key, income_type, amount):
  201. # type:(Dealer, str, str, Union[int, float])->None
  202. """
  203. :return:
  204. """
  205. money = RMB(amount)
  206. dealer.set_balance(income_type, source_key, money)
  207. assert dealer.reload().sub_balance(income_type, source_key) == money
  208. @given(income_type = st.sampled_from([DEALER_INCOME_TYPE.DEVICE_INCOME, DEALER_INCOME_TYPE.AD_INCOME]),
  209. amount = st.one_of(st.floats(min_value = 10, max_value = 1000), st.integers(min_value = 10, max_value = 1000)),
  210. initial_amount = st.one_of(st.floats(min_value = 1000, max_value = 10000),
  211. st.integers(min_value = 1000, max_value = 10000)))
  212. def test_dealer_recover_freeze_balance(dealer, source_key, income_type, amount, initial_amount):
  213. # type:(Dealer, str, str, Union[int, float], Union[int, float])->None
  214. initial = RMB(initial_amount)
  215. dealer.set_balance(income_type, source_key, initial)
  216. dealer.reload()
  217. assert dealer.sub_balance(income_type, source_key) == initial
  218. withdrawed = RMB(amount)
  219. transaction_id = str(generate_timestamp_ex())
  220. pre_frozenBalance = dealer.sub_frozen_balance(income_type, source_key)
  221. pre_balance = dealer.sub_balance(income_type, source_key)
  222. dealer.freeze_balance(income_type, withdrawed, source_key, transaction_id, True)
  223. dealer.reload()
  224. assert dealer.sub_frozen_balance(income_type, source_key) - withdrawed == pre_frozenBalance
  225. assert dealer.sub_balance(income_type, source_key) + withdrawed == pre_balance
  226. dealer.freeze_balance(income_type, withdrawed, source_key, transaction_id, True)
  227. dealer.reload()
  228. assert dealer.sub_frozen_balance(income_type, source_key) - withdrawed == pre_frozenBalance
  229. assert dealer.sub_balance(income_type, source_key) + withdrawed == pre_balance
  230. exists = False
  231. for item in dealer.inhandWithdrawList:
  232. if transaction_id == item['transaction_id']:
  233. exists = True
  234. break
  235. assert exists
  236. # test inverse
  237. dealer.recover_frozen_balance(income_type, withdrawed, source_key, transaction_id)
  238. dealer.reload()
  239. assert dealer.sub_frozen_balance(income_type, source_key) == pre_frozenBalance
  240. assert dealer.sub_balance(income_type, source_key) == pre_balance
  241. assert dealer.sub_balance(income_type, source_key) == initial
  242. exists = False
  243. for item in dealer.inhandWithdrawList:
  244. if transaction_id == item['transaction_id']:
  245. exists = True
  246. break
  247. assert not exists
  248. dealer.recover_frozen_balance(income_type, withdrawed, source_key, transaction_id)
  249. dealer.reload()
  250. assert dealer.sub_frozen_balance(income_type, source_key) == pre_frozenBalance
  251. assert dealer.sub_balance(income_type, source_key) == pre_balance
  252. assert dealer.sub_balance(income_type, source_key) == initial
  253. @given(income_type = st.sampled_from([DEALER_INCOME_TYPE.DEVICE_INCOME, DEALER_INCOME_TYPE.AD_INCOME]),
  254. amount = st.one_of(st.floats(min_value = 10, max_value = 1000), st.integers(min_value = 10, max_value = 1000)),
  255. initial_amount = st.one_of(st.floats(min_value = 1000, max_value = 10000),
  256. st.integers(min_value = 1000, max_value = 10000)))
  257. def test_dealer_clear_freeze_balance(dealer, source_key, income_type, amount, initial_amount):
  258. # type:(Dealer, str, str, Union[int, float], Union[int, float])->None
  259. initial = RMB(initial_amount)
  260. dealer.set_balance(income_type, source_key, initial)
  261. dealer.reload()
  262. assert dealer.sub_balance(income_type, source_key) == initial
  263. withdrawed = RMB(amount)
  264. transaction_id = str(generate_timestamp_ex())
  265. pre_frozenBalance = dealer.sub_frozen_balance(income_type, source_key)
  266. pre_balance = dealer.sub_balance(income_type, source_key)
  267. dealer.freeze_balance(income_type, withdrawed, source_key, transaction_id, True)
  268. dealer.reload()
  269. assert dealer.sub_frozen_balance(income_type, source_key) - withdrawed == pre_frozenBalance
  270. assert dealer.sub_balance(income_type, source_key) + withdrawed == pre_balance
  271. dealer.freeze_balance(income_type, withdrawed, source_key, transaction_id, True)
  272. dealer.reload()
  273. assert dealer.sub_frozen_balance(income_type, source_key) - withdrawed == pre_frozenBalance
  274. assert dealer.sub_balance(income_type, source_key) + withdrawed == pre_balance
  275. exists = False
  276. for item in dealer.inhandWithdrawList:
  277. if transaction_id == item['transaction_id']:
  278. exists = True
  279. break
  280. assert exists
  281. dealer.clear_frozen_balance(transaction_id)
  282. dealer.reload()
  283. assert dealer.sub_frozen_balance(income_type, source_key) == pre_frozenBalance
  284. assert dealer.sub_balance(income_type, source_key) + withdrawed == pre_balance
  285. exists = False
  286. for item in dealer.inhandWithdrawList:
  287. if transaction_id == item['transaction_id']:
  288. exists = True
  289. break
  290. assert not exists
  291. dealer.clear_frozen_balance(transaction_id)
  292. dealer.reload()
  293. assert dealer.sub_frozen_balance(income_type, source_key) == pre_frozenBalance
  294. assert dealer.sub_balance(income_type, source_key) + withdrawed == pre_balance
  295. exists = False
  296. for item in dealer.inhandWithdrawList:
  297. if transaction_id == item['transaction_id']:
  298. exists = True
  299. break
  300. assert not exists
  301. # @given(income_type = st.sampled_from([DEALER_INCOME_TYPE.DEVICE_INCOME, DEALER_INCOME_TYPE.AD_INCOME]),
  302. # amount = st.one_of(st.floats(min_value = 10, max_value = 1000), st.integers(min_value = 10, max_value = 1000)))
  303. # def test_dealer_withdraw_with_wechat(mocker, dealer, agent, income_type, source_key, dealer_client, amount):
  304. # # type: (MockFixture, Dealer, Agent, str, str, RequestTestClient, float)->None
  305. # money = RMB(amount)
  306. #
  307. # pre_balance = dealer.sub_balance(income_type, source_key)
  308. # assert dealer.incr_fund(income_type, source_key, money), 'balance inc failed'
  309. #
  310. # dealer.reload()
  311. #
  312. # desired_service_fee = money * (dealer.withdrawFeeRatio / Const.WITHDRAW_FEE_UNIT)
  313. # desired_actual_pay = money - desired_service_fee
  314. #
  315. # if dealer.withdrawFeeRatio > Const.PLATFORM_DEFAULT_WITHDRAW_FEE_RATIO:
  316. # desired_agent_balance = agent.sub_balance(AGENT_INCOME_TYPE.DEALER_WITHDRAW_FEE, source_key) + money * (
  317. # (dealer.withdrawFeeRatio - Const.PLATFORM_DEFAULT_WITHDRAW_FEE_RATIO) / Const.WITHDRAW_FEE_UNIT)
  318. # else:
  319. # desired_agent_balance = agent.sub_balance(AGENT_INCOME_TYPE.DEALER_WITHDRAW_FEE, source_key)
  320. #
  321. # from apps.web.dealer.views import dealerWithdraw
  322. # url = url_fn(dealerWithdraw)
  323. # payload = {
  324. # 'code': '1234',
  325. # 'payType': WITHDRAW_PAY_TYPE.WECHAT,
  326. # 'amount': str(money),
  327. # 'sourceType': income_type,
  328. # 'sourceId': source_key
  329. # }
  330. #
  331. # from apps.web.core.payment.wechat import WechatPaymentGateway
  332. # mocker.patch.object(WechatPaymentGateway, 'withdraw_via_changes', return_value = WECHAT_WITHDRAW_SUCCEEDED)
  333. #
  334. # response = dealer_client.post_json(url, data = payload)
  335. #
  336. # assert response
  337. #
  338. # dealer.reload()
  339. #
  340. # assert pre_balance == dealer.sub_balance(income_type, source_key)
  341. #
  342. # json_response = json.loads(response.content)
  343. # assert json_response['result'] == 1
  344. # assert json_response['description'] == u'提现成功'
  345. #
  346. # withdraw_record_id = json_response['payload']['paymentId']
  347. #
  348. # record = WithdrawRecord.objects(id = str(withdraw_record_id)).first() # type: WithdrawRecord
  349. # assert record
  350. # assert record.serviceFee == desired_service_fee
  351. # assert record.actualPay == desired_actual_pay
  352. # assert record.amount == money
  353. # assert record.ownerId == str(dealer.id)
  354. # assert record.payType == WITHDRAW_PAY_TYPE.WECHAT
  355. # assert record.balance == (pre_balance + money)
  356. # assert record.withdrawGatewayKey == source_key
  357. # assert record.status == WithdrawStatus.SUCCEEDED
  358. #
  359. # assert agent.reload().sub_balance(AGENT_INCOME_TYPE.DEALER_WITHDRAW_FEE, source_key) == desired_agent_balance
  360. #
  361. # @given(income_type = st.sampled_from([DEALER_INCOME_TYPE.DEVICE_INCOME, DEALER_INCOME_TYPE.AD_INCOME]),
  362. # amount = st.one_of(st.floats(min_value = 0.01, max_value = settings.WITHDRAW_MINIMUM - 0.01),
  363. # st.integers(min_value = 1, max_value = settings.WITHDRAW_MINIMUM - 1)))
  364. # def test_dealer_withdraw_with_wechat_less_min(mocker, dealer, agent, income_type, source_key, dealer_client, amount):
  365. # # type: (MockFixture, Dealer, Agent, str, str, RequestTestClient, float)->None
  366. # money = RMB(amount)
  367. #
  368. # pre_balance = dealer.sub_balance(income_type, source_key)
  369. # assert dealer.incr_fund(income_type, source_key, money), 'balance inc failed'
  370. #
  371. # added_balance = dealer.reload().sub_balance(income_type, source_key)
  372. #
  373. # from apps.web.dealer.views import dealerWithdraw
  374. # url = url_fn(dealerWithdraw)
  375. # payload = {
  376. # 'code': '1234',
  377. # 'payType': WITHDRAW_PAY_TYPE.WECHAT,
  378. # 'amount': str(money),
  379. # 'sourceType': income_type,
  380. # 'sourceId': source_key
  381. # }
  382. #
  383. # response = dealer_client.post_json(url, data = payload)
  384. #
  385. # assert response
  386. #
  387. # json_response = json.loads(response.content)
  388. # assert json_response['result'] == 0
  389. # assert json_response['description'] == u"提现金额不能少于%s元" % (settings.WITHDRAW_MINIMUM,)
  390. #
  391. # assert added_balance == dealer.reload().sub_balance(income_type, source_key)
  392. #
  393. #
  394. # @given(income_type = st.sampled_from([DEALER_INCOME_TYPE.DEVICE_INCOME, DEALER_INCOME_TYPE.AD_INCOME]),
  395. # amount = st.one_of(
  396. # st.floats(min_value = settings.WITHDRAW_MAXIMUM + 0.01, max_value = settings.WITHDRAW_MAXIMUM + 10),
  397. # st.integers(min_value = settings.WITHDRAW_MAXIMUM + 1, max_value = settings.WITHDRAW_MAXIMUM + 10)))
  398. # def test_dealer_withdraw_with_wechat_more_max(mocker, dealer, agent, income_type, source_key, dealer_client, amount):
  399. # # type: (MockFixture, Dealer, Agent, str, str, RequestTestClient, float)->None
  400. # money = RMB(amount)
  401. #
  402. # pre_balance = dealer.sub_balance(income_type, source_key)
  403. # assert dealer.incr_fund(income_type, source_key, money), 'balance inc failed'
  404. #
  405. # added_balance = dealer.reload().sub_balance(income_type, source_key)
  406. #
  407. # from apps.web.dealer.views import dealerWithdraw
  408. # url = url_fn(dealerWithdraw)
  409. # payload = {
  410. # 'code': '1234',
  411. # 'payType': WITHDRAW_PAY_TYPE.WECHAT,
  412. # 'amount': str(money),
  413. # 'sourceType': income_type,
  414. # 'sourceId': source_key
  415. # }
  416. #
  417. # response = dealer_client.post_json(url, data = payload)
  418. #
  419. # assert response
  420. #
  421. # json_response = json.loads(response.content)
  422. # assert json_response['result'] == 0
  423. # assert json_response['description'] == u"单次提现金额不得大于%s元" % (settings.WITHDRAW_MAXIMUM,)
  424. #
  425. # assert added_balance == dealer.reload().sub_balance(income_type, source_key)
  426. #
  427. #
  428. # @given(income_type = st.sampled_from([DEALER_INCOME_TYPE.DEVICE_INCOME, DEALER_INCOME_TYPE.AD_INCOME]))
  429. # def test_dealer_withdraw_with_wechat_less_balance(mocker, dealer, agent, income_type, source_key, dealer_client):
  430. # # type: (MockFixture, Dealer, Agent, str, str, RequestTestClient)->None
  431. # withdrawed = RMB(20)
  432. #
  433. # dealer.set_balance(income_type, source_key, RMB(10))
  434. # pre_balance = dealer.reload().sub_balance(income_type, source_key)
  435. #
  436. # assert pre_balance == RMB(10)
  437. #
  438. # from apps.web.dealer.views import dealerWithdraw
  439. # url = url_fn(dealerWithdraw)
  440. # payload = {
  441. # 'code': '1234',
  442. # 'payType': WITHDRAW_PAY_TYPE.WECHAT,
  443. # 'amount': str(withdrawed),
  444. # 'sourceType': income_type,
  445. # 'sourceId': source_key
  446. # }
  447. #
  448. # response = dealer_client.post_json(url, data = payload)
  449. #
  450. # assert response
  451. #
  452. # json_response = json.loads(response.content)
  453. # assert json_response['result'] == 0
  454. # assert json_response['description'] == u"余额不足"
  455. #
  456. # assert pre_balance == dealer.reload().sub_balance(income_type, source_key)
  457. #
  458. #
  459. # @given(income_type = st.sampled_from([DEALER_INCOME_TYPE.DEVICE_INCOME, DEALER_INCOME_TYPE.AD_INCOME]))
  460. # def test_dealer_withdraw_with_wechat_manual(mocker, dealer, agent, income_type, dealer_client):
  461. # # type: (MockFixture, Dealer, Agent, str, RequestTestClient)->None
  462. #
  463. # agent.payAppWechat.manual_withdraw = True
  464. # agent.payAppWechat.save()
  465. #
  466. # gateway = WechatWithdrawGateway(agent.payAppWechat) # type: WechatWithdrawGateway
  467. #
  468. # withdrawed = RMB(20)
  469. #
  470. # pre_balance = dealer.sub_balance(income_type, gateway.source_key)
  471. # assert dealer.incr_fund(income_type, gateway.source_key, withdrawed), 'balance inc failed'
  472. #
  473. # added_balance = dealer.reload().sub_balance(income_type, gateway.source_key)
  474. #
  475. # from apps.web.dealer.views import dealerWithdraw
  476. # url = url_fn(dealerWithdraw)
  477. # payload = {
  478. # 'code': '1234',
  479. # 'payType': WITHDRAW_PAY_TYPE.WECHAT,
  480. # 'amount': str(withdrawed),
  481. # 'sourceType': income_type,
  482. # 'sourceId': gateway.gateway_key
  483. # }
  484. #
  485. # response = dealer_client.post_json(url, data = payload)
  486. #
  487. # assert response
  488. #
  489. # json_response = json.loads(response.content)
  490. # assert json_response['result'] == 0
  491. # assert json_response['description'] == u"暂时不支持提现到微信"
  492. #
  493. # assert added_balance == dealer.reload().sub_balance(income_type, gateway.source_key)
  494. #
  495. #
  496. @given(income_type = st.sampled_from([DEALER_INCOME_TYPE.DEVICE_INCOME, DEALER_INCOME_TYPE.AD_INCOME]),
  497. test_id = st.integers(min_value = 0, max_value = len(WECHAT_WITHDRAW_ERROR) - 1))
  498. def test_dealer_withdraw_via_wechat_error(mocker, dealer, agent, income_type, source_key, dealer_client, test_id):
  499. # type: (MockFixture, Dealer, Agent, str, str, RequestTestClient, int)->None
  500. """
  501. 测试提现到微信失败的场景
  502. """
  503. desired_result = WECHAT_WITHDRAW_ERROR[test_id]['result']
  504. if 'remarks' in WECHAT_WITHDRAW_ERROR[test_id]:
  505. desired_remarks = WECHAT_WITHDRAW_ERROR[test_id]['remarks']
  506. else:
  507. desired_remarks = u'{err_code_des}({err_code})'.format(
  508. err_code = WECHAT_WITHDRAW_ERROR[test_id]['err_code'],
  509. err_code_des = WECHAT_WITHDRAW_ERROR[test_id][
  510. 'err_code_des'])
  511. if 'show_message' in WECHAT_WITHDRAW_ERROR[test_id]:
  512. desired_show_message = WECHAT_WITHDRAW_ERROR[test_id]['show_message']
  513. else:
  514. desired_show_message = WECHAT_WITHDRAW_ERROR[test_id]['err_code_des']
  515. withdrawed = RMB(20)
  516. after_withdraw_balance = dealer.sub_balance(income_type, source_key)
  517. assert dealer.incr_fund(income_type, source_key, withdrawed), 'balance inc failed'
  518. before_withdraw_balance = dealer.reload().sub_balance(income_type, source_key)
  519. desired_service_fee = withdrawed * (dealer.withdrawFeeRatio.as_ratio)
  520. desired_actual_pay = withdrawed - desired_service_fee
  521. before_agent_balance = agent.sub_balance(AGENT_INCOME_TYPE.DEALER_WITHDRAW_FEE, source_key)
  522. from apps.web.dealer.views import dealerWithdraw
  523. url = url_fn(dealerWithdraw)
  524. payload = {
  525. 'code': '1234',
  526. 'payType': WITHDRAW_PAY_TYPE.WECHAT,
  527. 'amount': str(withdrawed),
  528. 'sourceType': income_type,
  529. 'sourceId': source_key,
  530. 'openId': 'testOpenId'
  531. }
  532. from apps.web.core.payment.wechat import WechatWithdrawGateway
  533. if WECHAT_WITHDRAW_ERROR[test_id]['return_code'] == 'FAIL':
  534. mocker.patch.object(WechatWithdrawGateway, 'withdraw_via_changes',
  535. side_effect = WechatNetworkException(
  536. errCode = WECHAT_WITHDRAW_ERROR[test_id]['return_code'],
  537. errMsg = WECHAT_WITHDRAW_ERROR[test_id]['return_msg']))
  538. else:
  539. mocker.patch.object(WechatWithdrawGateway, 'withdraw_via_changes',
  540. side_effect = WeChatPayException(
  541. errCode = WECHAT_WITHDRAW_ERROR[test_id]['err_code'],
  542. errMsg = WECHAT_WITHDRAW_ERROR[test_id]['err_code_des']))
  543. response = dealer_client.post_json(url, data = payload)
  544. assert response
  545. json_response = json.loads(response.content)
  546. assert json_response['result'] == desired_result
  547. assert json_response['description'] == desired_show_message
  548. dealer.reload()
  549. if WECHAT_WITHDRAW_ERROR[test_id]['refund']:
  550. assert before_withdraw_balance == dealer.sub_balance(income_type, source_key)
  551. else:
  552. assert after_withdraw_balance == dealer.sub_balance(income_type, source_key)
  553. withdraw_record_id = json_response['payload']['paymentId']
  554. record = WithdrawRecord.objects(id = str(withdraw_record_id)).first() # type: WithdrawRecord
  555. assert record
  556. assert record.serviceFee == desired_service_fee
  557. assert record.actualPay == desired_actual_pay
  558. assert record.amount == withdrawed
  559. assert record.ownerId == str(dealer.id)
  560. assert record.payType == WITHDRAW_PAY_TYPE.WECHAT
  561. assert record.balance == before_withdraw_balance
  562. assert record.withdrawSourceKey == source_key
  563. if WECHAT_WITHDRAW_ERROR[test_id]['refund']:
  564. assert record.status == WithdrawStatus.CLOSED
  565. else:
  566. assert record.status == WithdrawStatus.FAILED
  567. assert agent.reload().sub_balance(AGENT_INCOME_TYPE.DEALER_WITHDRAW_FEE, source_key) == before_agent_balance
  568. @given(income_type = st.sampled_from([DEALER_INCOME_TYPE.DEVICE_INCOME, DEALER_INCOME_TYPE.AD_INCOME]),
  569. amount = st.one_of(st.floats(min_value = 20, max_value = 1000), st.integers(min_value = 20, max_value = 1000)))
  570. def test_dealer_withdraw_with_bank(mocker, dealer, agent, income_type, source_key, dealer_client, amount):
  571. # type: (MockFixture, Dealer, Agent, str, str, RequestTestClient, float)->None
  572. withdrawed = RMB(amount)
  573. after_withdraw_balance = dealer.sub_balance(income_type, source_key)
  574. assert dealer.incr_fund(income_type, source_key, withdrawed), 'balance inc failed'
  575. before_withdraw_balance = dealer.reload().sub_balance(income_type, source_key)
  576. desired_service_fee = withdrawed * (dealer.withdrawFeeRatio.as_ratio)
  577. desired_actual_pay = withdrawed - desired_service_fee
  578. desired_agent_balance = agent.sub_balance(AGENT_INCOME_TYPE.DEALER_WITHDRAW_FEE, source_key)
  579. from apps.web.dealer.views import dealerWithdraw
  580. url = url_fn(dealerWithdraw)
  581. payload = {
  582. 'code': '1234',
  583. 'payType': WITHDRAW_PAY_TYPE.BANK,
  584. 'amount': str(withdrawed),
  585. 'sourceType': income_type,
  586. 'sourceId': source_key,
  587. 'bankAccount': BANK_ACCOUNT_CODE,
  588. 'openId': 'test'
  589. }
  590. from apps.web.common.models import Banks
  591. mocker.patch.object(Banks, 'get_wechat_bank_code', return_value = '1026')
  592. from apps.web.core.payment.wechat import WechatWithdrawGateway
  593. mocker.patch.object(WechatWithdrawGateway, 'withdraw_via_bank', return_value = BANK_WITHDRAW_SUCCEEDED)
  594. response = dealer_client.post_json(url, data = payload)
  595. assert response
  596. assert after_withdraw_balance == dealer.reload().sub_balance(income_type, source_key)
  597. json_response = json.loads(response.content)
  598. assert json_response['result'] == 1
  599. assert json_response['description'] == u'提现申请已经受理'
  600. withdraw_record_id = json_response['payload']['paymentId']
  601. record = WithdrawRecord.objects(id = str(withdraw_record_id)).first() # type: WithdrawRecord
  602. assert record
  603. assert record.serviceFee == desired_service_fee
  604. assert record.actualPay == desired_actual_pay
  605. assert record.amount == withdrawed
  606. assert record.ownerId == str(dealer.id)
  607. assert record.payType == WITHDRAW_PAY_TYPE.BANK
  608. assert record.balance == before_withdraw_balance
  609. assert record.withdrawSourceKey == source_key
  610. assert record.status == WithdrawStatus.PROCESSING
  611. assert record.payAgentId == str(agent.id)
  612. assert record.remarks == u'提现申请已经受理'
  613. assert agent.reload().sub_balance(AGENT_INCOME_TYPE.DEALER_WITHDRAW_FEE, source_key) == desired_agent_balance
  614. @given(income_type = st.sampled_from([DEALER_INCOME_TYPE.DEVICE_INCOME, DEALER_INCOME_TYPE.AD_INCOME]),
  615. amount = st.one_of(st.floats(min_value = 0.01, max_value = settings.WITHDRAW_MINIMUM - 0.01),
  616. st.integers(min_value = 1, max_value = settings.WITHDRAW_MINIMUM - 1)))
  617. def test_dealer_withdraw_with_bank_less_min(mocker, dealer, agent, income_type, source_key, dealer_client, amount):
  618. # type: (MockFixture, Dealer, Agent, str, str, RequestTestClient, float)->None
  619. money = RMB(amount)
  620. pre_balance = dealer.sub_balance(income_type, source_key)
  621. assert dealer.incr_fund(income_type, source_key, money), 'balance inc failed'
  622. added_balance = dealer.reload().sub_balance(income_type, source_key)
  623. from apps.web.dealer.views import dealerWithdraw
  624. url = url_fn(dealerWithdraw)
  625. payload = {
  626. 'code': '1234',
  627. 'payType': WITHDRAW_PAY_TYPE.BANK,
  628. 'amount': str(money),
  629. 'sourceType': income_type,
  630. 'sourceId': source_key,
  631. 'bankAccount': BANK_ACCOUNT_CODE,
  632. 'openId': 'test'
  633. }
  634. response = dealer_client.post_json(url, data = payload)
  635. assert response
  636. json_response = json.loads(response.content)
  637. assert json_response['result'] == 0
  638. assert json_response['description'] == u"提现金额不能少于%s元" % (settings.WITHDRAW_MINIMUM,)
  639. assert added_balance == dealer.reload().sub_balance(income_type, source_key)
  640. @given(income_type = st.sampled_from([DEALER_INCOME_TYPE.DEVICE_INCOME, DEALER_INCOME_TYPE.AD_INCOME]),
  641. amount = st.one_of(
  642. st.floats(min_value = settings.WITHDRAW_MAXIMUM + 0.01, max_value = settings.WITHDRAW_MAXIMUM + 10),
  643. st.integers(min_value = settings.WITHDRAW_MAXIMUM + 1, max_value = settings.WITHDRAW_MAXIMUM + 10)))
  644. def test_dealer_withdraw_with_bank_more_max(mocker, dealer, agent, income_type, source_key, dealer_client, amount):
  645. # type: (MockFixture, Dealer, Agent, str, str, RequestTestClient, float)->None
  646. money = RMB(amount)
  647. pre_balance = dealer.sub_balance(income_type, source_key)
  648. assert dealer.incr_fund(income_type, source_key, money), 'balance inc failed'
  649. added_balance = dealer.reload().sub_balance(income_type, source_key)
  650. from apps.web.dealer.views import dealerWithdraw
  651. url = url_fn(dealerWithdraw)
  652. payload = {
  653. 'code': '1234',
  654. 'payType': WITHDRAW_PAY_TYPE.BANK,
  655. 'amount': str(money),
  656. 'sourceType': income_type,
  657. 'sourceId': source_key,
  658. 'bankAccount': BANK_ACCOUNT_CODE,
  659. 'openId': 'test'
  660. }
  661. response = dealer_client.post_json(url, data = payload)
  662. assert response
  663. json_response = json.loads(response.content)
  664. assert json_response['result'] == 0
  665. assert json_response['description'] == u"单次提现金额不得大于%s元" % (settings.WITHDRAW_MAXIMUM,)
  666. assert added_balance == dealer.reload().sub_balance(income_type, source_key)
  667. #
  668. @given(income_type = st.sampled_from([DEALER_INCOME_TYPE.DEVICE_INCOME, DEALER_INCOME_TYPE.AD_INCOME]))
  669. def test_dealer_withdraw_with_bank_less_balance(mocker, dealer, agent, income_type, source_key, dealer_client):
  670. # type: (MockFixture, Dealer, Agent, str, str, RequestTestClient)->None
  671. withdrawed = RMB(20)
  672. dealer.set_balance(income_type, source_key, RMB(10))
  673. pre_balance = dealer.reload().sub_balance(income_type, source_key)
  674. assert pre_balance == RMB(10)
  675. from apps.web.dealer.views import dealerWithdraw
  676. url = url_fn(dealerWithdraw)
  677. payload = {
  678. 'code': '1234',
  679. 'payType': WITHDRAW_PAY_TYPE.BANK,
  680. 'amount': str(withdrawed),
  681. 'sourceType': income_type,
  682. 'sourceId': source_key,
  683. 'bankAccount': BANK_ACCOUNT_CODE,
  684. 'openId': 'test'
  685. }
  686. response = dealer_client.post_json(url, data = payload)
  687. assert response
  688. json_response = json.loads(response.content)
  689. assert json_response['result'] == 0
  690. assert json_response['description'] == u"余额不足"
  691. assert pre_balance == dealer.reload().sub_balance(income_type, source_key)
  692. @given(income_type = st.sampled_from([DEALER_INCOME_TYPE.DEVICE_INCOME, DEALER_INCOME_TYPE.AD_INCOME]),
  693. manual_type = st.integers(min_value = 1, max_value = 2))
  694. def test_dealer_withdraw_with_bank_manual(mocker, dealer, agent, income_type, dealer_client, manual_type):
  695. # type: (MockFixture, Dealer, Agent, str, RequestTestClient, int)->None
  696. agent.payAppWechat.occupant = agent
  697. agent.payAppWechat.manual_withdraw = True
  698. agent.payAppWechat.save()
  699. gateway = WechatWithdrawGateway(agent.payAppWechat)
  700. source_key = gateway.gateway_key
  701. print repr(gateway)
  702. withdrawed = RMB(20)
  703. after_withdraw_balance = dealer.sub_balance(income_type, source_key)
  704. assert dealer.incr_fund(income_type, source_key, withdrawed), 'balance inc failed'
  705. before_withdraw_balance = dealer.reload().sub_balance(income_type, source_key)
  706. desired_service_fee = withdrawed * (dealer.withdrawFeeRatio.as_ratio)
  707. desired_actual_pay = withdrawed - desired_service_fee
  708. desired_agent_balance = agent.sub_balance(AGENT_INCOME_TYPE.DEALER_WITHDRAW_FEE, source_key)
  709. from apps.web.dealer.views import dealerWithdraw
  710. url = url_fn(dealerWithdraw)
  711. payload = {
  712. 'code': '1234',
  713. 'payType': WITHDRAW_PAY_TYPE.BANK,
  714. 'amount': str(withdrawed),
  715. 'sourceType': income_type,
  716. 'sourceId': source_key,
  717. 'bankAccount': BANK_ACCOUNT_CODE,
  718. 'openId': 'test'
  719. }
  720. response = dealer_client.post_json(url, data = payload)
  721. assert response
  722. json_response = json.loads(response.content)
  723. assert json_response['result'] == 1
  724. assert json_response['description'] == u"提现申请已经受理"
  725. assert after_withdraw_balance == dealer.reload().sub_balance(income_type, source_key)
  726. withdraw_record_id = json_response['payload']['paymentId']
  727. record = WithdrawRecord.objects(id = str(withdraw_record_id)).first() # type: WithdrawRecord
  728. assert record
  729. assert record.serviceFee == desired_service_fee
  730. assert record.actualPay == desired_actual_pay
  731. assert record.amount == withdrawed
  732. assert record.ownerId == str(dealer.id)
  733. assert record.payType == WITHDRAW_PAY_TYPE.BANK
  734. assert record.balance == before_withdraw_balance
  735. assert record.withdrawSourceKey == source_key
  736. assert record.status == WithdrawStatus.PROCESSING
  737. assert record.payAgentId == str(agent.id)
  738. assert record.remarks == u'提现申请已经受理'
  739. assert agent.reload().sub_balance(AGENT_INCOME_TYPE.DEALER_WITHDRAW_FEE, source_key) == desired_agent_balance
  740. @given(income_type = st.sampled_from([DEALER_INCOME_TYPE.DEVICE_INCOME, DEALER_INCOME_TYPE.AD_INCOME]),
  741. test_id = st.integers(min_value = 0, max_value = len(BANK_WITHDRAW_ERROR) - 1))
  742. def test_dealer_withdraw_via_bank_error(mocker, dealer, agent, income_type, source_key, dealer_client, test_id):
  743. # type: (MockFixture, Dealer, Agent, str, str, RequestTestClient, int)->None
  744. """
  745. 测试提现到微信失败的场景
  746. """
  747. desired_result = BANK_WITHDRAW_ERROR[test_id]['result']
  748. if 'remarks' in BANK_WITHDRAW_ERROR[test_id]:
  749. desired_remarks = BANK_WITHDRAW_ERROR[test_id]['remarks']
  750. else:
  751. desired_remarks = u'{err_code_des}({err_code})'.format(
  752. err_code = BANK_WITHDRAW_ERROR[test_id]['err_code'],
  753. err_code_des = BANK_WITHDRAW_ERROR[test_id][
  754. 'err_code_des'])
  755. if 'show_message' in BANK_WITHDRAW_ERROR[test_id]:
  756. desired_show_message = BANK_WITHDRAW_ERROR[test_id]['show_message']
  757. else:
  758. desired_show_message = BANK_WITHDRAW_ERROR[test_id]['err_code_des']
  759. withdrawed = RMB(20)
  760. after_withdraw_balance = dealer.sub_balance(income_type, source_key)
  761. assert dealer.incr_fund(income_type, source_key, withdrawed), 'balance inc failed'
  762. before_withdraw_balance = dealer.reload().sub_balance(income_type, source_key)
  763. desired_service_fee = withdrawed * (dealer.withdrawFeeRatio.as_ratio)
  764. desired_actual_pay = withdrawed - desired_service_fee
  765. before_agent_balance = agent.sub_balance(AGENT_INCOME_TYPE.DEALER_WITHDRAW_FEE, source_key)
  766. from apps.web.dealer.views import dealerWithdraw
  767. url = url_fn(dealerWithdraw)
  768. payload = {
  769. 'code': '1234',
  770. 'payType': WITHDRAW_PAY_TYPE.BANK,
  771. 'amount': str(withdrawed),
  772. 'sourceType': income_type,
  773. 'sourceId': source_key,
  774. 'bankAccount': BANK_ACCOUNT_CODE,
  775. 'openId': 'test'
  776. }
  777. from apps.web.common.models import Banks
  778. mocker.patch.object(Banks, 'get_wechat_bank_code', return_value = '1026')
  779. if BANK_WITHDRAW_ERROR[test_id]['return_code'] == 'FAIL':
  780. mocker.patch.object(WechatWithdrawGateway, 'withdraw_via_bank',
  781. side_effect = WechatNetworkException(
  782. errCode = BANK_WITHDRAW_ERROR[test_id]['return_code'],
  783. errMsg = BANK_WITHDRAW_ERROR[test_id].get('return_msg', '')))
  784. else:
  785. mocker.patch.object(WechatWithdrawGateway, 'withdraw_via_bank',
  786. side_effect = WeChatPayException(
  787. errCode = BANK_WITHDRAW_ERROR[test_id]['err_code'],
  788. errMsg = BANK_WITHDRAW_ERROR[test_id]['err_code_des']))
  789. response = dealer_client.post_json(url, data = payload)
  790. assert response
  791. json_response = json.loads(response.content)
  792. assert json_response['result'] == desired_result
  793. assert json_response['description'] == desired_show_message
  794. dealer.reload()
  795. if BANK_WITHDRAW_ERROR[test_id]['refund']:
  796. assert before_withdraw_balance == dealer.sub_balance(income_type, source_key)
  797. else:
  798. assert after_withdraw_balance == dealer.sub_balance(income_type, source_key)
  799. withdraw_record_id = json_response['payload']['paymentId']
  800. record = WithdrawRecord.objects(id = str(withdraw_record_id)).first() # type: WithdrawRecord
  801. assert record
  802. assert record.serviceFee == desired_service_fee
  803. assert record.actualPay == desired_actual_pay
  804. assert record.amount == withdrawed
  805. assert record.ownerId == str(dealer.id)
  806. assert record.payType == WITHDRAW_PAY_TYPE.BANK
  807. assert record.balance == before_withdraw_balance
  808. assert record.withdrawSourceKey == source_key
  809. if BANK_WITHDRAW_ERROR[test_id]['refund']:
  810. assert record.status == WithdrawStatus.CLOSED
  811. else:
  812. assert record.status == WithdrawStatus.FAILED
  813. assert agent.reload().sub_balance(AGENT_INCOME_TYPE.DEALER_WITHDRAW_FEE, source_key) == before_agent_balance
  814. #
  815. # def test_getIncomeList(dealer_client):
  816. # # type: (RequestTestClient)->None
  817. # url = urls['getIncomeList']
  818. #
  819. # from apps.web.dealer.proxy import DealerIncomeProxy
  820. #
  821. # proxies = DealerIncomeProxy()
  822. #
  823. # today_date = datetime.datetime.now().strftime(Const.DATE_FMT)
  824. #
  825. # response_schema = Schema(
  826. # {
  827. # 'total': int,
  828. # 'adShow': bool,
  829. # 'totalAmount': str,
  830. # 'dataList': list,
  831. # 'aggregate': dict
  832. # })
  833. #
  834. # # test different sources conform to response schema
  835. # response = dealer_client.get(url, data = {
  836. # 'pageIndex': 1,
  837. # 'pageSize': 10,
  838. # 'searchKey': '',
  839. # 'startTime': today_date,
  840. # 'endTime': today_date,
  841. # 'source': '',
  842. # 'groupId': '',
  843. # 'logicalCode': '',
  844. # 'aggregateBy': 'month'
  845. # })
  846. #
  847. # assert response_schema(json.loads(response.content)['payload'])
  848. #
  849. #
  850. # def test_getIncomeAggregate(dealer_client):
  851. # # type: (RequestTestClient)->None
  852. #
  853. # url = urls['getIncomeAggregate']
  854. #
  855. #
  856. # def test_getIncomeDetail(dealer_client):
  857. # # type: (RequestTestClient)->None
  858. #
  859. # url = urls['getIncomeDetail']
  860. #
  861. #
  862. # def test_getConsumptionList(dealer_client):
  863. # # type: (RequestTestClient)->None
  864. #
  865. # url = urls['getConsumptionList']
  866. #
  867. #
  868. # def test_getConsumptionAggregate(dealer_client):
  869. # # type: (RequestTestClient)->None
  870. #
  871. # url = urls['getConsumptionAggregate']
  872. #
  873. #
  874. #
  875. # def test_groupIncomeData(dealer_client):
  876. # url = urls['groupIncomeData']
  877. #
  878. #
  879. # def test_dealerRegister(client, agent):
  880. # from faker import Factory
  881. # fake = Factory.create()
  882. # from faker.providers import internet
  883. #
  884. # fake.add_provider(internet)
  885. #
  886. # from apps.web.dealer.views import dealerRegister
  887. # from testcase.providers.dealer import DealerDataProvider
  888. #
  889. # fake.add_provider(DealerDataProvider)
  890. #
  891. # url = url_fn(dealerRegister)
  892. #
  893. # payload = {}
  894. #
  895. # assert client.post_json(url, payload).json()['result'] == 0
  896. #
  897. # payload = {
  898. # 'code': '1234',
  899. # 'username': fake.username(),
  900. # 'password': fake.name(),
  901. # 'nickname': fake.name(),
  902. # 'agentId': str(agent.id)
  903. # }
  904. #
  905. # assert client.post_json(url, payload).json()['result'] == 1
  906. #
  907. # from apps.web.dealer.models import Dealer
  908. # Dealer.objects(username = payload['username']).delete()
  909. #
  910. #
  911. # def test_getFeatureList(dealer_client, dealer):
  912. # from apps.web.dealer.views import getFeatureList
  913. #
  914. # from apps.web.common.models import Feature
  915. #
  916. # dealer.update(set__features = [])
  917. #
  918. # url = url_fn(getFeatureList)
  919. #
  920. # assert dealer_client.post_json(url).json()['payload'] == {}
  921. #
  922. # with DisposableModel(model = Feature, name = 'test', key = 'test', role = "dealer") as model:
  923. # dealer.update(set__features = [model.key])
  924. # assert dealer_client.post_json(url, data = {'list': ['test']}).json()['payload'] == {'test': True}
  925. # dealer.update(set__features = [])
  926. #
  927. # def test_dealer_withdraw_service(mocker, dealer, agent_no_customized, default_agent, gateway_key):
  928. # from apps.web.core.payment.wechat import WechatPaymentGateway
  929. # mocker.patch.object(WechatPaymentGateway, 'withdraw_via_changes', return_value = WECHAT_WITHDRAW_SUCCEEDED)
  930. #
  931. # for income_type in DEALER_INCOME_TYPE.choices():
  932. # dealer.set_balance(income_type, gateway_key, RMB(20))
  933. # dealer.reload()
  934. #
  935. # for __gateway_key, balance_field in dealer.balance_dict(income_type).iteritems():
  936. # balance = balance_field.balance
  937. # if balance > RMB(10):
  938. # withdraw_service = DealerWithdrawService(payee = dealer,
  939. # income_type = income_type,
  940. # code = None, amount = balance,
  941. # pay_type = WITHDRAW_PAY_TYPE.WECHAT,
  942. # bank_card_no = None)
  943. # result = withdraw_service.execute(gateway_key = __gateway_key, recurrent = True)
  944. #
  945. # print '%s' % result
  946. #
  947. #
  948. # for income_type in DEALER_INCOME_TYPE.choices():
  949. # dealer.set_balance(income_type, gateway_key, RMB(30))
  950. # dealer.reload()
  951. #
  952. # for __gateway_key, balance_field in dealer.balance_dict(income_type).iteritems():
  953. # balance = balance_field.balance
  954. # if balance > RMB(10):
  955. # withdraw_service = DealerWithdrawService(payee = dealer,
  956. # income_type = income_type,
  957. # code = None, amount = balance,
  958. # pay_type = WITHDRAW_PAY_TYPE.WECHAT,
  959. # bank_card_no = None)
  960. # result = withdraw_service.execute(gateway_key = __gateway_key, recurrent = False)
  961. #
  962. # print '%s' % result
  963. #
  964. # default_agent.payAppWechat.manual_withdraw = True
  965. # default_agent.payAppWechat.save()
  966. # default_agent.payAppWechat.reload()
  967. #
  968. # for income_type in DEALER_INCOME_TYPE.choices():
  969. # dealer.set_balance(income_type, gateway_key, RMB(20))
  970. # dealer.reload()
  971. #
  972. # for __gateway_key, balance_field in dealer.balance_dict(income_type).iteritems():
  973. # balance = balance_field.balance
  974. # if balance > RMB(10):
  975. # withdraw_service = DealerWithdrawService(payee = dealer,
  976. # income_type = income_type,
  977. # code = None, amount = balance,
  978. # pay_type = WITHDRAW_PAY_TYPE.WECHAT,
  979. # bank_card_no = None)
  980. # result = withdraw_service.execute(gateway_key = __gateway_key, recurrent = True)
  981. #
  982. # print '%s' % result
  983. #
  984. #
  985. #