Esempio n. 1
0
    def test_journal_add_view_indicators(self):
        from eportfolio.models.app import Application
        from eportfolio.views.journal import journal_add_view
        renderer = self.config.testing_add_template('templates/journal_add.pt')

        root = Application()

        project = self._add_project()
        student = self._add_student()
        project.students.append(student)
        indicator_set = self._add_indicator_set()
        indicator1 = self._add_indicator(title=u'First indicator',
                                         indicator_set=indicator_set)
        indicator2 = self._add_indicator(title=u'Second indicator',
                                         indicator_set=indicator_set)
        # Competences have to be added to project over objectives
        objective = self._add_objective(project=project)
        objective.competences.append(indicator_set.competence)

        # Student is logged in
        self.config.testing_securitypolicy(userid=student.email)

        request = testing.DummyRequest(root=root)
        journal_add_view(project, request)
        indicator_sets = renderer.indicator_sets
        self.assertEquals(1, len(indicator_sets))
        self.assertEquals(indicator_set.title, indicator_sets[0]['title'])
        self.assertEquals(2, len(indicator_sets[0]['indicators']))
        self.assertEquals(str(indicator1.id),
                          indicator_sets[0]['indicators'][0]['id'])
        self.assertEquals(str(indicator2.id),
                          indicator_sets[0]['indicators'][1]['id'])

        request = testing.DummyRequest(root=root)
        request.POST['text'] = u'My first journal entry!'
        request.POST['image'] = u''
        request.POST['indicators'] = [
            str(indicator1.id),
        ]
        request.POST['form.submitted'] = 1
        journal_add_view(project, request)

        self.assertEquals(1, student.journal_entries.count())
        self.assertEquals(1, project.journal_entries.count())
        entry = student.journal_entries.first()
        self.assertEquals([indicator1], entry.indicators.all())

        # Indicator can be tagged only once, thus it's not in the list anymore.
        request = testing.DummyRequest(root=root)
        journal_add_view(project, request)
        indicator_sets = renderer.indicator_sets
        self.assertEquals(1, len(indicator_sets[0]['indicators']))
Esempio n. 2
0
 def test_handle_submit(self):
     from seantisinvoice.views.invoice import InvoiceController
     from seantisinvoice import statusmessage
     # Register route for redirect in invoice form actions
     testing.registerRoute('/', 'invoices', factory=None)
     # Create an invoice
     invoice = self._add_invoice()
     request = testing.DummyRequest()
     request.matchdict = dict(invoice=str(invoice.id))
     view = InvoiceController(None, request)
     data = view.form_defaults()
     self.assertEquals(u'Project', data['project_description'])
     # Change some of the invoice date
     data['project_description'] = u'My project'
     data['recurring_term'] = 30
     data['item_list'][0]['service_title'] = u'My service'
     view.handle_submit(data)
     data = view.form_defaults()
     self.assertEquals(u'My project', data['project_description'])
     self.assertEquals(u'My service', data['item_list'][0]['service_title'])
     # Add an additional invoice item
     data['item_list'].append(
         dict(item_id='',
              service_title=u'Training',
              service_description=u'',
              amount=200.0))
     view.handle_submit(data)
     data = view.form_defaults()
     self.assertEquals(u'Training', data['item_list'][1]['service_title'])
     # Reorder the items
     data['item_list'][0] = view.form_defaults()['item_list'][1]
     data['item_list'][1] = view.form_defaults()['item_list'][0]
     view.handle_submit(data)
     data = view.form_defaults()
     self.assertEquals(u'Training', data['item_list'][0]['service_title'])
     # And remove one of them
     del data['item_list'][0]
     view.handle_submit(data)
     data = view.form_defaults()
     self.assertEquals(1, len(data['item_list']))
     self.assertEquals(u'My service', data['item_list'][0]['service_title'])
     # Submit without changing anything
     request = testing.DummyRequest()
     request.environ['qc.statusmessage'] = []
     request.matchdict = dict(invoice=str(invoice.id))
     view = InvoiceController(None, request)
     view.handle_submit(data)
     msgs = statusmessage.messages(request)
     self.assertEquals(1, len(msgs))
     self.assertEquals(u"No changes saved.", msgs[0].msg)
