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
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
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
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)
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
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
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
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
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)
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
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")
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