Пример #1
0
    def create_transaction(self, message):
        self.user_validation()
        target_user_hash = re.search(r" [a-zA-Z0-9]{10} ",
                                     message).group(0).strip(' ')
        target_user = self.get_user_by_user_hash(target_user_hash)
        message = re.search(r" [a-zA-Z0-9]{10} [\w\W0-9.]+$",
                            message).group(0)[12:].strip(' ')

        def allowed_values(message):
            return all([char.isdigit() or char == '.' for char in message])

        if not allowed_values(message):
            raise TransactionError(
                TRANSACTION_UNALLOWED_VALUE.substitute(value=message))
        amount = float(message)
        if self.user.finances < amount:
            raise TransactionError(TRANSACTION_NO_FINANCES)
        if target_user_hash == self.user.character_hash:
            raise TransactionError(SELF_TRANSACTION)
        if amount <= 0:
            raise TransactionError(ZERO_TRANSACTION)
        transaction_hash = Transaction.create_transaction(
            self.user.character_hash, target_user_hash, amount, self.database)
        reciever_amount = target_user.finances + amount
        sender_amount = self.user.finances - amount
        User.update_db_value(target_user_hash, "finances", reciever_amount,
                             self.database)
        User.update_db_value(self.user.character_hash, "finances",
                             sender_amount, self.database)
        transaction_message = TRANSACTION_MESSAGE.substitute(
            sender_hash=self.user.character_hash,
            reciever_hash=target_user_hash,
            amount=amount,
            transaction_hash=transaction_hash)
        return self.user.chat_id, target_user.chat_id, transaction_message
Пример #2
0
def test_create_hacked_transaction_other(database, mock_message):
    User.create_admin(1, 1, database)
    character_hash = User.create_user(2, 2, "Test user", database)
    User.update_db_value(character_hash, "hacker_level", 1, database)
    character_hash_2 = User.create_user(3, 3, "Test user 2", database)
    character_hash_4 = User.create_user(4, 4, "Test user 4", database)
    character_hash_5 = User.create_user(5, 5, "Test user 5", database)
    User.update_db_value(character_hash_4, "hacker_defence", 1, database)
    client = BankingClientFactory(database).create_client(mock_message)
    double_amount = DEFAULT_FINANCES * 2
    half_amount = DEFAULT_FINANCES / 2
    user2 = client.get_user_by_user_hash(character_hash_2)
    user1 = client.get_user_by_user_hash(character_hash)
    assert user2.finances == DEFAULT_FINANCES
    assert user1.finances == DEFAULT_FINANCES
    with pytest.raises(TransactionError):
        client.create_hacker_transaction_other(
            f"/h@ck_theft_other {character_hash_2} {character_hash_5} {double_amount}"
        )
    with pytest.raises(TransactionError):
        client.create_hacker_transaction_other(
            f"/h@ck_theft_other {character_hash} {character_hash_5} {half_amount}"
        )
    with pytest.raises(TransactionError):
        client.create_hacker_transaction_other(
            f"/h@ck_theft_other {character_hash_2} {character_hash_5} notanumber"
        )
    with pytest.raises(TransactionError):
        client.create_hacker_transaction_other(
            f"/h@ck_theft_other {character_hash_2} {character_hash_5} 0")
    with pytest.raises(UserError):
        client.create_hacker_transaction_other(
            f"/h@ck_theft_other 1234567890 {character_hash_5} {half_amount}")
    with pytest.raises(HackerError):
        client.create_hacker_transaction_other(
            f"/h@ck_theft_other 0000000000 {character_hash_5} {half_amount}")
    hacker_hash, victim_chat_id, profiteer_chat_id, transaction_message, show_hack = client.create_hacker_transaction_other(
        f"/h@ck_theft_other {character_hash_2} {character_hash_5} {half_amount}"
    )
    user2 = client.get_user_by_user_hash(character_hash_2)
    user5 = client.get_user_by_user_hash(character_hash_5)
    assert user2.finances == DEFAULT_FINANCES - half_amount
    assert user5.finances == DEFAULT_FINANCES + half_amount
    assert hacker_hash == client.user.character_hash
    assert victim_chat_id == user2.chat_id
    assert not show_hack

    hacker_hash, victim_chat_id, profiteer_chat_id, transaction_message, show_hack = client.create_hacker_transaction_other(
        f"/h@ck_theft_other {character_hash_4} {character_hash_5} {half_amount}"
    )
    user4 = client.get_user_by_user_hash(character_hash_4)
    user5 = client.get_user_by_user_hash(character_hash_5)
    assert hacker_hash == client.user.character_hash
    assert victim_chat_id == user4.chat_id
    assert user4.finances == DEFAULT_FINANCES - half_amount
    assert user5.finances == DEFAULT_FINANCES + half_amount + half_amount
    assert show_hack
