Ignore:
Timestamp:
1 Feb 2012, 11:19:56 (13 years ago)
Author:
Henrik Bettermann
Message:

Implement course ticket importer.

Add checkConversion tests.

Location:
main/waeup.sirp/trunk/src/waeup/sirp/students/tests
Files:
1 added
1 edited

Legend:

Unmodified
Added
Removed
  • main/waeup.sirp/trunk/src/waeup/sirp/students/tests/test_batching.py

    r7536 r7548  
    3232from waeup.sirp.students.batching import (
    3333    StudentProcessor, StudentStudyCourseProcessor,
    34     StudentStudyLevelProcessor)
     34    StudentStudyLevelProcessor, CourseTicketProcessor)
    3535from waeup.sirp.students.student import Student
    3636from waeup.sirp.testing import FunctionalLayer, FunctionalTestCase
     
    7777
    7878STUDYLEVEL_HEADER_FIELDS = STUDYLEVEL_SAMPLE_DATA.split(
     79    '\n')[0].split(',')
     80
     81COURSETICKET_SAMPLE_DATA = open(
     82    os.path.join(os.path.dirname(__file__), 'sample_courseticket_data.csv'),
     83    'rb').read()
     84
     85COURSETICKET_HEADER_FIELDS = COURSETICKET_SAMPLE_DATA.split(
    7986    '\n')[0].split(',')
    8087
     
    161168        assert len(self.app['students'].keys()) == 2
    162169
     170    def test_checkConversion(self):
     171        errs, inv_errs, conv_dict = self.importer.checkConversion(
     172            dict(reg_number='1', reg_state='admitted'))
     173        self.assertEqual(len(errs),0)
     174        errs, inv_errs, conv_dict = self.importer.checkConversion(
     175            dict(reg_number='1', reg_state=''))
     176        self.assertEqual(len(errs),1)
     177        self.assertTrue(('reg_state', 'no value provided') in errs)
     178        errs, inv_errs, conv_dict = self.importer.checkConversion(
     179            dict(reg_number='1', reg_state='nonsense'))
     180        self.assertEqual(len(errs),1)
     181        self.assertTrue(('reg_state', 'not allowed') in errs)
     182
    163183    def test_delEntry(self):
    164184        assert self.student.student_id in self.app['students'].keys()
     
    283303        self.assertEqual(student.reg_number,'1')
    284304
     305    def test_checkConversion(self):
     306        errs, inv_errs, conv_dict = self.importer.checkConversion(
     307            dict(reg_number='1', certificate='CERT1', current_level='200'))
     308        self.assertEqual(len(errs),0)
     309        errs, inv_errs, conv_dict = self.importer.checkConversion(
     310            dict(reg_number='1', certificate='CERT999'))
     311        self.assertEqual(len(errs),1)
     312        self.assertTrue(('certificate', u'Invalid value') in errs)
     313        errs, inv_errs, conv_dict = self.importer.checkConversion(
     314            dict(reg_number='1', certificate='CERT1', current_level='100'))
     315        self.assertEqual(len(errs),1)
     316        self.assertTrue(('current_level','not in range') in errs)
     317        # If we import only current_level, no conversion checking is done.
     318        errs, inv_errs, conv_dict = self.importer.checkConversion(
     319            dict(reg_number='1', current_level='100'))
     320        self.assertEqual(len(errs),0)
     321
    285322    def test_import(self):
    286323        num, num_warns, fin_file, fail_file = self.importer.doImport(
     
    350387            IBatchProcessor, StudentStudyLevelProcessor) is True
    351388
     389    def test_checkConversion(self):
     390        errs, inv_errs, conv_dict = self.importer.checkConversion(
     391            dict(reg_number='1', level='220'))
     392        self.assertEqual(len(errs),0)
     393        errs, inv_errs, conv_dict = self.importer.checkConversion(
     394            dict(reg_number='1', level='900'))
     395        self.assertEqual(len(errs),1)
     396        self.assertTrue(('level','no valid integer') in errs)
     397        errs, inv_errs, conv_dict = self.importer.checkConversion(
     398            dict(reg_number='1', level='xyz'))
     399        self.assertEqual(len(errs),1)
     400        self.assertTrue(('level','no integer') in errs)
     401
    352402    def test_import(self):
    353403        num, num_warns, fin_file, fail_file = self.importer.doImport(
     
    365415       
    366416
     417class CourseTicketImporterTest(FunctionalTestCase):
     418
     419    layer = FunctionalLayer
     420
     421    def setUp(self):
     422        super(CourseTicketImporterTest, self).setUp()
     423        self.dc_root = tempfile.mkdtemp()
     424        self.workdir = tempfile.mkdtemp()
     425        app = University()
     426        app['datacenter'].setStoragePath(self.dc_root)
     427        self.getRootFolder()['app'] = app
     428        self.app = self.getRootFolder()['app']
     429        setSite(app)
     430
     431        # Import students with subobjects
     432        student_file = os.path.join(self.workdir, 'sample_student_data.csv')
     433        open(student_file, 'wb').write(STUDENT_SAMPLE_DATA)
     434        num, num_warns, fin_file, fail_file = StudentProcessor().doImport(
     435            student_file, STUDENT_HEADER_FIELDS)
     436        shutil.rmtree(os.path.dirname(fin_file))
     437
     438        # Populate university
     439        self.certificate = createObject('waeup.Certificate')
     440        self.certificate.code = 'CERT1'
     441        self.certificate.application_category = 'basic'
     442        self.certificate.start_level = 200
     443        self.certificate.end_level = 500
     444        self.app['faculties']['fac1'] = Faculty()
     445        self.app['faculties']['fac1']['dep1'] = Department()
     446        self.app['faculties']['fac1']['dep1'].certificates.addCertificate(
     447            self.certificate)
     448        self.course = createObject('waeup.Course')
     449        self.course.code = 'COURSE1'
     450        self.course.semester = 1
     451        self.course.credits = 10
     452        self.course.passmark = 40
     453        self.app['faculties']['fac1']['dep1'].courses.addCourse(
     454            self.course)
     455        self.app['faculties']['fac1']['dep1'].certificates['CERT1'].addCourseRef(
     456            self.course, level=100)
     457
     458        # Update study courses
     459        studycourse_file = os.path.join(
     460            self.workdir, 'sample_studycourse_data.csv')
     461        open(studycourse_file, 'wb').write(STUDYCOURSE_SAMPLE_DATA)
     462        importer = StudentStudyCourseProcessor()
     463        num, num_warns, fin_file, fail_file = importer.doImport(
     464            studycourse_file, STUDYCOURSE_HEADER_FIELDS,'update')
     465        shutil.rmtree(os.path.dirname(fin_file))
     466
     467        # Import study levels
     468        importer = StudentStudyLevelProcessor()
     469        studylevel_file = os.path.join(
     470            self.workdir, 'sample_studylevel_data.csv')
     471        open(studylevel_file, 'wb').write(STUDYLEVEL_SAMPLE_DATA)
     472        num, num_warns, fin_file, fail_file = importer.doImport(
     473            studylevel_file, STUDYLEVEL_HEADER_FIELDS,'create')
     474        shutil.rmtree(os.path.dirname(fin_file))
     475
     476        self.importer = CourseTicketProcessor()
     477        self.csv_file = os.path.join(
     478            self.workdir, 'sample_courseticket_data.csv')
     479        open(self.csv_file, 'wb').write(COURSETICKET_SAMPLE_DATA)
     480
     481    def tearDown(self):
     482        super(CourseTicketImporterTest, self).tearDown()
     483        shutil.rmtree(self.workdir)
     484        shutil.rmtree(self.dc_root)
     485        clearSite()
     486        return
     487
     488    def test_interface(self):
     489        # Make sure we fulfill the interface contracts.
     490        assert verifyObject(IBatchProcessor, self.importer) is True
     491        assert verifyClass(
     492            IBatchProcessor, CourseTicketProcessor) is True
     493
     494    def test_checkConversion(self):
     495        errs, inv_errs, conv_dict = self.importer.checkConversion(
     496            dict(reg_number='1', code='COURSE1', level='220'))
     497        self.assertEqual(len(errs),0)
     498        errs, inv_errs, conv_dict = self.importer.checkConversion(
     499            dict(reg_number='1', code='COURSE2', level='220'))
     500        self.assertEqual(len(errs),1)
     501        self.assertTrue(('code','non-existent') in errs)
     502
     503    def test_import(self):
     504
     505        num, num_warns, fin_file, fail_file = self.importer.doImport(
     506            self.csv_file, COURSETICKET_HEADER_FIELDS,'create')
     507
     508        self.assertEqual(num_warns,2)
     509        assert self.importer.entryExists(
     510            dict(reg_number='1', level='100', code='COURSE1'), self.app) is True
     511        courseticket = self.importer.getEntry(
     512            dict(reg_number='1', level='100', code='COURSE1'), self.app)
     513        self.assertEqual(courseticket.__parent__.__parent__.certificate.code, u'CERT1')
     514        self.assertEqual(courseticket.score, 1)
     515        self.assertEqual(courseticket.core_or_elective, True)
     516        self.assertEqual(courseticket.fcode, 'NA')
     517        self.assertEqual(courseticket.dcode, 'NA')
     518        self.assertEqual(courseticket.code, 'COURSE1')
     519        self.assertEqual(courseticket.title, 'Unnamed Course')
     520        self.assertEqual(courseticket.credits, 10)
     521        self.assertEqual(courseticket.passmark, 40)
     522        self.assertEqual(courseticket.semester, 1)
     523        #import pdb; pdb.set_trace()
     524        shutil.rmtree(os.path.dirname(fin_file))
     525
     526
    367527def test_suite():
    368528    suite = unittest.TestSuite()
    369529    for testcase in [
    370530        StudentImporterTest,StudentStudyCourseImporterTest,
    371         StudentStudyLevelImporterTest,]:
     531        StudentStudyLevelImporterTest,CourseTicketImporterTest,]:
    372532        suite.addTest(unittest.TestLoader().loadTestsFromTestCase(
    373533                testcase
Note: See TracChangeset for help on using the changeset viewer.