diff --git a/EnglishPal b/EnglishPal new file mode 160000 index 0000000..8cbc7c9 --- /dev/null +++ b/EnglishPal @@ -0,0 +1 @@ +Subproject commit 8cbc7c9a0ce543db48f80a743c4168ca847ca500 diff --git a/app/pickle_idea.py b/app/pickle_idea.py index 45bd19a..c172c32 100644 --- a/app/pickle_idea.py +++ b/app/pickle_idea.py @@ -54,12 +54,19 @@ def save_frequency_to_pickle(d, pickle_fname): pickle.dump(d2, f) f.close() -def unfamiliar(path,word): - f = open(path,"rb") +def unfamiliar(path, word): + f = open(path, "rb") dic = pickle.load(f) - dic[word] += [datetime.now().strftime('%Y%m%d%H%M')] - fp = open(path,"wb") - pickle.dump(dic,fp) + if word in dic: + if len(dic[word]) <= 16: # Check if the length of the list is less than 16 + dic[word].append(datetime.now().strftime('%Y%m%d%H%M')) + else: + dic[word].append(datetime.now().strftime('%Y%m%d%H%M')) + else: + dic[word] = [datetime.now().strftime('%Y%m%d%H%M')] + f.close() + with open(path, "wb") as fp: + pickle.dump(dic, fp) def familiar(path,word): f = open(path,"rb") diff --git a/app/templates/login.html b/app/templates/login.html index b0806b6..b001cb0 100644 --- a/app/templates/login.html +++ b/app/templates/login.html @@ -11,12 +11,14 @@ function login(){ let username = $("#username").val(); let password = $("#password").val(); + let regex = /^[a-zA-Z0-9_]*$/; + if (username === "" || password === ""){ alert('输入不能为空!'); return false; } - if (password.includes(' ')) { - alert('输入不能包含空格!'); + if (!regex.test(username) || !regex.test(password)) { + alert('用户名和密码只能包含英文字母和数字!'); return false; } $.post( @@ -29,7 +31,7 @@ window.location.href = "/"+username+"/userpage"; } } - ) + ); return false; } @@ -46,5 +48,4 @@ {% endif %} -{% endblock %} - +{% endblock %} \ No newline at end of file diff --git a/app/templates/reset.html b/app/templates/reset.html index 408e001..741a7f9 100644 --- a/app/templates/reset.html +++ b/app/templates/reset.html @@ -8,14 +8,12 @@ let old_password = $("#old-password").val(); let new_password = $("#new-password").val(); let re_new_password = $("#re-new-password").val(); + let regex = /^[a-zA-Z0-9_]*$/; + if (old_password === "" || new_password === "" || re_new_password === ""){ alert('输入不能为空!'); return false; } - if (old_password.includes(' ') || new_password.includes(' ')) { - alert('输入不能包含空格!'); - return false; - } if (new_password !== re_new_password) { alert('新密码不匹配,请重新输入'); return false; @@ -24,6 +22,11 @@ alert('密码过于简单。(密码长度至少4位)'); return false; } + if (!regex.test(new_password)) { + alert('新密码只能包含英文字母和数字!'); + return false; + } + $.post("/reset", {'old-password': old_password, 'new-password': new_password}, function (response) { if (response.status === '1') { @@ -34,7 +37,7 @@ window.location.href = "/reset"; } } - ) + ); return false; } diff --git a/app/templates/signup.html b/app/templates/signup.html index 6b5db6e..660e924 100644 --- a/app/templates/signup.html +++ b/app/templates/signup.html @@ -12,14 +12,12 @@ You're logged in already! Logout. let username = $("#username").val(); let password = $("#password").val(); let password2 = $("#password2").val(); + let regex = /^[a-zA-Z0-9_]*$/; + if (username === "" || password === "" || password2 === ""){ alert('输入不能为空!'); return false; } - if (password.includes(' ') || password2.includes(' ')) { - alert('输入不能包含空格!'); - return false; - } if (password !== password2) { alert('确认密码与输入密码不一致!'); return false; @@ -28,6 +26,11 @@ You're logged in already! Logout. alert('密码过于简单。(密码长度至少4位)'); return false; } + if (!regex.test(username) || !regex.test(password)) { + alert('用户名和密码只能包含英文字母和数字!'); + return false; + } + $.post("/signup", {'username': username, 'password': password}, function (response) { if (response.status === '0') { @@ -47,7 +50,7 @@ You're logged in already! Logout. alert(response.warn); } } - ) + ); return false; } @@ -60,13 +63,12 @@ You're logged in already! Logout.

Sign up

-

+

