Exemple #1
0
class TestMerchantAdminModelManager(TestCase):
    def setUp(self):
        self.factory = PayunionFactory()
        self.merchant = self.factory.create_merchant()
        self.merchant_admin = self.factory.create_merchant_admin(
            work_merchant=self.merchant)
        self.manager = MerchantAdminModelManager()

    def test_has_openid(self):
        # create multiple merchant
        for _ in range(10):
            self.factory.create_merchant()

        self.assertEqual(
            self.manager.get_merchant_admin(
                self.merchant_admin.wechat_unionid), self.merchant_admin)

        old_unionid = self.merchant_admin.wechat_unionid
        self.merchant_admin.wechat_unionid = 'another openid'
        self.merchant_admin.save()
        self.assertIsNone(self.manager.get_merchant_admin(old_unionid))

    def test_remove_cashier(self):
        cashier = self.factory.create_merchant_admin(
            status=SYSTEM_USER_STATUS['USING'],
            work_merchant=self.merchant,
            merchant_admin_type=MERCHANT_ADMIN_TYPES['CASHIER'])
        self.manager.remove_cashier(cashier)
        cashier = MerchantAdmin.objects.get(id=cashier.id)
        self.assertEqual(cashier.status, SYSTEM_USER_STATUS['DISABLED'])
Exemple #2
0
    def setUp(self):
        self.factory = PayunionFactory()

        try:
            self.platform_account = Account.objects.get(id=1)
        except Account.DoesNotExist:
            self.platform_account = self.factory.create_account(
                id=1,
                balance=0,
                withdrawable_balance=0,
                alipay_balance=0,
                alipay_withdrawable_balance=0)
        self.originator_account = self.factory.create_account(
            real_name='引流商户',
            balance=0,
            withdrawable_balance=0,
            alipay_balance=0,
            alipay_withdrawable_balance=0)
        self.merchant_account = self.factory.create_account(
            real_name='收款',
            balance=0,
            withdrawable_balance=0,
            alipay_balance=0,
            alipay_withdrawable_balance=0)
        self.inviter_account = self.factory.create_account(
            real_name='邀请人',
            balance=0,
            withdrawable_balance=0,
            alipay_balance=0,
            alipay_withdrawable_balance=0)
        self.inviter = self.factory.create_marketer(
            account=self.inviter_account)

        self.test_client = self.factory.create_client(openid='1234567890',
                                                      status=0)
        self.merchant = self.factory.create_merchant(
            account=self.merchant_account,
            inviter=self.inviter,
            status=MERCHANT_STATUS.USING)
        self.originator = self.factory.create_merchant(
            account=self.originator_account)
        self.rule = self.factory.create_coupon_rule(
            merchant=self.merchant,
            valid_strategy=VALID_STRATEGY.EXPIRATION,
            expiration_days=30)
        self.coupon = self.factory.create_coupon(
            rule=self.rule,
            client=self.test_client,
            originator_merchant=self.originator,
            min_charge=1000,
            discount=100,
            obtain_datetime=timezone.now(),
            status=COUPON_STATUS['NOT_USED'])

        self.merchant_admin = self.factory.create_merchant_admin(
            merchant_admin_type=MERCHANT_ADMIN_TYPES.ADMIN,
            work_merchant=self.merchant)
        super(TestWechatPaySteps, self).setUpTestData()
Exemple #3
0
    def prepare_data(self):
        from .base_data import create_base_data
        create_base_data()
        fake_factory = PayunionFactory()
        curr_time = timezone.now()
        yesterday = curr_time - timedelta(days=1)

        client = fake_factory.create_client(status=SYSTEM_USER_STATUS['USING'])
        inviter = fake_factory.create_marketer(
            inviter_type=MARKETER_TYPES['SALESMAN'],
            status=SYSTEM_USER_STATUS['USING'])
        merchant = fake_factory.create_merchant(
            status=MERCHANT_STATUS['USING'], inviter=inviter)
        merchant.type = MERCHANT_TYPE['ENTERPRISE']
        merchant.save()

        pay_money = 10 * 100
        payment = Payment.objects.create(
            serial_number="20181102172102347024194949482317",
            datetime=yesterday,
            pay_channel=PAY_CHANNELS['WECHAT'],
            status=PAYMENT_STATUS['FINISHED'],
            merchant=merchant,
            client=client,
            order_price=pay_money,
            coupon=None,
            coupon_granted=True,
            platform_share=0,
            inviter_share=0,
            originator_share=0,
        )
        merchant.account.balance = pay_money
        merchant.account.withdrawable_balance = pay_money

        pay_money = 5 * 100
        payment = Payment.objects.create(
            serial_number="20181102172106671737943971236656",
            datetime=yesterday,
            pay_channel=PAY_CHANNELS['ALIPAY'],
            status=PAYMENT_STATUS['FINISHED'],
            merchant=merchant,
            client=client,
            order_price=5 * 100,
            coupon=None,
            coupon_granted=True,
            platform_share=0,
            inviter_share=0,
            originator_share=0,
        )

        merchant.account.alipay_balance = pay_money
        merchant.account.alipay_withdrawable_balance = pay_money
        merchant.account.save()

        return merchant
Exemple #4
0
    def test_encrypt_filed(self):
        self.factory = PayunionFactory()
        for i in self.value_list:
            merchant_admin = self.factory.create_merchant_admin(
                wechat_openid=i, )
            self.assertEqual(merchant_admin.wechat_openid, i)

            marketer = self.factory.create_marketer(wechat_openid=i, )
            self.assertEqual(marketer.wechat_openid, i)

            client = self.factory.create_client(openid=i, )
            self.assertEqual(client.openid, i)
Exemple #5
0
class TestMerchantAdminManager(TestCase):
    def setUp(self):
        self.factory = PayunionFactory()
        self.merchant = self.factory.create_merchant()
        self.merchant_admin = self.factory.create_merchant_admin(
            work_merchant=self.merchant, alipay_user_name='周杰偷')
        self.manager = MerchantAdminManager(self.merchant_admin)

    def test_work_merchant(self):
        merchant = self.manager.work_merchant.obj
        self.assertEqual(merchant, self.merchant)

    def test_insensitive_alipay_user_name(self):
        self.assertEqual(self.manager.insensitive_alipay_user_name, '**偷')
Exemple #6
0
    def setUp(self):
        # We use a faked ALIPAY_PUBLIC_KEY to mock the alipay response.
        # ALIPAY_PUBLIC_KEY and its corresponding private key is generated by ourselves.
        self.ALIPAY_PUBLIC_KEY_backup = dynasettings.ALIPAY_PUBLIC_KEY
        dynasettings.ALIPAY_PUBLIC_KEY = AutoTestConfig.self_generated_alipay_public_key
        alipay_payment.api_instance.alipay_public_key = AutoTestConfig.self_generated_alipay_public_key

        self.factory = PayunionFactory()

        try:
            self.platform_account = Account.objects.get(id=1)
        except Account.DoesNotExist:
            self.platform_account = self.factory.create_account(id=1, balance=0,
                                                                withdrawable_balance=0,
                                                                alipay_balance=0,
                                                                alipay_withdrawable_balance=0)
        self.originator_account = self.factory.create_account(real_name='引流商户', balance=0,
                                                              withdrawable_balance=0,
                                                              alipay_balance=0,
                                                              alipay_withdrawable_balance=0)
        self.merchant_account = self.factory.create_account(real_name='收款', balance=0,
                                                            withdrawable_balance=0,
                                                            alipay_balance=0,
                                                            alipay_withdrawable_balance=0)
        self.inviter_account = self.factory.create_account(real_name='邀请人', balance=0,
                                                           withdrawable_balance=0,
                                                           alipay_balance=0,
                                                           alipay_withdrawable_balance=0)
        self.inviter = self.factory.create_marketer(account=self.inviter_account)

        self.test_client = self.factory.create_client(openid='1234567890', status=0)
        self.merchant = self.factory.create_merchant(account=self.merchant_account,
                                                     inviter=self.inviter,
                                                     status=MERCHANT_STATUS.USING)
        self.originator = self.factory.create_merchant(account=self.originator_account)
        self.rule = self.factory.create_coupon_rule(merchant=self.merchant,
                                                    valid_strategy=VALID_STRATEGY.EXPIRATION,
                                                    expiration_days=30)
        self.coupon = self.factory.create_coupon(rule=self.rule, client=self.test_client,
                                                 originator_merchant=self.originator,
                                                 min_charge=1000, discount=100,
                                                 obtain_datetime=timezone.now(),
                                                 status=COUPON_STATUS['NOT_USED'])

        self.merchant_admin = self.factory.create_merchant_admin(
            merchant_admin_type=MERCHANT_ADMIN_TYPES.ADMIN,
            work_merchant=self.merchant
        )
        super(TestWechatPaySteps, self).setUpTestData()
Exemple #7
0
    def setUp(self):
        self.ALIPAY_PUBLIC_KEY_backup = dynasettings.ALIPAY_PUBLIC_KEY
        dynasettings.ALIPAY_PUBLIC_KEY = AutoTestConfig.self_generated_alipay_public_key
        alipay_payment.api_instance.alipay_public_key = AutoTestConfig.self_generated_alipay_public_key
        create_base_data()

        self.factory = PayunionFactory()
        try:
            self.platform_account = Account.objects.get(id=1)
        except Account.DoesNotExist:
            self.platform_account = self.factory.create_account(
                id=1,
                balance=100,
                withdrawable_balance=100,
                alipay_balance=100,
                alipay_withdrawable_balance=100)

        merchant_data = dict(
            address_info=dict(adcode='510107062000',
                              address='成都市武侯区锦城大道666号奥克斯广场F1',
                              location_lon=30.57592,
                              location_lat=104.06147),
            merchant_name='提现测试商户',
            merchant_acct_data=dict(bank_name="工商银行",
                                    bank_card_number='622312131213121',
                                    real_name="提现测试"),
        )

        inviter_workflow = GenerateInviterWorkflow(self)
        new_work_ids = [
            area.id for area in Area.objects.filter(parent__name='武侯区')
        ]
        salesman_info = dict(set_salesman=True,
                             system_admin_name='*****@*****.**',
                             system_admin_password='******',
                             new_work_ids=new_work_ids,
                             worker_number='00001')
        res_info = inviter_workflow.generate_inviter(
            name='提现测试邀请人a', salesman_info=salesman_info)
        res_data = inviter_workflow.invite_merchant(
            inviter_token=res_info['token'], merchant_info=merchant_data)

        inviter_workflow.aduit_merchant(config.MERCHANT_STATUS.USING,
                                        token=res_info['token'],
                                        merchant_id=res_data['merchant_id'])

        self.merchant_info = res_data

        super(TestMerchantWithdraw, self).setUpTestData()
Exemple #8
0
    def setUpTestData(cls):
        cls.factory = PayunionFactory()

        # 创建一个商铺及其管理员和收银员各一个
        cls.wechat_person_admin = WechatPerson()
        cls.wechat_person_cashier = WechatPerson()

        # 创建商户b 并设管理员, 收银员
        cls.merchatn_b = cls.factory.create_merchant(
            status=config.MERCHANT_STATUS['USING'])
        cls.factory.create_merchant_admin(
            wechat_openid=cls.wechat_person_admin.subscription_openid,
            wechat_unionid=cls.wechat_person_admin.unionid,
            wechat_avatar_url=cls.wechat_person_admin.user_info['headimgurl'],
            wechat_nickname=cls.wechat_person_admin.user_info['nickname'],
            merchant_admin_type=config.MERCHANT_ADMIN_TYPES['ADMIN'],
            status=config.SYSTEM_USER_STATUS['USING'],
            work_merchant=cls.merchatn_b)
        cls.factory.create_merchant_admin(
            wechat_openid=cls.wechat_person_cashier.subscription_openid,
            wechat_unionid=cls.wechat_person_cashier.unionid,
            wechat_avatar_url=cls.wechat_person_cashier.
            user_info['headimgurl'],
            wechat_nickname=cls.wechat_person_cashier.user_info['nickname'],
            merchant_admin_type=config.MERCHANT_ADMIN_TYPES['CASHIER'],
            status=config.SYSTEM_USER_STATUS['USING'],
            work_merchant=cls.merchatn_b)
