-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Show current ticket price on UpdateMessage (#33)
* utils exceptions * utils with dcrdata request wrapper * ObserverMessage expire after 7 days * TicketPrice created * test TicketPrice * UpdateMessage with ticket price * minor fix
- Loading branch information
1 parent
ed13959
commit ed4c21a
Showing
13 changed files
with
184 additions
and
25 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
import logging | ||
|
||
import pendulum | ||
from mongoengine import ( | ||
Document, | ||
FloatField, DateTimeField) | ||
|
||
from utils.dcrdata import request_dcr_data | ||
|
||
|
||
logging.basicConfig( | ||
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', | ||
level=logging.INFO) | ||
|
||
logger = logging.getLogger(__name__) | ||
|
||
|
||
class TicketPrice(Document): | ||
endpoint = "stake/diff" | ||
|
||
price = FloatField(required=True) | ||
datetime = DateTimeField(default=pendulum.now, required=True) | ||
|
||
meta = { | ||
'ordering': ['datetime'], | ||
'indexes': [ | ||
{'fields': ['datetime'], 'expireAfterSeconds': 7*24*60*60} | ||
] | ||
} | ||
|
||
def __str__(self): | ||
return f"{self.price:.2f} DCR" | ||
|
||
@property | ||
def pendulum_datetime(self): | ||
return pendulum.instance(self.datetime).in_tz('America/Sao_Paulo') | ||
|
||
def is_past_expire(self): | ||
now = pendulum.now() | ||
last = self.pendulum_datetime | ||
diff = now - last | ||
return diff.in_seconds() >= 2*60*60 | ||
|
||
@classmethod | ||
def _fetch_new_ticket_price(cls): | ||
price = request_dcr_data(cls.endpoint) | ||
price = price.get('current') | ||
return cls(price) | ||
|
||
@classmethod | ||
def get_last(cls): | ||
last_ticket_price = cls.objects.order_by('-datetime').first() | ||
|
||
try: | ||
if last_ticket_price.is_past_expire(): | ||
last_ticket_price = cls._fetch_new_ticket_price() | ||
except AttributeError: | ||
last_ticket_price = cls._fetch_new_ticket_price() | ||
finally: | ||
last_ticket_price.save() | ||
|
||
return last_ticket_price |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
from unittest import TestCase, mock | ||
|
||
import pendulum | ||
import pytest | ||
|
||
from tests.fixtures import mongo # noqa F401 | ||
from db.ticket import TicketPrice | ||
|
||
|
||
@pytest.mark.usefixtures('mongo') | ||
class TicketPriceTestCase(TestCase): | ||
def test_create(self): | ||
self.assertEqual(TicketPrice.objects.count(), 0) | ||
|
||
instance = TicketPrice(150.5).save() | ||
self.assertEqual(TicketPrice.objects.count(), 1) | ||
|
||
self.assertEqual(instance.price, 150.5) | ||
self.assertTrue(instance.datetime) | ||
|
||
def test_is_past_expire(self): | ||
self.assertEqual(TicketPrice.objects.count(), 0) | ||
TicketPrice(150.5).save() | ||
self.assertEqual(TicketPrice.objects.count(), 1) | ||
|
||
instance = TicketPrice.objects.first() | ||
|
||
self.assertFalse(instance.is_past_expire()) | ||
|
||
instance.datetime = pendulum.yesterday() | ||
self.assertTrue(instance.is_past_expire()) | ||
|
||
@mock.patch('db.ticket.request_dcr_data') | ||
def test_fetch_new_ticket_price(self, mocked_request_dcr_data): | ||
self.assertIsInstance(mocked_request_dcr_data, mock.MagicMock) | ||
mocked_request_dcr_data.return_value = mock.MagicMock( | ||
get=mock.MagicMock( | ||
return_value=150.5 | ||
) | ||
) | ||
|
||
instance = TicketPrice._fetch_new_ticket_price() | ||
self.assertEqual(instance.price, 150.5) | ||
self.assertTrue(instance.datetime) | ||
|
||
@mock.patch('db.ticket.request_dcr_data') | ||
def test_get_last_price_exception(self, mocked_request_dcr_data): | ||
self.assertIsInstance(mocked_request_dcr_data, mock.MagicMock) | ||
mocked_request_dcr_data.return_value = mock.MagicMock( | ||
get=mock.MagicMock( | ||
return_value=150.5 | ||
) | ||
) | ||
|
||
self.assertEqual(TicketPrice.objects.count(), 0) | ||
|
||
instance = TicketPrice.get_last() | ||
self.assertEqual(TicketPrice.objects.count(), 1) | ||
self.assertEqual(instance.price, 150.5) | ||
self.assertTrue(instance.datetime) | ||
|
||
def test_get_last_price_existing(self): | ||
TicketPrice(130).save() | ||
|
||
self.assertEqual(TicketPrice.objects.count(), 1) | ||
|
||
instance = TicketPrice.get_last() | ||
self.assertEqual(TicketPrice.objects.count(), 1) | ||
self.assertEqual(instance.price, 130) | ||
self.assertTrue(instance.datetime) | ||
|
||
@mock.patch('db.ticket.request_dcr_data') | ||
def test_get_last_price_existing_expired(self, mocked_request_dcr_data): | ||
self.assertIsInstance(mocked_request_dcr_data, mock.MagicMock) | ||
mocked_request_dcr_data.return_value = mock.MagicMock( | ||
get=mock.MagicMock( | ||
return_value=150.5 | ||
) | ||
) | ||
|
||
TicketPrice(130, pendulum.yesterday()).save() | ||
self.assertEqual(TicketPrice.objects.count(), 1) | ||
|
||
instance = TicketPrice.get_last() | ||
self.assertEqual(TicketPrice.objects.count(), 2) | ||
self.assertEqual(instance.price, 150.5) | ||
self.assertTrue(instance.datetime) |
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
import json | ||
|
||
import requests | ||
|
||
from utils.exceptions import DcrDataAPIError | ||
|
||
|
||
DCRDATA_API_URL = "https://dcrdata.decred.org/api" | ||
|
||
|
||
def request_dcr_data(endpoint): | ||
dcrdata_response = requests.get(f"{DCRDATA_API_URL}/{endpoint}") | ||
if dcrdata_response.status_code != 200: | ||
raise DcrDataAPIError(dcrdata_response.content) | ||
|
||
return json.loads(dcrdata_response.content) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,7 @@ | ||
|
||
class DcrDataAPIError(Exception): | ||
pass | ||
|
||
|
||
class ObserverNotRegisteredError(Exception): | ||
pass | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters