From ee93a91c0458da899bc38d9315be697ff76b1759 Mon Sep 17 00:00:00 2001 From: Mark Veidemanis Date: Thu, 24 Feb 2022 22:27:04 +0000 Subject: [PATCH] Write various transaction test cases --- handler/tests/test_transactions.py | 147 ++++++++++++++++++++++------- 1 file changed, 111 insertions(+), 36 deletions(-) diff --git a/handler/tests/test_transactions.py b/handler/tests/test_transactions.py index 67def66..2330d3f 100644 --- a/handler/tests/test_transactions.py +++ b/handler/tests/test_transactions.py @@ -40,51 +40,84 @@ class TestTransactions(TestCase): transactions.r.keys = self.mock_keys transactions.r.get = self.mock_get + # Mock some callbacks self.transactions.irc = MagicMock() self.transactions.irc.sendmsg = MagicMock() self.transactions.release_funds = MagicMock() self.transactions.notify = MagicMock() self.transactions.notify.notify_complete_trade = MagicMock() - self.trade_1 = { - "id": "uuid1", - "buyer": "test_buyer_1", - "currency": "GBP", - "amount": "1", - "amount_xmr": "0.3", - "reference": "TEST-1", + # Mock the rates + self.transactions.money = MagicMock() + self.transactions.money.get_rates_all = MagicMock() + self.transactions.money.get_rates_all.return_value = {"GBP": 0.8} + + self.trades = { + 1: { + "id": "uuid1", + "buyer": "test_buyer_1", + "currency": "GBP", + "amount": "1", + "amount_xmr": "0.3", + "reference": "TEST-1", + }, + 2: { + "id": "uuid2", + "buyer": "test_buyer_2", + "currency": "GBP", + "amount": "1", + "amount_xmr": "0.3", + "reference": "TEST-2", + }, + 3: { + "id": "uuid3", + "buyer": "test_buyer_3", + "currency": "GBP", + "amount": "1000", + "amount_xmr": "3", + "reference": "TEST-3", + }, + 4: { + "id": "uuid4", + "buyer": "test_buyer_4", + "currency": "GBP", + "amount": "10", + "amount_xmr": "0.5", + "reference": "TEST-4", + }, } - self.trade_2 = { - "id": "uuid2", - "buyer": "test_buyer_2", - "currency": "GBP", - "amount": "1", - "amount_xmr": "0.3", - "reference": "TEST-2", - } + self.return_trades = [1, 2, 3] @property def test_data_copy(self): return deepcopy(self.test_data) + def data_custom(self, amount, currency, reference): + test_data = self.test_data_copy + test_data["data"]["reference"] = reference + test_data["data"]["legs"][0]["amount"] = amount + test_data["data"]["legs"][0]["currency"] = currency + return test_data + def mock_hgetall(self, string): - if string == "trade.TEST-1": - return self.trade_1 - elif string == "trade.TEST-2": - return self.trade_2 + print("MOCK HGERALL CALLED WITH", string) + ref = string.split(".")[1] + for num, trade in self.trades.items(): + if trade["reference"] == ref: + return trade def mock_hmset(self, string, data): print("HMSET", string, data) def mock_keys(self, string): - return ["uuid1", "uuid2"] + return [v["id"] for k, v in self.trades.items() if k in self.return_trades] def mock_get(self, string): - if string == "uuid1": - return "TEST-1" - elif string == "uuid2": - return "TEST-2" + print("MOCK GET", string) + for num, trade in self.trades.items(): + if trade["id"] == string: + return trade["reference"] def test_transaction(self): self.transactions.transaction(self.test_data) @@ -98,38 +131,80 @@ class TestTransactions(TestCase): def test_transaction_invalid(self): invalid_data = self.test_data_copy - invalid_data["data"]["reference"] = "sss" - invalid_data["data"]["amount"] = 2000 - invalid_data["data"]["currency"] = "SEK" + invalid_data = self.data_custom(2000, "SEK", "sss") self.transactions.transaction(invalid_data) self.transactions.release_funds.assert_not_called() def test_transaction_malformed(self): - pass + malformed_data = self.test_data_copy + del malformed_data["data"] + self.transactions.transaction(malformed_data) + self.transactions.release_funds.assert_not_called() + + malformed_data = self.test_data_copy + del malformed_data["data"]["type"] + self.transactions.transaction(malformed_data) + self.transactions.release_funds.assert_not_called() def test_transaction_no_reference_fail(self): - pass + no_reference_fail = self.data_custom(1, "GBP", "none") + no_reference_fail["data"]["reference"] = "none" + self.transactions.transaction(no_reference_fail) + self.transactions.release_funds.assert_not_called() def test_transaction_no_reference_pass(self): - pass + no_reference_pass = self.data_custom(1, "GBP", "none") + no_reference_pass["data"]["reference"] = "none" + self.return_trades = [1] + + self.transactions.transaction(no_reference_pass) + self.transactions.release_funds.assert_called_with("uuid1", "TEST-1") + + def test_transaction_large(self): + exceeds_max = self.data_custom(1000, "GBP", "TEST-3") + self.transactions.transaction(exceeds_max) + self.transactions.release_funds.assert_called_once_with("uuid3", "TEST-3") def test_transaction_no_reference_exceeds_max(self): - pass + exceeds_max = self.data_custom(1000, "GBP", "noref") + self.transactions.transaction(exceeds_max) + self.transactions.release_funds.assert_not_called() def test_transaction_wrong_currency(self): - pass + wrong_currency = self.data_custom(1, "EUR", "TEST-1") + self.transactions.transaction(wrong_currency) + self.transactions.release_funds.assert_not_called() + + wrong_currency = self.data_custom(1, "EUR", "none") + self.transactions.transaction(wrong_currency) + self.transactions.release_funds.assert_not_called() def test_transaction_wrong_amount(self): - pass + self.transactions.money.get_acceptable_margins = MagicMock() + self.transactions.money.get_acceptable_margins.return_value = (0.8, 1.8) + wrong_amount = self.data_custom(10, "GBP", "TEST-1") + self.transactions.transaction(wrong_amount) + self.transactions.release_funds.assert_not_called() + + wrong_amount = self.data_custom(10, "GBP", "none") + self.transactions.transaction(wrong_amount) + self.transactions.release_funds.assert_not_called() def test_transaction_pending(self): - pass + pending_tx = self.test_data_copy + pending_tx["data"]["state"] = "pending" + self.transactions.transaction(pending_tx) + self.transactions.release_funds.assert_not_called() def test_transaction_too_low(self): - pass + too_low = self.data_custom(5, "GBP", "TEST-1") + self.transactions.transaction(too_low) + self.transactions.release_funds.assert_not_called() def test_transaction_too_high(self): - pass + too_high = self.data_custom(15, "GBP", "TEST-1") + self.transactions.transaction(too_high) + self.transactions.release_funds.assert_not_called() # def test_transaction_pending_then_completed(self): # pass