From 513fe125bfdfe8c316332ab6c11088dd6d8629c8 Mon Sep 17 00:00:00 2001 From: calamity <1327612050@qq.com> Date: Wed, 18 Jun 2025 12:24:29 +0800 Subject: [PATCH] FIX Bug 347 --- app/Login.py | 2 + app/templates/signup.html | 4 +- app/test/test_integration_login.py | 74 +++++++++++++++++++++++++++++ app/test_login.py | 63 ++++++++++++++++++++++++ current_branch_commit_messages.txt | Bin 0 -> 139890 bytes 5 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 app/test/test_integration_login.py create mode 100644 app/test_login.py create mode 100644 current_branch_commit_messages.txt diff --git a/app/Login.py b/app/Login.py index d82a6d1..efd0ab4 100644 --- a/app/Login.py +++ b/app/Login.py @@ -79,6 +79,8 @@ class UserName: def validate(self): if len(self.username) > 20: return f'{self.username} is too long. The user name cannot exceed 20 characters.' + if len(self.username) == 0: # 用户名必须不为空 + return 'You can`t use an empty user name.' if self.username.startswith('.'): # a user name must not start with a dot return 'Period (.) is not allowed as the first letter in the user name.' if ' ' in self.username: # a user name must not include a whitespace diff --git a/app/templates/signup.html b/app/templates/signup.html index 48cf932..46d9a2e 100644 --- a/app/templates/signup.html +++ b/app/templates/signup.html @@ -29,8 +29,8 @@ password2 = $("#password2").val().trim(); // 基本表单验证 - if (username === "" || password === "" || password2 === "") { - alert('输入不能为空!'); + if (password === "" || password2 === "") { + alert('输入密码不能为空!'); return false; } if (password.includes(' ') || password2.includes(' ')) { diff --git a/app/test/test_integration_login.py b/app/test/test_integration_login.py new file mode 100644 index 0000000..793c4d7 --- /dev/null +++ b/app/test/test_integration_login.py @@ -0,0 +1,74 @@ +# test_integration_username.py + +import pytest +import sys +import os + +# 获取文件所在目录的上两级目录(EnglishPal) +project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')) +sys.path.append(project_root) + +from app.Login import add_user, check_username_availability + + +# 模拟数据库行为 +class MockUserDB: + def __init__(self): + self.users = {} + + def insert_user(self, username, password, start_date, expiry_date): + if username in self.users: + return False + self.users[username] = { + 'password': password, + 'start_date': start_date, + 'expiry_date': expiry_date + } + return True + + def get_user_by_username(self, username): + return self.users.get(username) + + +original_insert_user = None +original_get_user_by_username = None + + +@pytest.fixture(autouse=True) +def setup_and_teardown(): + global original_insert_user, original_get_user_by_username + + from app.Login import insert_user as original_iu, get_user_by_username as original_gubu + original_insert_user = original_iu + original_get_user_by_username = original_gubu + + mock_db = MockUserDB() + + def mock_insert_user(**kwargs): + return mock_db.insert_user(**kwargs) + + def mock_get_user_by_username(username): + return mock_db.get_user_by_username(username) + + from app.Login import insert_user, get_user_by_username + insert_user = mock_insert_user + get_user_by_username = mock_get_user_by_username + + yield + + from app.Login import insert_user, get_user_by_username + insert_user = original_insert_user + get_user_by_username = original_get_user_by_username + + +def test_add_user_with_empty_username_fails(): + with pytest.raises(ValueError) as exc_info: + add_user('', 'Password123') + assert "Attribute User.name is required" in str(exc_info.value) + + +def test_add_user_with_valid_username_succeeds(): + result = add_user('validuser', 'Password123') + assert result is None # 如果 add_user 不返回值,则断言无异常即可 + assert check_username_availability('validuser') is False # 用户已存在 + diff --git a/app/test_login.py b/app/test_login.py new file mode 100644 index 0000000..cd8f418 --- /dev/null +++ b/app/test_login.py @@ -0,0 +1,63 @@ +# test_username.py + +import pytest +from app.Login import UserName + + +def test_username_too_long(): + username = 'a' * 21 + result = UserName(username).validate() + assert username in result + assert 'too long' in result + + +def test_username_empty(): + username = '' + result = UserName(username).validate() + assert 'empty user name' in result + + +def test_username_starts_with_dot(): + username = '.startwithdot' + result = UserName(username).validate() + assert 'Period (.) is not allowed' in result + + +def test_username_contains_space(): + username = 'has space' + result = UserName(username).validate() + assert 'Whitespace is not allowed' in result + + +def test_username_contains_invalid_punctuation(): + invalid_chars = ['@', '#', '$', '!', '{', '}', '[', ']'] + for c in invalid_chars: + username = f'bad{c}name' + result = UserName(username).validate() + assert f'{c} is not allowed' in result, f"Failed on char: {c}" + + +def test_username_uses_restricted_word(): + restricted_words = ['signup', 'login', 'logout', 'reset', 'mark', 'back', + 'unfamiliar', 'familiar', 'del', 'admin'] + for word in restricted_words: + result = UserName(word).validate() + assert 'restricted word' in result, f"Failed on word: {word}" + + +def test_username_contains_chinese(): + username = '用户名' + result = UserName(username).validate() + assert 'Chinese characters are not allowed' in result + + +def test_valid_username(): + valid_usernames = [ + 'valid_user', + 'valid.user', + 'user123', + 'A_veryValidName', + ] + for username in valid_usernames: + result = UserName(username).validate() + assert result == 'OK', f"Failed on valid username: {username}" diff --git a/current_branch_commit_messages.txt b/current_branch_commit_messages.txt new file mode 100644 index 0000000000000000000000000000000000000000..06f4fac0dec8e25b12416745b0e9a45faf5f8da8 GIT binary patch literal 139890 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 >ur&Ij$Yf}BYjh05UX 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 C`x|=z literal 0 HcmV?d00001 -- 2.17.1