Пример #3
0
def test_update_db_value(database):
    character_hash = User.create_user(2, 2, "Test user", database)
    user_data = User.get_user_by_user_hash(character_hash, database)
    assert user_data is not None
    assert user_data.finances == DEFAULT_FINANCES
    User.update_db_value(character_hash, "finances", DEFAULT_FINANCES + 1,
                         database)
    user_data = User.get_user_by_user_hash(character_hash, database)
    assert user_data is not None
    assert user_data.finances == DEFAULT_FINANCES + 1
Пример #4
0
def test_hacker_validation(database, mock_message):
    character_hash = User.create_user(2, 2, "Test user", database)
    client = BankingClientFactory(database).create_client(mock_message)
    with pytest.raises(HackerError):
        client.hacker_validation(0)
    User.update_db_value(character_hash, "hacker_level", 1, database)
    client = BankingClientFactory(database).create_client(mock_message)
    with pytest.raises(HackerError):
        client.hacker_validation(2)
    client.hacker_validation(0)
Пример #5
0
 def set_attribute(self, message):
     self.admin_validation()
     target_user_hash = re.search(r" [a-zA-Z0-9]{10} ",
                                  message).group(0).strip(' ')
     target_user = self.get_user_by_user_hash(target_user_hash)
     target_attribute = re.search(
         r"(finances|hacker_level|hacker_defence|is_admin)",
         message).group(0)
     target_value = int(re.search(r"[0-9]+$", message).group(0))
     User.update_db_value(target_user_hash, target_attribute, target_value,
                          self.database)
     return ATTRIBUTE_UPDATE_MESSAGE
Пример #6
0
def test_get_admin_list(database):
    admin_list = User.get_admin_list(database)
    assert len(admin_list) == 0
    User.create_admin(1, 1, database)
    admin_list = User.get_admin_list(database)
    assert len(admin_list) == 1
    character_hash = User.create_user(2, 2, "Test user", database)
    admin_list = User.get_admin_list(database)
    assert len(admin_list) == 1
    user_data = User.get_user_by_user_hash(character_hash, database)
    User.update_db_value(character_hash, "is_admin", 1, database)
    admin_list = User.get_admin_list(database)
    assert len(admin_list) == 2
Пример #7
0
    def create_hacker_transaction_other(self, message):
        target_hashes = re.findall(r"[a-zA-Z0-9]{10}", message)
        target_first_user_hash = target_hashes[0]
        target_second_user_hash = target_hashes[1]
        target_user = self.get_user_by_user_hash(target_first_user_hash)
        reciever_user = self.get_user_by_user_hash(target_second_user_hash)

        message = re.search(r" [a-zA-Z0-9]{10} [a-zA-Z0-9]{10} [\w\W0-9.]+$",
                            message).group(0)[22:].strip(' ')
        show_hack = self.hacker_validation(
            target_user.hacker_defence + HACKER_THEFT_DIFFICULTY,
            target_user.chat_id)

        def allowed_values(message):
            return all([char.isdigit() or char == '.' for char in message])

        if not allowed_values(message):
            raise TransactionError(
                TRANSACTION_UNALLOWED_VALUE.substitute(value=message))
        amount = float(message)
        if self.user.finances < amount:
            raise TransactionError(TRANSACTION_NO_FINANCES)
        if target_first_user_hash == self.user.character_hash:
            raise TransactionError(SELF_TRANSACTION)
        if amount <= 0:
            raise TransactionError(ZERO_TRANSACTION)
        if show_hack:
            transaction_hash = Transaction.create_transaction(
                target_first_user_hash, target_second_user_hash, amount,
                self.database)
        else:
            transaction_hash_out = Transaction.create_transaction(
                target_first_user_hash, HACKER_FAKE_HASH, amount,
                self.database)
            transaction_hash_in = Transaction.create_transaction(
                HACKER_FAKE_HASH, target_second_user_hash, amount,
                self.database)
            transaction_hash = transaction_hash_out + ' ' + transaction_hash_in
        reciever_amount = reciever_user.finances + amount
        sender_amount = target_user.finances - amount
        User.update_db_value(target_first_user_hash, "finances", sender_amount,
                             self.database)
        User.update_db_value(target_second_user_hash, "finances",
                             reciever_amount, self.database)
        transaction_message = TRANSACTION_MESSAGE.substitute(
            sender_hash=target_first_user_hash,
            reciever_hash=target_second_user_hash,
            amount=amount,
            transaction_hash=transaction_hash)
        return self.user.character_hash, target_user.chat_id, reciever_user.chat_id, transaction_message, show_hack