Exemple #9
0
    def setUpTestData(cls):
        cls.factory = PayunionFactory()

        cls.merchant = cls.factory.create_merchant(
            status=MERCHANT_STATUS['USING'])
        cls.merchant_admin = cls.factory.create_merchant_admin(
            merchant_admin_type=MERCHANT_ADMIN_TYPES['ADMIN'],
            work_merchant=cls.merchant)

        # create cashiers

        cls.merchant_cashier = cls.factory.create_merchant_admin(
            status=SYSTEM_USER_STATUS['USING'],
            work_merchant=cls.merchant,
            merchant_admin_type=MERCHANT_ADMIN_TYPES['CASHIER'])

        cls.normal_cashier_b = cls.factory.create_merchant_admin(
            status=SYSTEM_USER_STATUS['USING'],
            work_merchant=cls.merchant,
            merchant_admin_type=MERCHANT_ADMIN_TYPES['CASHIER'])

        cls.other_merchant_cashier = cls.factory.create_merchant_admin(
            status=SYSTEM_USER_STATUS['USING'],
            merchant_admin_type=MERCHANT_ADMIN_TYPES['CASHIER'])

        cls.disabled_cashier = cls.factory.create_merchant_admin(
            status=SYSTEM_USER_STATUS['DISABLED'],
            work_merchant=cls.merchant,
            merchant_admin_type=MERCHANT_ADMIN_TYPES['CASHIER'])
        # 创建token并缓存, 绕过登录
        super(TestCashierViewSet, cls).setUpTestData()
Exemple #10
0
 def setUpTestData(cls):
     cls.factory = PayunionFactory()
     cls.account = cls.factory.create_account(
         bank_name='工商银行成都建设路支行',
         bank_card_number='7778889990123',
         real_name='鹏飞')
     cls.merchant = cls.factory.create_merchant(account=cls.account)
Exemple #11
0
class TestEncryptCharFileds(TestCase):
    """ 测试自定义的EncryptCharFiled"""

    value_list = ['', ' ', '0', '12344', 'asdasdasd', 'kjhfujewhff=ds+sd==']

    def test_encrypt_filed(self):
        self.factory = PayunionFactory()
        for i in self.value_list:
            merchant_admin = self.factory.create_merchant_admin(
                wechat_openid=i, )
            self.assertEqual(merchant_admin.wechat_openid, i)

            marketer = self.factory.create_marketer(wechat_openid=i, )
            self.assertEqual(marketer.wechat_openid, i)

            client = self.factory.create_client(openid=i, )
            self.assertEqual(client.openid, i)
Exemple #12
0
    def setUpTestData(cls):
        cls.factory = PayunionFactory()

        # 商户分类
        cls.merchant_category = None
        for p in range(4):
            parent = cls.factory.create_merchant_category(
                name='parent{}'.format(p))
            for c in range(4):
                cls.merchant_category = cls.factory.create_merchant_category(
                    parent=parent, name='{}_child{}'.format(parent.name, c))

        # 商户街道
        for p in range(4):
            parent = cls.factory.create_area(name='市{}'.format(p))
            for c in range(4):
                child = cls.factory.create_area(parent=parent,
                                                name='{}_区{}'.format(
                                                    parent.name, c))
                for cc in range(4):
                    cls.area = cls.factory.create_area(
                        parent=child,
                        name='{}_区{}_街道{}'.format(parent.name, c, cc))

        cls.account = cls.factory.create_account(
            balance=set_amount(1000.00),
            withdrawable_balance=set_amount('500.05'),
            alipay_balance=set_amount(2000),
            alipay_withdrawable_balance=set_amount('1000.05'),
            real_name='张三',
            bank_card_number='1234567890123',
            bank_name='中国招商银行成都玉林路支行')

        cls.merchant = cls.factory.create_merchant(
            name='就是这个公司',
            status=MERCHANT_STATUS['USING'],
            account=cls.account,
            area=cls.area,
            category=cls.merchant_category,
            avatar_url='https://merchant_avatar.jpg',
            photo_url='https://merchant_photo.jpg',
            id_card_back_url=True,
            id_card_front_url=True,
            day_begin_minute=8 * 60,  # 商户订单日结时间设置为08:00
        )
        cls.merchant_admin = cls.factory.create_merchant_admin(
            merchant_admin_type=MERCHANT_ADMIN_TYPES['ADMIN'],
            work_merchant=cls.merchant,
            wechat_nickname='张微信',
            alipay_user_name='张付宝',
            voice_on=True)
        cls.merchant_cashier = cls.factory.create_merchant_admin(
            merchant_admin_type=MERCHANT_ADMIN_TYPES['CASHIER'],
            work_merchant=cls.merchant)

        # 创建token并缓存, 绕过登录
        super(TestMerchantViewSet, cls).setUpTestData()
Exemple #13
0
    def setUpTestData(cls):
        cls.factory = PayunionFactory()
        cls.merchant = cls.factory.create_merchant(
            status=MERCHANT_STATUS['USING'])
        cls.merchant_admin = cls.factory.create_merchant_admin(
            work_merchant=cls.merchant)

        # 创建token并缓存, 绕过登录
        super(TestCouponViewSet, cls).setUpTestData()
Exemple #14
0
    def setUp(self):
        self.factory = PayunionFactory()

        try:
            self.platform_account = Account.objects.get(id=1)
        except Account.DoesNotExist:
            self.platform_account = self.factory.create_account(id=1, balance=0,
                                                                withdrawable_balance=0,
                                                                alipay_balance=0,
                                                                alipay_withdrawable_balance=0)
        self.originator_account = self.factory.create_account(real_name='引流商户', balance=0,
                                                              withdrawable_balance=0,
                                                              alipay_balance=0,
                                                              alipay_withdrawable_balance=0)
        self.merchant_account = self.factory.create_account(real_name='收款', balance=0,
                                                            withdrawable_balance=0,
                                                            alipay_balance=0,
                                                            alipay_withdrawable_balance=0)
        self.inviter_account = self.factory.create_account(real_name='邀请人', balance=0,
                                                           withdrawable_balance=0,
                                                           alipay_balance=0,
                                                           alipay_withdrawable_balance=0)
        self.inviter = self.factory.create_marketer(account=self.inviter_account)

        self.test_client = self.factory.create_client(openid='oUkVN5ZFKfLOkAFwkk4oGYVc0rfg',
                                                      status=0)
        self.merchant = self.factory.create_merchant(account=self.merchant_account,
                                                     status=1,
                                                     inviter=self.inviter)
        self.originator = self.factory.create_merchant(account=self.originator_account)
        self.rule = self.factory.create_coupon_rule(merchant=self.merchant)
        self.coupon = self.factory.create_coupon(rule=self.rule, client=self.test_client,
                                                 originator_merchant=self.originator,
                                                 min_charge=1000, discount=100,
                                                 status=COUPON_STATUS['NOT_USED'])

        self.merchant_admin = self.factory.create_merchant_admin(
            merchant_admin_type=MERCHANT_ADMIN_TYPES.ADMIN,
            work_merchant=self.merchant
        )
        super(GetMerchantInfoTestCase, self).setUp()
Exemple #15
0
    def setUpTestData(cls):
        cls.factory = PayunionFactory()
        cls.account = cls.factory.create_account(
            bank_name='工商银行成都建设路支行',
            bank_card_number='7778889990123',
            real_name='鹏飞'
        )
        cls.merchant = cls.factory.create_merchant(
            account=cls.account,
            day_begin_minute=8 * 60,
            status=MERCHANT_STATUS['USING']
        )
        cls.merchant_admin = cls.factory.create_merchant_admin(work_merchant=cls.merchant)

        # 创建token并缓存, 绕过登录
        super(TestTransactionViewSet, cls).setUpTestData()
Exemple #16
0
 def setUpTestData(cls):
     cls.factory = PayunionFactory()
     cls.merchant = cls.factory.create_merchant()
     cls.merchant_admin = cls.factory.create_merchant_admin(
         status=SYSTEM_USER_STATUS['USING'],
         work_merchant=cls.merchant,
         merchant_admin_type=MERCHANT_ADMIN_TYPES['ADMIN'],
         wechat_openid=Config.my_account_openid)
     cls.payment = cls.factory.create_payment(
         merchant=cls.merchant,
         order_price=300,
     )
     cls.refund = cls.factory.create_refund(
         serial_number='refund serial_number',
         payment=cls.payment,
     )
     cls.manager = RefundManager(cls.refund)
Exemple #17
0
    def setUpTestData(cls):
        cls.factory = PayunionFactory()
        cls.account = cls.factory.create_account(
            balance=set_amount(1000.00),
            withdrawable_balance=set_amount('500.05'),
            alipay_balance=set_amount(2000),
            alipay_withdrawable_balance=set_amount(0.99),
            bank_card_number='1234567890123'
        )
        cls.merchant = cls.factory.create_merchant(
            name='就是这个公司',
            account=cls.account,
            day_begin_minute=8 * 60,  # 商户订单日结时间设置为08:00
        )
        cls.merchant_admin = cls.factory.create_merchant_admin(
            status=SYSTEM_USER_STATUS['USING'],
            work_merchant=cls.merchant,
            merchant_admin_type=MERCHANT_ADMIN_TYPES['ADMIN']

        )
        cls.manager = MerchantManager(cls.merchant)

        # create cashiers
        cls.normal_cashier_a = cls.factory.create_merchant_admin(
            status=SYSTEM_USER_STATUS['USING'],
            work_merchant=cls.merchant,
            merchant_admin_type=MERCHANT_ADMIN_TYPES['CASHIER']
        )

        cls.normal_cashier_b = cls.factory.create_merchant_admin(
            status=SYSTEM_USER_STATUS['USING'],
            work_merchant=cls.merchant,
            merchant_admin_type=MERCHANT_ADMIN_TYPES['CASHIER']
        )

        cls.other_merchant_cashier = cls.factory.create_merchant_admin(
            status=SYSTEM_USER_STATUS['USING'],
            merchant_admin_type=MERCHANT_ADMIN_TYPES['CASHIER']
        )

        cls.disabled_cashier = cls.factory.create_merchant_admin(
            status=SYSTEM_USER_STATUS['DISABLED'],
            work_merchant=cls.merchant,
            merchant_admin_type=MERCHANT_ADMIN_TYPES['CASHIER']
        )
