Changeset 9169 for main/waeup.kofa/branches/uli-async-update/src/waeup/kofa/students/tests/test_batching.py
- Timestamp:
- 10 Sep 2012, 11:05:07 (12 years ago)
- Location:
- main/waeup.kofa/branches/uli-async-update
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
main/waeup.kofa/branches/uli-async-update
- Property svn:mergeinfo changed
-
main/waeup.kofa/branches/uli-async-update/src/waeup/kofa/students/tests/test_batching.py
r8626 r9169 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():
Note: See TracChangeset for help on using the changeset viewer.