Esempio n. 3
0
 def test_handle_submit(self):
     from seantisinvoice.views.customer import CustomerController
     from seantisinvoice import statusmessage
     # Register route for redirect in customer form actions
     testing.registerRoute('/customers', 'customers', factory=None)
     # Add a customer
     customer = self._add_customer()
     request = testing.DummyRequest()
     request.matchdict = dict(customer=str(customer.id))
     view = CustomerController(None, request)
     # Check default values
     default_values = view.form_defaults()
     self.assertEquals(u'Customers Inc.', default_values['name'])
     # Change the data
     default_values['name'] = u'Seantis GmbH'
     default_values['contact_list'][0]['first_name'] = u'Leopold'
     view.handle_submit(default_values)
     default_values = view.form_defaults()
     self.assertEquals(u'Seantis GmbH', default_values['name'])
     self.assertEquals(u'Leopold',
                       default_values['contact_list'][0]['first_name'])
     # Add an additional contact
     contact_date = dict(first_name=u'Stephen',
                         last_name=u'Dedalus',
                         title=u'Mr.',
                         contact_id='')
     default_values['contact_list'].append(contact_date)
     view.handle_submit(default_values)
     default_values = view.form_defaults()
     self.assertEquals(u'Stephen',
                       default_values['contact_list'][1]['first_name'])
     # Remove one of the contacts
     del default_values['contact_list'][0]
     view.handle_submit(default_values)
     default_values = view.form_defaults()
     self.assertEquals(1, len(default_values['contact_list']))
     # Contacts are alphabetically ordered.
     self.assertEquals(u'Stephen',
                       default_values['contact_list'][0]['first_name'])
     # Submit without changing anything
     request = testing.DummyRequest()
     request.environ['qc.statusmessage'] = []
     request.matchdict = dict(customer=str(customer.id))
     view = CustomerController(None, request)
     view.handle_submit(default_values)
     msgs = statusmessage.messages(request)
     self.assertEquals(1, len(msgs))
     self.assertEquals(u"No changes saved.", msgs[0].msg)
Esempio n. 4
0
 def test_view_invoices(self):
     from seantisinvoice.views.invoice import view_invoices
     request = testing.DummyRequest()
     view = view_invoices(request)
     self.assertEqual(view['invoices'], [])
     invoice = self._add_invoice()
     view = view_invoices(request)
     self.assertEqual(view['invoices'], [invoice])
     # Filtering recurring
     invoice2 = self._add_invoice()
     invoice2.recurring_date = datetime.date.today()
     request.params = dict(recurring='1')
     view = view_invoices(request)
     self.assertEqual(view['invoices'], [invoice2])
     request.params = dict(recurring='0')
     view = view_invoices(request)
     self.assertEqual(view['invoices'], [invoice])
     # Filtering due
     invoice.due_date = datetime.date.today() - datetime.timedelta(days=5)
     request.params = dict(due='1')
     view = view_invoices(request)
     self.assertEqual(view['invoices'], [invoice])
     # Sorting
     invoice.date = datetime.date(2010, 1, 18)
     invoice2.date = datetime.date(2010, 1, 2)
     request.params = dict(sort='date')
     view = view_invoices(request)
     self.assertEqual(view['invoices'], [invoice2, invoice])
     request.params = dict(sort='date', reverse='1')
     view = view_invoices(request)
     self.assertEqual(view['invoices'], [invoice, invoice2])
Esempio n. 5
0
 def test_form_fields(self):
     from seantisinvoice.views.customer import CustomerController
     from seantisinvoice.views.customer import CustomerSchema
     request = testing.DummyRequest()
     view = CustomerController(None, request)
     fields = view.form_fields()
     self.assertEquals(CustomerSchema.attrs, fields)
Esempio n. 6
0
 def test_my_view(self):
     from myproject.views import my_view
     context = testing.DummyModel()
     request = testing.DummyRequest()
     renderer = testing.registerDummyRenderer('templates/mytemplate.pt')
     response = my_view(context, request)
     self.assertEqual(renderer.project, 'myproject')
Esempio n. 7
0
 def test_handle_add(self):
     from seantisinvoice.models import Invoice
     from seantisinvoice.models import DBSession
     from seantisinvoice.views.invoice import InvoiceController
     # Register route for redirect in invoice form actions
     testing.registerRoute('/', 'invoices', factory=None)
     # Each invoice belongs to a customer, thus add one.
     customer = self._add_customer()
     request = testing.DummyRequest()
     view = InvoiceController(None, request)
     data = view.form_defaults()
     data['customer_contact_id'] = customer.contacts[0].id
     data['project_description'] = u'Project name'
     data['recurring_term'] = 30
     data['date'] = datetime.date(2010, 1, 18)
     data['item_list'] = [
         dict(item_id='',
              service_title=u'Testing',
              service_description=u'Work',
              amount=2000.0)
     ]
     view.handle_add(data)
     session = DBSession()
     invoice = session.query(Invoice).one()
     self.assertEquals(u'Project name', invoice.project_description)
     self.assertEquals(customer.contacts[0], invoice.contact)
     self.assertEquals(1, len(invoice.items))
     self.assertEquals(u'Testing', invoice.items[0].service_title)
