def handle(*args, **options): try: bitcoin_frespo_services.bitcoin_active_receive_confirmation() bitcoin_frespo_services.bitcoin_pay_programmers() bitcoin_frespo_services.bitcoin_active_send_confirmation() except: logger.exception('Error running bitcoin jobs') #log configuration will ensure that admin e-mail is sent
def _confirm_sent(self, offer, programmer, transaction_value, email_value1, email_value2): def get_transaction_mock(hash): class X: pass txn = X() txn.confirmations = 3 txn.details = [] txn.details.append({ 'address': 'fake_receive_address_programmer', 'amount': transaction_value }) txn.details.append({ 'address': 'dummy_bitcoin_address_fs', 'amount': -transaction_value }) return txn bitcoin_adapter.get_transaction = get_transaction_mock email_asserts.clear_sent() bitcoin_frespo_services.bitcoin_active_send_confirmation() email_asserts.assert_sent_count(self, 3) email_asserts.assert_sent(self, to=programmer.email, subject='%s has made you a BTC %s payment' % (offer.sponsor.getUserInfo().screenName, email_value1)) email_asserts.assert_sent(self, to=offer.sponsor.email, subject='You have made a BTC %s payment' % email_value1) email_asserts.assert_sent(self, to=settings.ADMINS[0][1], subject='Bitcoin payment made - %s' % email_value2)
def _confirm_sent(self, offer, programmer, transaction_value, email_value1, email_value2): def get_transaction_mock(hash): class X: pass txn = X() txn.confirmations = 3 txn.details = [] txn.details.append({ 'address': 'fake_receive_address_programmer', 'amount': transaction_value }) txn.details.append({ 'address': 'dummy_bitcoin_address_fs', 'amount': -transaction_value }) return txn bitcoin_adapter.get_transaction = get_transaction_mock email_asserts.clear_sent() bitcoin_frespo_services.bitcoin_active_send_confirmation() email_asserts.assert_sent_count(self, 3) email_asserts.assert_sent(self, to=programmer.email, subject='%s has made you a BTC %s payment' % (offer.sponsor.username, email_value1)) email_asserts.assert_sent(self, to=offer.sponsor.email, subject='You have made a BTC %s payment' % email_value1) email_asserts.assert_sent(self, to=settings.ADMINS[0][1], subject='Bitcoin payment made - %s' % email_value2)
def handle_noargs(self, **options): try: bitcoin_frespo_services.bitcoin_active_receive_confirmation() bitcoin_frespo_services.bitcoin_pay_programmers() bitcoin_frespo_services.bitcoin_active_send_confirmation() except: logger.exception( 'Error running bitcoin jobs' ) #log configuration will ensure that admin e-mail is sent
def test_bitcoin_payment_complete(self): #setup offer = test_data.create_dummy_offer_btc() programmer = test_data.create_dummy_programmer() test_data.create_dummy_bitcoin_receive_address_available() solution = Solution.newSolution(offer.issue, programmer, False) programmer_userinfo = solution.programmer.getUserInfo() programmer_userinfo.bitcoin_receive_address = 'fake_receive_address_programmer' programmer_userinfo.save() solution.accepting_payments = True solution.save() #get pay form client = Client() client.login(username=offer.sponsor.username, password='******') response = client.get('/core/offer/%s/pay' % offer.id) self.assertEqual(response.status_code, 200) response_offer = response.context['offer'] response_solutions_accepting_payments = response.context[ 'solutions_accepting_payments'] response_shared_price = response.context['shared_price'] response_convert_rate = response.context['convert_rate'] response_currency_symbol = response.context['currency_symbol'] self.assertEqual(offer.id, response_offer.id) self.assertEqual(len(response_solutions_accepting_payments), 1) self.assertEqual(float(response_shared_price), 5.0) self.assertEqual(float(response_convert_rate), 1.0) self.assertEqual(response_currency_symbol, 'BTC') #submit pay form response = client.post( '/core/offer/pay/submit', { 'offer_id': str(offer.id), 'count': '1', 'check_0': 'true', 'pay_0': '5.00', 'solutionId_0': str(solution.id) }) self.assertEqual(response.status_code, 200) self.assertTrue( 'Please make a BTC <strong>5.1500</strong> transfer to the following bitcoin address' in response.content) self.assertTrue('dummy_bitcoin_address_fs' in response.content) #RECEIVE ipn confirmation client2 = Client() response = client2.get( '/core/bitcoin/' + settings.BITCOIN_IPNNOTIFY_URL_TOKEN, { 'value': '515000000', 'destination_address': 'dummy_bitcoin_address_fs', 'transaction_hash': 'dummy_txn_hash', 'confirmations': '3', }) self.assertEqual(response.status_code, 200) self.assertEqual(response.content, '*ok*') payment = Payment.objects.get( bitcoin_receive_address__address='dummy_bitcoin_address_fs') self.assertEqual(payment.status, Payment.CONFIRMED_IPN) #active RECEIVE confirmation def get_received_by_address_mock(address): print('mock get received by address: %s' % address) return 5.15 bitcoin_adapter.get_received_by_address = get_received_by_address_mock bitcoin_frespo_services.bitcoin_active_receive_confirmation() payment = Payment.objects.get(pk=payment.id) self.assertEqual(payment.status, Payment.CONFIRMED_TRN) #Pay programmer def make_payment_mock(from_address, to_address, value): print('mock send bitcoins: %s ---(%s)---> %s' % (from_address, value, to_address)) return 'dummy_txn_hash_2' bitcoin_adapter.make_payment = make_payment_mock bitcoin_frespo_services.bitcoin_pay_programmers() part = PaymentPart.objects.get(payment__id=payment.id) self.assertTrue(part.money_sent is not None) self.assertEqual(part.money_sent.value, Decimal('5')) self.assertEqual(part.money_sent.status, MoneySent.SENT) self.assertEqual(part.money_sent.transaction_hash, 'dummy_txn_hash_2') #SEND ipn confirmation response = client2.get( '/core/bitcoin/' + settings.BITCOIN_IPNNOTIFY_URL_TOKEN, { 'value': '-500000000', 'destination_address': 'fake_receive_address_programmer', 'transaction_hash': 'dummy_txn_hash_2', 'confirmations': '3', }) self.assertEqual(response.status_code, 200) self.assertEqual(response.content, '*ok*') part = PaymentPart.objects.get(payment__id=payment.id) self.assertEqual(part.money_sent.status, MoneySent.CONFIRMED_IPN) def get_transaction_mock(hash): class X: pass txn = X() txn.confirmations = 3 txn.details = [] txn.details.append({ 'address': 'fake_receive_address_programmer', 'amount': Decimal('5') }) txn.details.append({ 'address': 'dummy_bitcoin_address_fs', 'amount': Decimal('-5') }) return txn bitcoin_adapter.get_transaction = get_transaction_mock bitcoin_frespo_services.bitcoin_active_send_confirmation() email_asserts.assert_sent_count(self, 3) email_asserts.assert_sent( self, to=programmer.email, subject='%s has made you a BTC 5.00 payment' % offer.sponsor.getUserInfo().screenName) email_asserts.assert_sent(self, to=offer.sponsor.email, subject='You have made a BTC 5.00 payment') email_asserts.assert_sent(self, to=settings.ADMINS[0][1], subject='Bitcoin payment made - 5.15')
def test_bitcoin_payment_complete(self): # setup offer = test_data.create_dummy_offer_btc() programmer = test_data.create_dummy_programmer() test_data.create_dummy_bitcoin_receive_address_available() solution = Solution.newSolution(offer.issue, programmer, False) programmer_userinfo = solution.programmer.getUserInfo() programmer_userinfo.bitcoin_receive_address = "fake_receive_address_programmer" programmer_userinfo.save() solution.accepting_payments = True solution.save() # get pay form client = Client() client.login(username=offer.sponsor.username, password="******") response = client.get("/core/offer/%s/pay" % offer.id) self.assertEqual(response.status_code, 200) response_offer = response.context["offer"] response_solutions_accepting_payments = response.context["solutions_accepting_payments"] response_shared_price = response.context["shared_price"] response_convert_rate = response.context["convert_rate"] response_currency_symbol = response.context["currency_symbol"] self.assertEqual(offer.id, response_offer.id) self.assertEqual(len(response_solutions_accepting_payments), 1) self.assertEqual(float(response_shared_price), 5.0) self.assertEqual(float(response_convert_rate), 1.0) self.assertEqual(response_currency_symbol, "BTC") # submit pay form response = client.post( "/core/offer/pay/submit", { "offer_id": str(offer.id), "count": "1", "check_0": "true", "pay_0": "5.00", "solutionId_0": str(solution.id), }, ) self.assertEqual(response.status_code, 200) self.assertTrue( "Please make a BTC <strong>5.1500</strong> transfer to the following bitcoin address" in response.content ) self.assertTrue("dummy_bitcoin_address_fs" in response.content) # RECEIVE ipn confirmation client2 = Client() response = client2.get( "/core/bitcoin/" + settings.BITCOIN_IPNNOTIFY_URL_TOKEN, { "value": "515000000", "destination_address": "dummy_bitcoin_address_fs", "transaction_hash": "dummy_txn_hash", "confirmations": "3", }, ) self.assertEqual(response.status_code, 200) self.assertEqual(response.content, "*ok*") payment = Payment.objects.get(bitcoin_receive_address__address="dummy_bitcoin_address_fs") self.assertEqual(payment.status, Payment.CONFIRMED_IPN) # active RECEIVE confirmation def get_received_by_address_mock(address): print("mock get received by address: %s" % address) return 5.15 bitcoin_adapter.get_received_by_address = get_received_by_address_mock bitcoin_frespo_services.bitcoin_active_receive_confirmation() payment = Payment.objects.get(pk=payment.id) self.assertEqual(payment.status, Payment.CONFIRMED_TRN) # Pay programmer def make_payment_mock(from_address, to_address, value): print("mock send bitcoins: %s ---(%s)---> %s" % (from_address, value, to_address)) return "dummy_txn_hash_2" bitcoin_adapter.make_payment = make_payment_mock bitcoin_frespo_services.bitcoin_pay_programmers() part = PaymentPart.objects.get(payment__id=payment.id) self.assertTrue(part.money_sent is not None) self.assertEqual(part.money_sent.value, Decimal("5")) self.assertEqual(part.money_sent.status, MoneySent.SENT) self.assertEqual(part.money_sent.transaction_hash, "dummy_txn_hash_2") # SEND ipn confirmation response = client2.get( "/core/bitcoin/" + settings.BITCOIN_IPNNOTIFY_URL_TOKEN, { "value": "-500000000", "destination_address": "fake_receive_address_programmer", "transaction_hash": "dummy_txn_hash_2", "confirmations": "3", }, ) self.assertEqual(response.status_code, 200) self.assertEqual(response.content, "*ok*") part = PaymentPart.objects.get(payment__id=payment.id) self.assertEqual(part.money_sent.status, MoneySent.CONFIRMED_IPN) def get_transaction_mock(hash): class X: pass txn = X() txn.confirmations = 3 txn.details = [] txn.details.append({"address": "fake_receive_address_programmer", "amount": Decimal("5")}) txn.details.append({"address": "dummy_bitcoin_address_fs", "amount": Decimal("-5")}) return txn bitcoin_adapter.get_transaction = get_transaction_mock bitcoin_frespo_services.bitcoin_active_send_confirmation() email_asserts.assert_sent_count(self, 3) email_asserts.assert_sent( self, to=programmer.email, subject="%s has made you a BTC 5.00 payment" % offer.sponsor.getUserInfo().screenName, ) email_asserts.assert_sent(self, to=offer.sponsor.email, subject="You have made a BTC 5.00 payment") email_asserts.assert_sent(self, to=settings.ADMINS[0][1], subject="Bitcoin payment made - 5.15")