Exemple #18
0
    def setUpTestData(cls):
        cls.factory = PayunionFactory()

        # 5个微信号和两个商铺
        cls.wechat_person_A = WechatPerson()
        cls.wechat_person_B = WechatPerson()
        cls.wechat_person_C = WechatPerson()
        cls.wechat_person_D = WechatPerson()
        cls.wechat_person_E = WechatPerson()

        # 创建商户a 并设管理员为A
        cls.merchatn_a = cls.factory.create_merchant(
            status=config.MERCHANT_STATUS['USING'])
        cls.factory.create_merchant_admin(
            wechat_openid=cls.wechat_person_A.subscription_openid,
            wechat_unionid=cls.wechat_person_A.unionid,
            wechat_avatar_url=cls.wechat_person_A.user_info['headimgurl'],
            wechat_nickname=cls.wechat_person_A.user_info['nickname'],
            merchant_admin_type=config.MERCHANT_ADMIN_TYPES['ADMIN'],
            status=config.SYSTEM_USER_STATUS['USING'],
            work_merchant=cls.merchatn_a)

        # 创建商户b 并设管理员为D, 收银员为E
        cls.merchatn_b = cls.factory.create_merchant(
            status=config.MERCHANT_STATUS['USING'])
        cls.factory.create_merchant_admin(
            wechat_openid=cls.wechat_person_D.subscription_openid,
            wechat_unionid=cls.wechat_person_D.unionid,
            wechat_avatar_url=cls.wechat_person_D.user_info['headimgurl'],
            wechat_nickname=cls.wechat_person_D.user_info['nickname'],
            merchant_admin_type=config.MERCHANT_ADMIN_TYPES['ADMIN'],
            status=config.SYSTEM_USER_STATUS['USING'],
            work_merchant=cls.merchatn_b)
        cls.factory.create_merchant_admin(
            wechat_openid=cls.wechat_person_E.subscription_openid,
            wechat_unionid=cls.wechat_person_E.unionid,
            wechat_avatar_url=cls.wechat_person_E.user_info['headimgurl'],
            wechat_nickname=cls.wechat_person_E.user_info['nickname'],
            merchant_admin_type=config.MERCHANT_ADMIN_TYPES['CASHIER'],
            status=config.SYSTEM_USER_STATUS['USING'],
            work_merchant=cls.merchatn_b)
Exemple #19
0
    def setUpTestData(cls):
        cls.factory = PayunionFactory()

        try:
            cls.platform_account = Account.objects.get(id=1)
        except Account.DoesNotExist:
            cls.platform_account = cls.factory.create_account(id=1, balance=0,
                                                              withdrawable_balance=0,
                                                              alipay_balance=0,
                                                              alipay_withdrawable_balance=0)
        cls.originator_account = cls.factory.create_account(real_name='引流商户', balance=0,
                                                            withdrawable_balance=0,
                                                            alipay_balance=0,
                                                            alipay_withdrawable_balance=0)
        cls.merchant_account = cls.factory.create_account(real_name='收款', balance=0,
                                                          withdrawable_balance=0,
                                                          alipay_balance=0,
                                                          alipay_withdrawable_balance=0)
        cls.inviter_account = cls.factory.create_account(real_name='邀请人', balance=0,
                                                         withdrawable_balance=0,
                                                         alipay_balance=0,
                                                         alipay_withdrawable_balance=0)
        cls.inviter = cls.factory.create_marketer(account=cls.inviter_account)

        cls.test_client = cls.factory.create_client(openid='1234567890', status=0)
        cls.merchant = cls.factory.create_merchant(account=cls.merchant_account,
                                                   inviter=cls.inviter)
        cls.originator = cls.factory.create_merchant(account=cls.originator_account)
        cls.rule = cls.factory.create_coupon_rule(merchant=cls.merchant)
        cls.coupon = cls.factory.create_coupon(rule=cls.rule, client=cls.test_client,
                                               originator_merchant=cls.originator,
                                               min_charge=1000, discount=100,
                                               status=COUPON_STATUS['NOT_USED'])

        cls.merchant_admin = cls.factory.create_merchant_admin(
            merchant_admin_type=MERCHANT_ADMIN_TYPES.ADMIN,
            work_merchant=cls.merchant
        )
        super(GetMerchantInfoTestCase, cls).setUpTestData()
Exemple #20
0
    def setUp(self):
        self.ALIPAY_PUBLIC_KEY_backup = dynasettings.ALIPAY_PUBLIC_KEY
        dynasettings.ALIPAY_PUBLIC_KEY = AutoTestConfig.self_generated_alipay_public_key
        alipay_payment.api_instance.alipay_public_key = AutoTestConfig.self_generated_alipay_public_key
        create_base_data()

        self.factory = PayunionFactory()
        try:
            self.platform_account = Account.objects.get(id=1)
        except Account.DoesNotExist:
            self.platform_account = self.factory.create_account(
                id=1,
                balance=0,
                withdrawable_balance=0,
                alipay_balance=0,
                alipay_withdrawable_balance=0)

        #  三个商户信息
        # 创建三个商户ABC
        # |A-B = 4| < 5 && |B-C=4| < 5 && |A-C=8| > 5
        # A: 成都市武侯区锦城大道666号奥克斯广场F1  lng= 104.06147  lat= 30.57592  adcode = 510107062000
        # B: 成都市武侯区益州大道1999号银泰城F1  lng= 104.05847  lat= 30.54097  adcode = 510107062000
        # C: 成都市天府新区华阳街道正西街88号  lng= 104.05365  lat= 30.5062  adcode = 510116003000
        merchant_info_a = dict(
            address_info=dict(adcode='510107062000',
                              address='成都市武侯区锦城大道666号奥克斯广场F1',
                              location_lon=30.57592,
                              location_lat=104.06147),
            merchant_name='商户a',
            merchant_acct_data=dict(bank_name="工商银行",
                                    bank_card_number='622312131213122',
                                    real_name="商户a"))
        merchant_info_b = dict(
            address_info=dict(adcode='510107062000',
                              address='成都市武侯区益州大道1999号银泰城F1',
                              location_lon=30.54097,
                              location_lat=104.05847),
            merchant_name='商户b',
            merchant_acct_data=dict(bank_name="工商银行",
                                    bank_card_number='622312131213123',
                                    real_name="商户b"))
        merchant_info_c = dict(address_info=dict(adcode='510116003000',
                                                 address='成都市天府新区华阳街道正西街88号',
                                                 location_lon=30.5062,
                                                 location_lat=104.05365),
                               merchant_name='商户c',
                               merchant_acct_data=dict(
                                   bank_name="工商银行",
                                   bank_card_number='622312131213124',
                                   real_name="商户c"))

        inviter_workflow = GenerateInviterWorkflow(self)

        new_work_ids_1 = [
            area.id for area in Area.objects.filter(parent__name='武侯区')
        ]
        salesman_info_1 = dict(set_salesman=True,
                               system_admin_name='*****@*****.**',
                               system_admin_password='******',
                               new_work_ids=new_work_ids_1,
                               worker_number='0001')

        new_work_ids_2 = [
            area.id for area in Area.objects.filter(parent__name='武侯区')
        ]
        salesman_info_2 = dict(set_salesman=True,
                               system_admin_name='*****@*****.**',
                               system_admin_password='******',
                               new_work_ids=new_work_ids_2,
                               worker_number='0002')

        new_work_ids_3 = [
            area.id for area in Area.objects.filter(parent__name='双流区')
        ]
        salesman_info_3 = dict(set_salesman=True,
                               system_admin_name='*****@*****.**',
                               system_admin_password='******',
                               new_work_ids=new_work_ids_3,
                               worker_number='0003')

        # 成为邀请人且设为业务员
        res_info_1 = inviter_workflow.generate_inviter(
            name='邀请人1', salesman_info=salesman_info_1)
        res_info_2 = inviter_workflow.generate_inviter(
            name='邀请人2', salesman_info=salesman_info_2)
        res_info_3 = inviter_workflow.generate_inviter(
            name='邀请人3', salesman_info=salesman_info_3)

        res_data_1 = inviter_workflow.invite_merchant(
            inviter_token=res_info_1['token'], merchant_info=merchant_info_a)
        res_data_2 = inviter_workflow.invite_merchant(
            inviter_token=res_info_2['token'], merchant_info=merchant_info_b)
        res_data_3 = inviter_workflow.invite_merchant(
            inviter_token=res_info_3['token'], merchant_info=merchant_info_c)

        # 业务员1,2, 3 分别审核a,b,c 通过
        aduit_a = inviter_workflow.aduit_merchant(
            config.MERCHANT_STATUS.USING,
            token=res_info_1['token'],
            merchant_id=res_data_1['merchant_id'])
        aduit_b = inviter_workflow.aduit_merchant(
            config.MERCHANT_STATUS.USING,
            token=res_info_2['token'],
            merchant_id=res_data_2['merchant_id'])
        aduit_c = inviter_workflow.aduit_merchant(
            config.MERCHANT_STATUS.USING,
            token=res_info_3['token'],
            merchant_id=res_data_3['merchant_id'])

        res_info_1.update(
            dict(db_instance=models.Marketer.objects.get(pk=res_info_1['id'])))
        res_info_2.update(
            dict(db_instance=models.Marketer.objects.get(pk=res_info_2['id'])))
        res_info_3.update(
            dict(db_instance=models.Marketer.objects.get(pk=res_info_3['id'])))
        res_data_1.update(
            dict(db_instance=models.Merchant.objects.get(
                pk=res_data_1['merchant_id'])))
        res_data_2.update(
            dict(db_instance=models.Merchant.objects.get(
                pk=res_data_2['merchant_id'])))
        res_data_3.update(
            dict(db_instance=models.Merchant.objects.get(
                pk=res_data_3['merchant_id'])))

        self.inviter_info = {
            "a": res_info_1,
            "b": res_info_2,
            "c": res_info_3,
        }
        self.merchatn_info = {
            "a": res_data_1,
            "b": res_data_2,
            "c": res_data_3,
        }
        self.system_admin_info = {
            'username': '******',
            'password': '******'
        }

        # #  每个商户分别创建4种优惠券
        coupon_data_1 = dict(
            discount=5,
            min_charge=11,
            valid_strategy=config.VALID_STRATEGY['DATE_RANGE'],
            stock=10,
            start_date='2018-10-1',
            end_date='2019-5-1',
            photo_url=fake.image_url())
        coupon_data_2 = dict(
            discount=8,
            min_charge=15,
            valid_strategy=config.VALID_STRATEGY['DATE_RANGE'],
            stock=10,
            start_date='2018-10-1',
            end_date='2019-5-1',
            photo_url=fake.image_url())
        coupon_data_3 = dict(
            discount=12,
            min_charge=17,
            valid_strategy=config.VALID_STRATEGY['DATE_RANGE'],
            stock=10,
            start_date='2018-10-1',
            end_date='2019-5-1',
            photo_url=fake.image_url())
        coupon_data_4 = dict(
            discount=15,
            min_charge=19,
            valid_strategy=config.VALID_STRATEGY['DATE_RANGE'],
            stock=10,
            start_date='2018-10-1',
            end_date='2019-5-1',
            photo_url=fake.image_url())
        self.create_coupon_rule_data(res_data_1['merchant_id'], coupon_data_1)
        self.create_coupon_rule_data(res_data_1['merchant_id'], coupon_data_2)
        self.create_coupon_rule_data(res_data_1['merchant_id'], coupon_data_3)
        self.create_coupon_rule_data(res_data_1['merchant_id'], coupon_data_4)

        # b商户
        coupon_data_1 = dict(
            discount=10,
            min_charge=20,
            valid_strategy=config.VALID_STRATEGY['DATE_RANGE'],
            stock=1,
            start_date='2018-10-1',
            end_date='2019-5-1',
            photo_url=fake.image_url())
        coupon_data_2 = dict(
            discount=10,
            min_charge=20,
            valid_strategy=config.VALID_STRATEGY['DATE_RANGE'],
            stock=1,
            start_date='2018-10-1',
            end_date='2019-5-1',
            photo_url=fake.image_url())
        coupon_data_3 = dict(
            discount=20,
            min_charge=30,
            valid_strategy=config.VALID_STRATEGY['DATE_RANGE'],
            stock=1,
            start_date='2018-10-1',
            end_date='2019-5-1',
            photo_url=fake.image_url())
        coupon_data_4 = dict(
            discount=20,
            min_charge=30,
            valid_strategy=config.VALID_STRATEGY['DATE_RANGE'],
            stock=1,
            start_date='2018-10-1',
            end_date='2019-5-1',
            photo_url=fake.image_url())
        self.create_coupon_rule_data(res_data_2['merchant_id'], coupon_data_1)
        self.create_coupon_rule_data(res_data_2['merchant_id'], coupon_data_2)
        self.create_coupon_rule_data(res_data_2['merchant_id'], coupon_data_3)
        self.create_coupon_rule_data(res_data_2['merchant_id'], coupon_data_4)

        coupon_data_1 = dict(
            discount=45,
            min_charge=51,
            valid_strategy=config.VALID_STRATEGY['DATE_RANGE'],
            stock=10,
            start_date='2018-10-1',
            end_date='2019-5-1',
            photo_url=fake.image_url())
        coupon_data_2 = dict(
            discount=48,
            min_charge=55,
            valid_strategy=config.VALID_STRATEGY['DATE_RANGE'],
            stock=10,
            start_date='2018-10-1',
            end_date='2019-5-1',
            photo_url=fake.image_url())
        coupon_data_3 = dict(
            discount=52,
            min_charge=57,
            valid_strategy=config.VALID_STRATEGY['DATE_RANGE'],
            stock=10,
            start_date='2018-10-1',
            end_date='2019-5-1',
            photo_url=fake.image_url())
        coupon_data_4 = dict(
            discount=55,
            min_charge=59,
            valid_strategy=config.VALID_STRATEGY['DATE_RANGE'],
            stock=10,
            start_date='2018-10-1',
            end_date='2019-5-1',
            photo_url=fake.image_url())
        self.create_coupon_rule_data(res_data_3['merchant_id'], coupon_data_1)
        self.create_coupon_rule_data(res_data_3['merchant_id'], coupon_data_2)
        self.create_coupon_rule_data(res_data_3['merchant_id'], coupon_data_3)
        self.create_coupon_rule_data(res_data_3['merchant_id'], coupon_data_4)

        super(TestUserPay, self).setUpTestData()
