- Timestamp:
- 20 Sep 2012, 08:49:37 (12 years ago)
- Location:
- main/waeup.kofa/branches/uli-zc-async
- Files:
-
- 4 edited
- 5 copied
Legend:
- Unmodified
- Added
- Removed
-
main/waeup.kofa/branches/uli-zc-async
- Property svn:mergeinfo changed
-
main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/university/tests/test_batching.py
r7811 r9209 19 19 # Tests for university related batching 20 20 import unittest 21 21 import tempfile 22 import shutil 23 import os 24 from zope.component.hooks import setSite, clearSite 25 from zope.component import createObject 26 from zope.securitypolicy.interfaces import ( 27 IPrincipalRoleMap, IPrincipalRoleManager) 28 from zope.testbrowser.testing import Browser 22 29 from zope.interface.verify import verifyClass, verifyObject 23 30 from waeup.kofa.interfaces import IBatchProcessor 24 31 from waeup.kofa.testing import FunctionalTestCase, FunctionalLayer 32 from waeup.kofa.app import University 25 33 from waeup.kofa.university.batching import ( 26 34 FacultyProcessor, DepartmentProcessor, CourseProcessor, … … 28 36 from waeup.kofa.university.certificate import Certificate, CertificateCourse 29 37 from waeup.kofa.university.course import Course 30 from waeup.kofa.university.department import Department 31 32 33 class TestFacultyProcessor(unittest.TestCase): 38 from waeup.kofa.university import Faculty, Department 39 from waeup.kofa.university.batching import FacultyProcessor 40 41 FACULTY_SAMPLE_DATA = open( 42 os.path.join(os.path.dirname(__file__), 'sample_faculty_data.csv'), 43 'rb').read() 44 45 FACULTY_HEADER_FIELDS = FACULTY_SAMPLE_DATA.split( 46 '\n')[0].split(',') 47 48 FACULTY_SAMPLE_DATA_UPDATE = open( 49 os.path.join(os.path.dirname(__file__), 'sample_faculty_data_update.csv'), 50 'rb').read() 51 52 FACULTY_HEADER_FIELDS_UPDATE = FACULTY_SAMPLE_DATA_UPDATE.split( 53 '\n')[0].split(',') 54 55 DEPARTMENT_SAMPLE_DATA = open( 56 os.path.join(os.path.dirname(__file__), 'sample_department_data.csv'), 57 'rb').read() 58 59 DEPARTMENT_HEADER_FIELDS = DEPARTMENT_SAMPLE_DATA.split( 60 '\n')[0].split(',') 61 62 CERTIFICATE_SAMPLE_DATA = open( 63 os.path.join(os.path.dirname(__file__), 'sample_certificate_data.csv'), 64 'rb').read() 65 66 CERTIFICATE_HEADER_FIELDS = CERTIFICATE_SAMPLE_DATA.split( 67 '\n')[0].split(',') 68 69 COURSE_SAMPLE_DATA = open( 70 os.path.join(os.path.dirname(__file__), 'sample_course_data.csv'), 71 'rb').read() 72 73 COURSE_HEADER_FIELDS = COURSE_SAMPLE_DATA.split( 74 '\n')[0].split(',') 75 76 class UniversityProcessorSetup(FunctionalTestCase): 77 78 layer = FunctionalLayer 34 79 35 80 def setUp(self): 81 super(UniversityProcessorSetup, self).setUp() 82 self.dc_root = tempfile.mkdtemp() 83 self.workdir = tempfile.mkdtemp() 84 app = University() 85 self.getRootFolder()['app'] = app 86 self.app = self.getRootFolder()['app'] 87 setSite(app) 88 89 self.app['users'].addUser('bob', 'bobssecret') 90 self.app['users'].addUser('anne', 'annessecret') 91 92 # Populate university 93 self.certificate = createObject('waeup.Certificate') 94 self.certificate.code = 'CRT1' 95 self.app['faculties']['FAC1'] = Faculty(code='FAC1') 96 self.app['faculties']['FAC1']['DEP1'] = Department(code='DEP1') 97 self.app['faculties']['FAC1']['DEP1'].certificates.addCertificate( 98 self.certificate) 99 self.course = createObject('waeup.Course') 100 self.course.code = 'CRS1' 101 self.app['faculties']['FAC1']['DEP1'].courses.addCourse( 102 self.course) 103 #self.app['faculties']['fac1']['dep1'].certificates['CERT1'].addCertCourse( 104 # self.course, level=100) 105 106 self.logfile = os.path.join( 107 self.app['datacenter'].storage, 'logs', 'main.log') 108 return 109 return 110 111 def tearDown(self): 112 super(UniversityProcessorSetup, self).tearDown() 113 shutil.rmtree(self.workdir) 114 shutil.rmtree(self.dc_root) 115 clearSite() 116 return 117 118 class TestFacultyProcessor(UniversityProcessorSetup): 119 120 def setUp(self): 121 super(TestFacultyProcessor, self).setUp() 122 123 self.browser = Browser() 124 self.browser.handleErrors = False 125 self.datacenter_path = 'http://localhost/app/datacenter' 126 self.app['datacenter'].setStoragePath(self.dc_root) 127 36 128 self.proc = FacultyProcessor() 37 129 self.site1 = dict(faculties=dict()) 38 130 self.site2 = dict(faculties=dict(FAC='pseudo faculty')) 39 131 self.row = dict(code='FAC') 132 133 self.csv_file_faculty = os.path.join(self.workdir, 'sample_faculty_data.csv') 134 open(self.csv_file_faculty, 'wb').write(FACULTY_SAMPLE_DATA) 135 self.csv_file_faculty_update = os.path.join(self.workdir, 'sample_faculty_data_update.csv') 136 open(self.csv_file_faculty_update, 'wb').write(FACULTY_SAMPLE_DATA_UPDATE) 40 137 return 41 138 … … 60 157 return 61 158 62 class TestDepartmentProcessors(unittest.TestCase): 159 def test_checkConversion(self): 160 # Make sure we can check conversions. 161 errs, inv_errs, conv_dict = self.proc.checkConversion( 162 dict(faculty_code='ABC', local_roles='[]')) 163 self.assertEqual(len(errs),0) 164 165 errs, inv_errs, conv_dict = self.proc.checkConversion( 166 dict(faculty_code='ABC', 167 local_roles="['nonsense'" 168 )) 169 self.assertEqual(len(errs),1) 170 self.assertEqual(errs, [('local_roles', 'Error')]) 171 errs, inv_errs, conv_dict = self.proc.checkConversion( 172 dict(faculty_code='ABC', 173 local_roles="('abc')" 174 )) 175 self.assertEqual(len(errs),1) 176 self.assertEqual(errs, [('local_roles', 'no list')]) 177 errs, inv_errs, conv_dict = self.proc.checkConversion( 178 dict(faculty_code='ABC', 179 local_roles="[('ABC')]" 180 )) 181 self.assertEqual(len(errs),1) 182 self.assertEqual(errs, [('local_roles', 'no dicts')]) 183 errs, inv_errs, conv_dict = self.proc.checkConversion( 184 dict(faculty_code='ABC', 185 local_roles="('abc')" 186 )) 187 self.assertEqual(len(errs),1) 188 self.assertEqual(errs, [('local_roles', 'no list')]) 189 errs, inv_errs, conv_dict = self.proc.checkConversion( 190 dict(faculty_code='ABC', local_roles= 191 "[{'name':'bob','local_role':'waeup.local.DepartmentManager'},]" 192 )) 193 self.assertEqual(len(errs),1) 194 self.assertEqual(errs, [('local_roles', 'user_name or local_role missing')]) 195 errs, inv_errs, conv_dict = self.proc.checkConversion( 196 dict(faculty_code='ABC', local_roles= 197 "[{'user_name':'bob','localrole':'waeup.local.DepartmentManager'},]" 198 )) 199 self.assertEqual(len(errs),1) 200 self.assertEqual(errs, [('local_roles', 'user_name or local_role missing')]) 201 errs, inv_errs, conv_dict = self.proc.checkConversion( 202 dict(faculty_code='ABC', local_roles= 203 "[{'user_name':'bob','local_role':'waeup.local.Boss'},]" 204 )) 205 self.assertEqual(len(errs),1) 206 self.assertEqual(errs, [('local_roles', 'waeup.local.Boss not allowed')]) 207 errs, inv_errs, conv_dict = self.proc.checkConversion( 208 dict(faculty_code='ABC', local_roles= 209 "[{'user_name':'john','local_role':'waeup.local.DepartmentManager'},]" 210 )) 211 self.assertEqual(len(errs),1) 212 self.assertEqual(errs, [('local_roles', 'john does not exist')]) 213 errs, inv_errs, conv_dict = self.proc.checkConversion( 214 dict(faculty_code='ABC', local_roles= 215 "[{'user_name':'bob','local_role':'waeup.local.DepartmentManager'},]" 216 )) 217 self.assertEqual(len(errs),0) 218 return 219 220 def test_import(self): 221 num, num_warns, fin_file, fail_file = self.proc.doImport( 222 self.csv_file_faculty, FACULTY_HEADER_FIELDS) 223 content = open(fail_file).read() 224 self.assertEqual(num_warns,5) 225 self.assertEqual( 226 content, 227 'code,local_roles,--ERRORS--\r\n' 228 'CDE,"[{\'user_name\':\'alice\',\'local_role\':\'waeup.local.DepartmentManager\'}]",' 229 'local_roles: alice does not exist\r\n' 230 'DEF,"[{\'user_name\':\'bob\',\'local_role\':\'waeup.local.Boss\'}]",' 231 'local_roles: waeup.local.Boss not allowed\r\n' 232 'EFG,[(\'anything\')],local_roles: no dicts\r\n' 233 'FGH,[,local_roles: Error\r\n' 234 'GHI,"[{\'user\':\'bob\',\'local\':\'waeup.local.DepartmentManager\'}]",' 235 'local_roles: user_name or local_role missing\r\n' 236 ) 237 # Bob got a local role in faculty ABC. 238 abc = self.app['faculties']['ABC'] 239 role_map = IPrincipalRoleMap(abc) 240 local_role, user_name, setting = role_map.getPrincipalsAndRoles()[0] 241 self.assertEqual(user_name, 'bob') 242 self.assertEqual(local_role, 'waeup.local.DepartmentManager') 243 shutil.rmtree(os.path.dirname(fin_file)) 244 return 245 246 def test_import_update(self): 247 self.app['faculties']['FAC2'] = Faculty(code='FAC2') 248 self.app['faculties']['FAC3'] = Faculty(code='FAC3') 249 self.app['faculties']['FAC4'] = Faculty(code='FAC4') 250 251 role_manager1 = IPrincipalRoleManager(self.app['faculties']['FAC1']) 252 role_manager1.assignRoleToPrincipal('alfonsrole', 'alfons') 253 role_map1 = IPrincipalRoleMap(self.app['faculties']['FAC1']) 254 self.assertEqual(len(role_map1.getPrincipalsAndRoles()), 1) 255 256 role_manager2 = IPrincipalRoleManager(self.app['faculties']['FAC2']) 257 role_manager2.assignRoleToPrincipal('alfonsrole', 'alfons') 258 role_map2 = IPrincipalRoleMap(self.app['faculties']['FAC2']) 259 self.assertEqual(len(role_map2.getPrincipalsAndRoles()), 1) 260 261 role_manager3 = IPrincipalRoleManager(self.app['faculties']['FAC3']) 262 role_manager3.assignRoleToPrincipal('alfonsrole', 'alfons') 263 role_map3 = IPrincipalRoleMap(self.app['faculties']['FAC3']) 264 self.assertEqual(len(role_map3.getPrincipalsAndRoles()), 1) 265 266 role_manager4 = IPrincipalRoleManager(self.app['faculties']['FAC4']) 267 role_manager4.assignRoleToPrincipal('alfonsrole', 'alfons') 268 role_map4 = IPrincipalRoleMap(self.app['faculties']['FAC4']) 269 self.assertEqual(len(role_map4.getPrincipalsAndRoles()), 1) 270 271 local_role, user_name, setting = role_map2.getPrincipalsAndRoles()[0] 272 self.assertEqual(user_name, 'alfons') 273 self.assertEqual(local_role, 'alfonsrole') 274 275 num, num_warns, fin_file, fail_file = self.proc.doImport( 276 self.csv_file_faculty_update, FACULTY_HEADER_FIELDS_UPDATE, 'update') 277 self.assertEqual(num_warns,0) 278 # Local roles have been removed in FAC1 due to deletion marker. 279 self.assertEqual(len(role_map1.getPrincipalsAndRoles()), 0) 280 # Old local roles have been removed and new roles have been added in FAC2. 281 self.assertEqual(len(role_map2.getPrincipalsAndRoles()), 1) 282 local_role, user_name, setting = role_map2.getPrincipalsAndRoles()[0] 283 self.assertEqual(user_name, 'bob') 284 self.assertEqual(local_role, 'waeup.local.DepartmentManager') 285 # Local roles are not touched in FAC3 due to ignore marker. 286 self.assertEqual(len(role_map3.getPrincipalsAndRoles()), 1) 287 local_role, user_name, setting = role_map3.getPrincipalsAndRoles()[0] 288 self.assertEqual(user_name, 'alfons') 289 self.assertEqual(local_role, 'alfonsrole') 290 # Local roles are not touched in FAC4 due to empty cell. 291 self.assertEqual(len(role_map4.getPrincipalsAndRoles()), 1) 292 local_role, user_name, setting = role_map4.getPrincipalsAndRoles()[0] 293 self.assertEqual(user_name, 'alfons') 294 self.assertEqual(local_role, 'alfonsrole') 295 shutil.rmtree(os.path.dirname(fin_file)) 296 return 297 298 def test_import_update_logging(self): 299 self.app['faculties']['FAC2'] = Faculty(code='FAC2') 300 self.app['faculties']['FAC3'] = Faculty(code='FAC3') 301 self.app['faculties']['FAC4'] = Faculty(code='FAC4') 302 num, num_warns, fin_file, fail_file = self.proc.doImport( 303 self.csv_file_faculty_update, FACULTY_HEADER_FIELDS_UPDATE, 'update') 304 self.assertEqual(num_warns,0) 305 logcontent = open(self.logfile).read() 306 # Logging message from updateEntry 307 self.assertTrue( 308 'INFO - system - Department Processor - DEP2 - ' 309 'Record updated: local_roles=anne|waeup.local.DepartmentManager, ' 310 'code=DEP2' 311 in logcontent) 312 313 def test_upload_import_reupload(self): 314 self.browser.addHeader('Authorization', 'Basic mgr:mgrpw') 315 self.browser.open(self.datacenter_path) 316 self.assertEqual(self.browser.headers['Status'], '200 Ok') 317 self.assertEqual(self.browser.url, self.datacenter_path) 318 self.browser.getLink("Upload data").click() 319 file = open(self.csv_file_faculty) 320 ctrl = self.browser.getControl(name='uploadfile:file') 321 file_ctrl = ctrl.mech_control 322 file_ctrl.add_file(file, filename='sample_faculty_data.csv') 323 self.browser.getControl('Upload').click() 324 self.browser.getLink('Process data').click() 325 self.browser.getControl(name="select").click() 326 importerselect = self.browser.getControl(name='importer') 327 importerselect.getControl('Faculty Processor').selected = True 328 modeselect = self.browser.getControl(name='mode') 329 modeselect.getControl(value='create').selected = True 330 self.browser.getControl('Proceed to step 3').click() 331 self.assertTrue('Header fields OK' in self.browser.contents) 332 self.browser.getControl('Perform import').click() 333 self.assertTrue('Successfully processed 1 rows' in self.browser.contents) 334 # We import the same file a second time. 335 self.browser.open(self.datacenter_path) 336 self.browser.getLink("Upload data").click() 337 file = open(self.csv_file_faculty) 338 ctrl = self.browser.getControl(name='uploadfile:file') 339 file_ctrl = ctrl.mech_control 340 file_ctrl.add_file(file, filename='sample_faculty_data.csv') 341 self.browser.getControl('Upload').click() 342 self.assertTrue( 343 'File with same name was uploaded earlier' in self.browser.contents) 344 return 345 346 class TestDepartmentProcessor(UniversityProcessorSetup): 63 347 64 348 def setUp(self): 349 super(TestDepartmentProcessor, self).setUp() 65 350 self.proc = DepartmentProcessor() 66 351 self.site0 = dict() … … 69 354 self.site3 = dict(faculties=dict(FAC=dict(DPT='pseudo department'))) 70 355 self.row = dict(code='DPT', faculty_code='FAC') 356 357 self.csv_file_department = os.path.join(self.workdir, 'sample_department_data.csv') 358 open(self.csv_file_department, 'wb').write(DEPARTMENT_SAMPLE_DATA) 71 359 return 72 360 … … 115 403 return 116 404 117 class CourseProcessorTests(FunctionalTestCase): 118 119 layer = FunctionalLayer 405 def test_import(self): 406 num, num_warns, fin_file, fail_file = self.proc.doImport( 407 self.csv_file_department, DEPARTMENT_HEADER_FIELDS) 408 content = open(fail_file).read() 409 self.assertEqual(num_warns,6) 410 self.assertEqual( 411 content, 412 'faculty_code,code,local_roles,--ERRORS--\r\n' 413 'FAC1,DEP2,"[{\'user_name\':\'alice\',\'local_role\':\'waeup.local.DepartmentManager\'}]",' 414 'local_roles: alice does not exist\r\n' 415 'FAC1,DEP2,"[{\'user_name\':\'anne\',\'local_role\':\'waeup.local.Boss\'}]",' 416 'local_roles: waeup.local.Boss not allowed\r\n' 417 'FAC1,DEP2,[(\'anything\')],local_roles: no dicts\r\n' 418 'FAC1,DEP2,[,local_roles: Error\r\n' 419 'FAC1,DEP2,"[{\'user\':\'anne\',\'local\':\'waeup.local.DepartmentManager\'}]",' 420 'local_roles: user_name or local_role missing\r\n' 421 'FAC11,DEP2,"[{\'user_name\':\'anne\',\'local_role\':\'waeup.local.DepartmentManager\'}]",' 422 'Not all parents do exist yet. Skipping\r\n' 423 ) 424 # Anne got a local role in department DEP2. 425 dep = self.app['faculties']['FAC1']['DEP2'] 426 role_map = IPrincipalRoleMap(dep) 427 local_role, user_name, setting = role_map.getPrincipalsAndRoles()[0] 428 self.assertEqual(user_name, 'anne') 429 self.assertEqual(local_role, 'waeup.local.DepartmentManager') 430 shutil.rmtree(os.path.dirname(fin_file)) 431 return 432 433 class CourseProcessorTests(UniversityProcessorSetup): 120 434 121 435 def setUp(self): 122 436 super(CourseProcessorTests, self).setUp() 123 437 self.proc = CourseProcessor() 124 self.site0 = dict() 125 self.site1 = dict(faculties=dict()) 126 self.site2 = dict(faculties=dict(FAC=dict())) 127 self.department1 = Department(code='DPT') 128 self.department2 = Department(code='DPT') 129 self.course = Course(code='CRS') 130 self.department2.courses['CRS'] = self.course 131 self.site3 = dict(faculties=dict(FAC=dict(DPT=self.department1))) 132 self.site4 = dict(faculties=dict(FAC=dict(DPT=self.department2))) 133 self.row = dict(department_code='DPT', faculty_code='FAC', code="CRS") 438 self.row1 = dict(department_code='DEP2', faculty_code='FAC1', code="CRS1") 439 self.row2 = dict(department_code='DEP1', faculty_code='FAC2', code="CRS1") 440 self.row3 = dict(department_code='DEP1', faculty_code='FAC1', code="CRS2") 441 self.row4 = dict(department_code='DEP1', faculty_code='FAC1', code="CRS1") 442 443 self.csv_file_course = os.path.join(self.workdir, 'sample_course_data.csv') 444 open(self.csv_file_course, 'wb').write(COURSE_SAMPLE_DATA) 134 445 return 135 446 … … 142 453 def test_parents_exist(self): 143 454 # make sure we lookup parents correctly 144 result0 = self.proc.parentsExist(self.row, self.site0) 145 result1 = self.proc.parentsExist(self.row, self.site1) 146 result2 = self.proc.parentsExist(self.row, self.site2) 147 result3 = self.proc.parentsExist(self.row, self.site3) 148 result4 = self.proc.parentsExist(self.row, self.site4) 149 self.assertTrue(result0 is False) 455 result1 = self.proc.parentsExist(self.row1, self.app) 456 result2 = self.proc.parentsExist(self.row2, self.app) 457 result3 = self.proc.parentsExist(self.row3, self.app) 150 458 self.assertTrue(result1 is False) 151 459 self.assertTrue(result2 is False) 152 460 self.assertTrue(result3 is True) 153 self.assertTrue(result4 is True)154 461 return 155 462 156 463 def test_entry_exists(self): 157 464 # make sure we find an entry if it exists 158 result0 = self.proc.entryExists(self.row, self.site0) 159 result1 = self.proc.entryExists(self.row, self.site1) 160 result2 = self.proc.entryExists(self.row, self.site2) 161 result3 = self.proc.entryExists(self.row, self.site3) 162 result4 = self.proc.entryExists(self.row, self.site4) 163 self.assertTrue(result0 is False) 465 result1 = self.proc.entryExists(self.row1, self.app) 466 result2 = self.proc.entryExists(self.row2, self.app) 467 result3 = self.proc.entryExists(self.row3, self.app) 468 result4 = self.proc.entryExists(self.row4, self.app) 164 469 self.assertTrue(result1 is False) 165 470 self.assertTrue(result2 is False) … … 170 475 def test_get_entry(self): 171 476 # make sure we can get an entry if it exists 172 result1 = self.proc.getEntry(self.row , self.site3)173 result2 = self.proc.getEntry(self.row , self.site4)477 result1 = self.proc.getEntry(self.row1, self.app) 478 result2 = self.proc.getEntry(self.row4, self.app) 174 479 self.assertTrue(result1 is None) 175 480 self.assertTrue(result2 is self.course) … … 178 483 def test_del_entry(self): 179 484 # make sure we can delete entries 180 self.assertTrue('CRS' in self.department2.courses.keys()) 181 self.proc.delEntry(self.row, self.site4) 182 self.assertTrue('CRS' not in self.department2.courses.keys()) 183 return 184 185 class CertificateProcessorTests(FunctionalTestCase): 186 187 layer = FunctionalLayer 485 self.assertTrue('CRS1' in self.app['faculties']['FAC1']['DEP1'].courses.keys()) 486 self.proc.delEntry(self.row4, self.app) 487 self.assertTrue('CRS1' not in self.app['faculties']['FAC1']['DEP1'].courses.keys()) 488 return 489 490 def test_import(self): 491 num, num_warns, fin_file, fail_file = self.proc.doImport( 492 self.csv_file_course, COURSE_HEADER_FIELDS) 493 content = open(fail_file).read() 494 self.assertEqual(num_warns,6) 495 self.assertEqual( 496 content, 497 'faculty_code,department_code,code,local_roles,--ERRORS--\r\n' 498 'FAC1,DEP1,CRS2,"[{\'user_name\':\'alice\',\'local_role\':\'waeup.local.Lecturer\'}]",' 499 'local_roles: alice does not exist\r\n' 500 'FAC1,DEP1,CRS2,"[{\'user_name\':\'anne\',\'local_role\':\'waeup.local.Boss\'}]",' 501 'local_roles: waeup.local.Boss not allowed\r\n' 502 'FAC1,DEP1,CRS2,[(\'anything\')],local_roles: no dicts\r\n' 503 'FAC1,DEP1,CRS2,[,local_roles: Error\r\n' 504 'FAC1,DEP1,CRS2,"[{\'user\':\'anne\',\'local\':\'waeup.local.Lecturer\'}]",' 505 'local_roles: user_name or local_role missing\r\n' 506 'FAC11,DEP2,CRS2,"[{\'user_name\':\'anne\',\'local_role\':\'waeup.local.Lecturer\'}]",' 507 'Not all parents do exist yet. Skipping\r\n' 508 ) 509 # Anne got a local role in course CRS2. 510 dep = self.app['faculties']['FAC1']['DEP1'].courses['CRS2'] 511 role_map = IPrincipalRoleMap(dep) 512 local_role, user_name, setting = role_map.getPrincipalsAndRoles()[0] 513 self.assertEqual(user_name, 'anne') 514 self.assertEqual(local_role, 'waeup.local.Lecturer') 515 shutil.rmtree(os.path.dirname(fin_file)) 516 return 517 518 519 class CertificateProcessorTests(UniversityProcessorSetup): 188 520 189 521 def setUp(self): 190 522 super(CertificateProcessorTests, self).setUp() 191 523 self.proc = CertificateProcessor() 192 self.site0 = dict() 193 self.site1 = dict(faculties=dict()) 194 self.site2 = dict(faculties=dict(FAC=dict())) 195 self.department1 = Department(code='DPT') 196 self.department2 = Department(code='DPT') 197 self.certificate = Certificate(code='CRT') 198 self.department2.certificates['CRT'] = self.certificate 199 self.site3 = dict(faculties=dict(FAC=dict(DPT=self.department1))) 200 self.site4 = dict(faculties=dict(FAC=dict(DPT=self.department2))) 201 self.row = dict(department_code='DPT', faculty_code='FAC', code="CRT") 524 self.row1 = dict(department_code='DEP2', faculty_code='FAC1', code="CRT1") 525 self.row2 = dict(department_code='DEP1', faculty_code='FAC2', code="CRT1") 526 self.row3 = dict(department_code='DEP1', faculty_code='FAC1', code="CRT2") 527 self.row4 = dict(department_code='DEP1', faculty_code='FAC1', code="CRT1") 528 529 self.csv_file_certificate = os.path.join(self.workdir, 'sample_certificate_data.csv') 530 open(self.csv_file_certificate, 'wb').write(CERTIFICATE_SAMPLE_DATA) 202 531 return 203 532 204 533 def test_ifaces(self): 205 534 # Make sure we fullfill all interface contracts 206 verifyClass(IBatchProcessor, C ertificateProcessor)535 verifyClass(IBatchProcessor, CourseProcessor) 207 536 verifyObject(IBatchProcessor, self.proc) 208 537 return 209 538 210 539 def test_parents_exist(self): 211 # make sure we can find all certificate parents 212 result0 = self.proc.parentsExist(self.row, self.site0) 213 result1 = self.proc.parentsExist(self.row, self.site1) 214 result2 = self.proc.parentsExist(self.row, self.site2) 215 result3 = self.proc.parentsExist(self.row, self.site3) 216 result4 = self.proc.parentsExist(self.row, self.site4) 217 self.assertTrue(result0 is False) 540 # make sure we lookup parents correctly 541 result1 = self.proc.parentsExist(self.row1, self.app) 542 result2 = self.proc.parentsExist(self.row2, self.app) 543 result3 = self.proc.parentsExist(self.row3, self.app) 218 544 self.assertTrue(result1 is False) 219 545 self.assertTrue(result2 is False) 220 546 self.assertTrue(result3 is True) 221 self.assertTrue(result4 is True)222 547 return 223 548 224 549 def test_entry_exists(self): 225 550 # make sure we find an entry if it exists 226 result0 = self.proc.entryExists(self.row, self.site0) 227 result1 = self.proc.entryExists(self.row, self.site1) 228 result2 = self.proc.entryExists(self.row, self.site2) 229 result3 = self.proc.entryExists(self.row, self.site3) 230 result4 = self.proc.entryExists(self.row, self.site4) 231 self.assertTrue(result0 is False) 551 result1 = self.proc.entryExists(self.row1, self.app) 552 result2 = self.proc.entryExists(self.row2, self.app) 553 result3 = self.proc.entryExists(self.row3, self.app) 554 result4 = self.proc.entryExists(self.row4, self.app) 232 555 self.assertTrue(result1 is False) 233 556 self.assertTrue(result2 is False) … … 238 561 def test_get_entry(self): 239 562 # make sure we can get an entry if it exists 240 result1 = self.proc.getEntry(self.row , self.site3)241 result2 = self.proc.getEntry(self.row , self.site4)563 result1 = self.proc.getEntry(self.row1, self.app) 564 result2 = self.proc.getEntry(self.row4, self.app) 242 565 self.assertTrue(result1 is None) 243 566 self.assertTrue(result2 is self.certificate) … … 246 569 def test_del_entry(self): 247 570 # make sure we can delete entries 248 self.assertTrue('CRT' in self.department2.certificates.keys()) 249 self.proc.delEntry(self.row, self.site4) 250 self.assertTrue('CRT' not in self.department2.certificates.keys()) 251 return 571 self.assertTrue('CRT1' in self.app['faculties']['FAC1']['DEP1'].certificates.keys()) 572 self.proc.delEntry(self.row4, self.app) 573 self.assertTrue('CRT1' not in self.app['faculties']['FAC1']['DEP1'].certificates.keys()) 574 return 575 576 def test_import(self): 577 num, num_warns, fin_file, fail_file = self.proc.doImport( 578 self.csv_file_certificate, CERTIFICATE_HEADER_FIELDS) 579 content = open(fail_file).read() 580 self.assertEqual(num_warns,6) 581 self.assertEqual( 582 content, 583 'faculty_code,department_code,code,local_roles,--ERRORS--\r\n' 584 'FAC1,DEP1,CRT2,"[{\'user_name\':\'alice\',\'local_role\':\'waeup.local.CourseAdviser100\'}]",' 585 'local_roles: alice does not exist\r\n' 586 'FAC1,DEP1,CRT2,"[{\'user_name\':\'anne\',\'local_role\':\'waeup.local.Boss\'}]",' 587 'local_roles: waeup.local.Boss not allowed\r\n' 588 'FAC1,DEP1,CRT2,[(\'anything\')],local_roles: no dicts\r\n' 589 'FAC1,DEP1,CRT2,[,local_roles: Error\r\n' 590 'FAC1,DEP1,CRT2,"[{\'user\':\'anne\',\'local\':\'waeup.local.CourseAdviser100\'}]",' 591 'local_roles: user_name or local_role missing\r\n' 592 'FAC11,DEP2,CRT2,"[{\'user_name\':\'anne\',\'local_role\':\'waeup.local.CourseAdviser100\'}]",' 593 'Not all parents do exist yet. Skipping\r\n' 594 ) 595 # Anne got a local role in certificate CRT2. 596 dep = self.app['faculties']['FAC1']['DEP1'].certificates['CRT2'] 597 role_map = IPrincipalRoleMap(dep) 598 local_role, user_name, setting = role_map.getPrincipalsAndRoles()[0] 599 self.assertEqual(user_name, 'anne') 600 self.assertEqual(local_role, 'waeup.local.CourseAdviser100') 601 shutil.rmtree(os.path.dirname(fin_file)) 602 603 logcontent = open(self.logfile).read() 604 # Logging message from updateEntry 605 self.assertTrue( 606 'INFO - system - Certificate Processor - CRT2 - Record updated: ' 607 'local_roles=anne|waeup.local.CourseAdviser100, code=CRT2' 608 in logcontent) 609 610 return 611 252 612 253 613 class CertCourseProcessorTests(FunctionalTestCase): … … 266 626 self.department2.certificates['CRT'] = self.certificate 267 627 self.course = Course(code='CRS') 268 self.department2.certificates['CRT'].addC ourseRef(self.course)628 self.department2.certificates['CRT'].addCertCourse(self.course) 269 629 self.cert_course = self.certificate['CRS_100'] 270 630 self.department2.courses['CRS'] = self.course -
main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/university/tests/test_export.py
r8303 r9209 22 22 from zope.component import queryUtility 23 23 from zope.interface.verify import verifyObject, verifyClass 24 from zope.securitypolicy.interfaces import IPrincipalRoleManager 24 25 from waeup.kofa.interfaces import ICSVExporter 25 from waeup.kofa.testing import KofaUnitTestLayer 26 from waeup.kofa.testing import KofaUnitTestLayer, FunctionalLayer 26 27 from waeup.kofa.university import ( 27 28 FacultiesContainer, Faculty, Department, Course, Certificate, … … 34 35 class FacultyExporterTest(unittest.TestCase): 35 36 36 layer = KofaUnitTestLayer37 layer = FunctionalLayer 37 38 38 39 def setUp(self): … … 66 67 self.assertEqual( 67 68 result, 68 'code,title,title_prefix \r\n'69 'F1,Faculty of Cheese,faculty \r\n'69 'code,title,title_prefix,users_with_local_roles\r\n' 70 'F1,Faculty of Cheese,faculty,[]\r\n' 70 71 ) 71 72 return … … 78 79 self.assertEqual( 79 80 result, 80 'code,title,title_prefix \r\n'81 'F1,Faculty of Cheese,faculty \r\n'81 'code,title,title_prefix,users_with_local_roles\r\n' 82 'F1,Faculty of Cheese,faculty,[]\r\n' 82 83 ) 83 84 return … … 96 97 self.assertEqual( 97 98 result, 98 'code,title,title_prefix \r\n'99 'F1,Faculty of Cheese,faculty \r\n'100 'F2,Centre of Onion,centre \r\n'99 'code,title,title_prefix,users_with_local_roles\r\n' 100 'F1,Faculty of Cheese,faculty,[]\r\n' 101 'F2,Centre of Onion,centre,[]\r\n' 101 102 ) 102 103 return … … 114 115 self.assertEqual( 115 116 result, 116 'code,title,title_prefix \r\n'117 'F1,Faculty of Cheese,faculty \r\n'118 'F2,Centre of Onion,centre \r\n'117 'code,title,title_prefix,users_with_local_roles\r\n' 118 'F1,Faculty of Cheese,faculty,[]\r\n' 119 'F2,Centre of Onion,centre,[]\r\n' 119 120 ) 120 121 return … … 123 124 # Tests for DepartmentExporter 124 125 125 layer = KofaUnitTestLayer126 layer = FunctionalLayer 126 127 127 128 def setUp(self): … … 141 142 self.fac1.addDepartment(self.dept2) 142 143 self.fac2.addDepartment(self.dept3) 144 role_manager = IPrincipalRoleManager(self.dept1) 145 role_manager.assignRoleToPrincipal(u'bobsrole', u'bob') 143 146 return 144 147 … … 167 170 self.assertEqual( 168 171 result, 169 'code,faculty_code,title,title_prefix\r\n' 170 'D1,F1,Department of Cheddar,department\r\n' 172 'code,faculty_code,title,title_prefix,users_with_local_roles\r\n' 173 'D1,F1,Department of Cheddar,department,' 174 '"[{\'user_name\': u\'bob\', \'local_role\': u\'bobsrole\'}]"\r\n' 171 175 ) 172 176 return … … 178 182 self.assertEqual( 179 183 result, 180 'code,faculty_code,title,title_prefix\r\n' 181 'D1,F1,Department of Cheddar,department\r\n' 182 'D2,F1,Institue of Gouda,institute\r\n' 184 'code,faculty_code,title,title_prefix,users_with_local_roles\r\n' 185 'D1,F1,Department of Cheddar,department,' 186 '"[{\'user_name\': u\'bob\', \'local_role\': u\'bobsrole\'}]"\r\n' 187 'D2,F1,Institue of Gouda,institute,[]\r\n' 183 188 ) 184 189 return … … 191 196 self.assertEqual( 192 197 result, 193 'code,faculty_code,title,title_prefix\r\n' 194 'D1,F1,Department of Cheddar,department\r\n' 195 'D2,F1,Institue of Gouda,institute\r\n' 196 'D3,F2,Department of Rings,department\r\n' 198 'code,faculty_code,title,title_prefix,users_with_local_roles\r\n' 199 'D1,F1,Department of Cheddar,department,' 200 '"[{\'user_name\': u\'bob\', \'local_role\': u\'bobsrole\'}]"\r\n' 201 'D2,F1,Institue of Gouda,institute,[]\r\n' 202 'D3,F2,Department of Rings,department,[]\r\n' 197 203 ) 198 204 return … … 204 210 self.assertEqual( 205 211 result, 206 'code,faculty_code,title,title_prefix\r\n' 207 'D1,F1,Department of Cheddar,department\r\n' 208 'D2,F1,Institue of Gouda,institute\r\n' 209 'D3,F2,Department of Rings,department\r\n' 212 'code,faculty_code,title,title_prefix,users_with_local_roles\r\n' 213 'D1,F1,Department of Cheddar,department,' 214 '"[{\'user_name\': u\'bob\', \'local_role\': u\'bobsrole\'}]"\r\n' 215 'D2,F1,Institue of Gouda,institute,[]\r\n' 216 'D3,F2,Department of Rings,department,[]\r\n' 210 217 ) 211 218 return … … 214 221 # Tests for CourseExporter 215 222 216 layer = KofaUnitTestLayer223 layer = FunctionalLayer 217 224 218 225 def setUp(self): … … 260 267 self.assertEqual( 261 268 result, 262 'code,faculty_code,department_code,title,credits,passmark,semester\r\n' 263 'C1,F1,D1,Cheese Basics,0,40,1\r\n' 269 'code,faculty_code,department_code,title,credits,' 270 'passmark,semester,users_with_local_roles\r\n' 271 'C1,F1,D1,Cheese Basics,0,40,1,[]\r\n' 264 272 ) 265 273 return … … 271 279 self.assertEqual( 272 280 result, 273 'code,faculty_code,department_code,title,credits,passmark,semester\r\n' 274 'C1,F1,D1,Cheese Basics,0,40,1\r\n' 275 'C2,F1,D1,Advanced Cheese Making,0,40,1\r\n' 281 'code,faculty_code,department_code,title,credits,passmark,' 282 'semester,users_with_local_roles\r\n' 283 'C1,F1,D1,Cheese Basics,0,40,1,[]\r\n' 284 'C2,F1,D1,Advanced Cheese Making,0,40,1,[]\r\n' 276 285 ) 277 286 return … … 284 293 self.assertEqual( 285 294 result, 286 'code,faculty_code,department_code,title,credits,passmark,semester\r\n' 287 'C1,F1,D1,Cheese Basics,0,40,1\r\n' 288 'C2,F1,D1,Advanced Cheese Making,0,40,1\r\n' 289 'C3,F1,D2,Selling Cheese,0,40,1\r\n' 295 'code,faculty_code,department_code,title,credits,passmark,' 296 'semester,users_with_local_roles\r\n' 297 'C1,F1,D1,Cheese Basics,0,40,1,[]\r\n' 298 'C2,F1,D1,Advanced Cheese Making,0,40,1,[]\r\n' 299 'C3,F1,D2,Selling Cheese,0,40,1,[]\r\n' 290 300 ) 291 301 return … … 297 307 self.assertEqual( 298 308 result, 299 'code,faculty_code,department_code,title,credits,passmark,semester\r\n' 300 'C1,F1,D1,Cheese Basics,0,40,1\r\n' 301 'C2,F1,D1,Advanced Cheese Making,0,40,1\r\n' 302 'C3,F1,D2,Selling Cheese,0,40,1\r\n' 309 'code,faculty_code,department_code,title,credits,passmark,' 310 'semester,users_with_local_roles\r\n' 311 'C1,F1,D1,Cheese Basics,0,40,1,[]\r\n' 312 'C2,F1,D1,Advanced Cheese Making,0,40,1,[]\r\n' 313 'C3,F1,D2,Selling Cheese,0,40,1,[]\r\n' 303 314 ) 304 315 return … … 307 318 # Tests for CertificateExporter 308 319 309 layer = KofaUnitTestLayer320 layer = FunctionalLayer 310 321 311 322 def setUp(self): … … 339 350 self.dept1.certificates.addCertificate(self.cert2) 340 351 self.dept2.certificates.addCertificate(self.cert3) 352 role_manager = IPrincipalRoleManager(self.cert1) 353 role_manager.assignRoleToPrincipal(u'bobsrole', u'bob') 341 354 return 342 355 … … 365 378 self.assertEqual( 366 379 result, 367 'code,faculty_code,department_code,title,study_mode,start_level,end_level,application_category,school_fee_1,school_fee_2\r\n' 368 'CERT1,F1,D1,Master of Cheese,ct_ft,100,300,basic,,\r\n' 380 'code,faculty_code,department_code,title,study_mode,start_level,' 381 'end_level,application_category,school_fee_1,' 382 'school_fee_2,school_fee_3,school_fee_4,users_with_local_roles\r\n' 383 'CERT1,F1,D1,Master of Cheese,ct_ft,100,300,basic,,,,,' 384 '"[{\'user_name\': u\'bob\', \'local_role\': u\'bobsrole\'}]"\r\n' 369 385 ) 370 386 return … … 376 392 self.assertEqual( 377 393 result, 378 'code,faculty_code,department_code,title,study_mode,start_level,end_level,application_category,school_fee_1,school_fee_2\r\n' 379 'CERT1,F1,D1,Master of Cheese,ct_ft,100,300,basic,,\r\n' 380 'CERT2,F1,D1,Master of Cheddar,ct_ft,400,700,cest,,\r\n' 394 'code,faculty_code,department_code,title,study_mode,start_level,' 395 'end_level,application_category,school_fee_1,' 396 'school_fee_2,school_fee_3,school_fee_4,users_with_local_roles\r\n' 397 'CERT1,F1,D1,Master of Cheese,ct_ft,100,300,basic,,,,,' 398 '"[{\'user_name\': u\'bob\', \'local_role\': u\'bobsrole\'}]"\r\n' 399 'CERT2,F1,D1,Master of Cheddar,ct_ft,400,700,cest,,,,,[]\r\n' 381 400 ) 382 401 return … … 389 408 self.assertEqual( 390 409 result, 391 'code,faculty_code,department_code,title,study_mode,start_level,end_level,application_category,school_fee_1,school_fee_2\r\n' 392 'CERT1,F1,D1,Master of Cheese,ct_ft,100,300,basic,,\r\n' 393 'CERT2,F1,D1,Master of Cheddar,ct_ft,400,700,cest,,\r\n' 394 'CERT3,F1,D2,Cert. of Rubbish,dp_pt,100,200,no,,\r\n' 410 'code,faculty_code,department_code,title,study_mode,start_level,' 411 'end_level,application_category,' 412 'school_fee_1,school_fee_2,school_fee_3,school_fee_4,' 413 'users_with_local_roles\r\n' 414 'CERT1,F1,D1,Master of Cheese,ct_ft,100,300,basic,,,,,' 415 '"[{\'user_name\': u\'bob\', \'local_role\': u\'bobsrole\'}]"\r\n' 416 'CERT2,F1,D1,Master of Cheddar,ct_ft,400,700,cest,,,,,[]\r\n' 417 'CERT3,F1,D2,Cert. of Rubbish,dp_pt,100,200,no,,,,,[]\r\n' 395 418 ) 396 419 return … … 402 425 self.assertEqual( 403 426 result, 404 'code,faculty_code,department_code,title,study_mode,start_level,end_level,application_category,school_fee_1,school_fee_2\r\n' 405 'CERT1,F1,D1,Master of Cheese,ct_ft,100,300,basic,,\r\n' 406 'CERT2,F1,D1,Master of Cheddar,ct_ft,400,700,cest,,\r\n' 407 'CERT3,F1,D2,Cert. of Rubbish,dp_pt,100,200,no,,\r\n' 427 'code,faculty_code,department_code,title,study_mode,start_level,' 428 'end_level,application_category,' 429 'school_fee_1,school_fee_2,school_fee_3,school_fee_4,' 430 'users_with_local_roles\r\n' 431 'CERT1,F1,D1,Master of Cheese,ct_ft,100,300,basic,,,,,' 432 '"[{\'user_name\': u\'bob\', \'local_role\': u\'bobsrole\'}]"\r\n' 433 'CERT2,F1,D1,Master of Cheddar,ct_ft,400,700,cest,,,,,[]\r\n' 434 'CERT3,F1,D2,Cert. of Rubbish,dp_pt,100,200,no,,,,,[]\r\n' 408 435 ) 409 436 return … … 444 471 self.dept1.certificates.addCertificate(self.cert2) 445 472 self.dept2.certificates.addCertificate(self.cert3) 446 self.cert1.addC ourseRef(self.course1, 100, True)447 self.cert1.addC ourseRef(self.course2, 400, False)448 self.cert3.addC ourseRef(self.course3, 100, False)473 self.cert1.addCertCourse(self.course1, 100, True) 474 self.cert1.addCertCourse(self.course2, 400, False) 475 self.cert3.addCertCourse(self.course3, 100, False) 449 476 self.certcourse1 = self.cert1['C1_100'] 450 477 self.certcourse2 = self.cert1['C2_400'] -
main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/university/tests/test_university.py
r7811 r9209 33 33 def test_suite(): 34 34 # collect doctests for university subpackage 35 suite = get_doctest_suite(['university/c ourserefs.txt',])35 suite = get_doctest_suite(['university/certcourses.txt',]) 36 36 # add local unittests (actually only one) 37 37 for testcase in [UniversitySubpackageTests,]:
Note: See TracChangeset for help on using the changeset viewer.