Esempio n. 8
0
    def test_application_view(self):
        from eportfolio.models.app import Application
        from eportfolio.views.application import application_view

        root = Application()

        # Redirect to login view if not authenticated
        request = testing.DummyRequest(root=root)
        response = application_view(root, request)
        self.assertEquals(302, response.code)
        self.assertEquals('http://example.com/login.html',
                          response.headers['Location'])

        # Logged in student
        student = self._add_student()
        self.config.testing_securitypolicy(userid=student.email)
        response = application_view(root, request)
        self.assertEquals(302, response.status_int)
        url = 'http://example.com/users/%s/' % student.id
        self.assertEquals(url, response.headers['Location'])

        # Logged in teacher
        teacher = self._add_teacher()
        self.config.testing_securitypolicy(userid=teacher.email)
        response = application_view(root, request)
        self.assertEquals(302, response.status_int)
        self.assertEquals('http://example.com/dashboard.html',
                          response.headers['Location'])
Esempio n. 9
0
 def test_form_fields(self):
     from seantisinvoice.views.reports import ReportsController
     from seantisinvoice.views.reports import ReportsSchema
     request = testing.DummyRequest()
     view = ReportsController(None, request)
     fields = view.form_fields()
     self.assertEquals(ReportsSchema.attrs, fields)
Esempio n. 10
0
 def test_call(self):
     from seantisinvoice.views.company import CompanyController
     request = testing.DummyRequest()
     view = CompanyController(None, request)
     result = view()
     self.failUnless('main' in result.keys())
     self.failUnless('msgs' in result.keys())
Esempio n. 11
0
    def test_members_view(self):
        from eportfolio.models.app import Application
        from eportfolio.models.project import Project
        from eportfolio.views.members import members_view

        root = Application()
        project = Project()

        # No members assigned yet
        request = testing.DummyRequest(root=root)
        response = members_view(project, request)
        self.assertEquals([], response['all_students'])
        self.assertEquals([], response['all_teachers'])

        # Student in list of students that can be assigned
        student = self._add_student()
        response = members_view(project, request)
        self.assertEquals([student], response['all_students'])

        # Assign student to project
        request.POST['student_id'] = student.id
        request.POST['form.submitted'] = 1
        response = members_view(project, request)
        self.assertEquals([student], project.students.all())

        request = testing.DummyRequest(root=root)
        response = members_view(project, request)
        # Student cannot be assigned a second time
        self.assertEquals([], response['all_students'])
        self.assertEquals([student], response['students'])

        # Teacher in the list of teachers than can be assigned
        teacher = self._add_teacher()
        response = members_view(project, request)
        self.assertEquals([teacher], response['all_teachers'])

        # Assign teacher to project
        request.POST['teacher_id'] = teacher.id
        request.POST['form.submitted'] = 1
        response = members_view(project, request)
        self.assertEquals([teacher], project.teachers.all())

        request = testing.DummyRequest(root=root)
        response = members_view(project, request)
        # Teacher cannot be assigned a second time
        self.assertEquals([], response['all_teachers'])
        self.assertEquals([teacher], response['teachers'])
Esempio n. 12
0
 def test_view_login(self):
     from seantisinvoice.views.login import view_login
     request = testing.DummyRequest()
     response = view_login(request)
     self.failUnless('seantis::invoice' in response.app_iter[0])
     request.params = dict(failed='1')
     response = view_login(request)
     self.failUnless('Login failed.' in response.app_iter[0])
Esempio n. 13
0
 def test_form_widgets(self):
     from seantisinvoice.views.invoice import InvoiceController
     customer = self._add_customer()
     contact = customer.contacts[0]
     request = testing.DummyRequest()
     view = InvoiceController(None, request)
     widgets = view.form_widgets(view.form_fields())
     option = (customer.id, u'%s: %s %s' %
               (customer.name, contact.first_name, contact.last_name))
     self.failUnless(option in widgets['customer_contact_id'].options)
