mirror of
https://github.com/haiwen/seahub.git
synced 2025-08-16 06:03:35 +00:00
247 lines
10 KiB
Python
247 lines
10 KiB
Python
# encoding: utf-8
|
|
import os
|
|
|
|
from django.test import TestCase, Client
|
|
from django_liveserver.testcases import LiveServerTestCase
|
|
from selenium import webdriver
|
|
from selenium.webdriver.firefox.webdriver import WebDriver
|
|
from selenium.webdriver.common.action_chains import ActionChains
|
|
from selenium.webdriver.common.keys import Keys
|
|
|
|
from seahub.base.accounts import User
|
|
from seaserv import list_personal_repos_by_owner, remove_repo
|
|
|
|
class BaseTest(LiveServerTestCase):
|
|
|
|
def setUp(self):
|
|
self.site_url = 'localhost:8000'
|
|
|
|
self.username = 'foo@foo.com'
|
|
self.passwd = 'foo'
|
|
self.browser = webdriver.Firefox()
|
|
self.browser.implicitly_wait(3)
|
|
|
|
def tearDown(self):
|
|
self.browser.quit()
|
|
|
|
def _setup_new_user(self, username, passwd):
|
|
User.objects.create_user(username, passwd, False, True)
|
|
|
|
def _teardown_new_user(self, username):
|
|
# First delete all repos created by user
|
|
for e in list_personal_repos_by_owner(username):
|
|
remove_repo(e.id)
|
|
# Then remove user
|
|
User.objects.get(email=username).delete()
|
|
|
|
def _login_user(self, username=None, passwd=None):
|
|
if not (username and passwd):
|
|
username = self.username
|
|
passwd = self.passwd
|
|
|
|
self._setup_new_user(username, passwd)
|
|
# A user goes to the login page, and inputs username and password
|
|
self.browser.get(self.site_url+ '/accounts/login/')
|
|
username_field = self.browser.find_element_by_name('username')
|
|
username_field.send_keys(username)
|
|
password_field = self.browser.find_element_by_name('password')
|
|
password_field.send_keys(passwd)
|
|
password_field.send_keys(Keys.RETURN)
|
|
|
|
# He is returned to myhome page
|
|
body = self.browser.find_element_by_tag_name('body')
|
|
self.assertIn(u'Libraries', body.text)
|
|
|
|
def _logout_user(self, username=None, remove_user=True):
|
|
if not username:
|
|
username = self.username
|
|
self.browser.find_elements_by_link_text(u'Log out')[0].click()
|
|
if remove_user:
|
|
self._teardown_new_user(username)
|
|
|
|
def test_can_login_and_logout(self):
|
|
self._setup_new_user(self.username, self.passwd)
|
|
# A user goes to the login page, and inputs username and password
|
|
self.browser.get(self.site_url+ '/accounts/login/')
|
|
|
|
# He sees the login heading
|
|
body = self.browser.find_element_by_tag_name('body')
|
|
self.assertIn(u'Log In', body.text)
|
|
|
|
# He types username and password
|
|
username_field = self.browser.find_element_by_name('username')
|
|
username_field.send_keys(self.username)
|
|
password_field = self.browser.find_element_by_name('password')
|
|
password_field.send_keys(self.passwd)
|
|
password_field.send_keys(Keys.RETURN)
|
|
|
|
# He is returned to myhome page
|
|
body = self.browser.find_element_by_tag_name('body')
|
|
self.assertIn(u'Libraries', body.text)
|
|
|
|
# He logout
|
|
self.browser.find_elements_by_link_text(u'Log out')[0].click()
|
|
body = self.browser.find_element_by_tag_name('body')
|
|
self.assertIn(u'Log In', body.text)
|
|
|
|
self._teardown_new_user(self.username)
|
|
|
|
def test_can_modify_personal_infos(self):
|
|
self._login_user()
|
|
|
|
self.browser.find_element_by_css_selector('.home-profile .avatar').click()
|
|
body = self.browser.find_element_by_tag_name('body')
|
|
self.assertIn(u'Profile Setting', body.text)
|
|
|
|
nickname_field = self.browser.find_element_by_name('nickname')
|
|
nickname_field.send_keys(u'test_nickname2012')
|
|
|
|
intro_field = self.browser.find_element_by_name('intro')
|
|
intro_field.send_keys('Hi, My name is test.')
|
|
|
|
self.browser.find_element_by_css_selector('.submit').click()
|
|
|
|
body = self.browser.find_element_by_tag_name('body')
|
|
self.assertIn(u'Successfully', body.text)
|
|
|
|
self._logout_user()
|
|
|
|
def _create_new_library(self, name, desc, read_only=False, encrypt=False,
|
|
passwd=None):
|
|
# He sees a button to 'add' a new repo, so he clicks it
|
|
new_repo_btn = self.browser.find_element_by_css_selector("#repo-create")
|
|
new_repo_btn.click()
|
|
|
|
# He sees some input fields for "Name" and "description", etc
|
|
body = self.browser.find_element_by_tag_name('body')
|
|
self.assertIn(u'Name', body.text)
|
|
self.assertIn(u'Description', body.text)
|
|
|
|
# He types in an test repo
|
|
reponame_field = self.browser.find_element_by_name('repo_name')
|
|
reponame_field.send_keys(name)
|
|
repodesc_field = self.browser.find_element_by_name('repo_desc')
|
|
repodesc_field.send_keys(desc)
|
|
if encrypt:
|
|
self.assertNotEquals(passwd, None)
|
|
self.browser.find_element_by_name('encryption').click()
|
|
self.browser.find_element_by_name('passwd').send_keys(passwd)
|
|
self.browser.find_element_by_name('passwd_again').send_keys(passwd)
|
|
if read_only:
|
|
self.browser.find_element_by_css_selector('option ~ option').click()
|
|
|
|
# He clicks the submit button
|
|
sub_btn = self.browser.find_element_by_css_selector("#repo-create-submit")
|
|
sub_btn.click()
|
|
|
|
# He is returned to the myhome page, where he can see his new repo,
|
|
# listed as a clickable link
|
|
new_repo_links = self.browser.find_elements_by_link_text(name)
|
|
self.assertNotEquals(len(new_repo_links), 0)
|
|
|
|
def test_can_create_new_library(self):
|
|
self._login_user()
|
|
|
|
'''Create a unencrypt repo'''
|
|
self._create_new_library('test_repo', 'test repo desc')
|
|
self.browser.find_elements_by_link_text('test_repo')[0].click()
|
|
# He is returned to the repo page, where he can view/add files or directories
|
|
body = self.browser.find_element_by_tag_name('body')
|
|
self.assertIn('Upload', body.text)
|
|
# He backs to Myhome page
|
|
self.browser.find_elements_by_link_text('My Home')[0].click()
|
|
|
|
'''Create an encrypte repo'''
|
|
passwd = '123'
|
|
self._create_new_library('test_enc_repo', 'test repo desc', encrypt=True,
|
|
passwd=passwd)
|
|
self.browser.find_elements_by_link_text('test_enc_repo')[0].click()
|
|
# He is returned to the repo decryption page, where he can input passwords
|
|
self.assertIn('Password', self.browser.find_element_by_tag_name('body').text)
|
|
# He inputs the password
|
|
passwd_input = self.browser.find_element_by_name('password')
|
|
passwd_input.send_keys(passwd)
|
|
passwd_input.send_keys(Keys.RETURN)
|
|
# He is returned to the repo page, where he can view/add files or directories
|
|
body = self.browser.find_element_by_tag_name('body')
|
|
self.assertIn('Upload', body.text)
|
|
# He backs to Myhome page
|
|
self.browser.find_elements_by_link_text('My Home')[0].click()
|
|
|
|
self._logout_user()
|
|
|
|
def test_can_view_readonly_library(self):
|
|
self._login_user()
|
|
|
|
'''Create read-only repo in Public Library'''
|
|
self.browser.find_elements_by_link_text('Public Library')[0].click()
|
|
body = self.browser.find_element_by_tag_name('body')
|
|
self.assertIn('Public Libraries', body.text)
|
|
self._create_new_library('test_readonly_repo', 'test read only repo',
|
|
read_only=True)
|
|
# He clicks the readonly library name
|
|
self.browser.find_elements_by_link_text('test_readonly_repo')[0].click()
|
|
# He is returned to the repo page, where he can view/add files or directories
|
|
body = self.browser.find_element_by_tag_name('body')
|
|
self.assertIn('Upload', body.text)
|
|
self._logout_user(remove_user=False)
|
|
|
|
# Another user login and click this readonly repo
|
|
self._login_user('bar@bar.com', 'bar')
|
|
self.browser.find_elements_by_link_text('Public Library')[0].click()
|
|
self.browser.find_elements_by_link_text('test_readonly_repo')[0].click()
|
|
# He can only view repo contents, but not upload or new files
|
|
body = self.browser.find_element_by_tag_name('body')
|
|
self.assertNotIn('Upload', body.text)
|
|
self._logout_user(username='bar@bar.com')
|
|
|
|
# Clean first user's libraries
|
|
self._login_user()
|
|
self._logout_user()
|
|
|
|
|
|
def _create_new_folder(self, folder_name):
|
|
# He clicks the New Directory button
|
|
self.browser.find_element_by_css_selector('#add-new-dir').click()
|
|
new_dir_input = self.browser.find_element_by_name('new_dir_name')
|
|
new_dir_input.send_keys(folder_name)
|
|
new_dir_input.send_keys(Keys.RETURN)
|
|
|
|
def test_folder_operations(self):
|
|
self._login_user()
|
|
|
|
# He create a new repo, clicked the repo name, and returned to the
|
|
# repo page
|
|
self._create_new_library('test_repo', 'test desc')
|
|
self.browser.find_elements_by_link_text('test_repo')[0].click()
|
|
|
|
# He creates two folders
|
|
self._create_new_folder('dir1')
|
|
self.assertNotEquals(self.browser.find_elements_by_link_text('dir1'), None)
|
|
self._create_new_folder('dir2')
|
|
self.assertNotEquals(self.browser.find_elements_by_link_text('dir2'), None)
|
|
|
|
'''Moving folder from one to another'''
|
|
# He clicks more op icon
|
|
ele_to_hover_over = self.browser.find_elements_by_link_text('dir1')[0]
|
|
hover = ActionChains(self.browser).move_to_element(ele_to_hover_over)
|
|
hover.perform()
|
|
|
|
# He chooses move operation
|
|
more_op = self.browser.find_element_by_css_selector('.repo-file-list .more-op-icon')
|
|
more_op.click()
|
|
self.browser.find_elements_by_link_text('Move')[0].click()
|
|
|
|
# He selects dir2 to move in, and click submit button
|
|
self.browser.find_element_by_css_selector('.jstree-default .jstree-closed ins').click()
|
|
self.browser.find_element_by_css_selector('.jstree-leaf a').click()
|
|
self.browser.find_element_by_css_selector('#mv-form .submit').click()
|
|
|
|
# He sees seccessfull message
|
|
body = self.browser.find_element_by_tag_name('body')
|
|
self.assertIn('Successfully moving', body.text)
|
|
|
|
self._logout_user()
|
|
|
|
|