Example #1
0
def set_alarm(request):
    """
    Shows every available asset and gives a POST method to set
    an alarm on the asset.
    :rtype: HttpResponse
    """
    if request.method == 'POST':
        try:
            float(request.POST['threshold'])
        except ValueError:
            return HttpResponse(status=400, reason="Incorrect threshold value")
        if float(request.POST['threshold']) < 0:
            return HttpResponse(status=400, reason="Incorrect threshold value")
        elif not request.POST.getlist('asset'):
            return HttpResponse(status=400,
                                reason="You need to select at least one asset")
        else:
            wallet = Wallet.objects.get(user=request.user)
            return JsonResponse(Alarm.safe_save(wallet=wallet,
                                                price=request.POST[
                                                    'price'],
                                                aname=request.POST['asset'],
                                                threshold=request.POST[
                                                    'threshold'],
                                                atype=request.POST['type']))
    else:
        asset_comunication = ACommunication(settings.API_URL)
        asset_list = [a.to_dict() for a in
                      asset_comunication.get_assets_with_average()]
        context = {'assets': asset_list}
        return render(request, 'Game/set_alarm.html', context)
Example #2
0
    def safe_save(wallet, aname, threshold, atype, price):
        """
        Saves a new alarm and returns a dictionary with information.
        :rtype: Dict
        """
        from Game.models import Asset
        acom = ACommunication(settings.API_URL)
        asset = Asset.create_if_not_exists(aname)
        if not asset:
            return {'error': True, 'message': 'Non existing asset'}

        asset = acom.get_asset_quote(asset)

        if Alarm.safe_get(wallet, asset, price, atype):
            return {
                'error': True,
                'message': 'You already have an alarm on this asset'
            }

        Alarm.objects.create(wallet=wallet,
                             asset=asset,
                             price=price,
                             old_price=asset.__getattribute__(price),
                             threshold=threshold,
                             type=atype).save()
        return {
            'error': False,
            'message': 'Your alarm has been set successfully!'
        }
Example #3
0
def ajax_quote(request, name):
    """
    returns the quote for an asset given the name
    :rtype: JsonResponse or HttpResponse
    """
    asset_comunication = ACommunication(settings.API_URL)
    asset = asset_comunication.get_asset_quote(Asset(name=name))
    if asset.buy != -1 and asset.sell != -1:
        return JsonResponse(asset.to_dict())
    else:
        return HttpResponse(status=403, reason="No asset quote")
Example #4
0
 def create_if_not_exists(name):
     """
     Look for an asset buy name, if asset doesn't exists, it creates it.
     :rtype: Asset
     """
     asset = Asset.safe_get(name)
     if not asset:
         asset_comms = ACommunication(settings.API_URL)
         type = asset_comms.get_asset_type(name)
         if not type:
             return None
         asset = Asset.objects.create(name=name, type=type)
         asset.save()
     return asset
Example #5
0
def history(request, name):
    """
    Shows the historic value for an asset in a range of dates
    :rtype: HttpResponse
    """
    if request.method == 'POST':

        start = request.POST['start']
        end = request.POST['end']

        asset_comunication = ACommunication(settings.API_URL)
        prices = asset_comunication.get_asset_history(name, start, end)
        prices['name'] = name
        return render(request, 'Game/history.html', prices)
    else:
        return render(request, 'Game/select_dates.html')
Example #6
0
 def setUp(self):
     self.asset_communication = AComunication(
         'http://localhost:8000/simulations/')
     user = User.objects.create(username='******')
     Wallet.objects.create(user=user)
     user2 = User.objects.create(username='******')
     Wallet.objects.create(user=user2)
Example #7
0
def assets(request):
    """
    Shows every available asset
    :rtype: HttpResponse
    """
    asset_comunication = ACommunication(settings.API_URL)
    asset_list = [a.to_dict() for a in asset_comunication.get_assets()]
    context = {'assets': asset_list}

    # user info
    wallet = Wallet.get_info(request.user)
    context['value_wallet'] = wallet['value_wallet']
    context['liquid'] = wallet['liquid']

    if request.is_ajax():
        return JsonResponse(context)
    else:
        return render(request, 'Game/assets.html', context)