- -{% endif %} -{% endblock %} +{% endif %} +{% endblock %} \ No newline at end of file diff --git a/app/templates/userpage_get.html b/app/templates/userpage_get.html index 57461c1..88cfdd6 100644 --- a/app/templates/userpage_get.html +++ b/app/templates/userpage_get.html @@ -232,6 +232,7 @@ update(data['today_article']); check_pre(data['visited_articles']); check_next(data['result_of_generate_article']); + toggleHighlighting(); } } }); @@ -245,6 +246,7 @@ if(data['today_article']){ update(data['today_article']); check_pre(data['visited_articles']); + toggleHighlighting(); } } }); diff --git a/app/test/conftest.py b/app/test/conftest.py index ed4186c..aefb718 100644 --- a/app/test/conftest.py +++ b/app/test/conftest.py @@ -12,24 +12,5 @@ def URL(): @pytest.fixture def driver(): - return webdriver.Edge() # follow the "End-to-end testing" section in README.md to install the web driver executable - - -@pytest.fixture -def restore_sqlite_database(): - ''' - Automatically restore SQLite database file app/db/wordfreqapp.db - using SQL statements from app/static/wordfreqapp.sql - ''' - con = sqlite3.connect('../db/wordfreqapp.db') - with con: - con.executescript('DROP TABLE IF EXISTS user;') - con.executescript('DROP TABLE IF EXISTS article;') - con.executescript(open('../static/wordfreqapp.sql', encoding='utf8').read()) - con.close() - - -@pytest.fixture(autouse=True) -def restart_englishpal(restore_sqlite_database): - (Path(__file__).parent / '../main.py').touch() - time.sleep(1) + my_driver = webdriver.Chrome() + return my_driver diff --git a/app/test/helper.py b/app/test/helper.py index 2b0deec..a6991d0 100644 --- a/app/test/helper.py +++ b/app/test/helper.py @@ -2,32 +2,47 @@ import uuid from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import UnexpectedAlertPresentException, NoAlertPresentException +from selenium.webdriver.common.by import By def signup(URL, driver): username = 'TestUser' + str(uuid.uuid1()).split('-')[0].title() password = '[Abc+123]' driver.get(URL) - - elem = driver.find_element_by_link_text('注册') - elem.click() - elem = driver.find_element_by_id('username') - elem.send_keys(username) - - elem = driver.find_element_by_id('password') - elem.send_keys(password) - - elem = driver.find_element_by_id('password2') - elem.send_keys(password) - - elem = driver.find_element_by_class_name('btn') # 找到"注册"按钮 - elem.click() - try: - WebDriverWait(driver, 1).until(EC.alert_is_present()) - driver.switch_to.alert.accept() - except (UnexpectedAlertPresentException, NoAlertPresentException): - pass + # Click the register link + register_link = WebDriverWait(driver, 10).until( + EC.element_to_be_clickable((By.LINK_TEXT, '注册')) + ) + register_link.click() + + # Fill the registration form + username_field = WebDriverWait(driver, 10).until( + EC.presence_of_element_located((By.ID, 'username')) + ) + username_field.send_keys(username) + + password_field = driver.find_element(By.ID, 'password') + password_field.send_keys(password) + + confirm_password_field = driver.find_element(By.ID, 'password2') + confirm_password_field.send_keys(password) + + # Click the register button + register_button = driver.find_element(By.CLASS_NAME, 'btn') + register_button.click() + + # Handle possible alert + try: + WebDriverWait(driver, 1).until(EC.alert_is_present()) + alert = driver.switch_to.alert + alert.accept() + except (UnexpectedAlertPresentException, NoAlertPresentException): + pass + + return username, password - return username, password + except Exception as e: + print(f"An error occurred: {e}") + return None, None \ No newline at end of file diff --git a/app/test/test_bug518_mponeja.py b/app/test/test_bug518_mponeja.py new file mode 100644 index 0000000..27bc19b --- /dev/null +++ b/app/test/test_bug518_mponeja.py @@ -0,0 +1,121 @@ +import random +import string +import time + +from selenium.webdriver.common.by import By +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC + +from helper import signup + +def has_punctuation(s): + return any(c in string.punctuation for c in s) + +def login(driver, home, uname, password): + driver.get(home) + WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, '登录'))).click() + driver.find_element(By.ID, 'username').send_keys(uname) + driver.find_element(By.ID, 'password').send_keys(password) + driver.find_element(By.XPATH, '//button[text()="登录"]').click() + WebDriverWait(driver, 10).until(EC.title_is(f"EnglishPal Study Room for {uname}")) + + +def select_valid_word(driver): + elem = driver.find_element(By.ID, 'text-content') + essay_content = elem.text + valid_word = random.choice([word for word in essay_content.split() if len(word) >= 6 and not has_punctuation( + word) and 'font>' not in word and 'br>' not in word and 'p>' not in word]) + driver.find_element(By.ID, 'selected-words').send_keys(valid_word) + return valid_word + + +def select_more_words(driver): + elem = driver.find_element(By.ID, 'text-content') + essay_content = elem.text + valid_words = [word for word in essay_content.split() if len(word) >= 6 and not has_punctuation( + word) and 'font>' not in word and 'br>' not in word and 'p>' not in word] + words_to_send = ', '.join(valid_words[:7]) + driver.find_element(By.ID, 'selected-words').send_keys(words_to_send) + + +def test_unfamiliar_button(driver, URL): + try: + username, password = signup(URL, driver) + time.sleep(5) + + word = select_valid_word(driver) + + # Wait for the button to be clickable + time.sleep(8) + # Add selected word to the list of unfamiliar words + add_to_unfamiliar_button = driver.find_element(By.XPATH, '//button[text()="把生词加入我的生词库"]') + add_to_unfamiliar_button.click() + # Wait for the page to update + time.sleep(3) + + add_words_button = driver.find_element(By.XPATH, '//button[text()="加入我的生词簿"]') # Replace with actual ID or selector + add_words_button.click() + # Wait for the page to update again + time.sleep(2) + + # Check if the added word appears in the word container + word_container = driver.find_element(By.CLASS_NAME, 'word-container') + words = word_container.find_elements(By.TAG_NAME, 'p') + added_word_exists = any(word.text == word for word in words) + time.sleep(2) + + # Mark word as unfamiliar + time.sleep(5) + for _ in range(16): + time.sleep(1) + unfamiliar_btn = driver.find_element(By.XPATH, '//a[contains(@class, "btn-warning") and text()="不熟悉"]') + unfamiliar_btn.click() + # Wait for the page to updatec + time.sleep(5) + + # # Keep track of the unfamiliar word count + # counter = 0 + # freq_count = driver.find_element(By.ID, 'freq_'+ word).text + # # counter = freq_count + # print(f"Unfamiliar word count: {freq_count}") + # time.sleep(3) + + #add new words + word = select_more_words(driver) + add_to_unfamiliar_button = driver.find_element(By.XPATH, '//button[text()="把生词加入我的生词库"]') + add_to_unfamiliar_button.click() + + time.sleep(5) + + #add the words to the list of words + add_words_again = driver.find_element(By.XPATH, '//button[text()="加入我的生词簿"]') # Replace with actual ID or selector + add_words_again.click() + # Wait for the page to update again + time.sleep(3) + + + #current count after adding new words + current_unfamiliar_count = driver.find_element(By.XPATH, '//a[contains(@class, "btn-warning") and text()="不熟悉"]') + current_unfamiliar_count = int(unfamiliar_btn.text.split('(')[1].split(')')[0]) + print(f"Unfamiliar word count: {current_unfamiliar_count}") + time.sleep(3) + + + # Verify that the number of unfamiliar words has decreased + # current_unfamiliar_count = driver.find_element(By.ID, 'freq_'+word).text + # print(f"Unfamiliar word second count: {current_unfamiliar_count}") + # time.sleep(3) + + # # Verify that the number of unfamiliar words remains the same + # assert current_unfamiliar_count == freq_count, "Unfamiliar word count did not increase as expected" + # time.sleep(3) + + # Log out and close the browser + driver.find_element(By.XPATH, '//a[contains(@class, "btn-secondary") and text()="退出"]') + driver.execute_script("window.open('');window.close();") + WebDriverWait(driver, 2) + driver.execute_script("window.open('');") + driver.switch_to.window(driver.window_handles[-1]) + + finally: + driver.quit() \ No newline at end of file diff --git a/app/test/test_bug536_QianLetao.py b/app/test/test_bug536_QianLetao.py new file mode 100644 index 0000000..cce0fe6 --- /dev/null +++ b/app/test/test_bug536_QianLetao.py @@ -0,0 +1,39 @@ +from selenium import webdriver +from selenium.webdriver.common.desired_capabilities import DesiredCapabilities +from selenium.webdriver.common.keys import Keys + +import time + +# 初始化WebDriver +driver = webdriver.Remote('http://localhost:4444/wd/hub', DesiredCapabilities.FIREFOX) +driver.implicitly_wait(10) + + +# 测试注册页面输入密码包含空格的情况 +def test_signup_password_with_space(): + try: + driver.get("http://127.0.0.1:5000/signup") + + # 输入用户名 + username_elem = driver.find_element_by_name('username') + username_elem.send_keys("阿萨德") + + # 输入包含空格的密码 + password_elem = driver.find_element_by_name('password') + password_elem.send_keys("阿萨德阿萨德") + + # 再次输入密码 + password2_elem = driver.find_element_by_name('password2') + password2_elem.send_keys("阿萨德阿萨德") + + # 提交注册表单 + password2_elem.send_keys(Keys.RETURN) + + # 等待一段时间确保页面加载完成 + time.sleep(2) + + # 检查是否弹出警告框 + alert = driver.switch_to.alert + assert "用户名和密码只能包含英文字母和数字!" in alert.text + finally: + driver.quit() diff --git a/mintty.2024-06-04_11-12-32.png b/mintty.2024-06-04_11-12-32.png new file mode 100644 index 0000000..72ccafe Binary files /dev/null and b/mintty.2024-06-04_11-12-32.png differ