Esempio n. 14
0
 def test_view_login_redirect(self):
     from seantisinvoice.views.login import view_login_redirect
     request = testing.DummyRequest()
     response = view_login_redirect(request)
     self.assertEquals(302, response.status_int)
     self.assertEquals(request.application_url + '/login?failed=1',
                       response.location)
     # Register permissive security policy which allows all access
     testing.registerDummySecurityPolicy('admin')
     response = view_login_redirect(request)
     self.assertEquals(302, response.status_int)
     self.assertEquals(request.application_url, response.location)
Esempio n. 15
0
    def test_teacher_edit_view(self):
        from eportfolio.models.app import Application
        from eportfolio.views.teacher import teacher_edit_view

        root = Application()
        teacher = self._add_teacher()

        request = testing.DummyRequest(root=root)
        response = teacher_edit_view(root['users'][teacher.id], request)
        self.failUnless('Edit' in response.body)

        request = testing.DummyRequest(root=root)
        request.params['form.submitted'] = 1
        request.params['first_name'] = u'Leopold'
        request.params['last_name'] = u'Bloom'
        request.params['email'] = u'*****@*****.**'
        request.params['portrait'] = u''
        teacher_edit_view(root['users'][teacher.id], request)
        self.assertEquals(u'Leopold', teacher.first_name)
        self.assertEquals(u'Bloom', teacher.last_name)
        self.assertEquals(u'*****@*****.**', teacher.email)
Esempio n. 16
0
 def test_handle_cancel(self):
     from seantisinvoice.views.invoice import InvoiceController
     from seantisinvoice import statusmessage
     # Register route for redirect in customer form actions
     testing.registerRoute('/', 'invoices', factory=None)
     request = testing.DummyRequest()
     request.environ['qc.statusmessage'] = []
     view = InvoiceController(None, request)
     view.handle_cancel()
     msgs = statusmessage.messages(request)
     self.assertEquals(1, len(msgs))
     self.assertEquals(u"No changes saved.", msgs[0].msg)
Esempio n. 17
0
 def test_invoices(self):
     from seantisinvoice.views.reports import ReportsController
     request = testing.DummyRequest()
     view = ReportsController(None, request)
     self.assertEquals([], view.invoices())
     invoice = self._add_invoice()
     invoice.date = datetime.date(2010, 3, 1)
     self.assertEquals([invoice], view.invoices())
     invoice2 = self._add_invoice()
     invoice2.date = datetime.date(2010, 4, 25)
     view = ReportsController(None, request)
     self.assertEquals([invoice2, invoice], view.invoices())
Esempio n. 18
0
    def test_journal_add_view(self):
        from eportfolio.models.app import Application
        from eportfolio.views.journal import journal_add_view

        root = Application()

        project = self._add_project()
        student = self._add_student()
        project.students.append(student)

        # Student is logged in
        self.config.testing_securitypolicy(userid=student.email)
        request = testing.DummyRequest(root=root)
        request.POST['text'] = u'My first journal entry!'
        request.POST['image'] = u''
        request.POST['form.submitted'] = 1
        response = journal_add_view(project, request)
        self.assertEquals(1, project.journal_entries.count())
        entry = project.journal_entries[0]
        self.assertEquals(u'My first journal entry!', entry.text)
        self.assertEquals(student, entry.user)
        # Check redirection
        self.assertEquals(302, response.status_int)
        url = 'http://example.com/users/%s/' % student.id
        self.assertEquals(url, response.headers['Location'])

        teacher = self._add_teacher()
        project.teachers.append(teacher)
        # Teacher is logged in
        self.config.testing_securitypolicy(userid=teacher.email)
        request = testing.DummyRequest(root=root)
        request.POST['text'] = u"Teacher's journal entry!"
        request.POST['image'] = u''
        request.POST['form.submitted'] = 1
        response = journal_add_view(project, request)
        self.assertEquals(1, teacher.journal_entries.count())
        # Check redirection
        self.assertEquals(302, response.status_int)
        url = 'http://example.com/projects/%s/' % project.id
        self.assertEquals(url, response.headers['Location'])
Esempio n. 19
0
 def test_form_widgets(self):
     from seantisinvoice.views.reports import ReportsController
     from formish import DateParts
     request = testing.DummyRequest()
     view = ReportsController(None, request)
     widgets = view.form_widgets(view.form_fields())
     self.assertEquals(DateParts, type(widgets['from_date']))
     self.assertEquals(DateParts, type(widgets['to_date']))
     self.assertEquals([], widgets['customer'].options)
     customer = self._add_customer()
     widgets = view.form_widgets(view.form_fields())
     self.assertEquals([(customer.id, customer.name)],
                       widgets['customer'].options)