Пример #8
0
def mass_set_character_csv(document, database):
    with open("mass_character_set.csv", "wb") as csvfile:
        csvfile.write(document)
    error_list = []
    good_result_counter = 0
    with open("mass_character_set.csv", "r+") as csvfile:
        reader = csv.reader(csvfile, delimiter=",")
        next(reader, None)
        for row_number, row in enumerate(reader):
            character_hash = row[0]
            finances = row[1]
            hacker_level = row[2]
            hacker_defence = row[3]
            is_admin = row[4]
            user = User.get_user_by_user_hash(character_hash, database)
            if user is None:
                error_list.append(f"Row {row_number + 2}: NO SUCH USER")
                continue
            User.update_db_value(character_hash, "finances", finances,
                                 database)
            User.update_db_value(character_hash, "hacker_level", hacker_level,
                                 database)
            User.update_db_value(character_hash, "hacker_defence",
                                 hacker_defence, database)
            User.update_db_value(character_hash, "is_admin", is_admin,
                                 database)
            good_result_counter += 1
    total_result_counter = row_number + 1
    os.remove("mass_character_set.csv")
    return good_result_counter, total_result_counter, error_list
Пример #9
0
def test_hack_inspect_transactions(database, mock_message):
    User.create_admin(1, 1, database)
    character_hash_1 = User.create_user(2, 2, "Test user", database)
    User.update_db_value(character_hash_1, "hacker_level", 1, database)
    character_hash_2 = User.create_user(3, 3, "Test user 2", database)
    character_hash_3 = User.create_user(4, 4, "Test user 3", database)
    character_hash_4 = User.create_user(5, 5, "Test user 4", database)
    User.update_db_value(character_hash_3, "hacker_defence", 1, database)

    client = BankingClientFactory(database).create_client(mock_message)

    results, chat_id, show_hack = client.hack_inspect_transactions(
        f"/hack_history_sent {character_hash_2}", True)
    assert results == NO_TRANSACTIONS_FOUND
    assert not show_hack
    results, chat_id, show_hack = client.hack_inspect_transactions(
        f"/hack_history_recieved {character_hash_2}", False)
    assert results == NO_TRANSACTIONS_FOUND
    assert not show_hack
    results, chat_id, show_hack = client.hack_inspect_transactions(
        f"/hack_history_recieved {character_hash_3}", False)
    assert results == NO_TRANSACTIONS_FOUND
    assert show_hack

    Transaction.create_transaction(character_hash_2, character_hash_4, 100,
                                   database)
    Transaction.create_transaction(character_hash_2, character_hash_3, 100,
                                   database)
    Transaction.create_transaction(character_hash_2, "0000000000", 100,
                                   database)

    results, chat_id, show_hack = client.hack_inspect_transactions(
        f"/hack_history_sent {character_hash_2}", True)
    assert results != NO_TRANSACTIONS_FOUND
    assert not show_hack
    results, chat_id, show_hack = client.hack_inspect_transactions(
        f"/hack_history_recieved {character_hash_2}", False)
    assert results == NO_TRANSACTIONS_FOUND
    assert not show_hack
    results, chat_id, show_hack = client.hack_inspect_transactions(
        f"/hack_history_recieved {character_hash_3}", False)
    assert results != NO_TRANSACTIONS_FOUND
    assert show_hack

    with pytest.raises(HackerError):
        client.hack_inspect_transactions(f"/hack_history_recieved 0000000000",
                                         False)
