- Timestamp:
- 20 Sep 2012, 08:49:37 (12 years ago)
- Location:
- main/waeup.kofa/branches/uli-zc-async
- Files:
-
- 8 edited
- 1 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/students/tests/sample_payment_data.csv
r8244 r9209 1 matric_number,p_state,p_category,p_id,reg_number,session_id,r_amount_approved,p_item,amount_auth,r_card_num,r_code,creation_date,type 2 ,paid,schoolfee,3816951290797973744#,1,2010,19500,BTECHBDT,19500,0942,00,2010/11/26 19:59:33.744 GMT+1,online 3 100001,unpaid,schoolfee,3816951290712593757,,2010,0,BTECHBDT,19500,0942,Z0,2010-11-25 20:16:33.757 GMT+1,online4 ,paid,schoolfee,p1266236341955,3,2009,19500,BTECHBDT,19500,0615,00,2010/02/15 13:19:01,online 1 matric_number,p_state,p_category,p_id,reg_number,session_id,r_amount_approved,p_item,amount_auth,r_card_num,r_code,creation_date,type,p_current 2 ,paid,schoolfee,3816951290797973744#,1,2010,19500,BTECHBDT,19500,0942,00,2010/11/26 19:59:33.744 GMT+1,online,1 3 100001,unpaid,schoolfee,3816951290712593757,,2010,0,BTECHBDT,19500,0942,Z0,2010-11-25 20:16:33.757 WAT,online,0 4 ,paid,schoolfee,p1266236341955,3,2009,19500,BTECHBDT,19500,0615,00,2010/02/15 13:19:01,online,1 -
main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/students/tests/test_authentication.py
r8351 r9209 65 65 email = None 66 66 phone = None 67 suspended = False 67 68 68 69 -
main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/students/tests/test_batching.py
r8626 r9209 23 23 import unittest 24 24 import datetime 25 import grok 25 26 from time import time 27 from zope.event import notify 26 28 from zope.component import createObject 27 29 from zope.component.hooks import setSite, clearSite 28 30 from zope.interface.verify import verifyClass, verifyObject 31 from hurry.workflow.interfaces import IWorkflowState 29 32 30 33 from waeup.kofa.app import University … … 126 129 '\n')[0].split(',') 127 130 131 PAYMENT_CREATE_SAMPLE_DATA = open( 132 os.path.join(os.path.dirname(__file__), 'sample_create_payment_data.csv'), 133 'rb').read() 134 135 PAYMENT_CREATE_HEADER_FIELDS = PAYMENT_CREATE_SAMPLE_DATA.split( 136 '\n')[0].split(',') 137 128 138 class StudentImportExportSetup(FunctionalTestCase): 129 139 … … 171 181 def setup_student(self, student): 172 182 # set predictable values for `student` 173 student.matric_number = u' M123456'183 student.matric_number = u'234' 174 184 student.adm_code = u'my adm code' 175 185 student.clearance_locked = False 176 186 student.clr_code = u'my clr code' 177 187 student.perm_address = u'Studentroad 21\nLagos 123456\n' 178 student.reg_number = u'123456' 179 student.student_id = u'A111111' 188 student.reg_number = u'123' 180 189 student.firstname = u'Anna' 181 190 student.lastname = u'Tester' … … 211 220 ticket.passmark = 100 212 221 ticket.semester = 2 213 study_level .addCourseTicket(ticket)222 study_level[ticket.code] = ticket 214 223 self.add_payment(student) 215 224 return student … … 232 241 233 242 234 235 class StudentProcessorTest(FunctionalTestCase): 243 class StudentProcessorTest(StudentImportExportSetup): 236 244 237 245 layer = FunctionalLayer … … 239 247 def setUp(self): 240 248 super(StudentProcessorTest, self).setUp() 241 # Setup a sample site for each test242 app = University()243 self.dc_root = tempfile.mkdtemp()244 app['datacenter'].setStoragePath(self.dc_root)245 246 # Prepopulate the ZODB...247 self.getRootFolder()['app'] = app248 # we add the site immediately after creation to the249 # ZODB. Catalogs and other local utilities are not setup250 # before that step.251 self.app = self.getRootFolder()['app']252 # Set site here. Some of the following setup code might need253 # to access grok.getSite() and should get our new app then254 setSite(app)255 249 256 250 # Add student with subobjects 257 251 student = Student() 258 student.firstname = u'Anna'259 student.lastname = u'Tester'260 student.reg_number = u'123'261 student.matric_number = u'234'262 252 self.app['students'].addStudent(student) 253 student = self.setup_student(student) 254 notify(grok.ObjectModifiedEvent(student)) 263 255 self.student = self.app['students'][student.student_id] 256 264 257 self.processor = StudentProcessor() 265 258 self.workdir = tempfile.mkdtemp() … … 285 278 open(self.csv_file_duplicates, 'wb').write(STUDENT_SAMPLE_DATA_DUPLICATES) 286 279 287 def tearDown(self):288 super(StudentProcessorTest, self).tearDown()289 shutil.rmtree(self.workdir)290 shutil.rmtree(self.dc_root)291 clearSite()292 return293 294 280 def test_interface(self): 295 281 # Make sure we fulfill the interface contracts. … … 343 329 self.assertEqual(initial_stud_id, new_stud_id) 344 330 return 331 332 def test_checkUpdateRequirements(self): 333 # Make sure that pg students can't be updated with wrong transition. 334 err = self.processor.checkUpdateRequirements(self.student, 335 dict(reg_number='1', state='returning'), self.app) 336 self.assertTrue(err is None) 337 self.certificate.study_mode = 'pg_ft' 338 err = self.processor.checkUpdateRequirements(self.student, 339 dict(reg_number='1', state='returning'), self.app) 340 self.assertEqual(err, 'State not allowed (pg student).') 341 IWorkflowState(self.student).setState('school fee paid') 342 err = self.processor.checkUpdateRequirements(self.student, 343 dict(reg_number='1', transition='reset6'), self.app) 344 self.assertEqual(err, 'Transition not allowed (pg student).') 345 err = self.processor.checkUpdateRequirements(self.student, 346 dict(reg_number='1', transition='register_courses'), self.app) 347 self.assertEqual(err, 'Transition not allowed (pg student).') 348 345 349 346 350 def test_delEntry(self): … … 486 490 super(StudentStudyCourseProcessorTest, self).setUp() 487 491 492 # Add student with subobjects 493 student = Student() 494 self.app['students'].addStudent(student) 495 student = self.setup_student(student) 496 notify(grok.ObjectModifiedEvent(student)) 497 self.student = self.app['students'][student.student_id] 498 488 499 # Import students with subobjects 489 500 student_file = os.path.join(self.workdir, 'sample_student_data.csv') … … 532 543 dict(reg_number='1', current_level='100')) 533 544 self.assertEqual(len(errs),0) 545 546 def test_checkUpdateRequirements(self): 547 # Make sure that pg students can't be updated with wrong transition. 548 err = self.processor.checkUpdateRequirements(self.student['studycourse'], 549 dict(reg_number='1', current_level='100'), self.app) 550 self.assertTrue(err is None) 551 # Since row has passed the converter, current_level is an integer. 552 err = self.processor.checkUpdateRequirements(self.student['studycourse'], 553 dict(reg_number='1', current_level=999), self.app) 554 self.assertTrue(err is None) 555 IWorkflowState(self.student).setState('returning') 556 err = self.processor.checkUpdateRequirements(self.student['studycourse'], 557 dict(reg_number='1', current_level=999), self.app) 558 self.assertEqual(err, 'Not a pg student.') 534 559 535 560 def test_import(self): … … 667 692 self.assertEqual(num_warns,2) 668 693 shutil.rmtree(os.path.dirname(fin_file)) 669 670 694 671 695 class CourseTicketProcessorTest(StudentImportExportSetup): … … 681 705 shutil.rmtree(os.path.dirname(fin_file)) 682 706 683 # Add course and c ourse referrer707 # Add course and certificate course 684 708 self.course = createObject('waeup.Course') 685 709 self.course.code = 'COURSE1' … … 689 713 self.app['faculties']['fac1']['dep1'].courses.addCourse( 690 714 self.course) 691 self.app['faculties']['fac1']['dep1'].certificates['CERT1'].addC ourseRef(715 self.app['faculties']['fac1']['dep1'].certificates['CERT1'].addCertCourse( 692 716 self.course, level=100) 693 717 … … 755 779 # Logging message from updateEntry, 756 780 self.assertTrue( 757 'INFO - system - K1000000 - Course ticket updated: code=COURSE1, '781 'INFO - system - K1000000 - Course ticket in 100 updated: code=COURSE1, ' 758 782 'mandatory=False, score=3' 759 783 in logcontent) … … 769 793 self.assertEqual(num_warns,2) 770 794 shutil.rmtree(os.path.dirname(fin_file)) 795 796 def test_import_remove(self): 797 # We perform the same import twice, 798 # the second time in remove mode. The number 799 # of warnings must be the same. 800 num, num_warns, fin_file, fail_file = self.processor.doImport( 801 self.csv_file, COURSETICKET_HEADER_FIELDS,'create') 802 assert self.processor.entryExists( 803 dict(reg_number='1', level='100', code='COURSE1'), self.app) is True 804 num, num_warns, fin_file, fail_file = self.processor.doImport( 805 self.csv_file, COURSETICKET_HEADER_FIELDS,'remove') 806 self.assertEqual(num_warns,2) 807 assert self.processor.entryExists( 808 dict(reg_number='1', level='100', code='COURSE1'), self.app) is False 809 shutil.rmtree(os.path.dirname(fin_file)) 810 logcontent = open(self.logfile).read() 811 self.assertTrue( 812 'INFO - system - K1000000 - Course ticket in 100 removed: COURSE1' 813 in logcontent) 771 814 772 815 class PaymentProcessorTest(StudentImportExportSetup): … … 784 827 self.student = self.app['students'][student.student_id] 785 828 payment = createObject(u'waeup.StudentOnlinePayment') 786 payment.p_id = 'p12 3'829 payment.p_id = 'p120' 787 830 self.student['payments'][payment.p_id] = payment 788 831 … … 798 841 self.workdir, 'sample_payment_data.csv') 799 842 open(self.csv_file, 'wb').write(PAYMENT_SAMPLE_DATA) 843 self.csv_file2 = os.path.join( 844 self.workdir, 'sample_create_payment_data.csv') 845 open(self.csv_file2, 'wb').write(PAYMENT_CREATE_SAMPLE_DATA) 800 846 801 847 def test_interface(self): … … 809 855 dict(student_id='ID_NONE', p_id='nonsense'), self.app) is None 810 856 assert self.processor.getEntry( 811 dict(student_id=self.student.student_id, p_id='p12 3'),812 self.app) is self.student['payments']['p12 3']857 dict(student_id=self.student.student_id, p_id='p120'), 858 self.app) is self.student['payments']['p120'] 813 859 assert self.processor.getEntry( 814 dict(student_id=self.student.student_id, p_id='XXXXXX123'), 815 self.app) is self.student['payments']['p123'] 860 dict(student_id=self.student.student_id, p_id='XXXXXX112'), 861 self.app) is self.student['payments']['p120'] 862 863 def test_delEntry(self): 864 assert self.processor.getEntry( 865 dict(student_id=self.student.student_id, p_id='p120'), 866 self.app) is self.student['payments']['p120'] 867 self.assertEqual(len(self.student['payments'].keys()),1) 868 self.processor.delEntry( 869 dict(student_id=self.student.student_id, p_id='p120'), 870 self.app) 871 assert self.processor.getEntry( 872 dict(student_id=self.student.student_id, p_id='p120'), 873 self.app) is None 874 self.assertEqual(len(self.student['payments'].keys()),0) 816 875 817 876 def test_addEntry(self): … … 831 890 self.app) 832 891 self.assertEqual(len(self.student['payments'].keys()),3) 833 self.assertEqual(self.student['payments']['p 456'].p_id, 'p456')892 self.assertEqual(self.student['payments']['p560'].p_id, 'p560') 834 893 835 894 def test_checkConversion(self): 836 895 errs, inv_errs, conv_dict = self.processor.checkConversion( 837 dict( reg_number='1',p_id='3816951266236341955'))896 dict(p_id='3816951266236341955')) 838 897 self.assertEqual(len(errs),0) 839 898 errs, inv_errs, conv_dict = self.processor.checkConversion( 840 dict( reg_number='1',p_id='p1266236341955'))899 dict(p_id='p1266236341955')) 841 900 self.assertEqual(len(errs),0) 842 901 errs, inv_errs, conv_dict = self.processor.checkConversion( 843 dict( reg_number='1',p_id='nonsense'))902 dict(p_id='nonsense')) 844 903 self.assertEqual(len(errs),1) 845 timestamp = "%d" % int(time()*1000)904 timestamp = ("%d" % int(time()*10000))[1:] 846 905 p_id = "p%s" % timestamp 847 906 errs, inv_errs, conv_dict = self.processor.checkConversion( 848 dict( reg_number='1',p_id=p_id))907 dict(p_id=p_id)) 849 908 self.assertEqual(len(errs),0) 850 909 … … 854 913 self.assertEqual(num_warns,0) 855 914 payment = self.processor.getEntry(dict(reg_number='1', 856 p_id='p1290797973744'), self.app) 857 self.assertEqual(payment.p_id, 'p1290797973744') 915 p_id='p2907979737440'), self.app) 916 self.assertEqual(payment.p_id, 'p2907979737440') 917 self.assertTrue(payment.p_current) 858 918 cdate = payment.creation_date.strftime("%Y-%m-%d %H:%M:%S") 859 919 self.assertEqual(cdate, "2010-11-26 18:59:33") 860 920 self.assertEqual(str(payment.creation_date.tzinfo),'UTC') 861 shutil.rmtree(os.path.dirname(fin_file)) 862 921 payment = self.processor.getEntry(dict(matric_number='100001', 922 p_id='p2907125937570'), self.app) 923 self.assertEqual(payment.p_id, 'p2907125937570') 924 self.assertFalse(payment.p_current) 925 cdate = payment.creation_date.strftime("%Y-%m-%d %H:%M:%S") 926 # Ooooh, still the old problem, see 927 # http://mail.dzug.org/mailman/archives/zope/2006-August/001153.html. 928 # WAT is interpreted as GMT-1 and not GMT+1 929 self.assertEqual(cdate, "2010-11-25 21:16:33") 930 self.assertEqual(str(payment.creation_date.tzinfo),'UTC') 931 shutil.rmtree(os.path.dirname(fin_file)) 863 932 logcontent = open(self.logfile).read() 864 # Logging message from updateEntry ,933 # Logging message from updateEntry 865 934 self.assertTrue( 866 935 'INFO - system - K1000001 - Payment ticket updated: ' 867 'p_i d=p1266236341955, p_item=BTECHBDT, '868 ' creation_date=2010-02-15 13:19:01+00:00, r_code=00, '869 ' r_amount_approved=19500.0, p_category=schoolfee, '870 ' amount_auth=19500.0,p_state=paid'936 'p_item=BTECHBDT, creation_date=2010-02-15 13:19:01+00:00, ' 937 'p_category=schoolfee, amount_auth=19500.0, p_current=True, ' 938 'p_id=p1266236341955, r_code=00, r_amount_approved=19500.0, ' 939 'p_state=paid' 871 940 in logcontent) 872 941 … … 881 950 self.assertEqual(num_warns,0) 882 951 shutil.rmtree(os.path.dirname(fin_file)) 952 953 def test_import_remove(self): 954 num, num_warns, fin_file, fail_file = self.processor.doImport( 955 self.csv_file, PAYMENT_HEADER_FIELDS,'create') 956 num, num_warns, fin_file, fail_file = self.processor.doImport( 957 self.csv_file, PAYMENT_HEADER_FIELDS,'remove') 958 self.assertEqual(num_warns,0) 959 shutil.rmtree(os.path.dirname(fin_file)) 960 logcontent = open(self.logfile).read() 961 self.assertTrue( 962 'INFO - system - K1000001 - Payment ticket removed: p1266236341955' 963 in logcontent) 964 965 def test_import_wo_pid(self): 966 num, num_warns, fin_file, fail_file = self.processor.doImport( 967 self.csv_file2, PAYMENT_CREATE_HEADER_FIELDS,'create') 968 self.assertEqual(num_warns,0) 969 shutil.rmtree(os.path.dirname(fin_file)) 970 self.assertEqual(len(self.app['students']['X666666']['payments']), 50) 971 883 972 884 973 def test_suite(): -
main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/students/tests/test_browser.py
r8779 r9209 118 118 self.manage_clearance_path = self.student_path + '/manage_clearance' 119 119 self.edit_personal_path = self.student_path + '/edit_personal' 120 self.manage_personal_path = self.student_path + '/manage_personal' 120 121 self.studycourse_path = self.student_path + '/studycourse' 121 122 self.payments_path = self.student_path + '/payments' … … 170 171 self.app['faculties']['fac1']['dep1'].courses.addCourse( 171 172 self.course) 172 self.app['faculties']['fac1']['dep1'].certificates['CERT1'].addC ourseRef(173 self.app['faculties']['fac1']['dep1'].certificates['CERT1'].addCertCourse( 173 174 self.course, level=100) 174 175 … … 403 404 layer = FunctionalLayer 404 405 406 def test_student_properties(self): 407 self.student['studycourse'].current_level = 100 408 self.assertEqual(self.student.current_level, 100) 409 self.student['studycourse'].current_session = 2011 410 self.assertEqual(self.student.current_session, 2011) 411 self.student['studycourse'].current_verdict = 'A' 412 self.assertEqual(self.student.current_verdict, 'A') 413 return 414 405 415 def test_basic_auth(self): 406 416 self.browser.addHeader('Authorization', 'Basic mgr:mgrpw') … … 454 464 self.assertEqual(self.browser.headers['Status'], '200 Ok') 455 465 self.assertEqual(self.browser.url, self.personal_path) 466 self.browser.getLink("Manage").click() 467 self.assertEqual(self.browser.headers['Status'], '200 Ok') 468 self.assertEqual(self.browser.url, self.manage_personal_path) 469 self.browser.open(self.personal_path) 456 470 self.browser.getLink("Edit").click() 457 471 self.assertEqual(self.browser.headers['Status'], '200 Ok') … … 474 488 self.assertEqual(self.browser.headers['Status'], '200 Ok') 475 489 self.assertEqual(self.browser.url, self.history_path) 476 self.assertMatches('... Student admitted by Manager...',490 self.assertMatches('...Admitted by Manager...', 477 491 self.browser.contents) 478 492 # Only the Application Slip does not exist … … 754 768 self.assertEqual(student['studycourse'].current_session, 2005) # +1 755 769 self.assertEqual(student['studycourse'].current_level, 200) # +100 756 self.assertEqual(student['studycourse'].current_verdict, ' NY') # NY= not set770 self.assertEqual(student['studycourse'].current_verdict, '0') # 0 = Zero = not set 757 771 self.assertEqual(student['studycourse'].previous_verdict, 'A') 758 772 self.browser.getControl(name="transition").value = ['register_courses'] … … 762 776 self.browser.getControl(name="transition").value = ['return'] 763 777 self.browser.getControl("Save").click() 778 return 779 780 def test_manage_pg_workflow(self): 781 # Managers can pass through the whole workflow 782 IWorkflowState(self.student).setState('school fee paid') 783 self.browser.addHeader('Authorization', 'Basic mgr:mgrpw') 784 student = self.app['students'][self.student_id] 785 self.browser.open(self.manage_student_path) 786 self.assertTrue('<option value="reset6">' in self.browser.contents) 787 self.assertTrue('<option value="register_courses">' in self.browser.contents) 788 self.assertTrue('<option value="reset5">' in self.browser.contents) 789 self.certificate.study_mode = 'pg_ft' 790 self.browser.open(self.manage_student_path) 791 self.assertFalse('<option value="reset6">' in self.browser.contents) 792 self.assertFalse('<option value="register_courses">' in self.browser.contents) 793 self.assertTrue('<option value="reset5">' in self.browser.contents) 764 794 return 765 795 … … 776 806 self.browser.addHeader('Authorization', 'Basic mgr:mgrpw') 777 807 self.browser.open(datacenter_path) 778 self.browser.getLink('Upload CSV file').click()808 self.browser.getLink('Upload data').click() 779 809 filecontents = StringIO(open('students.csv', 'rb').read()) 780 810 filewidget = self.browser.getControl(name='uploadfile:file') 781 811 filewidget.add_file(filecontents, 'text/plain', 'students.csv') 782 812 self.browser.getControl(name='SUBMIT').click() 783 self.browser.getLink(' Batch processing').click()813 self.browser.getLink('Process data').click() 784 814 button = lookup_submit_value( 785 815 'select', 'students_zope.mgr.csv', self.browser) … … 802 832 """) 803 833 self.browser.open(datacenter_path) 804 self.browser.getLink('Upload CSV file').click()834 self.browser.getLink('Upload data').click() 805 835 filecontents = StringIO(open('studycourses.csv', 'rb').read()) 806 836 filewidget = self.browser.getControl(name='uploadfile:file') 807 837 filewidget.add_file(filecontents, 'text/plain', 'studycourses.csv') 808 838 self.browser.getControl(name='SUBMIT').click() 809 self.browser.getLink(' Batch processing').click()839 self.browser.getLink('Process data').click() 810 840 button = lookup_submit_value( 811 841 'select', 'studycourses_zope.mgr.csv', self.browser) … … 917 947 self.assertTrue('clearance started' in self.browser.contents) 918 948 self.browser.open(self.history_path) 919 self.assertTrue("Reset to 'clearance ' by My Public Name" in949 self.assertTrue("Reset to 'clearance started' by My Public Name" in 920 950 self.browser.contents) 921 951 IWorkflowInfo(self.student).fireTransition('request_clearance') … … 946 976 self.app['users'].addUser('mrsadvise', 'mrsadvisesecret') 947 977 self.app['users']['mrsadvise'].email = 'mradvise@foo.ng' 948 self.app['users']['mrsadvise'].title = 'Helen Procter'978 self.app['users']['mrsadvise'].title = u'Helen Procter' 949 979 # Assign local CourseAdviser100 role for a certificate 950 980 cert = self.app['faculties']['fac1']['dep1'].certificates['CERT1'] … … 997 1027 # the 100L CA does see the 'Validate' button 998 1028 self.browser.open(L110_student_path) 999 self.assertFalse('Validate ' in self.browser.contents)1029 self.assertFalse('Validate courses' in self.browser.contents) 1000 1030 IWorkflowInfo(self.student).fireTransition('register_courses') 1001 1031 self.browser.open(L110_student_path) 1002 self.assertFalse('Validate ' in self.browser.contents)1032 self.assertFalse('Validate courses' in self.browser.contents) 1003 1033 self.student['studycourse'].current_level = 110 1004 1034 self.browser.open(L110_student_path) 1005 self.assertTrue('Validate ' in self.browser.contents)1035 self.assertTrue('Validate courses' in self.browser.contents) 1006 1036 # ... but a 100L CA does not see the button on other levels 1007 1037 studylevel2 = StudentStudyLevel() … … 1011 1041 L200_student_path = self.studycourse_path + '/200' 1012 1042 self.browser.open(L200_student_path) 1013 self.assertFalse('Validate ' in self.browser.contents)1043 self.assertFalse('Validate courses' in self.browser.contents) 1014 1044 self.browser.open(L110_student_path) 1015 1045 self.browser.getLink("Validate courses").click() 1016 1046 self.assertTrue('Course list has been validated' in self.browser.contents) 1017 1047 self.assertTrue('courses validated' in self.browser.contents) 1048 self.assertEqual(self.student['studycourse']['110'].validated_by, 1049 'Helen Procter') 1050 self.assertMatches( 1051 '<YYYY-MM-DD hh:mm:ss>', 1052 self.student['studycourse']['110'].validation_date.strftime( 1053 "%Y-%m-%d %H:%M:%S")) 1018 1054 self.browser.getLink("Reject courses").click() 1019 1055 self.assertTrue('Course list request has been annulled.' … … 1023 1059 '/contactstudent?subject=%s' % urlmessage) 1024 1060 self.assertTrue('school fee paid' in self.browser.contents) 1061 self.assertTrue(self.student['studycourse']['110'].validated_by is None) 1062 self.assertTrue(self.student['studycourse']['110'].validation_date is None) 1025 1063 IWorkflowInfo(self.student).fireTransition('register_courses') 1026 1064 self.browser.open(L110_student_path) … … 1142 1180 # and can perform actions 1143 1181 IWorkflowInfo(self.student).fireTransition('admit') 1182 # Students can't login if their account is suspended/deactivated 1183 self.student.suspended = True 1144 1184 self.browser.open(self.login_path) 1145 1185 self.browser.getControl(name="form.login").value = self.student_id 1146 1186 self.browser.getControl(name="form.password").value = 'spwd' 1147 1187 self.browser.getControl("Login").click() 1148 # Student can upload a passport picture 1188 self.assertTrue( 1189 'Your account has been deactivated.' in self.browser.contents) 1190 self.student.suspended = False 1191 self.browser.getControl("Login").click() 1192 self.assertTrue( 1193 'You logged in.' in self.browser.contents) 1194 # Admitted student can upload a passport picture 1149 1195 self.browser.open(self.student_path + '/change_portrait') 1150 1196 ctrl = self.browser.getControl(name='passportuploadedit') … … 1157 1203 '<img align="middle" height="125px" src="passport.jpg" />' 1158 1204 in self.browser.contents) 1205 # Students can open admission letter 1206 self.browser.getLink("Base Data").click() 1207 self.browser.getLink("Download admission letter").click() 1208 self.assertEqual(self.browser.headers['Status'], '200 Ok') 1209 self.assertEqual(self.browser.headers['Content-Type'], 'application/pdf') 1159 1210 # Student can view the clearance data 1211 self.browser.open(self.student_path) 1160 1212 self.browser.getLink("Clearance Data").click() 1161 1213 # Student can't open clearance edit form before starting clearance … … 1170 1222 self.assertMatches('...Not all required fields filled...', 1171 1223 self.browser.contents) 1172 self.student.email = 'aa@aa.ng' 1224 self.browser.open(self.student_path + '/edit_base') 1225 self.browser.getControl(name="form.email").value = 'aa@aa.ng' 1226 self.browser.getControl("Save").click() 1173 1227 self.browser.open(self.student_path + '/start_clearance') 1174 1228 self.browser.getControl(name="ac_series").value = '3' … … 1185 1239 # Set the correct owner 1186 1240 self.existing_clrac.owner = self.student_id 1241 # clr_code might be set (and thus returns None) due importing 1242 # an empty clr_code column. 1243 self.student.clr_code = None 1187 1244 self.browser.getControl("Start clearance now").click() 1188 1245 self.assertMatches('...Clearance process has been started...', … … 1235 1292 self.browser.getControl("Create course list now").click() 1236 1293 self.browser.getLink("100").click() 1237 self.browser.getLink(" Add and remove courses").click()1294 self.browser.getLink("Edit course list").click() 1238 1295 self.browser.getControl("Add course ticket").click() 1239 1296 self.browser.getControl(name="form.course").value = ['COURSE1'] … … 1248 1305 self.browser.getControl("Create course list now").click() 1249 1306 self.browser.getLink("200").click() 1250 self.browser.getLink(" Add and remove courses").click()1307 self.browser.getLink("Edit course list").click() 1251 1308 self.browser.getControl("Add course ticket").click() 1252 1309 self.browser.getControl(name="form.course").value = ['COURSE1'] … … 1286 1343 self.assertEqual(self.student.state, 'courses registered') 1287 1344 return 1345 1346 def test_student_clearance_wo_clrcode(self): 1347 IWorkflowState(self.student).setState('clearance started') 1348 self.browser.open(self.login_path) 1349 self.browser.getControl(name="form.login").value = self.student_id 1350 self.browser.getControl(name="form.password").value = 'spwd' 1351 self.browser.getControl("Login").click() 1352 self.student.clearance_locked = False 1353 self.browser.open(self.edit_clearance_path) 1354 self.browser.getControl(name="form.date_of_birth").value = '09/10/1961' 1355 self.browser.getControl("Save and request clearance").click() 1356 self.assertMatches('...Clearance has been requested...', 1357 self.browser.contents) 1288 1358 1289 1359 def test_manage_payments(self): … … 1516 1586 # The new SFE-0 pin can be used for starting new session 1517 1587 self.browser.open(self.studycourse_path) 1518 self.browser.getLink('Start session').click()1588 self.browser.getLink('Start new session').click() 1519 1589 pin = self.app['accesscodes']['SFE-0'].keys()[0] 1520 1590 parts = pin.split('-')[1:] … … 1528 1598 return 1529 1599 1530 def test_postgraduate_payments(self): 1600 def test_student_previous_payments(self): 1601 configuration = createObject('waeup.SessionConfiguration') 1602 configuration.academic_session = 2000 1603 configuration.clearance_fee = 3456.0 1604 configuration.booking_fee = 123.4 1605 self.student['studycourse'].entry_session = 2002 1606 self.app['configuration'].addSessionConfiguration(configuration) 1607 configuration2 = createObject('waeup.SessionConfiguration') 1608 configuration2.academic_session = 2003 1609 configuration2.clearance_fee = 3456.0 1610 configuration2.booking_fee = 123.4 1611 self.student['studycourse'].entry_session = 2002 1612 self.app['configuration'].addSessionConfiguration(configuration2) 1613 # Login 1614 self.browser.open(self.login_path) 1615 self.browser.getControl(name="form.login").value = self.student_id 1616 self.browser.getControl(name="form.password").value = 'spwd' 1617 self.browser.getControl("Login").click() 1618 1619 # Students can add previous school fee payment tickets in any state. 1620 IWorkflowState(self.student).setState('courses registered') 1621 self.browser.open(self.payments_path) 1622 self.browser.getControl("Add online payment ticket").click() 1623 self.browser.getControl(name="form.p_category").value = ['schoolfee'] 1624 self.browser.getControl("Create ticket").click() 1625 1626 # Amount cannot be determined since the state is not 1627 # 'cleared' or 'returning' 1628 self.assertMatches('...Amount could not be determined...', 1629 self.browser.contents) 1630 self.assertMatches('...Would you like to pay for a previous session?...', 1631 self.browser.contents) 1632 1633 # Previous session payment form is provided 1634 self.browser.getControl(name="form.p_category").value = ['schoolfee'] 1635 self.browser.getControl(name="form.p_session").value = ['2000'] 1636 self.browser.getControl(name="form.p_level").value = ['300'] 1637 self.browser.getControl("Create ticket").click() 1638 self.assertMatches('...The previous session must not fall below...', 1639 self.browser.contents) 1640 self.browser.getControl(name="form.p_category").value = ['schoolfee'] 1641 self.browser.getControl(name="form.p_session").value = ['2004'] 1642 self.browser.getControl(name="form.p_level").value = ['300'] 1643 self.browser.getControl("Create ticket").click() 1644 self.assertMatches('...This is not a previous session...', 1645 self.browser.contents) 1646 self.browser.getControl(name="form.p_category").value = ['schoolfee'] 1647 self.browser.getControl(name="form.p_session").value = ['2003'] 1648 self.browser.getControl(name="form.p_level").value = ['300'] 1649 self.browser.getControl("Create ticket").click() 1650 self.assertMatches('...ticket created...', 1651 self.browser.contents) 1652 ctrl = self.browser.getControl(name='val_id') 1653 value = ctrl.options[0] 1654 self.browser.getLink(value).click() 1655 self.assertMatches('...Amount Authorized...', 1656 self.browser.contents) 1657 self.assertEqual(self.student['payments'][value].amount_auth, 20000.0) 1658 1659 # Payment session is properly set 1660 self.assertEqual(self.student['payments'][value].p_session, 2003) 1661 self.assertEqual(self.student['payments'][value].p_level, 300) 1662 1663 # We simulate the approval 1664 self.browser.open(self.browser.url + '/fake_approve') 1665 self.assertMatches('...Payment approved...', 1666 self.browser.contents) 1667 1668 # No AC has been created 1669 self.assertEqual(len(self.app['accesscodes']['SFE-0'].keys()), 0) 1670 self.assertTrue(self.student['payments'][value].ac is None) 1671 1672 # Current payment flag is set False 1673 self.assertFalse(self.student['payments'][value].p_current) 1674 return 1675 1676 def test_student_postgraduate_payments(self): 1531 1677 self.certificate.study_mode = 'pg_ft' 1532 1678 self.certificate.start_level = 999 … … 1552 1698 self.browser.contents) 1553 1699 # Payment session and level are current ones. 1554 # Postgrads have to school_fee_1.1700 # Postgrads have to pay school_fee_1. 1555 1701 self.assertEqual(self.student['payments'][value].amount_auth, 40000.0) 1556 1702 self.assertEqual(self.student['payments'][value].p_session, 2004) … … 1565 1711 # The new SFE-0 pin can be used for starting session 1566 1712 self.browser.open(self.studycourse_path) 1567 self.browser.getLink('Start session').click()1713 self.browser.getLink('Start new session').click() 1568 1714 pin = self.app['accesscodes']['SFE-0'].keys()[0] 1569 1715 parts = pin.split('-')[1:] … … 1605 1751 # The new SFE-1 pin can be used for starting new session 1606 1752 self.browser.open(self.studycourse_path) 1607 self.browser.getLink('Start session').click()1753 self.browser.getLink('Start new session').click() 1608 1754 self.browser.getControl(name="ac_series").value = sfeseries 1609 1755 self.browser.getControl(name="ac_number").value = sfenumber … … 1847 1993 self.browser.getControl(name="form.identifier").value = '123' 1848 1994 self.browser.getControl(name="form.email").value = 'aa@aa.ng' 1849 self.browser.getControl(" Getlogin credentials").click()1995 self.browser.getControl("Send login credentials").click() 1850 1996 self.assertTrue('An email with' in self.browser.contents) 1851 1852 def test_reindex(self):1853 self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')1854 self.browser.open('http://localhost/app/reindex')1855 self.assertTrue('No catalog name provided' in self.browser.contents)1856 self.browser.open('http://localhost/app/reindex?ctlg=xyz')1857 self.assertTrue('xyz_catalog does not exist' in self.browser.contents)1858 cat = queryUtility(ICatalog, name='students_catalog')1859 results = cat.searchResults(student_id=(None, None))1860 self.assertEqual(len(results),1)1861 cat.clear()1862 results = cat.searchResults(student_id=(None, None))1863 self.assertEqual(len(results),0)1864 self.browser.open('http://localhost/app/reindex?ctlg=students')1865 self.assertTrue('1 students re-indexed' in self.browser.contents)1866 results = cat.searchResults(student_id=(None, None))1867 self.assertEqual(len(results),1)1868 1997 1869 1998 def test_change_current_mode(self): … … 1888 2017 self.assertTrue('Employer' in self.browser.contents) 1889 2018 2019 def test_activate_deactivate_buttons(self): 2020 self.browser.addHeader('Authorization', 'Basic mgr:mgrpw') 2021 self.browser.open(self.student_path) 2022 self.browser.getLink("Deactivate").click() 2023 self.assertTrue( 2024 'Student account has been deactivated.' in self.browser.contents) 2025 self.assertTrue( 2026 'Base Data (account deactivated)' in self.browser.contents) 2027 self.assertTrue(self.student.suspended) 2028 self.browser.getLink("Activate").click() 2029 self.assertTrue( 2030 'Student account has been activated.' in self.browser.contents) 2031 self.assertFalse( 2032 'Base Data (account deactivated)' in self.browser.contents) 2033 self.assertFalse(self.student.suspended) 2034 # History messages have been added ... 2035 self.browser.getLink("History").click() 2036 self.assertTrue( 2037 'Student account deactivated by Manager<br />' in self.browser.contents) 2038 self.assertTrue( 2039 'Student account activated by Manager<br />' in self.browser.contents) 2040 # ... and actions have been logged. 2041 logfile = os.path.join( 2042 self.app['datacenter'].storage, 'logs', 'students.log') 2043 logcontent = open(logfile).read() 2044 self.assertTrue('zope.mgr - students.browser.StudentDeactivatePage - ' 2045 'K1000000 - account deactivated' in logcontent) 2046 self.assertTrue('zope.mgr - students.browser.StudentActivatePage - ' 2047 'K1000000 - account activated' in logcontent) 2048 2049 def test_student_transfer(self): 2050 # Add second certificate 2051 self.certificate2 = createObject('waeup.Certificate') 2052 self.certificate2.code = u'CERT2' 2053 self.certificate2.study_mode = 'ug_ft' 2054 self.certificate2.start_level = 999 2055 self.certificate2.end_level = 999 2056 self.app['faculties']['fac1']['dep1'].certificates.addCertificate( 2057 self.certificate2) 2058 2059 # Add study level to old study course 2060 studylevel = createObject(u'waeup.StudentStudyLevel') 2061 studylevel.level = 200 2062 self.student['studycourse'].addStudentStudyLevel( 2063 self.certificate, studylevel) 2064 2065 self.browser.addHeader('Authorization', 'Basic mgr:mgrpw') 2066 self.browser.open(self.student_path) 2067 self.browser.getLink("Transfer").click() 2068 self.browser.getControl(name="form.certificate").value = ['CERT2'] 2069 self.browser.getControl(name="form.current_session").value = ['2011'] 2070 self.browser.getControl(name="form.current_level").value = ['200'] 2071 self.browser.getControl("Transfer").click() 2072 self.assertTrue( 2073 'Current level does not match certificate levels' 2074 in self.browser.contents) 2075 self.browser.getControl(name="form.current_level").value = ['999'] 2076 self.browser.getControl("Transfer").click() 2077 self.assertTrue('Successfully transferred' in self.browser.contents) 2078 2079 # Add study level to new study course 2080 studylevel = createObject(u'waeup.StudentStudyLevel') 2081 studylevel.level = 200 2082 self.student['studycourse'].addStudentStudyLevel( 2083 self.certificate, studylevel) 2084 2085 # Edit and add pages are locked for old study courses 2086 self.browser.open(self.student_path + '/studycourse/manage') 2087 self.assertFalse('The requested form is locked' in self.browser.contents) 2088 self.browser.open(self.student_path + '/studycourse_1/manage') 2089 self.assertTrue('The requested form is locked' in self.browser.contents) 2090 2091 self.browser.open(self.student_path + '/studycourse/start_session') 2092 self.assertFalse('The requested form is locked' in self.browser.contents) 2093 self.browser.open(self.student_path + '/studycourse_1/start_session') 2094 self.assertTrue('The requested form is locked' in self.browser.contents) 2095 2096 IWorkflowState(self.student).setState('school fee paid') 2097 self.browser.open(self.student_path + '/studycourse/add') 2098 self.assertFalse('The requested form is locked' in self.browser.contents) 2099 self.browser.open(self.student_path + '/studycourse_1/add') 2100 self.assertTrue('The requested form is locked' in self.browser.contents) 2101 2102 self.browser.open(self.student_path + '/studycourse/200/manage') 2103 self.assertFalse('The requested form is locked' in self.browser.contents) 2104 self.browser.open(self.student_path + '/studycourse_1/200/manage') 2105 self.assertTrue('The requested form is locked' in self.browser.contents) 2106 2107 self.browser.open(self.student_path + '/studycourse/200/validate_courses') 2108 self.assertFalse('The requested form is locked' in self.browser.contents) 2109 self.browser.open(self.student_path + '/studycourse_1/200/validate_courses') 2110 self.assertTrue('The requested form is locked' in self.browser.contents) 2111 2112 self.browser.open(self.student_path + '/studycourse/200/reject_courses') 2113 self.assertFalse('The requested form is locked' in self.browser.contents) 2114 self.browser.open(self.student_path + '/studycourse_1/200/reject_courses') 2115 self.assertTrue('The requested form is locked' in self.browser.contents) 2116 2117 self.browser.open(self.student_path + '/studycourse/200/add') 2118 self.assertFalse('The requested form is locked' in self.browser.contents) 2119 self.browser.open(self.student_path + '/studycourse_1/200/add') 2120 self.assertTrue('The requested form is locked' in self.browser.contents) 2121 2122 self.browser.open(self.student_path + '/studycourse/200/edit') 2123 self.assertFalse('The requested form is locked' in self.browser.contents) 2124 self.browser.open(self.student_path + '/studycourse_1/200/edit') 2125 self.assertTrue('The requested form is locked' in self.browser.contents) 2126 1890 2127 class StudentRequestPWTests(StudentsFullSetup): 1891 2128 # Tests for student registration … … 1894 2131 1895 2132 def test_request_pw(self): 1896 # Student with wrong reg_number can't be found.2133 # Student with wrong number can't be found. 1897 2134 self.browser.open('http://localhost/app/requestpw') 1898 2135 self.browser.getControl(name="form.firstname").value = 'Anna' 1899 self.browser.getControl(name="form. reg_number").value = 'anynumber'2136 self.browser.getControl(name="form.number").value = 'anynumber' 1900 2137 self.browser.getControl(name="form.email").value = 'xx@yy.zz' 1901 self.browser.getControl(" Getlogin credentials").click()2138 self.browser.getControl("Send login credentials").click() 1902 2139 self.assertTrue('No student record found.' 1903 2140 in self.browser.contents) … … 1906 2143 self.browser.open('http://localhost/app/requestpw') 1907 2144 self.browser.getControl(name="form.firstname").value = 'Johnny' 1908 self.browser.getControl(name="form. reg_number").value = '123'2145 self.browser.getControl(name="form.number").value = '123' 1909 2146 self.browser.getControl(name="form.email").value = 'xx@yy.zz' 1910 self.browser.getControl(" Getlogin credentials").click()2147 self.browser.getControl("Send login credentials").click() 1911 2148 self.assertTrue('No student record found.' 1912 2149 in self.browser.contents) … … 1914 2151 # password has been set and used. 1915 2152 self.browser.getControl(name="form.firstname").value = 'Anna' 1916 self.browser.getControl(name="form. reg_number").value = '123'1917 self.browser.getControl(" Getlogin credentials").click()2153 self.browser.getControl(name="form.number").value = '123' 2154 self.browser.getControl("Send login credentials").click() 1918 2155 self.assertTrue('Your password has already been set and used.' 1919 2156 in self.browser.contents) … … 1922 2159 # The firstname field, used for verification, is not case-sensitive. 1923 2160 self.browser.getControl(name="form.firstname").value = 'aNNa' 1924 self.browser.getControl(name="form. reg_number").value = '123'2161 self.browser.getControl(name="form.number").value = '123' 1925 2162 self.browser.getControl(name="form.email").value = 'new@yy.zz' 1926 self.browser.getControl(" Getlogin credentials").click()2163 self.browser.getControl("Send login credentials").click() 1927 2164 # Yeah, we succeded ... 2165 self.assertTrue('Your password request was successful.' 2166 in self.browser.contents) 2167 # We can also use the matric_number instead. 2168 self.browser.open('http://localhost/app/requestpw') 2169 self.browser.getControl(name="form.firstname").value = 'aNNa' 2170 self.browser.getControl(name="form.number").value = '234' 2171 self.browser.getControl(name="form.email").value = 'new@yy.zz' 2172 self.browser.getControl("Send login credentials").click() 1928 2173 self.assertTrue('Your password request was successful.' 1929 2174 in self.browser.contents) … … 1934 2179 email=('new@yy.zz', 'new@yy.zz'))) 1935 2180 self.assertEqual(self.student,results[0]) 2181 logfile = os.path.join( 2182 self.app['datacenter'].storage, 'logs', 'main.log') 2183 logcontent = open(logfile).read() 2184 self.assertTrue('zope.anybody - students.browser.StudentRequestPasswordPage - ' 2185 '234 (K1000000) - new@yy.zz' in logcontent) 1936 2186 return -
main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/students/tests/test_dynamicroles.py
r7811 r9209 25 25 Test as APRMTest, Manageable) 26 26 from waeup.kofa.testing import FunctionalLayer 27 from waeup.kofa.app import University 27 28 from waeup.kofa.students.tests.test_browser import StudentsFullSetup 28 29 from waeup.kofa.students import Student, StudentPrincipalRoleManager … … 48 49 def setUp(self): 49 50 super(StudentPrincipalRoleManagerFunctionalTests, self).setUp() 50 self.officer_role = 'waeup.StudentsClearanceOfficer'51 51 # assign clearance permissions for a virtual officer 52 52 prm = IPrincipalRoleManager(self.app['faculties']['fac1']['dep1']) 53 53 prm.assignRoleToPrincipal('waeup.local.ClearanceOfficer', 'alice') 54 prm.assignRoleToPrincipal('waeup.local.PGClearanceOfficer', 'bob') 55 prm.assignRoleToPrincipal('waeup.local.UGClearanceOfficer', 'anne') 54 56 return 55 57 … … 74 76 # student 75 77 prm = IPrincipalRoleManager(self.student) 76 result = prm.getRolesForPrincipal(' bob')78 result = prm.getRolesForPrincipal('claus') 77 79 self.assertEqual(result, []) 78 80 return … … 83 85 prm = IPrincipalRoleManager(self.student) 84 86 result = prm.getRolesForPrincipal('alice') 85 self.assertEqual(result, [(self.officer_role, Allow)]) 87 self.assertEqual(result, [('waeup.StudentsClearanceOfficer', Allow)]) 88 # Student is a UG student 89 self.assertFalse(self.student.is_postgrad) 90 result = prm.getRolesForPrincipal('bob') 91 self.assertEqual(result, [('waeup.StudentsOfficer', Allow)]) 92 result = prm.getRolesForPrincipal('anne') 93 self.assertEqual(result, [('waeup.StudentsClearanceOfficer', Allow)]) 94 # Make student a PG student 95 self.certificate.study_mode = u'pg_ft' 96 self.assertTrue(self.student.is_postgrad) 97 result = prm.getRolesForPrincipal('bob') 98 # The dynamic roles changed 99 self.assertEqual(result, [('waeup.StudentsClearanceOfficer', Allow)]) 100 result = prm.getRolesForPrincipal('anne') 101 self.assertEqual(result, [('waeup.StudentsOfficer', Allow)]) 86 102 return -
main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/students/tests/test_export.py
r8621 r9209 44 44 'adm_code,clearance_locked,clr_code,date_of_birth,email,employer,' 45 45 'firstname,lastname,matric_number,middlename,nationality,' 46 'perm_address,phone,reg_number,sex,student_id, password,'46 'perm_address,phone,reg_number,sex,student_id,suspended,password,' 47 47 'state,history,certcode\r\n' 48 48 49 49 'my adm code,0,my clr code,1981-02-04#,anna@sample.com,,' 50 'Anna,Tester, M123456,M.,NG,"Studentroad 21\nLagos 123456\n",'51 '+234-123-12345 ,123456,f,A111111,,created'50 'Anna,Tester,234,M.,NG,"Studentroad 21\nLagos 123456\n",' 51 '+234-123-12345#,123,f,A111111,0,,created' 52 52 in result 53 53 ) … … 64 64 'adm_code,clearance_locked,clr_code,date_of_birth,email,employer,' 65 65 'firstname,lastname,matric_number,middlename,nationality,' 66 'perm_address,phone,reg_number,sex,student_id, password,'66 'perm_address,phone,reg_number,sex,student_id,suspended,password,' 67 67 'state,history,certcode\r\n' 68 68 69 69 'my adm code,0,my clr code,1981-02-04#,anna@sample.com,,' 70 'Anna,Tester, M123456,M.,NG,"Studentroad 21\nLagos 123456\n",'71 '+234-123-12345 ,123456,f,A111111,,created'70 'Anna,Tester,234,M.,NG,"Studentroad 21\nLagos 123456\n",' 71 '+234-123-12345#,123,f,A111111,0,,created' 72 72 in result 73 73 ) … … 83 83 'adm_code,clearance_locked,clr_code,date_of_birth,email,employer,' 84 84 'firstname,lastname,matric_number,middlename,nationality,' 85 'perm_address,phone,reg_number,sex,student_id, password,'85 'perm_address,phone,reg_number,sex,student_id,suspended,password,' 86 86 'state,history,certcode\r\n' 87 87 88 88 'my adm code,0,my clr code,1981-02-04#,anna@sample.com,,' 89 'Anna,Tester, M123456,M.,NG,"Studentroad 21\nLagos 123456\n",'90 '+234-123-12345 ,123456,f,A111111,,created'89 'Anna,Tester,234,M.,NG,"Studentroad 21\nLagos 123456\n",' 90 '+234-123-12345#,123,f,A111111,0,,created' 91 91 in result 92 92 ) … … 127 127 'entry_mode,entry_session,previous_verdict,student_id\r\n' 128 128 129 ',,, NY,,,NY,\r\n'129 ',,,0,,,0,\r\n' 130 130 ) 131 131 return … … 144 144 'entry_mode,entry_session,previous_verdict,student_id\r\n' 145 145 146 'CERT1,200,2012, NY,ug_ft,2010,NY,A111111\r\n'146 'CERT1,200,2012,0,ug_ft,2010,0,A111111\r\n' 147 147 ) 148 148 return … … 160 160 'entry_mode,entry_session,previous_verdict,student_id\r\n' 161 161 162 'CERT1,200,2012, NY,ug_ft,2010,NY,A111111\r\n'162 'CERT1,200,2012,0,ug_ft,2010,0,A111111\r\n' 163 163 ) 164 164 return … … 175 175 'entry_mode,entry_session,previous_verdict,student_id\r\n' 176 176 177 'CERT1,200,2012, NY,ug_ft,2010,NY,A111111\r\n'177 'CERT1,200,2012,0,ug_ft,2010,0,A111111\r\n' 178 178 ) 179 179 return … … 209 209 self.assertEqual( 210 210 result, 211 'level,level_session,level_verdict,student_id\r\n' 212 ',,NY,\r\n' 211 'level,level_session,level_verdict,validated_by,validation_date,' 212 'student_id\r\n' 213 ',,0,,,\r\n' 213 214 ) 214 215 return … … 225 226 self.assertEqual( 226 227 result, 227 'level,level_session,level_verdict,student_id\r\n' 228 '100,2012,A,A111111\r\n' 228 'level,level_session,level_verdict,validated_by,validation_date,' 229 'student_id\r\n' 230 '100,2012,A,,,A111111\r\n' 229 231 ) 230 232 return … … 239 241 self.assertEqual( 240 242 result, 241 'level,level_session,level_verdict,student_id\r\n' 242 '100,2012,A,A111111\r\n' 243 'level,level_session,level_verdict,validated_by,validation_date,' 244 'student_id\r\n' 245 '100,2012,A,,,A111111\r\n' 243 246 ) 244 247 return … … 252 255 self.assertEqual( 253 256 result, 254 'level,level_session,level_verdict,student_id\r\n' 255 '100,2012,A,A111111\r\n' 257 'level,level_session,level_verdict,validated_by,validation_date,' 258 'student_id\r\n' 259 '100,2012,A,,,A111111\r\n' 256 260 ) 257 261 return … … 371 375 self.assertEqual( 372 376 result, 373 'ac,amount_auth,creation_date,p_category,p_ id,'377 'ac,amount_auth,creation_date,p_category,p_current,p_id,' 374 378 'p_item,p_level,p_session,p_state,payment_date,r_amount_approved,' 375 379 'r_code,r_desc,student_id\r\n' 376 380 377 ',0.0,2012-04-01 13:12:01,schoolfee, ,,,,unpaid,,0.0,,,\r\n'381 ',0.0,2012-04-01 13:12:01,schoolfee,1,,,,,unpaid,,0.0,,,\r\n' 378 382 ) 379 383 return … … 389 393 self.assertEqual( 390 394 result, 391 'ac,amount_auth,creation_date,p_category,p_ id,'395 'ac,amount_auth,creation_date,p_category,p_current,p_id,' 392 396 'p_item,p_level,p_session,p_state,payment_date,r_amount_approved,' 393 397 'r_code,r_desc,student_id\r\n' 394 398 395 '666,0.0,2012-04-01 13:12:01,schoolfee, my-id,'399 '666,0.0,2012-04-01 13:12:01,schoolfee,1,my-id,' 396 400 'p-item,100,2012,unpaid,2012-04-01 14:12:01,12.12,' 397 401 'r-code,,A111111\r\n' … … 408 412 self.assertEqual( 409 413 result, 410 'ac,amount_auth,creation_date,p_category,p_ id,'414 'ac,amount_auth,creation_date,p_category,p_current,p_id,' 411 415 'p_item,p_level,p_session,p_state,payment_date,r_amount_approved,' 412 416 'r_code,r_desc,student_id\r\n' 413 417 414 '666,0.0,2012-04-01 13:12:01,schoolfee, my-id,'418 '666,0.0,2012-04-01 13:12:01,schoolfee,1,my-id,' 415 419 'p-item,100,2012,unpaid,2012-04-01 14:12:01,12.12,' 416 420 'r-code,,A111111\r\n' … … 427 431 self.assertEqual( 428 432 result, 429 'ac,amount_auth,creation_date,p_category,p_ id,'433 'ac,amount_auth,creation_date,p_category,p_current,p_id,' 430 434 'p_item,p_level,p_session,p_state,payment_date,r_amount_approved,' 431 435 'r_code,r_desc,student_id\r\n' 432 436 433 '666,0.0,2012-04-01 13:12:01,schoolfee, my-id,'437 '666,0.0,2012-04-01 13:12:01,schoolfee,1,my-id,' 434 438 'p-item,100,2012,unpaid,2012-04-01 14:12:01,12.12,' 435 439 'r-code,,A111111\r\n' -
main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/students/tests/test_student.py
r8735 r9209 21 21 import re 22 22 import unittest 23 import grok 23 24 from cStringIO import StringIO 24 25 from datetime import tzinfo 25 from zope.component import getUtility 26 from zope.component import getUtility, queryUtility, createObject 27 from zope.catalog.interfaces import ICatalog 26 28 from zope.component.interfaces import IFactory 29 from zope.event import notify 27 30 from zope.interface import verify 31 from zope.schema.interfaces import RequiredMissing 28 32 from waeup.kofa.interfaces import IExtFileStore, IFileStoreNameChooser 29 33 from waeup.kofa.students.export import EXPORTER_NAMES … … 129 133 studylevel = StudentStudyLevel() 130 134 self.assertRaises( 131 TypeError, studylevel.addCourseTicket, department )135 TypeError, studylevel.addCourseTicket, department, department) 132 136 133 137 def test_booking_date(self): … … 236 240 return 237 241 242 class StudentTransferTests(StudentImportExportSetup): 243 244 layer = FunctionalLayer 245 246 def setUp(self): 247 super(StudentTransferTests, self).setUp() 248 249 # Add additional certificate 250 self.certificate2 = createObject('waeup.Certificate') 251 self.certificate2.code = 'CERT2' 252 self.certificate2.application_category = 'basic' 253 self.certificate2.start_level = 200 254 self.certificate2.end_level = 500 255 self.app['faculties']['fac1']['dep1'].certificates.addCertificate( 256 self.certificate2) 257 258 # Add student with subobjects 259 student = Student() 260 self.app['students'].addStudent(student) 261 student = self.setup_student(student) 262 notify(grok.ObjectModifiedEvent(student)) 263 self.student = self.app['students'][student.student_id] 264 return 265 266 def test_transfer_student(self): 267 self.assertRaises( 268 RequiredMissing, self.student.transfer, self.certificate2) 269 error = self.student.transfer(self.certificate2, current_session=1000) 270 self.assertTrue(error == -1) 271 error = self.student.transfer(self.certificate2, current_session=2013) 272 self.assertTrue(error == None) 273 self.assertEqual(self.student['studycourse_1'].certificate.code, 'CERT1') 274 self.assertEqual(self.student['studycourse'].certificate.code, 'CERT2') 275 self.assertEqual(self.student['studycourse_1'].current_session, 2012) 276 self.assertEqual(self.student['studycourse'].current_session, 2013) 277 self.assertEqual(self.student['studycourse'].entry_session, 278 self.student['studycourse_1'].entry_session) 279 self.assertEqual(self.student['studycourse_1'].__name__, 'studycourse_1') 280 logfile = os.path.join( 281 self.app['datacenter'].storage, 'logs', 'students.log') 282 logcontent = open(logfile).read() 283 self.assertTrue('system - K1000000 - transferred from CERT1 to CERT2' 284 in logcontent) 285 messages = ' '.join(self.student.history.messages) 286 self.assertMatches( 287 '...<YYYY-MM-DD hh:mm:ss> UTC - ' 288 'Transferred from CERT1 to CERT2 by system', messages) 289 290 # The students_catalog has been updated. 291 cat = queryUtility(ICatalog, name='students_catalog') 292 results = cat.searchResults(certcode=('CERT1', 'CERT1')) 293 results = [x for x in results] 294 self.assertEqual(len(results), 0) 295 results = cat.searchResults(certcode=('CERT2', 'CERT2')) 296 results = [x for x in results] 297 self.assertEqual(len(results), 1) 298 assert results[0] is self.app['students'][self.student.student_id] 299 results = cat.searchResults(current_session=(2013,2013)) 300 results = [x for x in results] 301 self.assertEqual(len(results), 1) 302 assert results[0] is self.app['students'][self.student.student_id] 303 304 # Students can be transferred (only) two times. 305 error = self.student.transfer(self.certificate, 306 current_session=2013) 307 self.assertTrue(error == None) 308 error = self.student.transfer(self.certificate2, 309 current_session=2013) 310 self.assertTrue(error == -3) 311 self.assertEqual([i for i in self.student.keys()], 312 [u'accommodation', u'payments', u'studycourse', 313 u'studycourse_1', u'studycourse_2']) 314 315 # The students_catalog has been updated again. 316 cat = queryUtility(ICatalog, name='students_catalog') 317 results = cat.searchResults(certcode=('CERT1', 'CERT1')) 318 results = [x for x in results] 319 self.assertEqual(len(results), 1) 320 assert results[0] is self.app['students'][self.student.student_id] 321 return 238 322 239 323 class StudentFactoryTest(FunctionalTestCase):
Note: See TracChangeset for help on using the changeset viewer.