Example #8
0
class InterfaceControlTest(TestCase):
    def setUp(self):
        self.asset_communication = AComunication(
            'http://localhost:8000/simulations/')
        user = User.objects.create(username='******')
        Wallet.objects.create(user=user)
        user2 = User.objects.create(username='******')
        Wallet.objects.create(user=user2)

    def test_asset_communication_sanity(self):
        # search for the names
        assets_name = self.asset_communication.get_asset_names()
        self.assertNotEqual(assets_name, [])

        # search for all info
        asset_info = [
            self.asset_communication.get_asset_quote(a) for a in assets_name
            if self.asset_communication.has_quote(
                self.asset_communication.get_asset_quote(a))
        ]
        self.assertNotEqual(asset_info, [])

        # dedasset_communicationated full method
        assets_complete = self.asset_communication.get_assets()
        self.assertNotEqual(assets_complete, [])

    def test_asset_communication_border(self):
        # ask for a quote of unexistent asset
        asset = Asset(name="NONE", type="NONE")
        quote = self.asset_communication.get_asset_quote(asset)
        self.assertEqual(quote.buy, -1)
        self.assertEqual(quote.sell, -1)

        # ask for a quote of existent asset
        asset = Asset(name="MARSHALL", type="currency")
        quote = self.asset_communication.get_asset_quote(asset)
        self.assertNotEqual(quote.buy, -1)
        self.assertNotEqual(quote.sell, -1)

    def test_wallet_sanity(self):
        # get user
        user = User.objects.get(username='******')
        wallet = Wallet.objects.get(user=user)

        # create and save assets
        assets = self.asset_communication.get_asset_names()

        asset_a = assets[0]
        asset_a = Asset.objects.create(name=asset_a.name, type=asset_a.type)
        asset_c = assets[3]
        asset_c = Asset.objects.create(name=asset_c.name, type=asset_c.type)

        # create and save transactions
        Ownership.objects.create(asset=asset_a, quantity=3, wallet=wallet)
        Ownership.objects.create(asset=asset_c, quantity=5, wallet=wallet)

        # check algorithm response
        response = Wallet.get_info(user)
        self.assertFalse(response['error'])
        expected_assets = [
            self.asset_communication.get_asset_quote(asset_a),
            self.asset_communication.get_asset_quote(asset_c)
        ]
        result_assets = response['assets']
        self.assertEqual(len(result_assets), len(expected_assets))

        for e, r in zip(expected_assets, result_assets):
            self.assertEqual(e.name, r.name)

    def test_wallet_buy(self):
        # get user
        user = User.objects.get(username='******')
        wallet = Wallet.objects.get(user=user)

        # create and save assets
        assets = self.asset_communication.get_assets()

        asset_a = assets[0]
        asset_a.quantity = 2.3

        asset_c = assets[3]
        asset_c.quantity = 1.4

        # expected results
        expected_money_result = 7680.0
        expected_ownership_result = [
            Ownership.objects.create(asset=asset_a,
                                     wallet=wallet,
                                     quantity=2.3),
            Ownership.objects.create(asset=asset_c,
                                     wallet=wallet,
                                     quantity=1.4)
        ]

        # buy assets
        wallet.buy_asset(asset_a)
        wallet.buy_asset(asset_c)

        # check algorithm response
        self.assertEqual(expected_money_result, wallet.liquid)
        self.assertEqual(expected_ownership_result,
                         list(Ownership.objects.all()))

    def test_wallet_buy_border_quantity(self):
        # get user
        user = User.objects.get(username='******')
        wallet = Wallet.objects.get(user=user)

        # create and save assets
        assets = self.asset_communication.get_assets()

        asset_a = assets[0]
        asset_a.quantity = 200000

        # expected results
        expected_money_result = 10000
        expected_ownership_result = []

        # buy assets
        wallet.buy_asset(asset_a)

        # check algorithm response
        self.assertEqual(expected_money_result, wallet.liquid)
        self.assertEqual(expected_ownership_result,
                         list(Ownership.objects.all()))

    def test_wallet_buy_border_nil_quantity(self):
        # get user
        user = User.objects.get(username='******')
        wallet = Wallet.objects.get(user=user)

        # create and save assets
        assets = self.asset_communication.get_assets()

        asset_a = assets[0]
        asset_a.quantity = 0

        # expected results
        expected_money_result = 10000
        expected_ownership_result = []

        # buy assets
        wallet.buy_asset(asset_a)

        # check algorithm response
        self.assertEqual(expected_ownership_result,
                         list(Ownership.objects.all()))
        self.assertEqual(expected_money_result, wallet.liquid)

    def test_wallet_sell_asset_part(self):
        # get user
        user = User.objects.get(username='******')
        wallet = Wallet.objects.get(user=user)

        # create and save assets
        assets = self.asset_communication.get_assets()

        asset_a = assets[0]
        asset_c = assets[3]

        # create and save transactions
        own1 = Ownership.objects.create(asset=asset_a,
                                        quantity=3,
                                        wallet=wallet)
        own2 = Ownership.objects.create(asset=asset_c,
                                        quantity=5,
                                        wallet=wallet)

        asset_a.quantity = 2.3
        asset_c.quantity = 1.4

        # expected results
        expected_money_result = 11152.8
        expected_asset_a_quantity = 0.7
        expected_asset_c_quantity = 3.6
        expected_ownership_result = [own1, own2]

        # sell assets
        wallet.sell_asset(asset_a)
        wallet.sell_asset(asset_c)

        # check algorithm response
        self.assertEqual(expected_money_result, wallet.liquid)
        self.assertEqual(expected_asset_a_quantity,
                         Ownership.objects.all()[0].quantity)
        self.assertEqual(expected_asset_c_quantity,
                         Ownership.objects.all()[1].quantity)
        self.assertEqual(expected_ownership_result,
                         list(Ownership.objects.all()))

    def test_wallet_sell_asset_full(self):
        # get user
        user = User.objects.get(username='******')
        wallet = Wallet.objects.get(user=user)

        # create and save assets
        assets = self.asset_communication.get_assets()

        asset_a = assets[0]
        asset_a.quantity = 3

        asset_c = assets[3]
        asset_c.quantity = 5

        # create and save transactions
        Ownership.objects.create(asset=asset_a, quantity=3, wallet=wallet)
        Ownership.objects.create(asset=asset_c, quantity=5, wallet=wallet)

        # expected results
        expected_money_result = 11510.0
        expected_ownership_result = []

        # sell assets
        wallet.sell_asset(asset_a)
        wallet.sell_asset(asset_c)

        # check algorithm response
        self.assertEqual(expected_money_result, wallet.liquid)
        self.assertEqual(expected_ownership_result,
                         list(Ownership.objects.all()))

    def test_wallet_sell_border_quantity(self):
        # get user
        user = User.objects.get(username='******')
        wallet = Wallet.objects.get(user=user)

        # create and save assets
        assets = self.asset_communication.get_assets()
        asset_a = assets[0]
        asset_a.quantity = 20000000

        # create and save transactions
        own = Ownership.objects.create(asset=asset_a,
                                       quantity=3,
                                       wallet=wallet)

        # expected results
        expected_money_result = 10000
        expected_ownership_result = [own]

        # sell assets
        wallet.sell_asset(asset_a)

        # check algorithm response
        self.assertEqual(expected_money_result, wallet.liquid)
        self.assertEqual(expected_ownership_result,
                         list(Ownership.objects.all()))

    def test_wallet_sell_border_nil_quantity(self):
        # get user
        user = User.objects.get(username='******')
        wallet = Wallet.objects.get(user=user)

        # create and save assets
        assets = self.asset_communication.get_assets()

        asset_a = assets[0]
        asset_a.quantity = 0

        # create and save transactions
        own = Ownership.objects.create(asset=asset_a,
                                       quantity=3,
                                       wallet=wallet)

        # expected results
        expected_money_result = 10000
        expected_ownership_result = [own]

        # sell assets
        wallet.sell_asset(asset_a)

        # check algorithm response
        self.assertEqual(expected_money_result, wallet.liquid)
        self.assertEqual(expected_ownership_result,
                         list(Ownership.objects.all()))

    def test_wallet_sell_border_ownership(self):
        # get user
        user = User.objects.get(username='******')
        wallet = Wallet.objects.get(user=user)

        # create and save assets
        assets = self.asset_communication.get_assets()

        asset_a = assets[0]
        asset_a.quantity = 2

        # expected results
        expected_money_result = 10000
        expected_ownership_result = []

        # sell assets
        wallet.sell_asset(asset_a)

        # check algorithm response
        self.assertEqual(expected_money_result, wallet.liquid)
        self.assertEqual(expected_ownership_result,
                         list(Ownership.objects.all()))

    def test_wallet_buy_then_sell(self):
        # get user
        user = User.objects.get(username='******')
        wallet = Wallet.objects.get(user=user)

        # create and save assets
        assets = self.asset_communication.get_assets()

        asset_a = assets[0]
        asset_a.quantity = 2

        # expected results
        expected_money_result = 10200
        expected_ownership_result = []

        wallet.buy_asset(asset_a)
        wallet.sell_asset(asset_a)

        # check algorithm response
        self.assertEqual(expected_money_result, wallet.liquid)
        self.assertEqual(expected_ownership_result,
                         list(Ownership.objects.all()))

    def test_alarm_not_exist_asset(self):
        #get user
        user = User.objects.get(username='******')
        wallet = Wallet.objects.get(user=user)

        #create alarm
        res = Alarm.safe_save(wallet=wallet,
                              aname=None,
                              threshold=200,
                              atype='type',
                              price=100)

        self.assertEqual(res, {'error': True, 'message': 'Non existing asset'})

    def test_delete_alarm(self):
        # get user
        user = User.objects.get(username='******')
        wallet = Wallet.objects.get(user=user)

        #take asset
        assets = self.asset_communication.get_assets()
        asset = assets[0]
        asset.save()

        # create alarm
        Alarm.safe_save(wallet=wallet,
                        aname=asset.name,
                        threshold=200,
                        atype='down',
                        price="buy")
        # delete alarm
        Alarm.safe_delete(wallet=wallet,
                          name=asset.name,
                          atype="down",
                          price="buy")

        self.assertEqual(
            None,
            Alarm.safe_get(wallet=wallet,
                           asset=asset,
                           price="buy",
                           type="down"))

    def test_offerloan_regular_values(self):
        # get user
        user = User.objects.get(username='******')
        wallet = Wallet.objects.get(user=user)

        # create and save a loan offer
        loanoffer = LoanOffer(lender=wallet,
                              offered=1000,
                              interest_rate=2.0,
                              days=10)

        # check object saves correctly.
        self.assertEqual(loanoffer.offered, 1000)
        self.assertEqual(loanoffer.lender, wallet)
        self.assertEqual(loanoffer.interest_rate, 2.0)
        self.assertEqual(loanoffer.days, 10)

    def test_offerloan_then_modify(self):
        # get user
        user = User.objects.get(username='******')
        wallet = Wallet.objects.get(user=user)

        # create and save a loan offer
        loanoffer = LoanOffer(lender=wallet,
                              offered=1000,
                              interest_rate=2.0,
                              days=10)
        loanoffer.save()

        # record previous money amount
        oldliq = wallet.liquid
        # modify loan
        res = LoanOffer.safe_modification(lender=wallet,
                                          id=str(loanoffer.id),
                                          new_offer=500)
        loanoffer = LoanOffer.objects.get(id=loanoffer.id)
        # check modification.
        self.assertEqual(res['error'], False)
        self.assertEqual(loanoffer.offered, 500)
        self.assertEqual(loanoffer.lender, wallet)
        self.assertEqual(loanoffer.interest_rate, 2.0)
        self.assertEqual(loanoffer.days, 10)

        # check user has its money back.
        self.assertEqual(wallet.liquid_with_loans, oldliq - 500)

    def test_make_loan_and_someone_takesit(self):
        # get users
        user1 = User.objects.get(username='******')
        user2 = User.objects.get(username='******')
        wallet1 = Wallet.objects.get(user=user1)
        wallet2 = Wallet.objects.get(user=user2)

        # create and save an offer
        loanoffer = LoanOffer(lender=wallet1,
                              offered=500,
                              interest_rate=2.0,
                              days=10)
        loanoffer.save()

        # record previous amount of money
        oldliq = wallet1.liquid
        oldliq2 = wallet2.liquid

        loanoffer = LoanOffer.objects.get(id=loanoffer.id)

        # take loan
        loaned = loanoffer.offered
        Loan.safe_save(borrower=wallet2, loaned=loaned, offer=loanoffer)

        self.assertEqual(oldliq2 + 500, wallet2.liquid_with_loans)
        self.assertEqual(oldliq - 500, wallet1.liquid_with_loans)

    def test_offer_loan_but_not_eough_money(self):
        # get users
        user1 = User.objects.get(username='******')
        wallet1 = Wallet.objects.get(user=user1)

        # create and save an offer
        res = LoanOffer.safe_save(wallet=wallet1,
                                  offered=10001,
                                  interest=2.0,
                                  days=10)

        self.assertEqual(
            res, {
                'error': True,
                'message': 'You have not enough liquid money available'
            })

    def test_offer_loan_but_negative_money(self):
        # get users
        user1 = User.objects.get(username='******')
        wallet1 = Wallet.objects.get(user=user1)

        # create and save an offer
        res = LoanOffer.safe_save(wallet=wallet1,
                                  offered=-1000,
                                  interest=2.0,
                                  days=10)

        self.assertEqual(
            res, {
                'error': True,
                'message': 'You have not enough liquid money available'
            })

    def test_offer_loan_but_invalid_interest(self):
        # get users
        user1 = User.objects.get(username='******')
        wallet1 = Wallet.objects.get(user=user1)

        # create and save an offer
        res = LoanOffer.safe_save(wallet=wallet1,
                                  offered=1000,
                                  interest=101,
                                  days=10)

        self.assertEqual(
            res, {
                'error': True,
                'message': 'The interest rate is not a valid percentage'
            })

    def test_offer_loan_but_invalid_daysdue(self):
        # get users
        user1 = User.objects.get(username='******')
        wallet1 = Wallet.objects.get(user=user1)

        # create and save an offer
        res = LoanOffer.safe_save(wallet=wallet1,
                                  offered=1000,
                                  interest=2.0,
                                  days=0)

        self.assertEqual(res, {
            'error': True,
            'message': 'The days amount cannot be negative'
        })

    def test_set_alarm_of_asset(self):
        # get user
        user = User.objects.get(username='******')
        wallet = Wallet.objects.get(user=user)

        # create asset

        assets = self.asset_communication.get_assets()
        asset_a_alarm = assets[0]
        asset_a_alarm.save()

        # create and save alarm

        Alarm.objects.create(wallet=wallet,
                             asset=asset_a_alarm,
                             price='buy',
                             old_price=asset_a_alarm.__getattribute__('buy'),
                             threshold=200,
                             type='down').save()

        # check object saves correctly.

        alarm = Alarm.objects.all()[0]

        self.assertEqual(alarm.wallet, wallet)
        self.assertEqual(alarm.asset, asset_a_alarm)
        self.assertEqual(alarm.price, 'buy')
        self.assertEqual(alarm.threshold, 200)
        self.assertEqual(alarm.type, 'down')