Exemple #21
0
class TestMarketerManager(TestCase):
    factory = PayunionFactory()

    def test_has_area(self):
        manager = AreaModelManager()
        area = self.factory.create_area(adcode='110119110000')
        marketer = self.factory.create_marketer(
            status=SYSTEM_USER_STATUS.USING,
            inviter_type=MARKETER_TYPES.SALESMAN)
        marketer.working_areas.add(area)
        self.assertEqual(manager.has_marketer(adcode='110119110000'), True)

    def test_get_merchant_sharing(self):
        manager = PaymentModelManager()
        merchant = self.factory.create_merchant(name='this merchant')
        self.factory.create_payment(merchant=merchant,
                                    inviter_share=1989,
                                    number=10,
                                    status=PAYMENT_STATUS.FINISHED)
        sharing = manager.get_merchant_sharing(obj=merchant)
        self.assertEqual(sharing, 1989 * 10)

    def test_create_marketer(self):
        manager = CreateMarketerManager()
        data = dict(wechat_openid='this open id',
                    wechat_unionid='this union id',
                    inviter_type=MARKETER_TYPES.MARKETER,
                    status=SYSTEM_USER_STATUS.USING,
                    name='this marketer name',
                    phone='this phone num',
                    id_card_front_url='this id card front url',
                    id_card_back_url='this id card back url')
        marketer_instance = manager.create(data)
        self.assertEqual(marketer_instance.name, data.get('name'))

    def test_create_merchant(self):
        manager = CreateMerchantManager()
        merchant_data = dict(
            status=MERCHANT_STATUS.USING,
            name='this name',
            inviter=self.factory.create_marketer(),
            payment_qr_code=self.factory.create_payment_qrcode(),
            category=self.factory.create_merchant_category(),
            contact_phone='this phone number',
            area=self.factory.create_area(),
            address='this address',
            location_lon=123,
            location_lat=132,
            description='this description',
            avatar_url='this url',
            photo_url='this url',
            license_url='this url',
            id_card_front_url='',
            id_card_back_url='',
            create_datetime=timezone.now())
        admin_data = dict(wechat_openid='this openid',
                          wechat_unionid='this unionid',
                          wechat_avatar_url='this url',
                          wechat_nickname='this nickname')
        merchant_acct_data = {
            'bank_name': 'bank name',
            'bank_card_number': '88888888888',
            'real_name': 'real name'
        }
        merchant = manager.create(merchant_data=merchant_data,
                                  merchant_admin_data=admin_data,
                                  merchant_acct_data=merchant_acct_data)
        pass

    def test_audit_merchant(self):
        marketer = self.factory.create_marketer(name='this marketer')
        to_using_merchant = self.factory.create_merchant(
            name='to_using_merchant', status=MERCHANT_STATUS.REVIEWING)
        to_reject_merchant = self.factory.create_merchant(
            name='to_reject_merchant', status=MERCHANT_STATUS.REVIEWING)
        manager = UserMerchantModelManager(user=marketer)
        to_using_merchant = manager.audit_merchant(
            merchant_instance=to_using_merchant,
            to_status=MERCHANT_STATUS.USING)
        to_reject_merchant = manager.audit_merchant(
            merchant_instance=to_reject_merchant,
            to_status=MERCHANT_STATUS.REJECTED,
            audit_info='audit_info')
        audit_info = to_reject_merchant.merchantmarketership_set.all(
        ).order_by('-audit_datetime').first()
        pass

    def test_get_all_status_merchant_num(self):
        marketer = self.factory.create_marketer()
        self.factory.create_merchant(number=5,
                                     inviter=marketer,
                                     status=MERCHANT_STATUS.USING)
        self.factory.create_merchant(number=4,
                                     inviter=marketer,
                                     status=MERCHANT_STATUS.REVIEWING)
        self.factory.create_merchant(number=3,
                                     inviter=marketer,
                                     status=MERCHANT_STATUS.REJECTED)
        manager = UserMerchantModelManager(user=marketer)
        res = manager.get_invited_merchant_num()
        self.assertEqual(res.get('reviewing_merchants_num'), 4 + 3)
        self.assertEqual(res.get('using_merchants_num'), 5)

    def test_get_sharing(self):
        marketer = self.factory.create_marketer()
        manager = UserTransactionModelManager(user=marketer)
        merchant = self.factory.create_merchant(inviter=marketer)
        self.factory.create_transaction(
            account=marketer.account,
            transaction_type=TRANSACTION_TYPE.MARKETER_SHARE,
            amount=100,
            content_object=self.factory.create_payment(merchant=merchant))
        self.factory.create_transaction(
            account=marketer.account,
            transaction_type=TRANSACTION_TYPE.MARKETER_SHARE,
            amount=200,
            content_object=self.factory.create_payment(merchant=merchant))
        self.factory.create_transaction(
            account=marketer.account,
            transaction_type=TRANSACTION_TYPE.MARKETER_SHARE,
            amount=300,
            content_object=self.factory.create_payment(merchant=merchant))
        res = manager.get_sharing(merchant=merchant)
        self.assertEqual(res, 100 + 200 + 300)

    def test_get_auditor_merchant(self):

        # 创建地址
        area1 = self.factory.create_area()
        area2 = self.factory.create_area()
        area3 = self.factory.create_area()

        # 为管理员添加工作区域
        marketer = self.factory.create_marketer()
        marketer.working_areas.add(area1, area2)

        # 添加管理员非工作区域但审核过的商铺
        # using_merchant1 = self.factory.create_merchant(status=MERCHANT_STATUS.USING, area=area3)
        # using_merchant2 = self.factory.create_merchant(status=MERCHANT_STATUS.USING, area=area3)
        # using_merchant3 = self.factory.create_merchant(status=MERCHANT_STATUS.USING, area=area3)
        # self.factory.create_merchant_marketer_ship(marketer=marketer, merchant=using_merchant1)
        # self.factory.create_merchant_marketer_ship(marketer=marketer, merchant=using_merchant2)
        # self.factory.create_merchant_marketer_ship(marketer=marketer, merchant=using_merchant3)

        # 添加管理员工作区域待审核商铺
        reviewing_merchant1 = self.factory.create_merchant(
            status=MERCHANT_STATUS.REVIEWING, area=area1)
        reviewing_merchant2 = self.factory.create_merchant(
            status=MERCHANT_STATUS.REVIEWING, area=area2)

        # 添加非管理员工作区域商铺
        self.factory.create_merchant(area=area3)

        # 添加管理员工作区域已审核商铺
        using_merchant = self.factory.create_merchant(
            status=MERCHANT_STATUS.USING, area=area1)

        # 预期查询结果
        # merchant_set = {using_merchant1, using_merchant2, using_merchant3, reviewing_merchant1, reviewing_merchant2}
        merchant_set = {
            using_merchant, reviewing_merchant1, reviewing_merchant2
        }
        manager = UserMerchantModelManager(user=marketer)
        res = manager.get_auditor_merchants()

        # 实际查询结果
        res_set = set()
        for item in res:
            res_set.add(item)
        self.assertEqual(merchant_set, res_set)

    def test_check_phone(self):
        self.factory.create_marketer(phone='18888888888')
        mamager = MarketerModelManager()
        res = mamager.check_phone_exist('18888888888')
        self.assertEqual(res, True)

    def test_show_invited_merchants(self):
        marketer = self.factory.create_marketer(
            status=SYSTEM_USER_STATUS.USING)
        merchant = self.factory.create_merchant(inviter=marketer,
                                                status=MERCHANT_STATUS.USING)
        for i in range(10):
            payment = self.factory.create_payment(
                merchant=merchant,
                status=PAYMENT_STATUS.FINISHED,
                order_price=10000,
                inviter_share=10000 * 0.005)
            self.factory.create_transaction(
                content_object=payment,
                transaction_type=TRANSACTION_TYPE.MARKETER_SHARE,
                amount=payment.inviter_share)
        manager = UserTransactionModelManager(user=marketer)
        res = manager.get_sharing(merchant)
        self.assertEqual(res, 500)

    def test_VerifyAccountLimitRecord(self):
        VerifyAccountLimitRecord.delete_record('test')
        record = 0
        for _ in range(11):
            record = VerifyAccountLimitRecord.record_request_an_hour('test')
        self.assertFalse(record < MAX_VERIFY_ACCOUNT_REQUEST_AN_HOUR)
        VerifyAccountLimitRecord.delete_record('test')
Exemple #22
0
 def setUpTestData(cls):
     cls.factory = PayunionFactory()
     cls.manager = MerchantCategoryModelManager()
