Forked mumble-django project from https://bitbucket.org/Svedrin/mumble-django
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

317 lines
12 KiB

# -*- coding: utf-8 -*-
# kate: space-indent on; indent-width 4; replace-tabs on;
"""
* Copyright © 2009-2010, Michael "Svedrin" Ziegler <diese-addy@funzt-halt.net>
*
* Mumble-Django is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This package is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
"""
# Privs:
#
# Unauthed users:
# * Registration: no Anon_MumbleUser{,Link}FormTestCase
# * Administration: no Anon_MumbleFormTestCase
# * User texture: no
# * User list: no
# * Log messages: no
# * Instance scope: ALL
#
# Authed users, unregistered:
# * Registration: self, User{,Password,Link}Form User_MumbleUserLinkFormTestCase
# * Administration: no
# * User texture: no
# * User list: no
# * Log messages: no
# * Instance scope: CURRENT
#
# Authed users, not admins:
# * Registration: self, UserForm
# * Administration: no
# * User texture: self
# * User list: no
# * Log messages: no
# * Instance scope: CURRENT
#
# Authed users, admins:
# * Registration: everyone
# * Administration: yes
# * User texture: everyone
# * User list: yes
# * Log messages: yes
# * Instance scope: CURRENT
#
# Authed users, superadmins:
# * Registration: everyone Super_MumbleUser{,Link}FormTestCase
# * Administration: yes Super_MumbleFormTestCase
# * User texture: everyone
# * User list: yes
# * Log messages: yes
# * Instance scope: ALL
import simplejson
from django.conf import settings
from django.test import TestCase
from django.test.client import Client
from django.contrib.auth.models import User
from models import Mumble, MumbleUser
from utils import ObjectInfo
class ExtDirectFormTestMixin(object):
""" Methods for testing a Form exported via Ext.Direct.
These only define the methods, you will need to inherit your TestCase
from this class and set the following class attributes:
api_baseurl:
The URL under which the Ext.Direct provider has been registered.
formname:
The name of the exported form class.
"""
def setUp(self):
self.cl = Client()
super(ExtDirectFormTestMixin, self).setUp()
self.tid = 1
def testFormApi(self):
rawr = self.cl.get( "%s/%s.js" % ( self.api_baseurl, self.formname.lower() ) )
self.assertEquals( rawr.status_code, 200 )
def formGet( self, data=[] ):
rawr = self.cl.post( self.api_baseurl+'/router',
data=simplejson.dumps({
'tid': self.tid,
'action': ('XD_%s' % self.formname),
'method': 'get',
'data': data,
'type': 'rpc'
}),
content_type='application/json' )
self.tid += 1
response = simplejson.loads(rawr.content)
if response['type'] == "exception":
raise Exception( response["message"] )
self.assert_( "result" in response )
return response['result']
def formPost( self, data={} ):
postdata={
'extAction': ('XD_%s' % self.formname),
'extMethod': 'update',
'extTID': self.tid,
'extType': 'rpc',
'extUpload': 'false',
}
self.tid += 1
postdata.update( data )
rawr = self.cl.post( self.api_baseurl+'/router', data=postdata )
response = simplejson.loads(rawr.content)
if response['type'] == "exception":
raise Exception( response["message"] )
self.assert_( "result" in response )
return response['result']
def generateTestCase( name, formname, data, login=None ):
attrs = {
'fixtures': ['testdb.json'],
'formname': formname,
'api_baseurl': '/mumble/forms',
}
if login:
def setUp( self ):
ExtDirectFormTestMixin.setUp( self )
if not self.cl.login( **login ):
raise Exception( "Login failed" )
attrs['setUp'] = setUp
def mkGet( data, result ):
def testFormGet( self ):
callresult = self.formGet( [{ 'pk': data['pk'] }] )
if "data" in callresult:
del callresult['data'] # don't care
self.assertEquals( callresult, result )
return testFormGet
def mkPost( data, result ):
def testFormPost( self ):
callresult = self.formPost( data )
self.assertEquals( callresult, result,
("errors" in callresult and callresult['errors'] or None)
)
return testFormPost
for testname in data:
if len(data[testname]) == 3:
testdata, getresult, postresult = data[testname]
else:
testdata, getresult = data[testname]
postresult = getresult
attrs.update({
('testForm%sGet' % testname): mkGet( testdata, getresult ),
('testForm%sPost' % testname): mkPost( testdata, postresult ),
})
return type( name, (ExtDirectFormTestMixin, TestCase), attrs )
RES_SUCCESS = {'success': True}
RES_ACCESSDENIED = {'success': False, 'errors': {'': 'access denied'}}
RES_PREVALFAIL = {'success': False, 'errors': {'': 'pre-validation failed'}}
LOGIN_SUPERADMIN = {'username': 'svedrin', 'password': 'passwort'}
LOGIN_UNREGUSER = {'username': 'nocheinuser', 'password': 'passwort'}
#############################################################
### ANON: Unauthed (not logged in) users ###
#############################################################
Anon_Registration = generateTestCase(
name = "Anon_Registration",
formname = "MumbleUserForm",
data = {
'My': ( {'pk': 1, 'name': "svedrin", 'password': 'passwort', 'serverid': 1}, RES_ACCESSDENIED ),
'Other': ( {'pk': 1, 'name': "svedrin", 'password': 'passwort'}, RES_ACCESSDENIED )
}
)
Anon_Administration = generateTestCase(
name = "Anon_Administration",
formname = "MumbleForm",
data = { 'My': ( {'pk': 1, 'url': '', 'player': ''}, RES_ACCESSDENIED ) },
)
Anon_UserLink = generateTestCase(
name = "Anon_UserLink",
formname = "MumbleUserLinkForm",
data = {
'My': ( {'pk': 1, 'name': "ohai", 'password': 'failfail', 'serverid': 1}, RES_ACCESSDENIED ),
}
)
#############################################################
### UNREG: Authenticated but no MumbleUser avail ###
#############################################################
Unreg_Registration = generateTestCase(
name = "Unreg_Registration",
formname = "MumbleUserForm",
data = {
'My': ( {'pk': -1, 'name': "neueruser", 'password': 'passwort', 'serverid': 1}, RES_SUCCESS ),
'Taken': ( {'pk': -1, 'name': "svedrin", 'password': 'passwort', 'serverid': 1}, RES_SUCCESS,
{'success': False, 'errors': {'name': 'Another player already registered that name.'}} ),
'Other': ( {'pk': 1, 'name': "svedrin", 'password': 'passwort'}, RES_ACCESSDENIED )
},
login = LOGIN_UNREGUSER
)
if settings.ALLOW_ACCOUNT_LINKING and settings.ALLOW_ACCOUNT_LINKING_ADMINS:
unreg_adminlinkresult = RES_SUCCESS
else:
unreg_adminlinkresult = {'success': False, 'errors': {'__all__': 'Linking Admin accounts is not allowed.'}}
Unreg_UserLink = generateTestCase(
name = "User_UserLink",
formname = "MumbleUserLinkForm",
data = {
'My': ( {'pk': -1, 'name': "nichtadmin", 'password': 'nichtadmin', 'serverid': 1, 'linkacc': 'on'},
RES_ACCESSDENIED, RES_SUCCESS if settings.ALLOW_ACCOUNT_LINKING else RES_ACCESSDENIED ),
'Admin': ( {'pk': -1, 'name': "dochadmin", 'password': 'dochadmin', 'serverid': 1, 'linkacc': 'on'},
RES_ACCESSDENIED, unreg_adminlinkresult ),
'Other': ( {'pk': 1, 'name': "svedrin", 'password': 'passwort', 'serverid': 1}, RES_ACCESSDENIED ),
'Taken': ( {'pk': -1, 'name': "svedrin", 'password': 'passwort', 'serverid': 1}, RES_ACCESSDENIED,
{'success': False, 'errors':{'name': 'Another player already registered that name.'}} ),
},
login = LOGIN_UNREGUSER
)
Unreg_Administration = generateTestCase(
name = "Unreg_Administration",
formname = "MumbleForm",
data = {
'My': ( {'pk': 1, 'name': 'test server', 'url': '', 'player': ''}, RES_ACCESSDENIED ),
'Other': ( {'pk': 2, 'name': 'alealejandro', 'url': '', 'player': ''}, RES_ACCESSDENIED ),
},
login = LOGIN_UNREGUSER,
)
#############################################################
### USER: MumbleUser but not a server admin ###
#############################################################
#############################################################
### ADMIN: MumbleUser is a server admin ###
#############################################################
#############################################################
### SUPER: User is superadmin, MumbleUser irrelevant ###
#############################################################
Super_Registration = generateTestCase(
name = "Super_Registration",
formname = "MumbleUserForm",
data = {
'My': ( {'pk': 1, 'name': "svedrin", 'password': 'passwort', 'serverid': 1}, RES_SUCCESS ),
'Fail': ( {'pk': 1, 'name': "svedrin", 'password': 'passwort'}, RES_SUCCESS, RES_PREVALFAIL ),
},
login = LOGIN_SUPERADMIN
)
Super_Administration = generateTestCase(
name = "Super_Administration",
formname = "MumbleForm",
data = {
'My': ( {'pk': 1, 'name': 'test server', 'url': '', 'player': ''}, RES_SUCCESS ),
'Other': ( {'pk': 2, 'name': 'alealejandro', 'url': '', 'player': ''}, RES_SUCCESS ),
},
login = LOGIN_SUPERADMIN,
)
Super_UserLink = generateTestCase(
name = "Super_UserLink",
formname = "MumbleUserLinkForm",
data = {
'My': ( {'pk': 1, 'name': "svedrin", 'password': 'passwort', 'serverid': 1},
RES_ACCESSDENIED ),
'Link': ( {'pk': 1, 'name': "svedrin", 'password': 'passwort', 'serverid': 1, 'linkacc': 'on'},
RES_ACCESSDENIED )
},
)
class ExportedForms(TestCase):
""" Makes sure needed forms are exported, and admin forms are not. """
def setUp(self):
self.cl = Client()
def testMumbleUserFormApi(self):
rawr = self.cl.get( '/mumble/forms/mumbleuserform.js' )
self.assertEquals( rawr.status_code, 200 )
def testMumbleUserPasswordFormApi(self):
rawr = self.cl.get( '/mumble/forms/mumbleuserpasswordform.js' )
self.assertEquals( rawr.status_code, 200 )
def testMumbleUserLinkFormApi(self):
rawr = self.cl.get( '/mumble/forms/mumbleuserlinkform.js' )
self.assertEquals( rawr.status_code, 200 )
def testMumbleAdminFormApi(self):
# This form is NOT exported (and shouldn't be) because it's only used in the admin
rawr = self.cl.get( '/mumble/forms/mumbleadminform.js' )
self.assertEquals( rawr.status_code, 404 )
def testMumbleUserAdminFormApi(self):
# This form is NOT exported (and shouldn't be) because it's only used in the admin
rawr = self.cl.get( '/mumble/forms/mumbleuseradminform.js' )
self.assertEquals( rawr.status_code, 404 )