test_dealer.py 44 KB

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