Exemple #23
0
class TestWechatPaySteps(APITestCase):
    def setUp(self):
        # We use a faked ALIPAY_PUBLIC_KEY to mock the alipay response.
        # ALIPAY_PUBLIC_KEY and its corresponding private key is generated by ourselves.
        self.ALIPAY_PUBLIC_KEY_backup = dynasettings.ALIPAY_PUBLIC_KEY
        dynasettings.ALIPAY_PUBLIC_KEY = AutoTestConfig.self_generated_alipay_public_key
        alipay_payment.api_instance.alipay_public_key = AutoTestConfig.self_generated_alipay_public_key

        self.factory = PayunionFactory()

        try:
            self.platform_account = Account.objects.get(id=1)
        except Account.DoesNotExist:
            self.platform_account = self.factory.create_account(id=1, balance=0,
                                                                withdrawable_balance=0,
                                                                alipay_balance=0,
                                                                alipay_withdrawable_balance=0)
        self.originator_account = self.factory.create_account(real_name='引流商户', balance=0,
                                                              withdrawable_balance=0,
                                                              alipay_balance=0,
                                                              alipay_withdrawable_balance=0)
        self.merchant_account = self.factory.create_account(real_name='收款', balance=0,
                                                            withdrawable_balance=0,
                                                            alipay_balance=0,
                                                            alipay_withdrawable_balance=0)
        self.inviter_account = self.factory.create_account(real_name='邀请人', balance=0,
                                                           withdrawable_balance=0,
                                                           alipay_balance=0,
                                                           alipay_withdrawable_balance=0)
        self.inviter = self.factory.create_marketer(account=self.inviter_account)

        self.test_client = self.factory.create_client(openid='1234567890', status=0)
        self.merchant = self.factory.create_merchant(account=self.merchant_account,
                                                     inviter=self.inviter,
                                                     status=MERCHANT_STATUS.USING)
        self.originator = self.factory.create_merchant(account=self.originator_account)
        self.rule = self.factory.create_coupon_rule(merchant=self.merchant,
                                                    valid_strategy=VALID_STRATEGY.EXPIRATION,
                                                    expiration_days=30)
        self.coupon = self.factory.create_coupon(rule=self.rule, client=self.test_client,
                                                 originator_merchant=self.originator,
                                                 min_charge=1000, discount=100,
                                                 obtain_datetime=timezone.now(),
                                                 status=COUPON_STATUS['NOT_USED'])

        self.merchant_admin = self.factory.create_merchant_admin(
            merchant_admin_type=MERCHANT_ADMIN_TYPES.ADMIN,
            work_merchant=self.merchant
        )
        super(TestWechatPaySteps, self).setUpTestData()

    def tearDown(self):
        dynasettings.ALIPAY_PUBLIC_KEY = self.ALIPAY_PUBLIC_KEY_backup
        alipay_payment.api_instance.alipay_public_key = self.ALIPAY_PUBLIC_KEY_backup

    def test_workflow(self):
        client_steps = ClientSteps()

        # Login
        code = uuid.uuid4().hex

        def validate(request):
            params = parse_qs(request.query)
            self.assertEqual(params['app_id'][0], str(dynasettings.ALIPAY_APP_ID))
            self.assertEqual(params['code'][0], code)
            self.assertEqual(params['grant_type'][0], 'authorization_code')
            return True

        login_result = client_steps.alipay_login(code,
                                                 mocked_user_id=self.test_client.openid,
                                                 validate=validate)
        access_token = login_result['access_token']
        self.assertEqual(len(access_token), 32)

        # Get user info
        me_info = client_steps.me(access_token)
        assert me_info

        # Get all coupons
        coupons = client_steps.get_coupons(access_token)
        self.assertEqual(len(coupons), 1)
        self.assertEqual(coupons[0]['id'], self.coupon.id)
        self.assertEqual(coupons[0]['rule']['merchant']['name'], self.merchant.name)
        self.assertEqual(coupons[0]['discount'], self.coupon.discount)
        self.assertEqual(coupons[0]['min_charge'], self.coupon.min_charge)

        # Get merchant info
        merchant_info = client_steps.get_merchant_info(access_token,
                                                       self.merchant.payment_qr_code.uuid)
        self.assertTrue(merchant_info)
        self.assertTrue(merchant_info['id'])
        self.assertTrue(merchant_info['name'])
        self.assertTrue(merchant_info['description'])
        self.assertTrue(merchant_info['avatar_url'])
        self.assertTrue(isinstance(merchant_info['status'], int))

        # Place order
        alipay_payment_steps = AlipayPaymentSteps(
            access_token)
        shared_pay_steps = SharedPaySteps(access_token)

        place_order_result = alipay_payment_steps.place_order(
            self.merchant.id, 1000,
            self.coupon.id)
        assert place_order_result
        self.assertEqual(place_order_result['code'], '10000')
        self.assertEqual(place_order_result['msg'], 'Success')
        self.assertEqual(len(place_order_result['out_trade_no']), 32)

        # Cancel the order
        cancel_order_result = alipay_payment_steps.cancel_order(
            place_order_result['out_trade_no'])
        assert cancel_order_result['new_coupon']
        self.coupon = Coupon.objects.get(id=cancel_order_result['new_coupon']['id'])
        assert self.coupon

        # Place another order
        place_order_result = alipay_payment_steps.place_order(
            self.merchant.id, 1000,
            self.coupon.id)
        assert place_order_result
        self.assertEqual(place_order_result['code'], '10000')
        self.assertEqual(place_order_result['msg'], 'Success')
        self.assertEqual(len(place_order_result['out_trade_no']), 32)

        poll_result_result = shared_pay_steps.poll_result(
            place_order_result['out_trade_no'],
            None, None, None
        )
        assert poll_result_result['payment']['status'] == 0

        # Payment callback
        callback_response = alipay_payment_steps.payment_callback(
            dynasettings.ALIPAY_APP_ID,
            self.test_client.openid,
            place_order_result['out_trade_no'],
            900,
        )
        assert '"OK"' == callback_response.content.decode()

        poll_result_result = shared_pay_steps.poll_result(
            place_order_result['out_trade_no'],
            None, None, None
        )
        assert poll_result_result['payment']['status'] == 1

        # login merchant
        code = uuid.uuid4().hex
        resp = MerchantLoginMockStep(self).login(
            code,
            mocked_unionid=self.merchant_admin.wechat_unionid)
        token = resp.json()['token']
        assert token

        # get merchant info
        me = MerchantStep(self, token=token).me().json()
        self.assertEqual(me['name'], self.merchant.name)

        # get order detail
        order_detail = TransactionStep(self, token=token).retrieve(
            transaction_id=place_order_result['out_trade_no']).json()
        self.assertEqual(order_detail['status'], config.PAYMENT_STATUS.FROZEN)

        # refund
        refund_result = TransactionStep(self, token=token).refund(
            payment_id=place_order_result['out_trade_no']).json()
        self.assertEqual(refund_result, {})

        # get order detail
        order_detail = TransactionStep(self, token=token).retrieve(
            transaction_id=place_order_result['out_trade_no']).json()
        self.assertEqual(order_detail['status'], config.PAYMENT_STATUS.REFUND)

        # ********************************************
        # Place another to test unfreeze
        place_order_result = alipay_payment_steps.place_order(
            self.merchant.id, 1000,
            Coupon.objects.filter(client=self.test_client).order_by('-id').first().id)

        # Payment callback
        alipay_payment_steps.payment_callback(
            dynasettings.ALIPAY_APP_ID,
            self.test_client.openid,
            place_order_result['out_trade_no'],
            900,
        )

        # Unfreeze and check result.
        shared_pay_steps.unfreeze_immediately()

        order_detail = TransactionStep(self, token=token).retrieve(
            transaction_id=place_order_result['out_trade_no']).json()
        self.assertEqual(order_detail['status'], config.PAYMENT_STATUS.FINISHED)
Exemple #24
0
 def setUp(self):
     self.factory = PayunionFactory()
     self.merchant = self.factory.create_merchant()
     self.merchant_admin = self.factory.create_merchant_admin(
         work_merchant=self.merchant, alipay_user_name='周杰偷')
     self.manager = MerchantAdminManager(self.merchant_admin)