Esempio n. 20
0
    def test_logged_in_view(self):
        from eportfolio.models.app import Application
        from eportfolio.views.login import logged_in_view

        root = Application()

        # Not logged in
        request = testing.DummyRequest(root=root)
        response = logged_in_view(root, request)
        self.assertEquals(302, response.status_int)
        url = 'http://example.com/login.html?login_failed=1'
        self.assertEquals(url, response.headers['Location'])

        # Menu's 'Home' entry is used to find the homepage
        from eportfolio.views.menu import GlobalMenu
        from eportfolio.views.menu import StudentHomeEntry
        self.config.registry.registerAdapter(GlobalMenu)
        self.config.registry.registerAdapter(StudentHomeEntry, name='home')

        # Logged in student
        student = self._add_student()
        self.config.testing_securitypolicy(userid=student.email)
        request = testing.DummyRequest(root=root)
        response = logged_in_view(root, request)
        self.assertEquals(302, response.status_int)
        url = 'http://example.com/users/%s/' % student.id
        self.assertEquals(url, response.headers['Location'])

        from eportfolio.views.menu import TeacherHomeEntry
        self.config.registry.registerAdapter(TeacherHomeEntry, name='home')

        # Logged in teacher
        teacher = self._add_teacher()
        self.config.testing_securitypolicy(userid=teacher.email)
        request = testing.DummyRequest(root=root)
        response = logged_in_view(root, request)
        self.assertEquals(302, response.status_int)
        url = 'http://example.com/dashboard.html'
        self.assertEquals(url, response.headers['Location'])
Esempio n. 21
0
 def test_my_view(self):
     from myproject.views import my_view
     context = testing.DummyModel()
     request = testing.DummyRequest()
     result = my_view(context, request)
     self.assertEqual(result.status, '200 OK')
     body = result.app_iter[0]
     self.failUnless('Welcome to myproject' in body)
     self.assertEqual(len(result.headerlist), 2)
     self.assertEqual(result.headerlist[0],
                      ('content-type', 'text/html; charset=UTF-8'))
     self.assertEqual(result.headerlist[1],
                      ('Content-Length', str(len(body))))
Esempio n. 22
0
 def test_call(self):
     from seantisinvoice.views.invoice import InvoiceController
     request = testing.DummyRequest()
     # No invoice with this id
     request.matchdict = dict(invoice='1')
     view = InvoiceController(None, request)
     result = view()
     self.assertEquals(404, result.status_int)
     # Add an invoice
     invoice = self._add_invoice()
     request.matchdict = dict(invoice=str(invoice.id))
     view = InvoiceController(None, request)
     result = view()
     self.failUnless('main' in result.keys())
Esempio n. 23
0
 def test_call(self):
     from seantisinvoice.views.customer import CustomerController
     request = testing.DummyRequest()
     # No customer with this id
     request.matchdict = dict(customer='2')
     view = CustomerController(None, request)
     result = view()
     self.assertEquals(404, result.status_int)
     # Add a customer
     customer = self._add_customer()
     request.matchdict = dict(customer=str(customer.id))
     view = CustomerController(None, request)
     result = view()
     self.failUnless('main' in result.keys())
Esempio n. 24
0
 def test_view_invoice_export(self):
     from seantisinvoice.views.invoice_export import view_invoice_pdf
     # Add an invoice
     company = self._set_company_profile()
     invoice = self._add_invoice()
     invoice.company = company
     request = testing.DummyRequest()
     request.matchdict = dict(invoice=str(invoice.id))
     response = view_invoice_pdf(request)
     self.assertEquals('application/pdf', response.content_type)
     # Not existing invoice
     request.matchdict = dict(invoice='10')
     response = view_invoice_pdf(request)
     self.assertEquals(404, response.status_int)
