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)
Beispiel #2
0
    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)
Beispiel #4
0
def transfer_tickets():
    try:
        current_user = get_current_user()

        balance = get_user_balance(current_user.id)

        data = json.loads(request.data)
        recipient_id = data["to"]
        amount = data["amount"]

        error = None

        recipient = User.query.filter_by(id=recipient_id).first()

        if amount <= 0:
            error = "You can't transfer non-positive number of tickets"

        if balance < amount:
            error = "Insufficient balance"

        if recipient_id == current_user.id:
            error = "You can't send points to yourself"

        if recipient is None:
            error = "Recipient does not exist"

        if error is not None:
            return {"error": error}, 400

        subtract_balance = Transaction(
            user_id=current_user.id,
            ticket_amount=-1 * amount,
            activity=f"Transfer to {recipient.name}",
        )
        add_balance = Transaction(
            user_id=recipient_id,
            ticket_amount=amount,
            activity=f"Transfer from {current_user.name}",
        )

        db.session.add(subtract_balance)
        db.session.add(add_balance)
        db.session.commit()

        return {"success": True, "user_id": recipient.id, "amount": amount}

    except json.decoder.JSONDecodeError:
        return {"error": "Malformed request"}, 400
Beispiel #5
0
    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)
Beispiel #6
0
    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))
Beispiel #7
0
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
Beispiel #8
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

            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))
Beispiel #9
0
    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)