from django.test import TestCase from trading.models import User, Commodity, TxRequest, BalanceError class TestTransactions(TestCase): def test_tx_requests(self): # Create users user1 = User.objects.create_user(username="test1", email="test1@test.test") user2 = User.objects.create_user(username="test2", email="test2@test.test") # Create test commodity for user1 com1 = Commodity(created_by=user1, in_circulation=1000, name="test1", symbol="TEST1") com1.save() # Create test commodity for user2 com2 = Commodity(created_by=user2, in_circulation=1000, name="test2", symbol="TEST2") com2.save() # Create TX request req1 = TxRequest.open(user1, user2, com1, com2, 10, 10) # Confirm balances self.assertEqual(user1.balance_of(com1), 990) self.assertEqual(user1.balance_of(com2), 0) self.assertEqual(user2.balance_of(com1), 0) self.assertEqual(user2.balance_of(com2), 1000) # Accept TX request req1.accept() # Confirm balances self.assertEqual(user1.balance_of(com1), 990) self.assertEqual(user1.balance_of(com2), 10) self.assertEqual(user2.balance_of(com1), 10) self.assertEqual(user2.balance_of(com2), 990) # Create TX request req2 = TxRequest.open(user2, user1, com2, com1, 10, 10) # Confirm balances self.assertEqual(user1.balance_of(com1), 990) self.assertEqual(user1.balance_of(com2), 10) self.assertEqual(user2.balance_of(com1), 10) self.assertEqual(user2.balance_of(com2), 980) # Decline TX request req2.decline() # Confirm balances self.assertEqual(user1.balance_of(com1), 990) self.assertEqual(user1.balance_of(com2), 10) self.assertEqual(user2.balance_of(com1), 10) self.assertEqual(user2.balance_of(com2), 990) # Ensure assertions on already created TXs with self.assertRaises(AssertionError): req1.accept() with self.assertRaises(AssertionError): req1.decline() with self.assertRaises(AssertionError): req2.accept() with self.assertRaises(AssertionError): req2.decline() # Balance checking # Ensure whoever opens the request has the balance available with self.assertRaises(BalanceError): TxRequest.open(user1, user2, com2, com1, 100, 100) # Ensure whoever tries to accept the request has the balance available req3 = TxRequest.open(user1, user2, com2, com1, 10, 100) with self.assertRaises(BalanceError): req3.accept() # And make sure you can still decline it after failing to accept it. req3.decline() class TestCommodities(TestCase): def test_commodity_stats(self): # Create users user1 = User.objects.create_user(username="test1", email="test1@test.test") user2 = User.objects.create_user(username="test2", email="test2@test.test") # Create test commodity for user1 com1 = Commodity(created_by=user1, in_circulation=1000, name="test1", symbol="TEST1") com1.save() # Create test commodity for user2 com2 = Commodity(created_by=user2, in_circulation=1000, name="test2", symbol="TEST2") com2.save() # Ensure stats are correct self.assertEqual(com1.amount_pending, 0) self.assertEqual(com2.amount_pending, 0) self.assertEqual(com1.trading_volume(), 0) self.assertEqual(com2.trading_volume(), 0) self.assertEqual(com1.market_spread, 1) self.assertEqual(com2.market_spread, 1) # Create TX request req1 = TxRequest.open(user1, user2, com1, com2, 10, 100) # Ensure trading volume is correct self.assertEqual(com1.amount_pending, 10) self.assertEqual(com2.amount_pending, 0) self.assertEqual(com1.trading_volume(), 0) self.assertEqual(com2.trading_volume(), 0) self.assertEqual(com1.market_spread, 1) self.assertEqual(com2.market_spread, 1) # Accept trade req1.accept() # Ensure amount pending is correct self.assertEqual(com1.amount_pending, 0) self.assertEqual(com2.amount_pending, 0) self.assertEqual(com1.trading_volume(), 10) self.assertEqual(com2.trading_volume(), 100) self.assertEqual(com1.market_spread, 2) self.assertEqual(com2.market_spread, 2)