Esempio n. 25
0
    def test_teacher_add_view(self):
        from eportfolio.models.app import Application
        from eportfolio.views.teacher import teacher_edit_view

        root = Application()

        request = testing.DummyRequest(root=root)
        response = teacher_edit_view(root['users'], request)
        self.failUnless('Add' in response.body)

        request = testing.DummyRequest(root=root)
        request.params['form.submitted'] = 1
        request.params['first_name'] = u'Buck'
        request.params['last_name'] = u'Mulligan'
        request.params['email'] = u'*****@*****.**'
        request.params['password'] = u''
        request.params['portrait'] = u''
        # Empty password field triggers registration mail
        teacher_edit_view(root['users'], request)
        registration_mail = self.mailer.mails[-1]
        mail_address = '%s %s <%s>' % (u'Buck', u'Mulligan',
                                       u'*****@*****.**')
        self.assertEquals(mail_address, registration_mail['To'])
Esempio n. 26
0
 def test_call(self):
     from seantisinvoice.views.reports import ReportsController
     request = testing.DummyRequest()
     # No invoices yet
     view = ReportsController(None, request)
     result = view()
     self.assertEquals([], result['invoices'])
     # Add an invoice
     invoice = self._add_invoice()
     invoice.tax = 7.6
     invoice.items[0].amount = 10000
     view = ReportsController(None, request)
     result = view()
     self.assertEquals([invoice], result['invoices'])
     self.assertEquals(10760, result['total_amount'])
     self.assertEquals(760, result['total_tax'])
Esempio n. 27
0
 def test_competences_container(self):
     from eportfolio.models.app import Application
     from eportfolio.views.container import remove_item
     
     root = Application()
     
     # Add competence
     meta_competence = self._add_meta_competence()
     competence = self._add_competence(meta_competence=meta_competence)
     self.assertEquals(1, len(root['competences']))
     # Remove competence
     request = testing.DummyRequest(root=root)
     request.POST['item'] = competence.id
     response = remove_item(root['competences'], request)
     self.assertEquals(200, response.status_int)
     self.assertEquals('success', response.body)
     self.assertEquals(0, len(root['competences']))
     
Esempio n. 28
0
    def test_projects_container(self):
        from eportfolio.models.app import Application
        from eportfolio.views.container import remove_item

        root = Application()

        # Try to remove not existing project
        request = testing.DummyRequest(root=root)
        request.POST['item'] = 'test'
        response = remove_item(root['projects'], request)
        self.assertEquals(400, response.status_int)

        # Add project
        project = self._add_project()
        self.assertEquals(1, len(root['projects']))
        request.POST['item'] = project.id
        response = remove_item(root['projects'], request)
        self.assertEquals(200, response.status_int)
        self.assertEquals(0, len(root['projects']))
Esempio n. 29
0
 def test_statusmessage(self):
     from seantisinvoice import statusmessage
     request = testing.DummyRequest()
     request.environ['qc.statusmessage'] = []
     msgs = statusmessage.messages(request)
     self.assertEquals([], msgs)
     statusmessage.show(request, u'Test message')
     msgs = statusmessage.messages(request)
     self.assertEquals(1, len(msgs))
     self.assertEquals(u'Test message', msgs[0].msg)
     self.assertEquals(u'notice', msgs[0].msg_type)
     # Shown messages are removed
     msgs = statusmessage.messages(request)
     self.assertEquals([], msgs)
     statusmessage.show(request, u'First message')
     statusmessage.show(request, u'Second message', msg_type=u'error')
     msgs = statusmessage.messages(request)
     self.assertEquals(2, len(msgs))
     self.assertEquals(u'Second message', msgs[0].msg)
     self.assertEquals(u'error', msgs[0].msg_type)
     self.assertEquals(u'First message', msgs[1].msg)
Esempio n. 30
0
 def test_form_defaults(self):
     from seantisinvoice.views.reports import ReportsController
     request = testing.DummyRequest()
     view = ReportsController(None, request)
     defaults = view.form_defaults()
     self.assertEquals(None, defaults['from_date'])
     self.assertEquals(None, defaults['to_date'])
     # Add an invoice
     invoice = self._add_invoice()
     invoice.date = datetime.date(2010, 3, 1)
     view = ReportsController(None, request)
     defaults = view.form_defaults()
     self.assertEquals(datetime.date(2010, 3, 1), defaults['from_date'])
     self.assertEquals(datetime.date(2010, 3, 1), defaults['to_date'])
     # Add a second invoice
     invoice2 = self._add_invoice()
     invoice2.date = datetime.date(2010, 4, 1)
     view = ReportsController(None, request)
     defaults = view.form_defaults()
     self.assertEquals(datetime.date(2010, 3, 1), defaults['from_date'])
     self.assertEquals(datetime.date(2010, 4, 1), defaults['to_date'])