## $Id: test_browser.py 16474 2021-04-23 07:22:53Z 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 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.students.tests.test_browser import StudentsFullSetup
from waeup.kofa.students.accommodation import BedTicket
from waeup.kofa.browser.tests.test_pdf import samples_dir
from waeup.kofa.testing import FunctionalTestCase
from waeup.kofa.interfaces import (
    IExtFileStore, IFileStoreNameChooser)
from waeup.kofa.students.interfaces import IStudentsUtils
from kofacustom.coewarri.testing import FunctionalLayer


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

    layer = FunctionalLayer

    def test_for_instalment_payments(self):

        #configuration_1 = createObject('waeup.SessionConfiguration')
        #configuration_1.academic_session = 2015
        #self.app['configuration'].addSessionConfiguration(configuration_1)
        self.student['studycourse'].certificate.study_mode = 'ug_ft'
        self.student.nationality = u'NG'
        # Fresh student
        IWorkflowState(self.student).setState('cleared')
        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
        self.browser.open(self.payments_path + '/addop')
        self.browser.open(self.payments_path + '/addop')
        # Add first instalment
        self.browser.getControl(name="form.p_category").value = ['schoolfee_1']
        self.browser.getControl("Create ticket").click()
        self.assertTrue('ticket created' in self.browser.contents)
        self.browser.open(self.payments_path)
        ctrl = self.browser.getControl(name='val_id')
        p_id = ctrl.options[0]
        self.browser.open(self.payments_path + '/' + p_id + '/approve')
        # Add the second instalment ...
        self.browser.open(self.payments_path + '/addop')
        self.browser.getControl(name="form.p_category").value = ['schoolfee_2']
        self.browser.getControl("Create ticket").click()
        self.assertTrue('ticket created' in self.browser.contents)
        # ... approve the second instalment ...
        self.browser.open(self.payments_path)
        ctrl = self.browser.getControl(name='val_id')
        p_id = ctrl.options[1]
        self.browser.open(self.payments_path + '/' + p_id + '/approve')
        self.assertEqual(self.student['payments'].values()[0].p_category, 'schoolfee_1')
        self.assertEqual(self.student['payments'].values()[1].p_category, 'schoolfee_2')
        # 85700/ 2 + 250
        self.assertEqual(self.student['payments'].values()[0].amount_auth, 43100.0)
        self.assertEqual(self.student['payments'].values()[1].amount_auth, 43100.0)
        # The  two payments belong to the same session and level.
        self.assertEqual(self.student['payments'].values()[0].p_session, 2004)
        self.assertEqual(self.student['payments'].values()[0].p_level, 100)
        self.assertEqual(self.student['payments'].values()[1].p_session, 2004)
        self.assertEqual(self.student['payments'].values()[1].p_level, 100)

        # Returning student
        configuration_2 = createObject('waeup.SessionConfiguration')
        configuration_2.academic_session = 2005
        self.app['configuration'].addSessionConfiguration(configuration_2)
        IWorkflowState(self.student).setState('returning')
        self.browser.open(self.payments_path + '/addop')
        self.browser.getControl(name="form.p_category").value = ['schoolfee_1']
        self.browser.getControl("Create ticket").click()
        self.browser.open(self.payments_path + '/addop')
        self.browser.getControl(name="form.p_category").value = ['schoolfee_2']
        self.browser.getControl("Create ticket").click()
        self.browser.open(self.payments_path)
        ctrl = self.browser.getControl(name='val_id')
        # Nothing happens if we approve the 2nd instalment for session 2005
        self.browser.open(self.payments_path + '/' + ctrl.options[3] + '/approve')
        self.assertEqual(self.student.state, 'returning')
        # Workflow transition is trigered if we approve the 1st indtalment
        self.browser.open(self.payments_path + '/' + ctrl.options[2] + '/approve')
        self.assertEqual(self.student.state, 'school fee paid')
        self.assertEqual(self.student.current_level, 200)
        self.assertEqual(self.student.current_session, 2005)
        # 79700 / 2 + 250
        self.assertEqual(self.student['payments'].values()[2].amount_auth, 37600.0)
        self.assertEqual(self.student['payments'].values()[3].amount_auth, 37600.0)
        # The last two payments belong to the same session and level.
        self.assertEqual(self.student['payments'].values()[2].p_session, 2005)
        self.assertEqual(self.student['payments'].values()[2].p_level, 200)
        self.assertEqual(self.student['payments'].values()[3].p_session, 2005)
        self.assertEqual(self.student['payments'].values()[3].p_level, 200)
        return

    def test_registration_pdf_slips(self):
        # Student cant login if their password is not set
        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("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()
        # A level with one course ticket was created
        self.browser.getLink("100").click()
        self.browser.getLink("Download course registration slip").click()
        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
