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