Exemple #25
0
class DemoData:
    factory = PayunionFactory()

    class C:
        categories = {
            '娱乐': ('电玩', '健身游泳', '彩票', '网吧', '按摩', '足浴'),
            '农林牧渔': ('兽医兽药', '农药', '化肥', '养殖', '种植', '园林景观'),
            '旅游住宿': ('旅游', '宾馆酒店', '交通票务'),
            '日用百货': ('文具', '服装', '纺织原料', '箱包', '饰品', '日化用品', '化妆品', '美容', '家具',
                     '家纺家饰', '餐具厨具', '大型家电', '成人用品'),
            '餐饮': ('饮料饮品', '中餐', '牛排', '零食', '冰淇淋', '火锅', '咖啡'),
        }

        avatar_url = 'https://ss1.mvpalpha.muchbo.com/images/8c4d0e63-9d0d-4147-9c4c-bdfe0041d954_.jpg'
        photo_url = 'https://ss1.mvp.muchbo.com/default_avatar_v2/2.png'

        id_card_front_url = 'https://ss1.mvpalpha.muchbo.com//tmp/wxde4cd9477fb1b7cc.o6zAJs_2J1MEva4MSZJ3mD_HZxGs.HCOsasOtDFiIfa0725dff5d321d4c45473bbb9a559a9.png'
        id_card_back_url = 'https://ss1.mvpalpha.muchbo.com//tmp/wxde4cd9477fb1b7cc.o6zAJs_2J1MEva4MSZJ3mD_HZxGs.LQlXi3PiXc6Y514303d48605a6b93c6acd415b691055.png'

        merchant_admins = [
            dict(name='易宇豪',
                 openid='ocBww1tzu48XhqoyLAAro_K5VjNU',
                 unionid='oYpKH1FA1m_piWNL9RYF8Mi61iCU'),
            dict(name='陈秀梅',
                 openid='1',
                 unionid='oYpKH1NA7fnrBASmTz_61Wh-e3dA'),
            dict(name='代绪',
                 openid='ocBww1oHcnOem9Uhterls3ItFx9o',
                 unionid='oYpKH1BZdJeahn9sL46tsXM7vXqM',
                 qr_code_uuid='129d3209ad9f87771719df50347492d9'),
            dict(name='谢汪益',
                 openid='ocBww1n_-2iKlWyp4lXBS73iWwAc',
                 unionid='oYpKH1E0JUlHLfeGXed1nsCdavoE'),
        ]

        marketers = [
            dict(type='SALESMAN',
                 name='谢汪益',
                 openid='ocBww1n_-2iKlWyp4lXBS73iWwAc',
                 unionid='oYpKH1E0JUlHLfeGXed1nsCdavoE'),
            dict(type='MARKETER',
                 name='刘琳',
                 openid='ocBww1iGLaABtMiNJGgT0fK2mp1g',
                 unionid='oYpKH1BKU3Qdg9kPgCwTAJGgbBJI'),
            dict(type='MARKETER',
                 name='唐田',
                 openid='3',
                 unionid='oYpKH1Ebo1opV914_yj49vyB0Aa8'),
            dict(type='MARKETER',
                 name='李姗',
                 openid='ocBww1lbnnTT8fz84M8WX4mYz4ho',
                 unionid='oYpKH1FXke5DLi38tqZ-p8Sa1VEE'),
        ]

        withdraw = 90
        receive = 100.1
        share = 1.01

    @classmethod
    def already_created(cls):
        return MerchantAdmin.objects.first() is not None

    @classmethod
    def create_marketer(cls, user):
        account = cls.factory.create_account(
            balance=set_amount(10),
            withdrawable_balance=set_amount('0.50'),
            alipay_balance=set_amount('15006.50'),
            alipay_withdrawable_balance=set_amount('15006.50'),
            real_name=user['name'])
        cls.marketer = cls.factory.create_marketer(
            wechat_openid=user['openid'],
            wechat_unionid=user['unionid'],
            inviter_type=MARKETER_TYPES[user['type']],
            status=SYSTEM_USER_STATUS['USING'],
            name=user['name'],
            phone='13333333333',
            id_card_front_url=cls.C.id_card_front_url,
            id_card_back_url=cls.C.id_card_back_url,
            account=account,
        )

    @classmethod
    def create_merchant(cls, user):
        # 商户account
        account = cls.factory.create_account(
            balance=set_amount(10),
            withdrawable_balance=set_amount('0.50'),
            alipay_balance=set_amount('15006.50'),
            alipay_withdrawable_balance=set_amount('15006.50'),
            real_name=user['name'])

        # 付款二维码, 使用唯一可测试的code
        payment_qr_code = cls.factory.create_payment_qrcode(uuid='129d3209ad9f87771719df50347492d9') \
            if 'qr_code_uuid' in user else None

        # 商户
        merchant = cls.factory.create_merchant(
            name=f"一家咖啡店({user['name']}店)",
            status=MERCHANT_STATUS['USING'],
            location_lat=30.533743,
            location_lon=104.068197,
            account=account,
            area=cls.area,
            category=cls.merchant_category,
            inviter=cls.marketer,
            avatar_url=cls.C.avatar_url,
            photo_url=cls.C.photo_url,
            id_card_back_url=cls.C.id_card_back_url,
            id_card_front_url=cls.C.id_card_front_url,
            payment_qr_code=payment_qr_code)
        cls.factory.create_merchant_admin(
            wechat_openid=user['openid'],
            wechat_unionid=user['unionid'],
            merchant_admin_type=MERCHANT_ADMIN_TYPES['ADMIN'],
            work_merchant=merchant,
            wechat_nickname=user['name'])

        # 创建投放完成的优惠券
        coupon_rule = cls.factory.create_coupon_rule(merchant=merchant,
                                                     stock=0)

        share_merchant = cls.factory.create_merchant(
            name='通过发优惠券引流客户到达的商户',
            area=cls.area,
            category=cls.merchant_category,
            inviter=cls.marketer,
        )
        grant_coupon_merchant = cls.factory.create_merchant(
            name='发优惠券的商户',
            area=cls.area,
            category=cls.merchant_category,
            inviter=cls.marketer,
        )

        cls.factory.create_coupon(number=1,
                                  rule=coupon_rule,
                                  status=COUPON_STATUS['NOT_USED'],
                                  originator_merchant=grant_coupon_merchant,
                                  use_datetime=timezone.now())
        cls.factory.create_coupon(number=2,
                                  rule=coupon_rule,
                                  status=COUPON_STATUS['USED'],
                                  originator_merchant=grant_coupon_merchant,
                                  use_datetime=timezone.now())
        cls.factory.create_coupon(number=4,
                                  rule=coupon_rule,
                                  status=COUPON_STATUS['DESTROYED'],
                                  originator_merchant=grant_coupon_merchant,
                                  use_datetime=timezone.now())
        cls.factory.create_coupon(number=8,
                                  rule=coupon_rule,
                                  status=COUPON_STATUS['USED'],
                                  originator_merchant=grant_coupon_merchant,
                                  use_datetime=timezone.now().replace(
                                      hour=7,
                                      minute=59,
                                      second=59,
                                      microsecond=0))

        for day in range(10):
            withdraw = cls.factory.create_withdraw(account=account,
                                                   amount=set_amount(
                                                       cls.C.withdraw))
            cls.factory.create_transaction(
                content_object=withdraw,
                account=account,
                datetime=withdraw.datetime,
                transaction_type=TRANSACTION_TYPE['MERCHANT_WITHDRAW'])

            withdraw = cls.factory.create_withdraw(
                withdraw_type=WITHDRAW_TYPE.ALIPAY,
                account=account,
                amount=set_amount(cls.C.withdraw))
            cls.factory.create_transaction(
                content_object=withdraw,
                account=account,
                amount=-withdraw.amount,
                datetime=withdraw.datetime,
                transaction_type=TRANSACTION_TYPE['MERCHANT_WITHDRAW'])

            coupon_rule = cls.factory.create_coupon_rule(
                merchant=merchant,
                datetime=timezone.now(),
                end_date=timezone.now().replace(year=2019))

            coupon = cls.factory.create_coupon(
                rule=coupon_rule,
                originator_merchant=grant_coupon_merchant,
                obtain_datetime=timezone.now() - timedelta(days=day),
                use_datetime=timezone.now() - timedelta(days=day),
            )
            payment = cls.factory.create_payment(
                merchant=merchant,
                coupon=coupon,
                datetime=timezone.now() - timedelta(days=day),
            )
            cls.factory.create_transaction(
                content_object=payment,
                account=account,
                datetime=payment.datetime,
                transaction_type=TRANSACTION_TYPE['MERCHANT_RECEIVE'])

            without_coupon_payment = cls.factory.create_payment(
                merchant=merchant,
                datetime=timezone.now() - timedelta(days=day),
            )
            cls.factory.create_transaction(
                content_object=without_coupon_payment,
                account=account,
                datetime=without_coupon_payment.datetime,
                transaction_type=TRANSACTION_TYPE['MERCHANT_RECEIVE'])

            share = cls.factory.create_payment(
                coupon=cls.factory.create_coupon(
                    rule=coupon_rule,
                    originator_merchant=grant_coupon_merchant),
                datetime=timezone.now() - timedelta(days=day),
                merchant=share_merchant)
            cls.factory.create_transaction(
                content_object=share,
                account=account,
                datetime=share.datetime,
                transaction_type=TRANSACTION_TYPE['MERCHANT_SHARE'])

    @classmethod
    def create(cls):
        if cls.already_created():
            return

        with atomic():
            cls.area = Area.objects.order_by('-id').first()

            # 商户分类
            cls.merchant_category = None
            for p, children in cls.C.categories.items():
                parent = cls.factory.create_merchant_category(name=p)
                for c in children:
                    cls.merchant_category = cls.factory.create_merchant_category(
                        parent=parent, name=c)

            # 创建业务员
            for user in cls.C.marketers:
                cls.create_marketer(user)

            # 创建商户
            for user in cls.C.merchant_admins:
                cls.create_merchant(user)

            # 后台管理员
            cls.factory.create_system_admin(
                username='******',
                password=make_password('123456'),
                name='super',
                status=SYSTEM_USER_STATUS['USING'],
                is_super=True,
            )
Exemple #26
0
 def setUp(self):
     self.factory = PayunionFactory()
     self.merchant = self.factory.create_merchant()
     self.merchant_admin = self.factory.create_merchant_admin(
         work_merchant=self.merchant)
     self.manager = MerchantAdminModelManager()
