def test_successful_transfer(self): with self.app.app_context(): with self.client.session_transaction() as sess: sess["user_id"] = self.sender_id sender = get_user_by_id(self.sender_id) receiver = get_user_by_id(self.receiver_id) amount = 10 total_transfer = 0 for _ in range(10): response = self.client.post( "/api/ticket/transfer", data=json.dumps({ "to": receiver.id, "amount": amount }), ) total_transfer += amount sender_balance = get_user_balance(sender.id) receiver_balance = get_user_balance(receiver.id) self.assertEqual(response.status_code, 200) self.assertEqual(sender_balance, 1000 - total_transfer) self.assertEqual(receiver_balance, total_transfer)
def test_success_coinflip(self): with self.app.test_request_context(): with self.client.session_transaction() as sess: sess["user_id"] = self.user_id amount = 100 user = get_user_by_id(self.user_id) with mock.patch("server.routes.coinflip.randint", lambda _a, _b: 0): response = self.client.post( COINFLIP_ENDPOINT, data=json.dumps({ "side": "Heads", "bet": amount, }), ) self.assertTrue(response.json["won"]) # Win 100 points self.assertEqual(get_user_balance(user.id), 1100) response = self.client.post( COINFLIP_ENDPOINT, data=json.dumps({ "side": "Tails", "bet": amount, }), ) self.assertFalse(response.json["won"]) # Lose 100 points self.assertEqual(get_user_balance(user.id), 1000) with mock.patch("server.routes.coinflip.randint", lambda _a, _b: 1): response = self.client.post( COINFLIP_ENDPOINT, data=json.dumps({ "side": "Tails", "bet": amount, }), ) self.assertTrue(response.json["won"]) # Win 100 points self.assertEqual(get_user_balance(user.id), 1100) response = self.client.post( COINFLIP_ENDPOINT, data=json.dumps({ "side": "Heads", "bet": amount, }), ) self.assertFalse(response.json["won"]) # Lose 100 points self.assertEqual(get_user_balance(user.id), 1000)
def test_sending_to_self(self): with self.app.app_context(): with self.client.session_transaction() as sess: sess["user_id"] = self.sender_id sender = get_user_by_id(self.sender_id) receiver = get_user_by_id(self.receiver_id) amount = 10 response = self.client.post( "/api/ticket/transfer", data=json.dumps({ "to": sender.id, "amount": amount }), ) sender_balance = get_user_balance(sender.id) receiver_balance = get_user_balance(receiver.id) self.assertEqual(response.status_code, 400) self.assertEqual(sender_balance, 1000) self.assertEqual(receiver_balance, 0)
def test_fail_coinflip(self): with self.app.test_request_context(): with self.client.session_transaction() as sess: sess["user_id"] = self.user_id user = get_user_by_id(self.user_id) transaction = Transaction(user=user, ticket_amount=-1000, activity="Make balance 0") db.session.add(transaction) db.session.commit() response = self.client.post(COINFLIP_ENDPOINT) self.assertIn("error", response.json)
def test_success_skiball(self): with self.app.test_request_context(): with self.client.session_transaction() as sess: sess["user_id"] = self.user_id user = get_user_by_id(self.user_id) balance = 1000 amounts = [10, 20, 30, 40, 50, 100] for amount in amounts: with mock.patch("random.choice", lambda _b: amount): response = self.client.post(COINFLIP_ENDPOINT) balance -= 30 balance += amount self.assertEqual(response.json["amount"], amount) self.assertEqual(get_user_balance(user.id), balance)
def test_fail_dice(self): with self.app.test_request_context(): with self.client.session_transaction() as sess: sess["user_id"] = self.user_id amount = 10000 user = get_user_by_id(self.user_id) with mock.patch("server.routes.dice.get_side", lambda: 2): response = self.client.post( DICE_ENDPOINT, data=json.dumps({ "bet": 6, "quantity": amount, }), ) self.assertIn("error", response.json) self.assertEqual(1000, get_user_balance(user.id))
def get_profile_view(user_id): if user_id is None: user = get_current_user() else: user = get_user_by_id(user_id) if user: if user.is_public or user_id is None: total_tickets = get_user_balance(user.id) return { "name": user.name, "username": user.username, "registration_datetime": user.registration_datetime, "total_tickets": total_tickets, "is_public": user.is_public, } return {"error": "User profile is private"}, 401 return {"error": "User not found"}, 404
def test_fail_coinflip(self): with self.app.test_request_context(): with self.client.session_transaction() as sess: sess["user_id"] = self.user_id amount = 10000 user = get_user_by_id(self.user_id) with mock.patch("server.routes.coinflip.get_side", lambda: "Heads"): response = self.client.post( COINFLIP_ENDPOINT, data=json.dumps({ "side": "Tails", "bet": amount, }), ) self.assertIn("error", response.json) self.assertEqual(1000, get_user_balance(user.id))
def test_success_dice(self): with self.app.test_request_context(): with self.client.session_transaction() as sess: sess["user_id"] = self.user_id amount = 100 user = get_user_by_id(self.user_id) with mock.patch("server.routes.dice.randint", lambda _a, _b: 1): response = self.client.post( DICE_ENDPOINT, data=json.dumps({ "bet": 1, "quantity": amount, }), ) self.assertTrue(response.json["won"]) # Win 400 points self.assertEqual(get_user_balance(user.id), 1400) response = self.client.post( DICE_ENDPOINT, data=json.dumps({ "bet": 2, "quantity": amount, }), ) self.assertFalse(response.json["won"]) # Lose 100 points self.assertEqual(get_user_balance(user.id), 1300) with mock.patch("server.routes.dice.randint", lambda _a, _b: 2): response = self.client.post( DICE_ENDPOINT, data=json.dumps({ "bet": 2, "quantity": amount, }), ) self.assertTrue(response.json["won"]) # Win 100 points self.assertEqual(get_user_balance(user.id), 1700) response = self.client.post( DICE_ENDPOINT, data=json.dumps({ "bet": 3, "quantity": amount, }), ) self.assertFalse(response.json["won"]) # Lose 100 points self.assertEqual(get_user_balance(user.id), 1600) with mock.patch("server.routes.dice.randint", lambda _a, _b: 3): response = self.client.post( DICE_ENDPOINT, data=json.dumps({ "bet": 3, "quantity": amount, }), ) self.assertTrue(response.json["won"]) # Win 100 points self.assertEqual(get_user_balance(user.id), 2000) response = self.client.post( DICE_ENDPOINT, data=json.dumps({ "bet": 4, "quantity": amount, }), ) self.assertFalse(response.json["won"]) # Lose 100 points self.assertEqual(get_user_balance(user.id), 1900) with mock.patch("server.routes.dice.randint", lambda _a, _b: 4): response = self.client.post( DICE_ENDPOINT, data=json.dumps({ "bet": 4, "quantity": amount, }), ) self.assertTrue(response.json["won"]) # Win 100 points self.assertEqual(get_user_balance(user.id), 2300) response = self.client.post( DICE_ENDPOINT, data=json.dumps({ "bet": 5, "quantity": amount, }), ) self.assertFalse(response.json["won"]) # Lose 100 points self.assertEqual(get_user_balance(user.id), 2200) with mock.patch("server.routes.dice.randint", lambda _a, _b: 5): response = self.client.post( DICE_ENDPOINT, data=json.dumps({ "bet": 5, "quantity": amount, }), ) self.assertTrue(response.json["won"]) # Win 100 points self.assertEqual(get_user_balance(user.id), 2600) response = self.client.post( DICE_ENDPOINT, data=json.dumps({ "bet": 6, "quantity": amount, }), ) self.assertFalse(response.json["won"]) # Lose 100 points self.assertEqual(get_user_balance(user.id), 2500) with mock.patch("server.routes.dice.randint", lambda _a, _b: 6): response = self.client.post( DICE_ENDPOINT, data=json.dumps({ "bet": 6, "quantity": amount, }), ) self.assertTrue(response.json["won"]) # Win 100 points self.assertEqual(get_user_balance(user.id), 2900) response = self.client.post( DICE_ENDPOINT, data=json.dumps({ "bet": 1, "quantity": amount, }), ) self.assertFalse(response.json["won"]) # Lose 100 points self.assertEqual(get_user_balance(user.id), 2800)