From 906996d36b4b935ea9dbf2845568ccef75f8e890 Mon Sep 17 00:00:00 2001
From: Holger Nahrstaedt <holger@nahrstaedt.de>
Date: Mon, 23 Apr 2018 16:23:49 +0200
Subject: [PATCH] Sell and Buy in cli improved

CLI
* market adapted on asset for buy and sell
market
* quote and base asset can be set
unit test
* more unit tests for buy and sell
---
 beem/cli.py            | 19 +++++++++++++++----
 beem/market.py         | 16 +++++++++++-----
 tests/beem/test_cli.py |  8 ++++++++
 3 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/beem/cli.py b/beem/cli.py
index 4de008cb..e19d1d3c 100644
--- a/beem/cli.py
+++ b/beem/cli.py
@@ -13,6 +13,7 @@ from beem.comment import Comment
 from beem.market import Market
 from beem.block import Block
 from beem.profile import Profile
+from beem.asset import Asset
 from beem.witness import Witness, WitnessesRankedByVote, WitnessesVotedByAccount
 from beem.blockchain import Blockchain
 from beem.utils import formatTimeString
@@ -981,16 +982,21 @@ def buy(amount, asset, price, account, orderid):
         Limit buy price denoted in (SBD per STEEM)
     """
     stm = shared_steem_instance()
-    market = Market(steem_instance=stm)
     if not account:
         account = stm.config["default_account"]
+    if asset == "SBD":
+        market = Market(base=Asset("STEEM"), quote=Asset("SBD"), steem_instance=stm)
+    else:
+        market = Market(base=Asset("SBD"), quote=Asset("STEEM"), steem_instance=stm)
     if not price:
         orderbook = market.orderbook(limit=1, raw_data=False)
         if asset == "STEEM" and len(orderbook["bids"]) > 0:
             p = Price(orderbook["bids"][0]["base"], orderbook["bids"][0]["quote"], steem_instance=stm).invert()
+            p_show = p
         else:
             p = Price(orderbook["asks"][0]["base"], orderbook["asks"][0]["quote"], steem_instance=stm).invert()
-        price_ok = click.prompt("Is the following Price ok: %s [y/n]" % (str(p)))
+            p_show = p
+        price_ok = click.prompt("Is the following Price ok: %s [y/n]" % (str(p_show)))
         if price_ok not in ["y", "ye", "yes"]:
             return
     else:
@@ -1017,16 +1023,21 @@ def sell(amount, asset, price, account, orderid):
         Limit sell price denoted in (SBD per STEEM)
     """
     stm = shared_steem_instance()
-    market = Market(steem_instance=stm)
+    if asset == "SBD":
+        market = Market(base=Asset("STEEM"), quote=Asset("SBD"), steem_instance=stm)
+    else:
+        market = Market(base=Asset("SBD"), quote=Asset("STEEM"), steem_instance=stm)
     if not account:
         account = stm.config["default_account"]
     if not price:
         orderbook = market.orderbook(limit=1, raw_data=False)
         if asset == "SBD" and len(orderbook["bids"]) > 0:
             p = Price(orderbook["bids"][0]["base"], orderbook["bids"][0]["quote"], steem_instance=stm).invert()
+            p_show = p
         else:
             p = Price(orderbook["asks"][0]["base"], orderbook["asks"][0]["quote"], steem_instance=stm).invert()
-        price_ok = click.prompt("Is the following Price ok: %s [y/n]" % (str(p)))
+            p_show = p
+        price_ok = click.prompt("Is the following Price ok: %s [y/n]" % (str(p_show)))
         if price_ok not in ["y", "ye", "yes"]:
             return
     else:
diff --git a/beem/market.py b/beem/market.py
index b0b44705..eca56796 100644
--- a/beem/market.py
+++ b/beem/market.py
@@ -19,9 +19,9 @@ import random
 class Market(dict):
     """ This class allows to easily access Markets on the blockchain for trading, etc.
 
-        :param steem.steem.Steem steem_instance: Steem instance
-        :param steem.asset.Asset base: Base asset
-        :param steem.asset.Asset quote: Quote asset
+        :param beem.steem.Steem steem_instance: Steem instance
+        :param beem.asset.Asset base: Base asset
+        :param beem.asset.Asset quote: Quote asset
         :returns: Blockchain Market
         :rtype: dictionary with overloaded methods
 
@@ -50,14 +50,20 @@ class Market(dict):
     def __init__(
         self,
         steem_instance=None,
+        *args,
+        **kwargs
     ):
         """
         Init Market
+
+            :param beem.steem.Steem steem_instance: Steem instance
+            :param beem.asset.Asset base: Base asset
+            :param beem.asset.Asset quote: Quote asset
         """
         self.steem = steem_instance or shared_steem_instance()
+        base = kwargs.get("base", Asset("SBD", steem_instance=self.steem))
+        quote = kwargs.get("quote", Asset("STEEM", steem_instance=self.steem))
 
-        quote = Asset("STEEM", steem_instance=self.steem)
-        base = Asset("SBD", steem_instance=self.steem)
         super(Market, self).__init__({"base": base, "quote": quote})
 
     def get_string(self, separator=":"):
diff --git a/tests/beem/test_cli.py b/tests/beem/test_cli.py
index a31b6add..6891a250 100644
--- a/tests/beem/test_cli.py
+++ b/tests/beem/test_cli.py
@@ -265,13 +265,21 @@ class Testcases(unittest.TestCase):
         self.assertEqual(result.exit_code, 0)
         result = runner.invoke(cli, ['-d', 'buy', '1', 'STEEM'], input="y\ntest\n")
         self.assertEqual(result.exit_code, 0)
+        result = runner.invoke(cli, ['-d', 'buy', '1', 'SBD', '2.2'], input="test\n")
+        self.assertEqual(result.exit_code, 0)
+        result = runner.invoke(cli, ['-d', 'buy', '1', 'SBD'], input="y\ntest\n")
+        self.assertEqual(result.exit_code, 0)
 
     def test_sell(self):
         runner = CliRunner()
         result = runner.invoke(cli, ['-d', 'sell', '1', 'STEEM', '2.2'], input="test\n")
         self.assertEqual(result.exit_code, 0)
+        result = runner.invoke(cli, ['-d', 'sell', '1', 'SBD', '2.2'], input="test\n")
+        self.assertEqual(result.exit_code, 0)
         result = runner.invoke(cli, ['-d', 'sell', '1', 'STEEM'], input="y\ntest\n")
         self.assertEqual(result.exit_code, 0)
+        result = runner.invoke(cli, ['-d', 'sell', '1', 'SBD'], input="y\ntest\n")
+        self.assertEqual(result.exit_code, 0)
 
     def test_cancel(self):
         runner = CliRunner()
-- 
GitLab