Пример #10
0
def test_hack_send_hacked_message(database, mock_message):
    User.create_admin(1, 1, database)
    character_hash = User.create_user(2, 2, "Test user", database)
    User.update_db_value(character_hash, "hacker_level", 1, database)
    client = BankingClientFactory(database).create_client(mock_message)
    character_hash_2 = User.create_user(3, 3, "Test user 2", database)
    character_hash_4 = User.create_user(4, 4, "Test user 4", database)
    User.update_db_value(character_hash_4, "hacker_defence", 1, database)
    user2 = client.get_user_by_user_hash(character_hash_2)
    user4 = client.get_user_by_user_hash(character_hash_4)
    with pytest.raises(UserError):
        client.prepare_hacker_message("/h@ck_message 1234567890 OLOLO")
    chat_id, sent_message, show_hack = client.prepare_hacker_message(
        f'/h@ck_message {character_hash_2} OLOLO')
    assert sent_message == "OLOLO"
    assert chat_id == user2.chat_id
    assert not show_hack
    with pytest.raises(HackerError):
        client.hack_inspect_user(f'/h@ck_message 0000000000 OLOLO')
    chat_id, sent_message, show_hack = client.prepare_hacker_message(
        f'/h@ck_message {character_hash_4} OLOLO')
    assert sent_message == "OLOLO"
    assert chat_id == user4.chat_id
    assert show_hack
Пример #11
0
def test_hack_inspect_all_messages(database, mock_message):
    User.create_admin(1, 1, database)
    character_hash_1 = User.create_user(2, 2, "Test user", database)
    User.update_db_value(character_hash_1, "hacker_level", 1, database)
    character_hash_2 = User.create_user(3, 3, "Test user 2", database)
    character_hash_3 = User.create_user(4, 4, "Test user 3", database)
    character_hash_4 = User.create_user(5, 5, "Test user 4", database)
    User.update_db_value(character_hash_3, "hacker_defence", 1, database)

    client = BankingClientFactory(database).create_client(mock_message)

    results, chat_id, show_hack = client.hack_inspect_all_messages(
        f"/hack_messages_history_all {character_hash_2}")
    assert results == NO_MESSAGES_FOUND
    assert not show_hack
    results, chat_id, show_hack = client.hack_inspect_all_messages(
        f"/hack_messages_history_all {character_hash_3}")
    assert results == NO_MESSAGES_FOUND
    assert show_hack

    Message.create_message(character_hash_2, character_hash_4, "100", database)
    Message.create_message(character_hash_2, character_hash_3, "100", database)
    Message.create_message(character_hash_2, "0000000000", "100", database)

    results, chat_id, show_hack = client.hack_inspect_all_messages(
        f"/hack_messages_history_all {character_hash_2}")
    assert results != NO_MESSAGES_FOUND
    assert not show_hack
    results, chat_id, show_hack = client.hack_inspect_all_messages(
        f"/hack_messages_history_all {character_hash_3}")
    assert results != NO_MESSAGES_FOUND
    assert show_hack

    with pytest.raises(HackerError):
        client.hack_inspect_all_messages(
            f"/hack_messages_history_all 0000000000")
Пример #12
0
def test_hack_inspect_user(database, mock_message):
    User.create_admin(1, 1, database)
    character_hash = User.create_user(2, 2, "Test user", database)
    User.update_db_value(character_hash, "hacker_level", 1, database)
    client = BankingClientFactory(database).create_client(mock_message)
    character_hash_2 = User.create_user(3, 3, "Test user 2", database)
    character_hash_4 = User.create_user(4, 4, "Test user 4", database)
    User.update_db_value(character_hash_4, "hacker_defence", 1, database)
    user2 = client.get_user_by_user_hash(character_hash_2)
    user4 = client.get_user_by_user_hash(character_hash_4)
    with pytest.raises(UserError):
        client.hack_inspect_user("/hack 1234567890")
    resulting_data, chat_id, show_hack = client.hack_inspect_user(
        f'/hack {character_hash_2}')
    assert resulting_data == user2.hack_result
    assert chat_id == user2.chat_id
    assert not show_hack
    with pytest.raises(HackerError):
        client.hack_inspect_user(f'/hack 0000000000')
    resulting_data, chat_id, show_hack = client.hack_inspect_user(
        f'/hack {character_hash_4}')
    assert resulting_data == user4.hack_result
    assert chat_id == user4.chat_id
    assert show_hack