Exemple #27
0
class TestUserPay(MerchantClientTestBase):
    def setUp(self):
        self.ALIPAY_PUBLIC_KEY_backup = dynasettings.ALIPAY_PUBLIC_KEY
        dynasettings.ALIPAY_PUBLIC_KEY = AutoTestConfig.self_generated_alipay_public_key
        alipay_payment.api_instance.alipay_public_key = AutoTestConfig.self_generated_alipay_public_key
        create_base_data()

        self.factory = PayunionFactory()
        try:
            self.platform_account = Account.objects.get(id=1)
        except Account.DoesNotExist:
            self.platform_account = self.factory.create_account(
                id=1,
                balance=0,
                withdrawable_balance=0,
                alipay_balance=0,
                alipay_withdrawable_balance=0)

        #  三个商户信息
        # 创建三个商户ABC
        # |A-B = 4| < 5 && |B-C=4| < 5 && |A-C=8| > 5
        # A: 成都市武侯区锦城大道666号奥克斯广场F1  lng= 104.06147  lat= 30.57592  adcode = 510107062000
        # B: 成都市武侯区益州大道1999号银泰城F1  lng= 104.05847  lat= 30.54097  adcode = 510107062000
        # C: 成都市天府新区华阳街道正西街88号  lng= 104.05365  lat= 30.5062  adcode = 510116003000
        merchant_info_a = dict(
            address_info=dict(adcode='510107062000',
                              address='成都市武侯区锦城大道666号奥克斯广场F1',
                              location_lon=30.57592,
                              location_lat=104.06147),
            merchant_name='商户a',
            merchant_acct_data=dict(bank_name="工商银行",
                                    bank_card_number='622312131213122',
                                    real_name="商户a"))
        merchant_info_b = dict(
            address_info=dict(adcode='510107062000',
                              address='成都市武侯区益州大道1999号银泰城F1',
                              location_lon=30.54097,
                              location_lat=104.05847),
            merchant_name='商户b',
            merchant_acct_data=dict(bank_name="工商银行",
                                    bank_card_number='622312131213123',
                                    real_name="商户b"))
        merchant_info_c = dict(address_info=dict(adcode='510116003000',
                                                 address='成都市天府新区华阳街道正西街88号',
                                                 location_lon=30.5062,
                                                 location_lat=104.05365),
                               merchant_name='商户c',
                               merchant_acct_data=dict(
                                   bank_name="工商银行",
                                   bank_card_number='622312131213124',
                                   real_name="商户c"))

        inviter_workflow = GenerateInviterWorkflow(self)

        new_work_ids_1 = [
            area.id for area in Area.objects.filter(parent__name='武侯区')
        ]
        salesman_info_1 = dict(set_salesman=True,
                               system_admin_name='*****@*****.**',
                               system_admin_password='******',
                               new_work_ids=new_work_ids_1,
                               worker_number='0001')

        new_work_ids_2 = [
            area.id for area in Area.objects.filter(parent__name='武侯区')
        ]
        salesman_info_2 = dict(set_salesman=True,
                               system_admin_name='*****@*****.**',
                               system_admin_password='******',
                               new_work_ids=new_work_ids_2,
                               worker_number='0002')

        new_work_ids_3 = [
            area.id for area in Area.objects.filter(parent__name='双流区')
        ]
        salesman_info_3 = dict(set_salesman=True,
                               system_admin_name='*****@*****.**',
                               system_admin_password='******',
                               new_work_ids=new_work_ids_3,
                               worker_number='0003')

        # 成为邀请人且设为业务员
        res_info_1 = inviter_workflow.generate_inviter(
            name='邀请人1', salesman_info=salesman_info_1)
        res_info_2 = inviter_workflow.generate_inviter(
            name='邀请人2', salesman_info=salesman_info_2)
        res_info_3 = inviter_workflow.generate_inviter(
            name='邀请人3', salesman_info=salesman_info_3)

        res_data_1 = inviter_workflow.invite_merchant(
            inviter_token=res_info_1['token'], merchant_info=merchant_info_a)
        res_data_2 = inviter_workflow.invite_merchant(
            inviter_token=res_info_2['token'], merchant_info=merchant_info_b)
        res_data_3 = inviter_workflow.invite_merchant(
            inviter_token=res_info_3['token'], merchant_info=merchant_info_c)

        # 业务员1,2, 3 分别审核a,b,c 通过
        aduit_a = inviter_workflow.aduit_merchant(
            config.MERCHANT_STATUS.USING,
            token=res_info_1['token'],
            merchant_id=res_data_1['merchant_id'])
        aduit_b = inviter_workflow.aduit_merchant(
            config.MERCHANT_STATUS.USING,
            token=res_info_2['token'],
            merchant_id=res_data_2['merchant_id'])
        aduit_c = inviter_workflow.aduit_merchant(
            config.MERCHANT_STATUS.USING,
            token=res_info_3['token'],
            merchant_id=res_data_3['merchant_id'])

        res_info_1.update(
            dict(db_instance=models.Marketer.objects.get(pk=res_info_1['id'])))
        res_info_2.update(
            dict(db_instance=models.Marketer.objects.get(pk=res_info_2['id'])))
        res_info_3.update(
            dict(db_instance=models.Marketer.objects.get(pk=res_info_3['id'])))
        res_data_1.update(
            dict(db_instance=models.Merchant.objects.get(
                pk=res_data_1['merchant_id'])))
        res_data_2.update(
            dict(db_instance=models.Merchant.objects.get(
                pk=res_data_2['merchant_id'])))
        res_data_3.update(
            dict(db_instance=models.Merchant.objects.get(
                pk=res_data_3['merchant_id'])))

        self.inviter_info = {
            "a": res_info_1,
            "b": res_info_2,
            "c": res_info_3,
        }
        self.merchatn_info = {
            "a": res_data_1,
            "b": res_data_2,
            "c": res_data_3,
        }
        self.system_admin_info = {
            'username': '******',
            'password': '******'
        }

        # #  每个商户分别创建4种优惠券
        coupon_data_1 = dict(
            discount=5,
            min_charge=11,
            valid_strategy=config.VALID_STRATEGY['DATE_RANGE'],
            stock=10,
            start_date='2018-10-1',
            end_date='2019-5-1',
            photo_url=fake.image_url())
        coupon_data_2 = dict(
            discount=8,
            min_charge=15,
            valid_strategy=config.VALID_STRATEGY['DATE_RANGE'],
            stock=10,
            start_date='2018-10-1',
            end_date='2019-5-1',
            photo_url=fake.image_url())
        coupon_data_3 = dict(
            discount=12,
            min_charge=17,
            valid_strategy=config.VALID_STRATEGY['DATE_RANGE'],
            stock=10,
            start_date='2018-10-1',
            end_date='2019-5-1',
            photo_url=fake.image_url())
        coupon_data_4 = dict(
            discount=15,
            min_charge=19,
            valid_strategy=config.VALID_STRATEGY['DATE_RANGE'],
            stock=10,
            start_date='2018-10-1',
            end_date='2019-5-1',
            photo_url=fake.image_url())
        self.create_coupon_rule_data(res_data_1['merchant_id'], coupon_data_1)
        self.create_coupon_rule_data(res_data_1['merchant_id'], coupon_data_2)
        self.create_coupon_rule_data(res_data_1['merchant_id'], coupon_data_3)
        self.create_coupon_rule_data(res_data_1['merchant_id'], coupon_data_4)

        # b商户
        coupon_data_1 = dict(
            discount=10,
            min_charge=20,
            valid_strategy=config.VALID_STRATEGY['DATE_RANGE'],
            stock=1,
            start_date='2018-10-1',
            end_date='2019-5-1',
            photo_url=fake.image_url())
        coupon_data_2 = dict(
            discount=10,
            min_charge=20,
            valid_strategy=config.VALID_STRATEGY['DATE_RANGE'],
            stock=1,
            start_date='2018-10-1',
            end_date='2019-5-1',
            photo_url=fake.image_url())
        coupon_data_3 = dict(
            discount=20,
            min_charge=30,
            valid_strategy=config.VALID_STRATEGY['DATE_RANGE'],
            stock=1,
            start_date='2018-10-1',
            end_date='2019-5-1',
            photo_url=fake.image_url())
        coupon_data_4 = dict(
            discount=20,
            min_charge=30,
            valid_strategy=config.VALID_STRATEGY['DATE_RANGE'],
            stock=1,
            start_date='2018-10-1',
            end_date='2019-5-1',
            photo_url=fake.image_url())
        self.create_coupon_rule_data(res_data_2['merchant_id'], coupon_data_1)
        self.create_coupon_rule_data(res_data_2['merchant_id'], coupon_data_2)
        self.create_coupon_rule_data(res_data_2['merchant_id'], coupon_data_3)
        self.create_coupon_rule_data(res_data_2['merchant_id'], coupon_data_4)

        coupon_data_1 = dict(
            discount=45,
            min_charge=51,
            valid_strategy=config.VALID_STRATEGY['DATE_RANGE'],
            stock=10,
            start_date='2018-10-1',
            end_date='2019-5-1',
            photo_url=fake.image_url())
        coupon_data_2 = dict(
            discount=48,
            min_charge=55,
            valid_strategy=config.VALID_STRATEGY['DATE_RANGE'],
            stock=10,
            start_date='2018-10-1',
            end_date='2019-5-1',
            photo_url=fake.image_url())
        coupon_data_3 = dict(
            discount=52,
            min_charge=57,
            valid_strategy=config.VALID_STRATEGY['DATE_RANGE'],
            stock=10,
            start_date='2018-10-1',
            end_date='2019-5-1',
            photo_url=fake.image_url())
        coupon_data_4 = dict(
            discount=55,
            min_charge=59,
            valid_strategy=config.VALID_STRATEGY['DATE_RANGE'],
            stock=10,
            start_date='2018-10-1',
            end_date='2019-5-1',
            photo_url=fake.image_url())
        self.create_coupon_rule_data(res_data_3['merchant_id'], coupon_data_1)
        self.create_coupon_rule_data(res_data_3['merchant_id'], coupon_data_2)
        self.create_coupon_rule_data(res_data_3['merchant_id'], coupon_data_3)
        self.create_coupon_rule_data(res_data_3['merchant_id'], coupon_data_4)

        super(TestUserPay, self).setUpTestData()

    def tearDown(self):
        dynasettings.ALIPAY_PUBLIC_KEY = self.ALIPAY_PUBLIC_KEY_backup
        alipay_payment.api_instance.alipay_public_key = self.ALIPAY_PUBLIC_KEY_backup

    def create_coupon_rule_data(self, merchant_id, coupon_rule_data):
        """ 每个商户分别创建4种优惠券"""
        merchant_admin = MerchantAdmin.objects.filter(
            work_merchant_id=merchant_id,
            merchant_admin_type=config.MERCHANT_ADMIN_TYPES.ADMIN).first()

        # 商户管理员a创建4种卡券
        merchant_admin_token = self.mock_merchant_admin_or_cashier_login_success(
            WechatPerson(unionid=merchant_admin.wechat_unionid,
                         subscription_openid=merchant_admin.wechat_openid))

        admin_coupon_step = CouponStep(self, merchant_admin_token)
        resp = admin_coupon_step.create(**coupon_rule_data)

    def test_user_alipay_not_use_coupon(self):
        """
        不使用优惠券付款
        :return:
        """

        # 用户支付宝支付 向a商户0.01 元后退款"""
        # 用户不同意地理位置授权,支付成功,获取商户B的优惠券共3张

        # 支付宝授权
        alipay_clent_step = ClientSteps()
        alipay_person_userid = str(uuid.uuid4().hex)
        alipay_person = alipay_clent_step.alipay_login(str(uuid.uuid4().hex),
                                                       alipay_person_userid,
                                                       None)
        alipay_person_access_token = alipay_person['access_token']

        # 给商户a支付0.01元给商户
        money = 1
        alipay_payment_step = AlipayPaymentSteps(alipay_person_access_token)
        place_order_resp_json = alipay_payment_step.place_order(
            self.merchatn_info['a']['merchant_id'], money, None)

        # 支付宝支付成功回调
        resp = alipay_payment_step.payment_callback(
            dynasettings.ALIPAY_APP_ID, alipay_person_userid,
            place_order_resp_json['out_trade_no'], 1)
        self.assertEqual(resp.content.decode(), '"OK"')

        # 获取优惠券 , 未报告位置,获取三张b的优惠券
        resp_json = SharedPaySteps(alipay_person['access_token']).poll_result(
            place_order_resp_json['out_trade_no'], None, None, None)
        payment_info = resp_json['payment']
        self.assertEqual(payment_info['serial_number'],
                         place_order_resp_json['out_trade_no'])
        self.assertEqual(payment_info['status'],
                         config.PAYMENT_STATUS['FROZEN'])
        self.assertEqual(payment_info['order_price'], money)
        coupons = resp_json['coupons']
        self.assertEqual(len(coupons), 3)
        for coupon in coupons:
            self.assertEqual('商户b', coupon['rule']['merchant']['name'])
            self.assertEqual('商户a', coupon['originator_merchant'])

        # 打开用户端查看三张优惠券
        resp_json = alipay_clent_step.get_coupons(alipay_person_access_token)
        self.assertEqual(resp_json, coupons)

        # 商户a退款
        # 商户管理员登录token
        merchant_admin = MerchantAdmin.objects.filter(
            work_merchant_id=self.merchatn_info['a']['merchant_id'],
            merchant_admin_type=config.MERCHANT_ADMIN_TYPES.ADMIN).first()

        merchant_admin_token = self.mock_merchant_admin_or_cashier_login_success(
            WechatPerson(unionid=merchant_admin.wechat_unionid,
                         subscription_openid=merchant_admin.wechat_openid))
        transaction_step = TransactionStep(self)
        resp = transaction_step.alipay_refund(merchant_admin_token,
                                              payment_info['serial_number'])
        self.assertEqual(resp.json(), {})

        # 退款成功,用户查看其优惠券未消失,商户b卡券已领三张
        resp_json = alipay_clent_step.get_coupons(alipay_person_access_token)
        self.assertEqual(resp_json, coupons)

        # TODO 商户b管理员登录查看卡券已领三张
        # merchant_admin = MerchantAdmin.objects.get(pk=self.merchatn_info['b']['merchant_id'])
        # merchant_admin_token = self.mock_merchant_admin_or_cashier_login_success(
        #     WechatPerson(unionid=merchant_admin.wechat_unionid,
        #                  subscription_openid=merchant_admin.wechat_openid
        #                  ))
        # coupon_step = CouponStep(self, merchant_admin_token)
        # resp_json = coupon_step.list()

        # 后台管理员登录查看数据
        system_admin_login_step = LoginStep(self)
        finacial_query_step = FinancialQueryStep(self)
        system_admin_login_step.login(**self.system_admin_info)
        resp = finacial_query_step.get_overview_data()
        self.assertEqual(
            resp.json(), {
                'merchant': 3,
                'inviter': 3,
                'client': 1,
                'coupon': 3,
                'coupon_used': 0,
                'payment': {
                    'wechat': 0.0,
                    'alipay': 0.0,
                    'total': 0.0
                }
            })

        # 用户同意地理位置授权,且用户在商户C的位置。支付成功,获取商户B、C的优惠券共3张
        # 给商户a支付10元给商户
        money = 10 * 100
        alipay_payment_step = AlipayPaymentSteps(alipay_person_access_token)
        place_order_resp_json = alipay_payment_step.place_order(
            self.merchatn_info['a']['merchant_id'], money, None)
        print(place_order_resp_json)

        # 支付宝支付成功回调
        resp = alipay_payment_step.payment_callback(
            dynasettings.ALIPAY_APP_ID, alipay_person_userid,
            place_order_resp_json['out_trade_no'], 10 * 100)
        self.assertEqual(resp.content.decode(), '"OK"')

        # 获取优惠券 , 用户在商户C的位置,获取商户b、c的优惠券共3张
        resp_json = SharedPaySteps(alipay_person['access_token']).poll_result(
            place_order_resp_json['out_trade_no'],
            self.merchatn_info['c']['db_instance'].location_lon,
            self.merchatn_info['c']['db_instance'].location_lat, 5.0)
        payment_info = resp_json['payment']
        self.assertEqual(payment_info['serial_number'],
                         place_order_resp_json['out_trade_no'])
        self.assertEqual(payment_info['status'],
                         config.PAYMENT_STATUS['FROZEN'])
        self.assertEqual(payment_info['order_price'], money)
        coupons = resp_json['coupons']
        self.assertEqual(len(coupons), 3)
        for coupon in coupons:
            self.assertEqual('商户a', coupon['originator_merchant'])
            self.assertIn(coupon['rule']['merchant']['name'], ['商户b', '商户c'])

        # 后台查看
        resp = finacial_query_step.get_overview_data()
        print(resp.json())
        self.assertEqual(
            resp.json(), {
                'merchant': 3,
                'inviter': 3,
                'client': 1,
                'coupon': 6,
                'coupon_used': 0,
                'payment': {
                    'wechat': 0.0,
                    'alipay': 10,
                    'total': 10
                }
            })

    def test_user_alipay_use_coupon(self):
        """
         使用优惠券付款
        :return:
        """

        # 用户支付宝支付 向a商户0.01 元后退款"""
        # 用户不同意地理位置授权,支付成功,获取商户B的优惠券共3张

        # 支付宝授权
        alipay_clent_step = ClientSteps()
        alipay_person_userid = str(uuid.uuid4().hex)
        alipay_person = alipay_clent_step.alipay_login(str(uuid.uuid4().hex),
                                                       alipay_person_userid,
                                                       None)
        alipay_person_access_token = alipay_person['access_token']

        # 给商户a支付0.01元给商户
        money = 1
        alipay_payment_step = AlipayPaymentSteps(alipay_person_access_token)
        place_order_resp_json = alipay_payment_step.place_order(
            self.merchatn_info['a']['merchant_id'], money, None)

        # 支付宝支付成功回调
        resp = alipay_payment_step.payment_callback(
            dynasettings.ALIPAY_APP_ID, alipay_person_userid,
            place_order_resp_json['out_trade_no'], 1)
        self.assertEqual(resp.content.decode(), '"OK"')

        # 获取优惠券 , 未报告位置,获取三张b的优惠券
        resp_json = SharedPaySteps(alipay_person['access_token']).poll_result(
            place_order_resp_json['out_trade_no'], None, None, None)
        payment_info = resp_json['payment']
        self.assertEqual(payment_info['serial_number'],
                         place_order_resp_json['out_trade_no'])
        self.assertEqual(payment_info['status'],
                         config.PAYMENT_STATUS['FROZEN'])
        self.assertEqual(payment_info['order_price'], money)
        coupons = resp_json['coupons']
        user_coupon_type_dict = dict(buy_20_get_10_reduction=[],
                                     buy_30_get_20_reduction=[])
        self.assertEqual(len(coupons), 3)
        for coupon in coupons:
            self.assertEqual('商户b', coupon['rule']['merchant']['name'])
            self.assertEqual('商户a', coupon['originator_merchant'])
            if coupon['discount'] == 1000 and coupon['min_charge'] == 2000:
                user_coupon_type_dict['buy_20_get_10_reduction'].append(
                    coupon['id'])
            elif coupon['discount'] == 2000 and coupon['min_charge'] == 3000:
                user_coupon_type_dict['buy_30_get_20_reduction'].append(
                    coupon['id'])
        self.assertNotEqual(
            user_coupon_type_dict,
            dict(buy_20_get_10_reduction=[], buy_30_get_20_reduction=[]))

        # 商户a退款
        # 商户管理员登录token
        merchant_admin = MerchantAdmin.objects.filter(
            work_merchant_id=self.merchatn_info['a']['merchant_id'],
            merchant_admin_type=config.MERCHANT_ADMIN_TYPES.ADMIN).first()
        merchant_admin_token = self.mock_merchant_admin_or_cashier_login_success(
            WechatPerson(unionid=merchant_admin.wechat_unionid,
                         subscription_openid=merchant_admin.wechat_openid))
        transaction_step = TransactionStep(self)
        resp = transaction_step.alipay_refund(merchant_admin_token,
                                              payment_info['serial_number'])
        self.assertEqual(resp.json(), {})

        # 退款成功,用户查看其优惠券未消失,商户b卡券已领三张
        resp_json = alipay_clent_step.get_coupons(
            alipay_person_access_token,
            uuid=self.merchatn_info['b']['db_instance'].payment_qr_code.uuid)
        self.assertEqual(len(resp_json), 3)

        # 用户向商户b付款30元,使用优惠券满30减20实际付款10元,支付成功后得到3张优惠券,然后商户b退款, 然后支付成功
        # 给商户b支付30元给商户
        money = 30 * 100
        alipay_payment_step = AlipayPaymentSteps(alipay_person_access_token)
        place_order_resp_json = alipay_payment_step.place_order(
            self.merchatn_info['b']['merchant_id'], money,
            user_coupon_type_dict['buy_30_get_20_reduction'][0])
        print(place_order_resp_json)
        # 支付宝支付成功回调
        resp = alipay_payment_step.payment_callback(
            dynasettings.ALIPAY_APP_ID, alipay_person_userid,
            place_order_resp_json['out_trade_no'], 1)
        self.assertEqual(resp.content.decode(), '"OK"')

        # 获取优惠券 , 未报告位置,获取三张的优惠券
        resp_json = SharedPaySteps(alipay_person['access_token']).poll_result(
            place_order_resp_json['out_trade_no'], None, None, None)
        payment_info = resp_json['payment']
        self.assertEqual(payment_info['serial_number'],
                         place_order_resp_json['out_trade_no'])
        self.assertEqual(payment_info['status'],
                         config.PAYMENT_STATUS['FROZEN'])
        self.assertEqual(payment_info['order_price'], money)
        coupons = resp_json['coupons']
        self.assertEqual(len(coupons), 3)

        # 支付成功,查看该用户在商户b的优惠券是否减少一张
        resp_json = alipay_clent_step.get_coupons(
            alipay_person_access_token,
            uuid=self.merchatn_info['b']['db_instance'].payment_qr_code.uuid)
        temp = 0
        for coupon in resp_json:
            if coupon['discount'] == 2000 and coupon['min_charge'] == 3000:
                temp = temp + 1
        self.assertEqual(temp + 1,
                         len(user_coupon_type_dict['buy_30_get_20_reduction']))
        # self.assertEqual(resp_json, coupons)

        # 商户b退款
        # 商户管理员登录token
        merchant_admin = MerchantAdmin.objects.filter(
            work_merchant_id=self.merchatn_info['b']['merchant_id'],
            merchant_admin_type=config.MERCHANT_ADMIN_TYPES.ADMIN).first()

        merchant_admin_token = self.mock_merchant_admin_or_cashier_login_success(
            WechatPerson(unionid=merchant_admin.wechat_unionid,
                         subscription_openid=merchant_admin.wechat_openid))
        transaction_step = TransactionStep(self)
        resp = transaction_step.alipay_refund(merchant_admin_token,
                                              payment_info['serial_number'])
        self.assertEqual(resp.json(), {})
        # 退款成功,用户查看其优惠券未消失(退款退回一张优惠券)
        resp_json = alipay_clent_step.get_coupons(
            alipay_person_access_token,
            uuid=self.merchatn_info['b']['db_instance'].payment_qr_code.uuid)
        user_coupon_type_dict = dict(buy_20_get_10_reduction=[],
                                     buy_30_get_20_reduction=[])
        self.assertEqual(len(resp_json), 3)
        for coupon in resp_json:
            self.assertEqual('商户b', coupon['rule']['merchant']['name'])
            self.assertEqual('商户a', coupon['originator_merchant'])
            if coupon['discount'] == 1000 and coupon['min_charge'] == 2000:
                user_coupon_type_dict['buy_20_get_10_reduction'].append(
                    coupon['id'])
            elif coupon['discount'] == 2000 and coupon['min_charge'] == 3000:
                user_coupon_type_dict['buy_30_get_20_reduction'].append(
                    coupon['id'])
        self.assertNotEqual(
            user_coupon_type_dict,
            dict(buy_20_get_10_reduction=[], buy_30_get_20_reduction=[]))

        # 用户再次支付30向商户b付款30元,使用优惠券满30减20实际付款10元,支付成功后得到3张优惠券,

        money = 30 * 100
        alipay_payment_step = AlipayPaymentSteps(alipay_person_access_token)
        place_order_resp_json = alipay_payment_step.place_order(
            self.merchatn_info['b']['merchant_id'], money,
            user_coupon_type_dict['buy_30_get_20_reduction'][0])
        # 支付宝支付成功回调
        resp = alipay_payment_step.payment_callback(
            dynasettings.ALIPAY_APP_ID, alipay_person_userid,
            place_order_resp_json['out_trade_no'], 1)
        self.assertEqual(resp.content.decode(), '"OK"')
        # 获取优惠券 , 未报告位置,获取三张的优惠券
        resp_json = SharedPaySteps(alipay_person['access_token']).poll_result(
            place_order_resp_json['out_trade_no'], None, None, None)
        payment_info = resp_json['payment']
        self.assertEqual(payment_info['serial_number'],
                         place_order_resp_json['out_trade_no'])
        self.assertEqual(payment_info['status'],
                         config.PAYMENT_STATUS['FROZEN'])
        self.assertEqual(payment_info['order_price'], money)
        # 解冻账单成功
        resp_json = SharedPaySteps(None).unfreeze_immediately()
        print(resp_json)
        self.assertEqual(resp_json, "OK")

        # 商户a查看引流收益
        # 商户管理员登录token TODO 接口更新
        # merchant_admin = MerchantAdmin.objects.get(pk=self.merchatn_info['a']['merchant_id'])
        # merchant_admin_token = self.mock_merchant_admin_or_cashier_login_success(
        #     WechatPerson(unionid=merchant_admin.wechat_unionid,
        #                  subscription_openid=merchant_admin.wechat_openid
        #                  ))
        # merchant_step = MerchantStep(self, merchant_admin_token)
        # resp = merchant_step.statistics()
        # print(resp.json())
        # 邀请人查看引流收益
        inviter_get_userinfo_step = GetUserInfoStep()
        resp, _ = inviter_get_userinfo_step.go(
            token=self.inviter_info['b']['token'])
        resp_json = resp.json()
        self.assertEqual(resp_json['user_name'], '邀请人2')
        self.assertEqual(resp_json['using_invited_merchants_num'], 1)
        self.assertEqual(resp_json['total_bonus'], 10)
        # 管理后台查看数据
        system_admin_login_step = LoginStep(self)
        finacial_query_step = FinancialQueryStep(self)
        system_admin_login_step.login(**self.system_admin_info)
        resp = finacial_query_step.get_overview_data()
        self.assertEqual(
            resp.json(), {
                'merchant': 3,
                'inviter': 3,
                'client': 1,
                'coupon': 9,
                'coupon_used': 1,
                'payment': {
                    'wechat': 0.0,
                    'alipay': 10.0,
                    'total': 10.0
                }
            })
