Ignore:
Timestamp:
10 Sep 2012, 11:05:07 (12 years ago)
Author:
uli
Message:

Merge changes from trunk, r8786-HEAD

Location:
main/waeup.kofa/branches/uli-async-update
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • main/waeup.kofa/branches/uli-async-update

  • main/waeup.kofa/branches/uli-async-update/src/waeup/kofa/students/tests/test_batching.py

    r8626 r9169  
    2323import unittest
    2424import datetime
     25import grok
    2526from time import time
     27from zope.event import notify
    2628from zope.component import createObject
    2729from zope.component.hooks import setSite, clearSite
    2830from zope.interface.verify import verifyClass, verifyObject
     31from hurry.workflow.interfaces import IWorkflowState
    2932
    3033from waeup.kofa.app import University
     
    126129    '\n')[0].split(',')
    127130
     131PAYMENT_CREATE_SAMPLE_DATA = open(
     132    os.path.join(os.path.dirname(__file__), 'sample_create_payment_data.csv'),
     133    'rb').read()
     134
     135PAYMENT_CREATE_HEADER_FIELDS = PAYMENT_CREATE_SAMPLE_DATA.split(
     136    '\n')[0].split(',')
     137
    128138class StudentImportExportSetup(FunctionalTestCase):
    129139
     
    171181    def setup_student(self, student):
    172182        # set predictable values for `student`
    173         student.matric_number = u'M123456'
     183        student.matric_number = u'234'
    174184        student.adm_code = u'my adm code'
    175185        student.clearance_locked = False
    176186        student.clr_code = u'my clr code'
    177187        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'
    180189        student.firstname = u'Anna'
    181190        student.lastname = u'Tester'
     
    211220        ticket.passmark = 100
    212221        ticket.semester = 2
    213         study_level.addCourseTicket(ticket)
     222        study_level[ticket.code] = ticket
    214223        self.add_payment(student)
    215224        return student
     
    232241
    233242
    234 
    235 class StudentProcessorTest(FunctionalTestCase):
     243class StudentProcessorTest(StudentImportExportSetup):
    236244
    237245    layer = FunctionalLayer
     
    239247    def setUp(self):
    240248        super(StudentProcessorTest, self).setUp()
    241         # Setup a sample site for each test
    242         app = University()
    243         self.dc_root = tempfile.mkdtemp()
    244         app['datacenter'].setStoragePath(self.dc_root)
    245 
    246         # Prepopulate the ZODB...
    247         self.getRootFolder()['app'] = app
    248         # we add the site immediately after creation to the
    249         # ZODB. Catalogs and other local utilities are not setup
    250         # before that step.
    251         self.app = self.getRootFolder()['app']
    252         # Set site here. Some of the following setup code might need
    253         # to access grok.getSite() and should get our new app then
    254         setSite(app)
    255249
    256250        # Add student with subobjects
    257251        student = Student()
    258         student.firstname = u'Anna'
    259         student.lastname = u'Tester'
    260         student.reg_number = u'123'
    261         student.matric_number = u'234'
    262252        self.app['students'].addStudent(student)
     253        student = self.setup_student(student)
     254        notify(grok.ObjectModifiedEvent(student))
    263255        self.student = self.app['students'][student.student_id]
     256
    264257        self.processor = StudentProcessor()
    265258        self.workdir = tempfile.mkdtemp()
     
    285278        open(self.csv_file_duplicates, 'wb').write(STUDENT_SAMPLE_DATA_DUPLICATES)
    286279
    287     def tearDown(self):
    288         super(StudentProcessorTest, self).tearDown()
    289         shutil.rmtree(self.workdir)
    290         shutil.rmtree(self.dc_root)
    291         clearSite()
    292         return
    293 
    294280    def test_interface(self):
    295281        # Make sure we fulfill the interface contracts.
     
    343329        self.assertEqual(initial_stud_id, new_stud_id)
    344330        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
    345349
    346350    def test_delEntry(self):
     
    486490        super(StudentStudyCourseProcessorTest, self).setUp()
    487491
     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
    488499        # Import students with subobjects
    489500        student_file = os.path.join(self.workdir, 'sample_student_data.csv')
     
    532543            dict(reg_number='1', current_level='100'))
    533544        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.')
    534559
    535560    def test_import(self):
     
    667692        self.assertEqual(num_warns,2)
    668693        shutil.rmtree(os.path.dirname(fin_file))
    669        
    670694
    671695class CourseTicketProcessorTest(StudentImportExportSetup):
     
    681705        shutil.rmtree(os.path.dirname(fin_file))
    682706
    683         # Add course and course referrer
     707        # Add course and certificate course
    684708        self.course = createObject('waeup.Course')
    685709        self.course.code = 'COURSE1'
     
    689713        self.app['faculties']['fac1']['dep1'].courses.addCourse(
    690714            self.course)
    691         self.app['faculties']['fac1']['dep1'].certificates['CERT1'].addCourseRef(
     715        self.app['faculties']['fac1']['dep1'].certificates['CERT1'].addCertCourse(
    692716            self.course, level=100)
    693717
     
    755779        # Logging message from updateEntry,
    756780        self.assertTrue(
    757             'INFO - system - K1000000 - Course ticket updated: code=COURSE1, '
     781            'INFO - system - K1000000 - Course ticket in 100 updated: code=COURSE1, '
    758782            'mandatory=False, score=3'
    759783            in logcontent)
     
    769793        self.assertEqual(num_warns,2)
    770794        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)
    771814
    772815class PaymentProcessorTest(StudentImportExportSetup):
     
    784827        self.student = self.app['students'][student.student_id]
    785828        payment = createObject(u'waeup.StudentOnlinePayment')
    786         payment.p_id = 'p123'
     829        payment.p_id = 'p120'
    787830        self.student['payments'][payment.p_id] = payment
    788831
     
    798841            self.workdir, 'sample_payment_data.csv')
    799842        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)
    800846
    801847    def test_interface(self):
     
    809855            dict(student_id='ID_NONE', p_id='nonsense'), self.app) is None
    810856        assert self.processor.getEntry(
    811             dict(student_id=self.student.student_id, p_id='p123'),
    812             self.app) is self.student['payments']['p123']
     857            dict(student_id=self.student.student_id, p_id='p120'),
     858            self.app) is self.student['payments']['p120']
    813859        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)
    816875
    817876    def test_addEntry(self):
     
    831890            self.app)
    832891        self.assertEqual(len(self.student['payments'].keys()),3)
    833         self.assertEqual(self.student['payments']['p456'].p_id, 'p456')
     892        self.assertEqual(self.student['payments']['p560'].p_id, 'p560')
    834893
    835894    def test_checkConversion(self):
    836895        errs, inv_errs, conv_dict = self.processor.checkConversion(
    837             dict(reg_number='1', p_id='3816951266236341955'))
     896            dict(p_id='3816951266236341955'))
    838897        self.assertEqual(len(errs),0)
    839898        errs, inv_errs, conv_dict = self.processor.checkConversion(
    840             dict(reg_number='1', p_id='p1266236341955'))
     899            dict(p_id='p1266236341955'))
    841900        self.assertEqual(len(errs),0)
    842901        errs, inv_errs, conv_dict = self.processor.checkConversion(
    843             dict(reg_number='1', p_id='nonsense'))
     902            dict(p_id='nonsense'))
    844903        self.assertEqual(len(errs),1)
    845         timestamp = "%d" % int(time()*1000)
     904        timestamp = ("%d" % int(time()*10000))[1:]
    846905        p_id = "p%s" % timestamp
    847906        errs, inv_errs, conv_dict = self.processor.checkConversion(
    848             dict(reg_number='1', p_id=p_id))
     907            dict(p_id=p_id))
    849908        self.assertEqual(len(errs),0)
    850909
     
    854913        self.assertEqual(num_warns,0)
    855914        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)
    858918        cdate = payment.creation_date.strftime("%Y-%m-%d %H:%M:%S")
    859919        self.assertEqual(cdate, "2010-11-26 18:59:33")
    860920        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))
    863932        logcontent = open(self.logfile).read()
    864         # Logging message from updateEntry,
     933        # Logging message from updateEntry
    865934        self.assertTrue(
    866935            'INFO - system - K1000001 - Payment ticket updated: '
    867             'p_id=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'
    871940            in logcontent)
    872941
     
    881950        self.assertEqual(num_warns,0)
    882951        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
    883972
    884973def test_suite():
Note: See TracChangeset for help on using the changeset viewer.