383 lines
13 KiB
Python
383 lines
13 KiB
Python
|
"""
|
||
|
Testing the REST api, not the units.
|
||
|
unittest the right way feels so unpythonic :(
|
||
|
!! BIG FAT WARNING !!: this test deletes active torrents .
|
||
|
!! BIG FAT WARNING 2!!: this test hammers the tracker that is tested against.
|
||
|
"""
|
||
|
import unittest
|
||
|
import cookielib, urllib2 , urllib
|
||
|
import WebUi.webserver_common as ws
|
||
|
import operator
|
||
|
|
||
|
|
||
|
ws.init_05()
|
||
|
print 'test-env=',ws.ENV
|
||
|
|
||
|
|
||
|
|
||
|
#CONFIG:
|
||
|
BASE_URL = 'http://localhost:8112'
|
||
|
PWD = 'deluge'
|
||
|
|
||
|
def get_status(id):
|
||
|
return ws.proxy.get_torrent_status(id,ws.TORRENT_KEYS)
|
||
|
|
||
|
#BASE:
|
||
|
#303 = see other
|
||
|
#404 = not found
|
||
|
#500 = server error
|
||
|
#200 = OK, page exists.
|
||
|
class TestWebUiBase(unittest.TestCase):
|
||
|
def setUp(self):
|
||
|
#cookie aware-opener that DOES NOT use redirects.
|
||
|
opener = urllib2.OpenerDirector()
|
||
|
self.cj = cookielib.CookieJar()
|
||
|
for handler in [urllib2.HTTPHandler(),urllib2.HTTPDefaultErrorHandler(),
|
||
|
urllib2.FileHandler(),urllib2.HTTPErrorProcessor(),
|
||
|
urllib2.HTTPCookieProcessor(self.cj)]:
|
||
|
opener.add_handler(handler)
|
||
|
#/opener
|
||
|
self.opener = opener
|
||
|
|
||
|
def open_url(self, page, post=None):
|
||
|
url = BASE_URL + page
|
||
|
|
||
|
if post == 1:
|
||
|
post = {'Force_a_post' : 'spam'}
|
||
|
if post:
|
||
|
post = urllib.urlencode(post)
|
||
|
r = self.opener.open(url , data = post)
|
||
|
|
||
|
|
||
|
#BUG: error-page does not return status 500, but status 200
|
||
|
#workaround...
|
||
|
data = r.read()
|
||
|
if '<!--ERROR-MARKER-->' in data:
|
||
|
error = IOError()
|
||
|
error.code = 500
|
||
|
#print data
|
||
|
raise error
|
||
|
if r.code <> 200:
|
||
|
fail('no code 200, error-code=%s' % r.code)
|
||
|
return r
|
||
|
|
||
|
def get_cookies(self):
|
||
|
return dict((c.name,c.value) for c in self.cj)
|
||
|
cookies = property(get_cookies)
|
||
|
|
||
|
def assert_status(self,status, page, post):
|
||
|
try :
|
||
|
r = self.open_url(page, post)
|
||
|
except IOError,e:
|
||
|
self.assertEqual(e.code, status)
|
||
|
else:
|
||
|
self.fail('page was found "%s" (%s)' % (page, r.code ))
|
||
|
|
||
|
def assert_404(self, page, post = None):
|
||
|
self.assert_status(404, page, post)
|
||
|
|
||
|
def assert_500(self, page, post = None):
|
||
|
self.assert_status(500, page, post)
|
||
|
|
||
|
def assert_303(self, page, redirect_to, post=None):
|
||
|
try :
|
||
|
r = self.open_url(page, post)
|
||
|
except IOError,e:
|
||
|
self.assertEqual(e.code, 303)
|
||
|
self.assertEqual(e.headers['Location'], redirect_to)
|
||
|
else:
|
||
|
#print r
|
||
|
self.fail('No 303!')
|
||
|
|
||
|
def assert_exists(self, page, post = None):
|
||
|
try :
|
||
|
r = self.open_url(page, post)
|
||
|
except IOError,e:
|
||
|
self.fail('page was not found "%s" (%s)' % (page, e.code))
|
||
|
else:
|
||
|
pass
|
||
|
|
||
|
first_torrent_id = property(lambda self: ws.proxy.get_session_state()[0])
|
||
|
first_torrent = property(lambda self: get_status(self.first_torrent_id))
|
||
|
|
||
|
|
||
|
class TestNoAuth(TestWebUiBase):
|
||
|
def test303(self):
|
||
|
self.assert_303('/','/login')
|
||
|
self.assert_303('','/login')
|
||
|
self.assert_303('/index','/login')
|
||
|
#self.assert_303('/torrent/pause/','/login')
|
||
|
self.assert_303('/config','/login')
|
||
|
self.assert_303('/torrent/info/','/login')
|
||
|
|
||
|
def test404(self):
|
||
|
self.assert_404('/torrent/info')
|
||
|
self.assert_404('/garbage')
|
||
|
#self.assert_404('/static/garbage')
|
||
|
#self.assert_404('/template/static/garbage')
|
||
|
self.assert_404('/torrent/pause/', post=1)
|
||
|
|
||
|
def testOpen(self):
|
||
|
self.assert_exists('/login')
|
||
|
self.assert_exists('/about')
|
||
|
|
||
|
def testStatic(self):
|
||
|
self.assert_exists('/static/images/simple_line.jpg')
|
||
|
self.assert_exists('/static/images/tango/up.png')
|
||
|
#test 404
|
||
|
|
||
|
#test template-static
|
||
|
|
||
|
|
||
|
|
||
|
class TestSession(TestWebUiBase):
|
||
|
def testLogin(self):
|
||
|
self.assert_303('/home','/login')
|
||
|
#invalid pwd:
|
||
|
self.assert_303('/login','/login?error=1',{'pwd':'invalid'})
|
||
|
#login
|
||
|
self.assert_303('/login','/index',{'pwd':PWD})
|
||
|
#now i'm logged-in!
|
||
|
#there are no sort-coockies yet so the default page is /index.
|
||
|
self.assert_303('/home','/index')
|
||
|
self.assert_exists('/index')
|
||
|
self.assert_exists('/config')
|
||
|
self.assert_exists('/torrent/add')
|
||
|
self.assert_303('/','/index')
|
||
|
self.assert_303('','/index')
|
||
|
|
||
|
#logout
|
||
|
self.assert_303('/logout','/login', post=1)
|
||
|
#really logged out?
|
||
|
self.assert_303('/','/login')
|
||
|
self.assert_303('','/login')
|
||
|
self.assert_303('/index','/login')
|
||
|
self.assert_303('/torrent/add','/login')
|
||
|
self.assert_exists('/about')
|
||
|
|
||
|
|
||
|
def testRefresh(self):
|
||
|
#starting pos
|
||
|
self.assert_303('/login','/index',{'pwd':PWD})
|
||
|
r = self.open_url('/index')
|
||
|
assert not 'auto_refresh' in self.cookies
|
||
|
assert not 'auto_refresh_secs' in self.cookies
|
||
|
assert not r.headers.has_key('Refresh')
|
||
|
|
||
|
#on:
|
||
|
self.assert_303('/refresh/on','/index', post=1)
|
||
|
|
||
|
assert 'auto_refresh' in self.cookies
|
||
|
assert 'auto_refresh_secs' in self.cookies
|
||
|
self.assertEqual(self.cookies['auto_refresh'],'1')
|
||
|
self.assertEqual(self.cookies['auto_refresh_secs'],'10')
|
||
|
|
||
|
r = self.open_url('/index')
|
||
|
assert r.headers['Refresh'] == '10 ; url=/index'
|
||
|
|
||
|
#set:
|
||
|
self.assert_303('/refresh/set','/index',{'refresh':'5'})
|
||
|
self.assertEqual(self.cookies['auto_refresh_secs'],'5')
|
||
|
|
||
|
r = self.open_url('/index')
|
||
|
assert r.headers['Refresh'] == '5 ; url=/index'
|
||
|
self.assert_500('/refresh/set',{'refresh':'a string'})
|
||
|
|
||
|
#off:
|
||
|
self.assert_303('/refresh/off','/index', post=1)
|
||
|
self.assertEqual(self.cookies['auto_refresh'],'0')
|
||
|
self.assertEqual(self.cookies['auto_refresh_secs'],'5')
|
||
|
|
||
|
r = self.open_url('/index')
|
||
|
assert not 'Refresh' in r.headers
|
||
|
|
||
|
class TestIntegration(TestWebUiBase):
|
||
|
initialized = False
|
||
|
def setUp(self):
|
||
|
TestWebUiBase.setUp(self)
|
||
|
|
||
|
self.assert_303('/login','/index',{'pwd':PWD})
|
||
|
self.urls = sorted([
|
||
|
'http://torrents.aelitis.com:88/torrents/azplatform2_1.13.zip.torrent',
|
||
|
'http://torrents.aelitis.com:88/torrents/azplugins_2.1.4.jar.torrent',
|
||
|
'http://torrents.aelitis.com:88/torrents/azautoseeder_0.1.1.jar.torrent'
|
||
|
])
|
||
|
|
||
|
torrent_ids = ws.proxy.get_session_state()
|
||
|
|
||
|
#avoid hammering, investigate current torrent-list and do not re-add.
|
||
|
#correct means : 3 torrent's in list (for now)
|
||
|
if len(torrent_ids) <> 3:
|
||
|
#delete all, nice use case for refactoring delete..
|
||
|
torrent_ids = ws.proxy.get_session_state()
|
||
|
for torrent in torrent_ids:
|
||
|
ws.proxy.remove_torrent([torrent], False, False)
|
||
|
|
||
|
torrent_ids = ws.proxy.get_session_state()
|
||
|
self.assertEqual(torrent_ids, [])
|
||
|
|
||
|
#add 3 using url.
|
||
|
for url in self.urls:
|
||
|
self.assert_303('/torrent/add','/index',{'url':url,'torrent':None})
|
||
|
|
||
|
#added?
|
||
|
self.torrent_ids = ws.proxy.get_session_state()
|
||
|
self.assertEqual(len(self.torrent_ids), 3)
|
||
|
|
||
|
else:
|
||
|
#test correctness of existing-list
|
||
|
#The setup makes 0.6 fail everything, added an else..
|
||
|
for url in self.urls:
|
||
|
if ws.ENV.startswith('0.5'):
|
||
|
self.assert_500('/torrent/add',{'url':url,'torrent':None})
|
||
|
else:
|
||
|
self.assert_303('/torrent/add','/index',{'url':url,'torrent':None})
|
||
|
|
||
|
def testPauseResume(self):
|
||
|
#pause all
|
||
|
self.assert_303('/pause_all','/index', post=1)
|
||
|
#pause worked?
|
||
|
pause_status = [get_status(id)["user_paused"] for id in ws.proxy.get_session_state()]
|
||
|
for paused in pause_status:
|
||
|
self.assertEqual(paused, True)
|
||
|
|
||
|
#resume all
|
||
|
self.assert_303('/resume_all','/index', post=1)
|
||
|
#resume worked?
|
||
|
pause_status = [get_status(id)["user_paused"] for id in ws.proxy.get_session_state()]
|
||
|
for paused in pause_status:
|
||
|
self.assertEqual(paused,False)
|
||
|
#pause again.
|
||
|
self.assert_303('/pause_all','/index', post=1)
|
||
|
|
||
|
torrent_id = self.first_torrent_id
|
||
|
#single resume.
|
||
|
self.assert_303('/torrent/start/%s' % torrent_id ,'/index', post=1)
|
||
|
self.assertEqual(get_status(torrent_id)["user_paused"] ,False)
|
||
|
#single pause
|
||
|
self.assert_303('/torrent/stop/%s' % torrent_id,'/index', post=1)
|
||
|
self.assertEqual(get_status(torrent_id)["user_paused"] , True)
|
||
|
|
||
|
def testQueue(self):
|
||
|
#find last:
|
||
|
torrent_id = [id for id in ws.proxy.get_session_state()
|
||
|
if (get_status(id)['queue_pos'] ==3 )][0]
|
||
|
|
||
|
#queue
|
||
|
torrent = get_status(torrent_id)
|
||
|
self.assertEqual(torrent['queue_pos'], 3)
|
||
|
#up:
|
||
|
self.assert_303('/torrent/queue/up/%s' % torrent_id,'/index', post=1)
|
||
|
torrent = get_status(torrent_id)
|
||
|
self.assertEqual(torrent['queue_pos'], 2)
|
||
|
self.assert_303('/torrent/queue/up/%s' % torrent_id,'/index', post=1)
|
||
|
torrent = get_status(torrent_id)
|
||
|
self.assertEqual(torrent['queue_pos'], 1)
|
||
|
self.assert_303('/torrent/queue/up/%s' % torrent_id,'/index', post=1)
|
||
|
#upper limit
|
||
|
torrent = get_status(torrent_id)
|
||
|
self.assertEqual(torrent['queue_pos'], 1)
|
||
|
#down:
|
||
|
self.assert_303('/torrent/queue/down/%s' % torrent_id,'/index', post=1)
|
||
|
torrent = get_status(torrent_id)
|
||
|
self.assertEqual(torrent['queue_pos'], 2)
|
||
|
self.assert_303('/torrent/queue/down/%s' % torrent_id,'/index', post=1)
|
||
|
torrent = get_status(torrent_id)
|
||
|
self.assertEqual(torrent['queue_pos'], 3)
|
||
|
self.assert_303('/torrent/queue/down/%s' % torrent_id,'/index', post=1)
|
||
|
#down limit
|
||
|
torrent = get_status(torrent_id)
|
||
|
self.assertEqual(torrent['queue_pos'], 3)
|
||
|
|
||
|
def testMeta(self):
|
||
|
#info available?
|
||
|
for torrent_id in ws.proxy.get_session_state():
|
||
|
self.assert_exists('/torrent/info/%s' % torrent_id)
|
||
|
self.assert_exists('/torrent/delete/%s' % torrent_id)
|
||
|
|
||
|
#no info:
|
||
|
self.assert_500('/torrent/info/99999999')
|
||
|
self.assert_500('/torrent/delete/99999999')
|
||
|
|
||
|
def testAddRemove(self):
|
||
|
#add a duplicate:
|
||
|
self.assert_500('/torrent/add', post={'url':self.urls[0],'torrent':None})
|
||
|
|
||
|
#add a 4th using url
|
||
|
|
||
|
#delete
|
||
|
|
||
|
#add torrrent-file
|
||
|
#./test01.torrent
|
||
|
|
||
|
|
||
|
def test_do_redirect(self):
|
||
|
self.assert_303('/home','/index')
|
||
|
#1
|
||
|
self.assert_exists('/index?sort=download_rate&order=down')
|
||
|
self.assert_303('/home','/index?sort=download_rate&order=down')
|
||
|
assert self.cookies['sort'] == 'download_rate'
|
||
|
assert self.cookies['order'] == 'down'
|
||
|
#2
|
||
|
self.assert_exists('/index?sort=progress&order=up')
|
||
|
self.assert_303('/home','/index?sort=progress&order=up')
|
||
|
assert self.cookies['sort'] == 'progress'
|
||
|
assert self.cookies['order'] == 'up'
|
||
|
#redir after pause-POST? in /index.
|
||
|
self.assert_exists('/index?sort=name&order=down')
|
||
|
torrent_id = self.first_torrent_id
|
||
|
self.assert_303('/torrent/stop/%s' % torrent_id,
|
||
|
'/index?sort=name&order=down', post=1)
|
||
|
#redir in details 1
|
||
|
self.assert_303('/torrent/stop/%s?redir=/torrent/info/%s' %(torrent_id,torrent_id)
|
||
|
,'/torrent/info/' + torrent_id, post = 1)
|
||
|
#redir in details 2
|
||
|
self.assert_303('/torrent/stop/%s' % torrent_id
|
||
|
,'/torrent/info/' + torrent_id ,
|
||
|
post={'redir': '/torrent/info/' + torrent_id})
|
||
|
|
||
|
def testRemote(self):
|
||
|
pass
|
||
|
|
||
|
def test_redir_after_login(self):
|
||
|
pass
|
||
|
|
||
|
def testReannounce(self):
|
||
|
torrent_id = self.first_torrent_id
|
||
|
self.assert_303(
|
||
|
'/torrent/reannounce/%(id)s?redir=/torrent/info/%(id)s'
|
||
|
% {'id':torrent_id}
|
||
|
,'/torrent/info/' + torrent_id, post = 1)
|
||
|
|
||
|
def testRecheck(self):
|
||
|
#add test before writing code..
|
||
|
#RELEASE-->disable
|
||
|
"""
|
||
|
torrent_id = self.first_torrent_id
|
||
|
self.assert_303(
|
||
|
'/torrent/recheck/%(id)s?redir=/torrent/info/%(id)s'
|
||
|
% {'id':torrent_id}
|
||
|
,'/torrent/info/' + torrent_id, post = 1)
|
||
|
"""
|
||
|
|
||
|
|
||
|
|
||
|
#
|
||
|
|
||
|
if False:
|
||
|
suiteFew = unittest.TestSuite()
|
||
|
|
||
|
suiteFew.addTest(TestSession("testRefresh"))
|
||
|
|
||
|
unittest.TextTestRunner(verbosity=2).run(suiteFew)
|
||
|
|
||
|
elif False:
|
||
|
suiteFew = unittest.TestSuite()
|
||
|
suiteFew.addTest(TestIntegration("testDoRedirect"))
|
||
|
unittest.TextTestRunner(verbosity=2).run(suiteFew)
|
||
|
|
||
|
|
||
|
else:
|
||
|
unittest.main()
|
||
|
|