Exemple #28
0
class PaymentBaseTestCases(TestCase):
    def __init__(self, methodName='runTest'):
        super().__init__(methodName)
        self.factory = PayunionFactory()

    def setUp(self):
        self.merchants = []
        self.merchants.append(
            self.factory.create_merchant(
                location_lon=39.913811,
                location_lat=116.410189,
                name='王府井百货',
                status=config.MERCHANT_STATUS.USING,
            ))

        self.merchants.append(
            self.factory.create_merchant(
                location_lon=39.909631,
                location_lat=116.423407,
                name='好苑建国饭店',
                status=config.MERCHANT_STATUS.USING,
            ))

        self.merchants.append(
            self.factory.create_merchant(
                location_lon=39.908775,
                location_lat=116.409802,
                name='北京饭店',
                status=config.MERCHANT_STATUS.USING,
            ))

        self.merchants.append(
            self.factory.create_merchant(
                location_lon=39.906668,
                location_lat=116.426454,
                name='湖南大厦',
                status=config.MERCHANT_STATUS.USING,
            ))

        self.merchants.append(
            self.factory.create_merchant(
                location_lon=39.960701,
                location_lat=116.323457,
                name='天作国际',
                status=config.MERCHANT_STATUS.USING,
            ))

        self.merchants.append(
            self.factory.create_merchant(
                location_lon=39.970503,
                location_lat=116.321054,
                name='当代商城',
                status=config.MERCHANT_STATUS.USING,
            ))

        for m in self.merchants:
            self.factory.create_coupon_rule(merchant=m, stock=100)

        self.payment = self.factory.create_payment(
            status=config.PAYMENT_STATUS.FROZEN, coupon_granted=False)

    def test_grant_coupons(self):
        coupons = PaymentBaseUseCases.grant_coupons(self.payment, 39.913384,
                                                    116.414437, 10)

        assert len(coupons) == 3
        valid_ids = {m.id for m in self.merchants[:4]}
        actual_ids = {c.rule.merchant.id for c in coupons}

        assert actual_ids < valid_ids

    def test_grant_coupons1(self):
        coupons = PaymentBaseUseCases.grant_coupons(self.payment, 39.962215,
                                                    116.32899310, 10)

        assert len(coupons) == 2
        valid_ids = {m.id for m in self.merchants[4:]}
        actual_ids = {c.rule.merchant.id for c in coupons}

        assert actual_ids <= valid_ids
Exemple #29
0
 def setUpTestData(cls):
     cls.factory = PayunionFactory()
     cls.manager = AreaModelManager()
Exemple #30
0
 def __init__(self, methodName='runTest'):
     super().__init__(methodName)
     self.factory = PayunionFactory()