## $Id: test_browser.py 16603 2021-09-04 11:09:01Z henrik $
##
## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##
import os
import shutil
import tempfile
from time import time
from datetime import datetime, timedelta
from StringIO import StringIO
from hurry.workflow.interfaces import IWorkflowState, IWorkflowInfo
from zope.securitypolicy.interfaces import IPrincipalRoleManager
from zope.component.hooks import setSite, clearSite
from zope.component import getUtility, createObject
from zope.interface import verify
from zope.event import notify
from waeup.kofa.authentication import LocalRoleSetEvent
from waeup.kofa.app import University
from waeup.kofa.university.faculty import Faculty
from waeup.kofa.university.department import Department
from waeup.kofa.students.tests.test_browser import StudentsFullSetup
from waeup.kofa.students.accommodation import BedTicket
from waeup.kofa.testing import FunctionalTestCase
from waeup.kofa.browser.tests.test_pdf import samples_dir
from waeup.kofa.interfaces import (
    IExtFileStore, IFileStoreNameChooser)
from waeup.kofa.students.interfaces import IStudentsUtils
from waeup.kofa.tests.test_authentication import SECRET
from kofacustom.iuokada.testing import FunctionalLayer


class StudentsContainerUITests(StudentsFullSetup):
    # Tests for StudentsContainer class views and pages

    layer = FunctionalLayer

    def test_dummytest(self):
        return

class OfficerUITests(StudentsFullSetup):
    # Tests for Student class views and pages

    layer = FunctionalLayer

    def test_lib_idcard_officer(self):
        # Create library officer
        self.app['users'].addUser('mrlibrary', SECRET)
        self.app['users']['mrlibrary'].email = 'library@foo.ng'
        self.app['users']['mrlibrary'].title = 'Carlo Pitter'
        prmglobal = IPrincipalRoleManager(self.app)
        prmglobal.assignRoleToPrincipal(
            'waeup.LibraryClearanceOfficer', 'mrlibrary')
        prmglobal.assignRoleToPrincipal(
            'waeup.StudentsOfficer', 'mrlibrary')
        self.browser.open(self.login_path)
        self.browser.getControl(name="form.login").value = 'mrlibrary'
        self.browser.getControl(name="form.password").value = SECRET
        self.browser.getControl("Login").click()
        self.assertMatches('...You logged in...', self.browser.contents)
        self.browser.open(self.student_path)
        self.assertFalse('Download Library Id Card' in self.browser.contents)
        self.browser.getLink("Switch library access").click()
        self.assertTrue('Library access enabled' in self.browser.contents)
        self.browser.getLink("Download Library Id Card").click()
        self.assertEqual(self.browser.headers['Status'], '200 Ok')
        self.assertEqual(self.browser.headers['Content-Type'], 'application/pdf')
        path = os.path.join(samples_dir(), 'lib_idcard_officer.pdf')
        open(path, 'wb').write(self.browser.contents)
        print "Sample PDF lib_idcard_officer.pdf written to %s" % path

