verify.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from share import db
from share import render
NotFound = -1
PersonId = 0
operator = {'read':'readPriv','write':'writePriv','manager':'manager','newPrj':'newPrj'}
def doSomething(userId,resId,op):#hasAuth
try:
if operator.has_key(op) == False:
return False
#暂时关闭创建项目审核
#if op == 'newPrj':
# rs = db.query("select grade from User where userId=$userId",vars=locals()).list()
# if len(rs)==1 and rs[0].grade > 1:
# return True
# return False
if op == 'newPrj':
return True
if op == 'manager':
rs = db.query("select * from Project where projectId = $resId",vars=locals()).list()
if len(rs)==1 and rs[0].userId == userId:
return True
rs = findProjectByresId(resId)
if rs == NotFound:
return False
if rs[0].projectId == None:
if rs[0].resUserId == userId:
return True
else:
return False
if rs[0].userId == userId:
return True
else:
return memberDo(userId,rs[0].projectId,resId,op)
except:
return False
def memberDo(userId,prjId,resId,op):
roles = db.query("SELECT roleId FROM RoleUser where projectId=$prjId and UserId=$userId",vars=locals()).list()
for r in roles:
if roleDo(int(r.roleId),prjId,int(resId),op) == True:
#print '测试通过'
return True
#print '测试未通过'
return False
def roleDo(roleId,prjId,resId,op):
if operator.has_key(op) == False:
return False
else:
op = operator[op]
if verify(roleId,prjId,resId,op) == True:
return True
pid = getResourcePid(resId)
print pid
while pid != NotFound:
if verify(roleId,prjId,pid,op) == True:
return True
pid = getResourcePid(pid)
return False
def verify(roleId,prjId,resId,op):
rs = db.query("SELECT readPriv,writePriv FROM FolderPriv WHERE roleId=$roleId and projectId=$prjId and FolderId=$resId",vars=locals()).list()
if len(rs) == 0:
return False
if hasattr(rs[0],op)== True and rs[0][op]==1:
return True
return False
def getResourcePid(resId):
print resId
rs = db.query("SELECT pCatId FROM Category WHERE catId=$resId",vars=locals()).list()
if len(rs)==1:
return int(rs[0].pCatId)
return NotFound
def findProjectByresId(resId):
rs = []
rs = db.query("SELECT Project.*,Category.userId AS resUserId FROM Category left join Project on Category.projectId = Project.projectId WHERE catId=$resId;",vars=locals()).list()
if len(rs) ==1 :
return rs
return NotFound
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
权限系统API单元测试
'''
import sys
import unittest
from share import db
import verify
from verify import doSomething
class PreSetData:
def __init__(self):
print '===============================================>开始预置测试数据'
self.clearTestData()
self.insertUser()
self.insertProject()
self.insertRole()
self.insertProjectMember()
self.insertRoleUser()
self.insertRolePes()
print '=================>预置数据成功,可以测试权限系统API'
def clearTestData(self):
db.query("delete from Note Where userId in(1000,1001,1002,1003,1004)")
db.query("delete from User Where userId in(1000,1001,1002,1003,1004)")
db.query("delete from Project where projectId= 2000 or userId in(1000,1001,1002,1003,1004)")
db.query("delete from Category where userId in(1000,1001,1002,1003,1004)")
db.query("delete from Category where projectId= 2000")
db.query("delete from Role where projectId= 2000")
db.query("delete from ProjectUser where projectId= 2000")
db.query("delete from RoleUser where projectId= 2000")
db.query("delete from FolderPriv where projectId = 2000")
print '=================>清除数据成功'
def insertUser(self):
try:
userId = 1000 # 项目创建人
username = '1000'
password = 'C4CA4238A0B923820DCC509A6F75849B' #1
grade = 100
email='[email protected]'
defaultCatId = 1000
db.insert('User',userId=userId,username=username,grade=grade,password=password,email=email,defaultCatId=defaultCatId)
db.insert('Category',catId=1000,catName='1000DEFAULT',userId=1000,deep=0,pCatId=0,projectId=0,isLeaf=1,trash=0)
print '=================>预置用户1'
userId = 1001 #HR部门人员
username = '1001'
password = 'C4CA4238A0B923820DCC509A6F75849B'
grade = 0
email='[email protected]'
defaultCatId = 1001
db.insert('User',userId=userId,username=username,grade=grade,password=password,email=email,defaultCatId=defaultCatId)
db.insert('Category',catId=1001,catName='1001DEFAULT',userId=1001,deep=0,pCatId=0,projectId=0,isLeaf=1,trash=0)
print '=================>预置用户2'
userId = 1002 #Makert部门人员
username = '1002'
password = 'C4CA4238A0B923820DCC509A6F75849B'
grade = 0
email='[email protected]'
defaultCatId = 1002
db.insert('User',userId=userId,username=username,grade=grade,password=password,email=email,defaultCatId=defaultCatId)
db.insert('Category',catId=1002,catName='1002DEFAULT',userId=1002,deep=0,pCatId=0,projectId=0,isLeaf=1,trash=0)
print '=================>预置用户3'
userId = 1003 #拥有HR和MARKET角色
username = '1003'
password = 'C4CA4238A0B923820DCC509A6F75849B'
grade = 0
email='[email protected]'
db.insert('User',userId=userId,username=username,grade=grade,password=password,email=email,defaultCatId=defaultCatId)
db.insert('Category',catId=1003,catName='1003DEFAULT',userId=1003,deep=0,pCatId=0,projectId=0,isLeaf=1,trash=0)
defaultCatId = 1003
print '=================>预置用户4'
userId = 1004 #不属于项目的成员
username = '1004'
password = 'C4CA4238A0B923820DCC509A6F75849B'
grade = 0
email='[email protected]'
defaultCatId = 1004
db.insert('User',userId=userId,username=username,grade=grade,password=password,email=email,defaultCatId=defaultCatId)
db.insert('Category',catId=1004,catName='1004DEFAULT',userId=1004,deep=0,pCatId=0,projectId=0,isLeaf=1,trash=0)
print '=================>预置用户5'
except:
print '===============================================>预置用户失败'
sys.exit()
def insertProject(self):
try:
catId = 3000
catName = 'TEST_HP'
userId = 1000
deep = 0
pCatId = 0
projectId = 2000
trash = 0
isLeaf = 0
db.insert('Category',catId=catId,catName=catName,userId=userId,deep=deep,pCatId=pCatId,projectId=projectId,isLeaf=isLeaf,trash=trash)
print '=================>预置项目根目录'
projectId=2000
projectName = 'TEST_HP'
userId=1000
folderId = 3000
password = '123'
privacy = 'public'
status = 'active'
db.insert('Project',projectId=projectId,projectName=projectName,userId=userId,folderId=folderId,password=password,privacy=privacy,status=status)
print '=================>预置项目'
catId = 3001
catName = 'TEST_HP_HR'
userId = 1000
deep = 1
pCatId = 3000
projectId = 2000
trash = 0
isLeaf = 1
db.insert('Category',catId=catId,catName=catName,userId=userId,deep=deep,pCatId=pCatId,projectId=projectId,isLeaf=isLeaf,trash=trash)
print '=================>预置项目子目录'
catId = 3002
catName = 'TEST_HP_MARKET'
userId = 1000
deep = 1
pCatId = 3000
projectId = 2000
trash = 0
isLeaf = 1
db.insert('Category',catId=catId,catName=catName,userId=userId,deep=deep,pCatId=pCatId,projectId=projectId,isLeaf=isLeaf,trash=trash)
print '=================>预置项目'
catId = 3003
catName = 'TEST_HP_HR_HR1'
userId = 1000
deep = 2
pCatId = 3001
projectId = 2000
trash = 0
isLeaf = 1
db.insert('Category',catId=catId,catName=catName,userId=userId,deep=deep,pCatId=pCatId,projectId=projectId,isLeaf=isLeaf,trash=trash)
print '=================>预置项目'
except:
print '===============================================>预置项目失败'
sys.exit()
def insertProjectMember(self):
try:
projectId = 2000
userId = 1001
status = 'active'
db.insert("ProjectUser",projectId=projectId,userId=userId,status=status)
print '=================>预置项目成员1'
projectId = 2000
userId = 1002
status = 'active'
db.insert("ProjectUser",projectId=projectId,userId=userId,status=status)
print '=================>预置项目成员2'
projectId = 2000
userId = 1003
status = 'active'
db.insert("ProjectUser",projectId=projectId,userId=userId,status=status)
print '=================>预置项目成员3'
except:
print '===============================================>插入项目成员失败'
sys.exit()
def insertRole(self):
try:
roleId = 4001
roleName = 'TEST_ROLE_HR'
projectId = 2000
remark = ''
db.insert("Role",roleId=roleId,roleName=roleName,projectId=projectId,remark=remark)
print '=================>预置角色1'
roleId = 4002
roleName = 'TEST_ROLE_MARKET'
projectId = 2000
remark = ''
db.insert("Role",roleId=roleId,roleName=roleName,projectId=projectId,remark=remark)
print '=================>预置角色2'
roleId = 4003
roleName = 'TEST_ROLE_HR_DELETE'
projectId = 2000
remark = ''
db.insert("Role",roleId=roleId,roleName=roleName,projectId=projectId,remark=remark)
print '=================>预置角色1'
except:
print '===============================================>预置角色失败'
sys.exit()
def insertRoleUser(self):
try:
projectId =2000
userId = 1001
RoleId = 4001
db.query("insert into RoleUser (projectId,userId,RoleId)values($projectId,$userId,$RoleId)",vars=locals())
projectId =2000
userId = 1001
RoleId = 4003
db.query("insert into RoleUser (projectId,userId,RoleId)values($projectId,$userId,$RoleId)",vars=locals())
projectId =2000
userId = 1002
RoleId = 4002
db.query("insert into RoleUser (projectId,userId,RoleId)values($projectId,$userId,$RoleId)",vars=locals())
projectId =2000
userId = 1003
RoleId = 4001
db.query("insert into RoleUser (projectId,userId,RoleId)values($projectId,$userId,$RoleId)",vars=locals())
projectId =2000
userId = 1003
RoleId = 4002
db.query("insert into RoleUser (projectId,userId,RoleId)values($projectId,$userId,$RoleId)",vars=locals())
print '预置用户角色'
except:
print '===============================================>插入角色成员失败'
sys.exit()
def insertRolePes(self):
try:
sql = "insert into FolderPriv(projectId,folderId,roleId,readPriv,writePriv) values "
sql +="($projectId,$folderId,$roleId,$readPriv,$writePriv)"
projectId = 2000
folderId = 3001 #HR
roleId = 4001 #HR
readPriv = 1
writePriv = 0
db.query(sql,vars=locals())#HR
print '预置角色1权限'
projectId = 2000
folderId = 3002 #MARKET
roleId = 4002 #MARKET
readPriv = 1
writePriv = 0
db.query(sql,vars=locals())#MARKET
print '预置角色2权限'
projectId = 2000
folderId = 3001 #HR
roleId = 4003 #HR
readPriv = 0
writePriv = 1
db.query(sql,vars=locals())#HR
print '预置角色3权限'
except:
print '===============================================>插入角色权限失败'
sys.exit()
class UserTestCase(unittest.TestCase):
def runTest(self):
#管理员测试
assert verify.doSomething(1000,9000,'newPrj') == True,''
assert verify.doSomething(1000,3000,'read') == True,''
assert verify.doSomething(1000,3003,'write') == True,''
assert verify.doSomething(1000,3003,'manager') == True,''
assert verify.doSomething(1000,2000,'manager') == True,''
assert verify.doSomething(1000,9000,'manager') == False,''
#一般测试
assert verify.doSomething(1001,3001,'read') == True,''
assert verify.doSomething(1002,3002,'read') == True,''
assert verify.doSomething(1002,3002,'write') == False,''
#角色叠加测试
assert verify.doSomething(1001,3001,'read') == True,''
assert verify.doSomething(1001,3001,'write') == True,''
#继承测试
assert verify.doSomething(1001,3003,'write') == True,''
#请求个人的资源
assert verify.doSomething(1001,1001,'write') == True,''
assert verify.doSomething(1001,1001,'write') == True,''
assert verify.doSomething(1001,1002,'read') == False,''
assert verify.doSomething(1001,1002,'read') == False,''
#错误的测试数据
#assert verify.doSomething(1009,2009,'read') == False,''
#assert verify.doSomething(1009,2009,'write') == False,''
assert verify.doSomething(1000,8000,'read') == False,''
assert verify.doSomething(1001,8000,'read') == False,''
assert verify.doSomething(8000,3001,'read') == False,''
assert verify.doSomething(1000,3001,'get') == False,''
assert verify.doSomething(1001,3001,'get') == False,''
class RoleTestCase(unittest.TestCase):
def runTest(self):
assert verify.roleDo(4001,2000,3001,'read') == True,''
assert verify.roleDo(4001,2000,3001,'get') == False,''
if __name__ == "__main__":
PreSetData()
unittest.main()