diff options
Diffstat (limited to 'tests/test_market.py')
-rw-r--r-- | tests/test_market.py | 99 |
1 files changed, 63 insertions, 36 deletions
diff --git a/tests/test_market.py b/tests/test_market.py index 6a3322c..46fad53 100644 --- a/tests/test_market.py +++ b/tests/test_market.py | |||
@@ -1,5 +1,5 @@ | |||
1 | from .helper import * | 1 | from .helper import * |
2 | import market, store, portfolio | 2 | import market, store, portfolio, dbs |
3 | import datetime | 3 | import datetime |
4 | 4 | ||
5 | @unittest.skipUnless("unit" in limits, "Unit skipped") | 5 | @unittest.skipUnless("unit" in limits, "Unit skipped") |
@@ -595,13 +595,11 @@ class MarketTest(WebMockTestCase): | |||
595 | 595 | ||
596 | self.assertRegex(stdout_mock.getvalue(), "impossible to store report file: FileNotFoundError;") | 596 | self.assertRegex(stdout_mock.getvalue(), "impossible to store report file: FileNotFoundError;") |
597 | 597 | ||
598 | @mock.patch.object(market, "psycopg2") | 598 | @mock.patch.object(dbs, "psql") |
599 | def test_store_database_report(self, psycopg2): | 599 | def test_store_database_report(self, psql): |
600 | connect_mock = mock.Mock() | ||
601 | cursor_mock = mock.MagicMock() | 600 | cursor_mock = mock.MagicMock() |
602 | 601 | ||
603 | connect_mock.cursor.return_value = cursor_mock | 602 | psql.cursor.return_value = cursor_mock |
604 | psycopg2.connect.return_value = connect_mock | ||
605 | m = market.Market(self.ccxt, self.market_args(), | 603 | m = market.Market(self.ccxt, self.market_args(), |
606 | pg_config={"config": "pg_config"}, user_id=1) | 604 | pg_config={"config": "pg_config"}, user_id=1) |
607 | cursor_mock.fetchone.return_value = [42] | 605 | cursor_mock.fetchone.return_value = [42] |
@@ -613,7 +611,7 @@ class MarketTest(WebMockTestCase): | |||
613 | ("date2", "type2", "payload2"), | 611 | ("date2", "type2", "payload2"), |
614 | ] | 612 | ] |
615 | m.store_database_report(datetime.datetime(2018, 3, 24)) | 613 | m.store_database_report(datetime.datetime(2018, 3, 24)) |
616 | connect_mock.assert_has_calls([ | 614 | psql.assert_has_calls([ |
617 | mock.call.cursor(), | 615 | mock.call.cursor(), |
618 | mock.call.cursor().execute('INSERT INTO reports("date", "market_config_id", "debug") VALUES (%s, %s, %s) RETURNING id;', (datetime.datetime(2018, 3, 24), None, False)), | 616 | mock.call.cursor().execute('INSERT INTO reports("date", "market_config_id", "debug") VALUES (%s, %s, %s) RETURNING id;', (datetime.datetime(2018, 3, 24), None, False)), |
619 | mock.call.cursor().fetchone(), | 617 | mock.call.cursor().fetchone(), |
@@ -621,21 +619,16 @@ class MarketTest(WebMockTestCase): | |||
621 | mock.call.cursor().execute('INSERT INTO report_lines("date", "report_id", "type", "payload") VALUES (%s, %s, %s, %s);', ('date2', 42, 'type2', 'payload2')), | 619 | mock.call.cursor().execute('INSERT INTO report_lines("date", "report_id", "type", "payload") VALUES (%s, %s, %s, %s);', ('date2', 42, 'type2', 'payload2')), |
622 | mock.call.commit(), | 620 | mock.call.commit(), |
623 | mock.call.cursor().close(), | 621 | mock.call.cursor().close(), |
624 | mock.call.close() | ||
625 | ]) | 622 | ]) |
626 | 623 | ||
627 | connect_mock.reset_mock() | ||
628 | with self.subTest(error=True),\ | 624 | with self.subTest(error=True),\ |
629 | mock.patch('sys.stdout', new_callable=StringIO) as stdout_mock: | 625 | mock.patch('sys.stdout', new_callable=StringIO) as stdout_mock: |
630 | psycopg2.connect.side_effect = Exception("Bouh") | 626 | psql.cursor.side_effect = Exception("Bouh") |
631 | m.store_database_report(datetime.datetime(2018, 3, 24)) | 627 | m.store_database_report(datetime.datetime(2018, 3, 24)) |
632 | self.assertEqual(stdout_mock.getvalue(), "impossible to store report to database: Exception; Bouh\n") | 628 | self.assertEqual(stdout_mock.getvalue(), "impossible to store report to database: Exception; Bouh\n") |
633 | 629 | ||
634 | @mock.patch.object(market, "redis") | 630 | @mock.patch.object(dbs, "redis") |
635 | def test_store_redis_report(self, redis): | 631 | def test_store_redis_report(self, redis): |
636 | connect_mock = mock.Mock() | ||
637 | redis.Redis.return_value = connect_mock | ||
638 | |||
639 | m = market.Market(self.ccxt, self.market_args(), | 632 | m = market.Market(self.ccxt, self.market_args(), |
640 | redis_config={"config": "redis_config"}, market_id=1) | 633 | redis_config={"config": "redis_config"}, market_id=1) |
641 | 634 | ||
@@ -646,7 +639,7 @@ class MarketTest(WebMockTestCase): | |||
646 | ("type2", "payload2"), | 639 | ("type2", "payload2"), |
647 | ] | 640 | ] |
648 | m.store_redis_report(datetime.datetime(2018, 3, 24)) | 641 | m.store_redis_report(datetime.datetime(2018, 3, 24)) |
649 | connect_mock.assert_has_calls([ | 642 | redis.assert_has_calls([ |
650 | mock.call.set("/cryptoportfolio/1/2018-03-24T00:00:00/type1", "payload1", ex=31*24*60*60), | 643 | mock.call.set("/cryptoportfolio/1/2018-03-24T00:00:00/type1", "payload1", ex=31*24*60*60), |
651 | mock.call.set("/cryptoportfolio/1/latest/type1", "payload1"), | 644 | mock.call.set("/cryptoportfolio/1/latest/type1", "payload1"), |
652 | mock.call.set("/cryptoportfolio/1/2018-03-24T00:00:00/type2", "payload2", ex=31*24*60*60), | 645 | mock.call.set("/cryptoportfolio/1/2018-03-24T00:00:00/type2", "payload2", ex=31*24*60*60), |
@@ -654,20 +647,24 @@ class MarketTest(WebMockTestCase): | |||
654 | mock.call.set("/cryptoportfolio/1/latest/date", "2018-03-24T00:00:00"), | 647 | mock.call.set("/cryptoportfolio/1/latest/date", "2018-03-24T00:00:00"), |
655 | ]) | 648 | ]) |
656 | 649 | ||
657 | connect_mock.reset_mock() | 650 | redis.reset_mock() |
658 | with self.subTest(error=True),\ | 651 | with self.subTest(error=True),\ |
659 | mock.patch('sys.stdout', new_callable=StringIO) as stdout_mock: | 652 | mock.patch('sys.stdout', new_callable=StringIO) as stdout_mock: |
660 | redis.Redis.side_effect = Exception("Bouh") | 653 | redis.set.side_effect = Exception("Bouh") |
661 | m.store_redis_report(datetime.datetime(2018, 3, 24)) | 654 | m.store_redis_report(datetime.datetime(2018, 3, 24)) |
662 | self.assertEqual(stdout_mock.getvalue(), "impossible to store report to redis: Exception; Bouh\n") | 655 | self.assertEqual(stdout_mock.getvalue(), "impossible to store report to redis: Exception; Bouh\n") |
663 | 656 | ||
664 | def test_store_report(self): | 657 | def test_store_report(self): |
665 | m = market.Market(self.ccxt, self.market_args(report_db=False), user_id=1) | 658 | m = market.Market(self.ccxt, self.market_args(report_db=False), user_id=1) |
666 | with self.subTest(file=None, pg_config=None),\ | 659 | with self.subTest(file=None, pg_connected=None),\ |
660 | mock.patch.object(dbs, "psql_connected") as psql,\ | ||
661 | mock.patch.object(dbs, "redis_connected") as redis,\ | ||
667 | mock.patch.object(m, "report") as report,\ | 662 | mock.patch.object(m, "report") as report,\ |
668 | mock.patch.object(m, "store_database_report") as db_report,\ | 663 | mock.patch.object(m, "store_database_report") as db_report,\ |
669 | mock.patch.object(m, "store_redis_report") as redis_report,\ | 664 | mock.patch.object(m, "store_redis_report") as redis_report,\ |
670 | mock.patch.object(m, "store_file_report") as file_report: | 665 | mock.patch.object(m, "store_file_report") as file_report: |
666 | psql.return_value = False | ||
667 | redis.return_value = False | ||
671 | m.store_report() | 668 | m.store_report() |
672 | report.merge.assert_called_with(store.Portfolio.report) | 669 | report.merge.assert_called_with(store.Portfolio.report) |
673 | 670 | ||
@@ -677,13 +674,16 @@ class MarketTest(WebMockTestCase): | |||
677 | 674 | ||
678 | report.reset_mock() | 675 | report.reset_mock() |
679 | m = market.Market(self.ccxt, self.market_args(report_db=False, report_path="present"), user_id=1) | 676 | m = market.Market(self.ccxt, self.market_args(report_db=False, report_path="present"), user_id=1) |
680 | with self.subTest(file="present", pg_config=None),\ | 677 | with self.subTest(file="present", pg_connected=None),\ |
678 | mock.patch.object(dbs, "psql_connected") as psql,\ | ||
679 | mock.patch.object(dbs, "redis_connected") as redis,\ | ||
681 | mock.patch.object(m, "report") as report,\ | 680 | mock.patch.object(m, "report") as report,\ |
682 | mock.patch.object(m, "store_file_report") as file_report,\ | 681 | mock.patch.object(m, "store_file_report") as file_report,\ |
683 | mock.patch.object(m, "store_redis_report") as redis_report,\ | 682 | mock.patch.object(m, "store_redis_report") as redis_report,\ |
684 | mock.patch.object(m, "store_database_report") as db_report,\ | 683 | mock.patch.object(m, "store_database_report") as db_report,\ |
685 | mock.patch.object(market.datetime, "datetime") as time_mock: | 684 | mock.patch.object(market.datetime, "datetime") as time_mock: |
686 | 685 | psql.return_value = False | |
686 | redis.return_value = False | ||
687 | time_mock.now.return_value = datetime.datetime(2018, 2, 25) | 687 | time_mock.now.return_value = datetime.datetime(2018, 2, 25) |
688 | 688 | ||
689 | m.store_report() | 689 | m.store_report() |
@@ -695,13 +695,16 @@ class MarketTest(WebMockTestCase): | |||
695 | 695 | ||
696 | report.reset_mock() | 696 | report.reset_mock() |
697 | m = market.Market(self.ccxt, self.market_args(report_db=True, report_path="present"), user_id=1) | 697 | m = market.Market(self.ccxt, self.market_args(report_db=True, report_path="present"), user_id=1) |
698 | with self.subTest(file="present", pg_config=None, report_db=True),\ | 698 | with self.subTest(file="present", pg_connected=None, report_db=True),\ |
699 | mock.patch.object(dbs, "psql_connected") as psql,\ | ||
700 | mock.patch.object(dbs, "redis_connected") as redis,\ | ||
699 | mock.patch.object(m, "report") as report,\ | 701 | mock.patch.object(m, "report") as report,\ |
700 | mock.patch.object(m, "store_file_report") as file_report,\ | 702 | mock.patch.object(m, "store_file_report") as file_report,\ |
701 | mock.patch.object(m, "store_redis_report") as redis_report,\ | 703 | mock.patch.object(m, "store_redis_report") as redis_report,\ |
702 | mock.patch.object(m, "store_database_report") as db_report,\ | 704 | mock.patch.object(m, "store_database_report") as db_report,\ |
703 | mock.patch.object(market.datetime, "datetime") as time_mock: | 705 | mock.patch.object(market.datetime, "datetime") as time_mock: |
704 | 706 | psql.return_value = False | |
707 | redis.return_value = False | ||
705 | time_mock.now.return_value = datetime.datetime(2018, 2, 25) | 708 | time_mock.now.return_value = datetime.datetime(2018, 2, 25) |
706 | 709 | ||
707 | m.store_report() | 710 | m.store_report() |
@@ -712,14 +715,17 @@ class MarketTest(WebMockTestCase): | |||
712 | redis_report.assert_not_called() | 715 | redis_report.assert_not_called() |
713 | 716 | ||
714 | report.reset_mock() | 717 | report.reset_mock() |
715 | m = market.Market(self.ccxt, self.market_args(report_db=True), pg_config="present", user_id=1) | 718 | m = market.Market(self.ccxt, self.market_args(report_db=True), user_id=1) |
716 | with self.subTest(file=None, pg_config="present"),\ | 719 | with self.subTest(file=None, pg_connected=True),\ |
720 | mock.patch.object(dbs, "psql_connected") as psql,\ | ||
721 | mock.patch.object(dbs, "redis_connected") as redis,\ | ||
717 | mock.patch.object(m, "report") as report,\ | 722 | mock.patch.object(m, "report") as report,\ |
718 | mock.patch.object(m, "store_file_report") as file_report,\ | 723 | mock.patch.object(m, "store_file_report") as file_report,\ |
719 | mock.patch.object(m, "store_redis_report") as redis_report,\ | 724 | mock.patch.object(m, "store_redis_report") as redis_report,\ |
720 | mock.patch.object(m, "store_database_report") as db_report,\ | 725 | mock.patch.object(m, "store_database_report") as db_report,\ |
721 | mock.patch.object(market.datetime, "datetime") as time_mock: | 726 | mock.patch.object(market.datetime, "datetime") as time_mock: |
722 | 727 | psql.return_value = True | |
728 | redis.return_value = False | ||
723 | time_mock.now.return_value = datetime.datetime(2018, 2, 25) | 729 | time_mock.now.return_value = datetime.datetime(2018, 2, 25) |
724 | 730 | ||
725 | m.store_report() | 731 | m.store_report() |
@@ -731,14 +737,17 @@ class MarketTest(WebMockTestCase): | |||
731 | 737 | ||
732 | report.reset_mock() | 738 | report.reset_mock() |
733 | m = market.Market(self.ccxt, self.market_args(report_db=True, report_path="present"), | 739 | m = market.Market(self.ccxt, self.market_args(report_db=True, report_path="present"), |
734 | pg_config="pg_config", user_id=1) | 740 | user_id=1) |
735 | with self.subTest(file="present", pg_config="present"),\ | 741 | with self.subTest(file="present", pg_connected=True),\ |
742 | mock.patch.object(dbs, "psql_connected") as psql,\ | ||
743 | mock.patch.object(dbs, "redis_connected") as redis,\ | ||
736 | mock.patch.object(m, "report") as report,\ | 744 | mock.patch.object(m, "report") as report,\ |
737 | mock.patch.object(m, "store_file_report") as file_report,\ | 745 | mock.patch.object(m, "store_file_report") as file_report,\ |
738 | mock.patch.object(m, "store_redis_report") as redis_report,\ | 746 | mock.patch.object(m, "store_redis_report") as redis_report,\ |
739 | mock.patch.object(m, "store_database_report") as db_report,\ | 747 | mock.patch.object(m, "store_database_report") as db_report,\ |
740 | mock.patch.object(market.datetime, "datetime") as time_mock: | 748 | mock.patch.object(market.datetime, "datetime") as time_mock: |
741 | 749 | psql.return_value = True | |
750 | redis.return_value = False | ||
742 | time_mock.now.return_value = datetime.datetime(2018, 2, 25) | 751 | time_mock.now.return_value = datetime.datetime(2018, 2, 25) |
743 | 752 | ||
744 | m.store_report() | 753 | m.store_report() |
@@ -750,14 +759,17 @@ class MarketTest(WebMockTestCase): | |||
750 | 759 | ||
751 | report.reset_mock() | 760 | report.reset_mock() |
752 | m = market.Market(self.ccxt, self.market_args(report_redis=False), | 761 | m = market.Market(self.ccxt, self.market_args(report_redis=False), |
753 | redis_config="redis_config", user_id=1) | 762 | user_id=1) |
754 | with self.subTest(redis_config="present", report_redis=False),\ | 763 | with self.subTest(redis_connected=True, report_redis=False),\ |
764 | mock.patch.object(dbs, "psql_connected") as psql,\ | ||
765 | mock.patch.object(dbs, "redis_connected") as redis,\ | ||
755 | mock.patch.object(m, "report") as report,\ | 766 | mock.patch.object(m, "report") as report,\ |
756 | mock.patch.object(m, "store_file_report") as file_report,\ | 767 | mock.patch.object(m, "store_file_report") as file_report,\ |
757 | mock.patch.object(m, "store_redis_report") as redis_report,\ | 768 | mock.patch.object(m, "store_redis_report") as redis_report,\ |
758 | mock.patch.object(m, "store_database_report") as db_report,\ | 769 | mock.patch.object(m, "store_database_report") as db_report,\ |
759 | mock.patch.object(market.datetime, "datetime") as time_mock: | 770 | mock.patch.object(market.datetime, "datetime") as time_mock: |
760 | 771 | psql.return_value = False | |
772 | redis.return_value = True | ||
761 | time_mock.now.return_value = datetime.datetime(2018, 2, 25) | 773 | time_mock.now.return_value = datetime.datetime(2018, 2, 25) |
762 | 774 | ||
763 | m.store_report() | 775 | m.store_report() |
@@ -766,13 +778,16 @@ class MarketTest(WebMockTestCase): | |||
766 | report.reset_mock() | 778 | report.reset_mock() |
767 | m = market.Market(self.ccxt, self.market_args(report_redis=True), | 779 | m = market.Market(self.ccxt, self.market_args(report_redis=True), |
768 | user_id=1) | 780 | user_id=1) |
769 | with self.subTest(redis_config="absent", report_redis=True),\ | 781 | with self.subTest(redis_connected=False, report_redis=True),\ |
782 | mock.patch.object(dbs, "psql_connected") as psql,\ | ||
783 | mock.patch.object(dbs, "redis_connected") as redis,\ | ||
770 | mock.patch.object(m, "report") as report,\ | 784 | mock.patch.object(m, "report") as report,\ |
771 | mock.patch.object(m, "store_file_report") as file_report,\ | 785 | mock.patch.object(m, "store_file_report") as file_report,\ |
772 | mock.patch.object(m, "store_redis_report") as redis_report,\ | 786 | mock.patch.object(m, "store_redis_report") as redis_report,\ |
773 | mock.patch.object(m, "store_database_report") as db_report,\ | 787 | mock.patch.object(m, "store_database_report") as db_report,\ |
774 | mock.patch.object(market.datetime, "datetime") as time_mock: | 788 | mock.patch.object(market.datetime, "datetime") as time_mock: |
775 | 789 | psql.return_value = False | |
790 | redis.return_value = False | ||
776 | time_mock.now.return_value = datetime.datetime(2018, 2, 25) | 791 | time_mock.now.return_value = datetime.datetime(2018, 2, 25) |
777 | 792 | ||
778 | m.store_report() | 793 | m.store_report() |
@@ -780,14 +795,17 @@ class MarketTest(WebMockTestCase): | |||
780 | 795 | ||
781 | report.reset_mock() | 796 | report.reset_mock() |
782 | m = market.Market(self.ccxt, self.market_args(report_redis=True), | 797 | m = market.Market(self.ccxt, self.market_args(report_redis=True), |
783 | redis_config="redis_config", user_id=1) | 798 | user_id=1) |
784 | with self.subTest(redis_config="present", report_redis=True),\ | 799 | with self.subTest(redis_connected=True, report_redis=True),\ |
800 | mock.patch.object(dbs, "psql_connected") as psql,\ | ||
801 | mock.patch.object(dbs, "redis_connected") as redis,\ | ||
785 | mock.patch.object(m, "report") as report,\ | 802 | mock.patch.object(m, "report") as report,\ |
786 | mock.patch.object(m, "store_file_report") as file_report,\ | 803 | mock.patch.object(m, "store_file_report") as file_report,\ |
787 | mock.patch.object(m, "store_redis_report") as redis_report,\ | 804 | mock.patch.object(m, "store_redis_report") as redis_report,\ |
788 | mock.patch.object(m, "store_database_report") as db_report,\ | 805 | mock.patch.object(m, "store_database_report") as db_report,\ |
789 | mock.patch.object(market.datetime, "datetime") as time_mock: | 806 | mock.patch.object(market.datetime, "datetime") as time_mock: |
790 | 807 | psql.return_value = False | |
808 | redis.return_value = True | ||
791 | time_mock.now.return_value = datetime.datetime(2018, 2, 25) | 809 | time_mock.now.return_value = datetime.datetime(2018, 2, 25) |
792 | 810 | ||
793 | m.store_report() | 811 | m.store_report() |
@@ -1014,6 +1032,15 @@ class ProcessorTest(WebMockTestCase): | |||
1014 | processor.process_step("foo", step, {"foo":"bar"}) | 1032 | processor.process_step("foo", step, {"foo":"bar"}) |
1015 | self.m.balances.fetch_balances.assert_not_called() | 1033 | self.m.balances.fetch_balances.assert_not_called() |
1016 | 1034 | ||
1035 | self.m.reset_mock() | ||
1036 | with mock.patch.object(processor, "run_action") as run_action: | ||
1037 | step = processor.scenarios["print_balances"][0] | ||
1038 | |||
1039 | processor.process_step("foo", step, {"foo":"bar"}) | ||
1040 | self.m.balances.fetch_balances.assert_called_once_with( | ||
1041 | add_portfolio=True, log_tickers=True, | ||
1042 | tag='process_foo__1_print_balances_begin') | ||
1043 | |||
1017 | def test_parse_args(self): | 1044 | def test_parse_args(self): |
1018 | processor = market.Processor(self.m) | 1045 | processor = market.Processor(self.m) |
1019 | 1046 | ||