class StudentUITests(StudentsFullSetup):
    # Tests for Student class views and pages

    layer = FunctionalLayer

    def test_student_course_registration(self):
        IWorkflowState(self.student).setState('school fee paid')
        self.browser.open(self.login_path)
        self.browser.getControl(name="form.login").value = self.student_id
        self.browser.getControl(name="form.password").value = 'spwd'
        self.browser.getControl("Login").click()
        # Now students can add the current study level
        self.browser.getLink("Study Course").click()
        self.browser.getLink("Add course list").click()
        self.assertMatches('...Add current level 100 (Year 1)...',
                           self.browser.contents)
        self.browser.getControl("Create course list now").click()
        # Students can open the pdf course registration slip
        self.browser.open(
            self.student_path + '/studycourse/100/course_registration_slip.pdf')
        self.assertEqual(self.browser.headers['Status'], '200 Ok')
        self.assertEqual(self.browser.headers['Content-Type'], 'application/pdf')
        path = os.path.join(samples_dir(), 'course_registration_slip.pdf')
        open(path, 'wb').write(self.browser.contents)
        print "Sample PDF course_registration_slip.pdf written to %s" % path

    def test_library_idcard(self):
        IWorkflowState(self.student).setState('returning')
        self.browser.open(self.login_path)
        self.browser.getControl(name="form.login").value = self.student_id
        self.browser.getControl(name="form.password").value = 'spwd'
        self.browser.getControl("Login").click()
        self.assertFalse('Download Library' in self.browser.contents)
        self.student.library = True
        self.browser.open(self.student_path)
        self.browser.getLink("Download Library Id Card").click()
        self.assertEqual(self.browser.headers['Status'], '200 Ok')
        self.assertEqual(self.browser.headers['Content-Type'], 'application/pdf')
        path = os.path.join(samples_dir(), 'lib_idcard_student.pdf')
        open(path, 'wb').write(self.browser.contents)
        print "Sample PDF lib_idcard_student.pdf written to %s" % path
        self.assertTrue(self.student.library)
        IWorkflowInfo(self.student).fireTransition('pay_school_fee')
        self.assertFalse(self.student.library)

    def test_student_studycourse_slip(self):
        IWorkflowState(self.student).setState('school fee paid')
        self.browser.open(self.login_path)
        self.browser.getControl(name="form.login").value = self.student_id
        self.browser.getControl(name="form.password").value = 'spwd'
        self.browser.getControl("Login").click()
        # Students can open base data slip
        # (no button available in base package)
        pdf_url = '%s/studycourse_slip.pdf' % self.studycourse_path
        self.browser.open(pdf_url)
        self.assertEqual(self.browser.headers['Status'], '200 Ok')
        self.assertEqual(self.browser.headers['Content-Type'], 'application/pdf')
        path = os.path.join(samples_dir(), 'studycourse_slip.pdf')
        open(path, 'wb').write(self.browser.contents)
        print "Sample PDF studycourse_slip.pdf written to %s" % path

    def test_student_personal_edit(self):
        IWorkflowState(self.student).setState('school fee paid')
        self.browser.open(self.login_path)
        self.browser.getControl(name="form.login").value = self.student_id
        self.browser.getControl(name="form.password").value = 'spwd'
        self.browser.getControl("Login").click()
        self.browser.getLink("Bio Data").click()
        self.browser.getLink("Edit registration bio data").click()
        self.assertTrue("Please make 40% of your tution fee payments first." in self.browser.contents)
        self.assertEqual(self.browser.url, self.personal_path)

    def test_student_personal_slip(self):
        payment1 = createObject(u'waeup.StudentOnlinePayment')
        timestamp = ("%d" % int(time()*10000))[1:]
        payment1.p_id = "LSCNEW-2-4153206270" # the longest possible p_id
        payment1.p_category = 'schoolfee'
        payment1.p_item = u'My School Fee'
        payment1.p_session = 2015
        payment1.p_level = 100
        payment1.p_current = True
        payment1.amount_auth = 23456.9
        payment1.approve()
        payment2 = createObject(u'waeup.StudentOnlinePayment')
        timestamp = ("%d" % int(time()*10000))[1:]
        payment2.p_id = "p%s" % timestamp
        payment2.p_category = 'clearance'
        payment2.p_item = u'My Clearance Fee'
        payment2.p_session = 2015
        payment2.p_level = 100
        payment2.p_current = True
        payment2.amount_auth = 5678.6
        payment2.approve()
        self.student['payments'][payment1.p_id] = payment1
        self.student['payments'][payment2.p_id] = payment2
        IWorkflowState(self.student).setState('school fee paid')
        self.browser.open(self.login_path)
        self.browser.getControl(name="form.login").value = self.student_id
        self.browser.getControl(name="form.password").value = 'spwd'
        self.browser.getControl("Login").click()
        # Students can open base data slip
        # (no button available in base package)
        pdf_url = '%s/course_registration_clearance.pdf' % self.student_path
        self.browser.open(pdf_url)
        self.assertEqual(self.browser.headers['Status'], '200 Ok')
        self.assertEqual(self.browser.headers['Content-Type'], 'application/pdf')
        path = os.path.join(samples_dir(), 'course_registration_clearance.pdf')
        open(path, 'wb').write(self.browser.contents)
        print "Sample PDF course_registration_clearance.pdf written to %s" % path

    def test_student_admission_letters(self):
        self.certificate.study_mode = 'ug_ft'
        # Student cant login if their password is not set
        IWorkflowInfo(self.student).fireTransition('admit')
        self.browser.open(self.login_path)
        self.browser.getControl(name="form.login").value = self.student_id
        self.browser.getControl(name="form.password").value = 'spwd'
        self.browser.getControl("Login").click()
        self.assertMatches(
            '...You logged in...', self.browser.contents)
        # Admitted student can upload a passport picture
        #self.browser.open(self.student_path + '/change_portrait')
        #ctrl = self.browser.getControl(name='passportuploadedit')
        #file_obj = open(SAMPLE_IMAGE, 'rb')
        #file_ctrl = ctrl.mech_control
        #file_ctrl.add_file(file_obj, filename='my_photo.jpg')
        #self.browser.getControl(
        #    name='upload_passportuploadedit').click()
        #self.assertTrue(
        #    'src="http://localhost/app/students/K1000000/passport.jpg"'
        #    in self.browser.contents)
        # Students can open admission letter
        self.browser.getLink("Base Data").click()
        self.browser.getLink("Download admission letter").click()
        self.assertEqual(self.browser.headers['Status'], '200 Ok')
        self.assertEqual(self.browser.headers['Content-Type'], 'application/pdf')
        path = os.path.join(samples_dir(), 'ug_admission_slip.pdf')
        open(path, 'wb').write(self.browser.contents)
        print "Sample PDF UG admission_slip.pdf written to %s" % path
        self.certificate.study_mode = 'pg_ft'
        self.browser.open(self.student_path)
        self.browser.getLink("Base Data").click()
        self.browser.getLink("Download admission letter").click()
        self.assertEqual(self.browser.headers['Status'], '200 Ok')
        self.assertEqual(self.browser.headers['Content-Type'], 'application/pdf')
        path = os.path.join(samples_dir(), 'pg_admission_slip.pdf')
        open(path, 'wb').write(self.browser.contents)
        print "Sample PDF PG admission_slip.pdf written to %s" % path
        self.certificate.study_mode = 'ug_pt'
        self.browser.open(self.student_path)
        self.browser.getLink("Base Data").click()
        self.browser.getLink("Download admission letter").click()
        self.assertEqual(self.browser.headers['Status'], '200 Ok')
        self.assertEqual(self.browser.headers['Content-Type'], 'application/pdf')
        path = os.path.join(samples_dir(), 'pt_admission_slip.pdf')
        open(path, 'wb').write(self.browser.contents)
        print "Sample PDF PT admission_slip.pdf written to %s" % path

        # JUPEB is bit more complicated to test.
        # Populate university with JUPEB first.
        self.certificate = createObject('waeup.Certificate')
        self.certificate.code = u'CERT2'
        self.certificate.application_category = 'basic'
        self.certificate.study_mode = 'ug_ft'
        self.certificate.start_level = 100
        self.certificate.end_level = 500
        self.certificate.school_fee_1 = 40000.0
        self.certificate.school_fee_2 = 20000.0
        self.app['faculties']['jupeb'] = Faculty(code=u'JUPEB')
        self.app['faculties']['jupeb']['dep2'] = Department(code=u'dep2')
        self.app['faculties']['jupeb']['dep2'].certificates.addCertificate(
            self.certificate)
        self.course = createObject('waeup.Course')
        self.course.code = 'COURSE2'
        self.course.semester = 1
        self.course.credits = 10
        self.course.passmark = 40
        self.app['faculties']['jupeb']['dep2'].courses.addCourse(
            self.course)
        self.app['faculties']['jupeb']['dep2'].certificates[
            'CERT2'].addCertCourse(self.course, level=100)
        # Now it should work
        self.student['studycourse'].certificate = self.certificate
        self.browser.open(self.student_path)
        self.browser.getLink("Base Data").click()
        self.browser.getLink("Download admission letter").click()
        self.assertEqual(self.browser.headers['Status'], '200 Ok')
        self.assertEqual(self.browser.headers['Content-Type'], 'application/pdf')
        path = os.path.join(samples_dir(), 'jupeb_admission_slip.pdf')
        open(path, 'wb').write(self.browser.contents)
        print "Sample PDF JUPEB admission_slip.pdf written to %s" % path