I have invoice/estimates django app, I need to write tests for it. Since 
I'm a beginner with this, testing forms results hard for me.
This is the code - for models, form  and admin:

    # MODELS 
    class Invoice(models.Model):
        subject = models.ForeignKey(
    Subject,
    verbose_name= _("Subject")
        )
        date = models.DateField(default=date.today())
        tasks = models.ManyToManyField(
    Task,
    through='TaskCount',
        )
        discount = models.DecimalField(
    max_digits=10, 
    decimal_places=2, 
    default=0
        )
        tip1 = models.BooleanField();
        tip2 = models.BooleanField();
        tax_a = models.BooleanField();
        notes = models.CharField(max_length=500, blank=True)
        expire = models.DateField(null=True, blank=True)
        invoicenumber = models.IntegerField("Invoice number")
        subtotal = models.DecimalField(max_digits=10, decimal_places=2,)
        amount = models.DecimalField(max_digits=10, decimal_places=2, 
default=0)
        adi_start_date = models.DateField(null=True, blank=True)
        adi_end_date = models.DateField(null=True, blank=True)


    class People(models.Model):
        first_name = models.CharField(
            "First name",max_length=50, blank=True
        )
        last_name = models.CharField(
            "Last name",max_length=50, blank=True
        )
        ....
        .... # other fields
        def __unicode__(self):
    return u"%s %s" % (self.first_name, self.last_name)

    # model for inlines
    class TaskCount(models.Model):
        count_items = models.PositiveIntegerField("Qty", default=1)
        task = models.ForeignKey(
    'Task',
    null=False)
        estimate = models.ForeignKey(
            'Estimate', 
            null=True, 
            blank=True
        )
        invoice = models.ForeignKey(
            'Invoice',
            related_name='task_count',
            null=True,
            blank=True
        )

        def __unicode__(self):
            return u"%s" % (str(self.task.price))

    class Task(models.Model):
        label = models.CharField(
            "Task name",
            max_length=150
        )
        price = models.DecimalField(
            "Price per session", 
            max_digits=10, 
            decimal_places=2,
            default=0
        )
        is_adi = models.BooleanField(
            default=False,
            help_text=_("")
        )



    # FORMS

    class InvoiceAdminForm(forms.ModelForm):
        class Meta:
            model = Invoice

        def __init__(self, *args, **kwargs):
            super(InvoiceAdminForm, self).__init__(*args, **kwargs)
    ....

    # ADMIN

    # inline
    class TaskCountInline(admin.TabularInline):
        model = TaskCount
        extra = 0
        fields = ('num_items', 'task')

        def __init__(self, *args, **kwargs):
            super(TaskCountInline, self).__init__(*args, **kwargs)

        ...

    class InvoiceAdmin(admin.ModelAdmin):
        list_display = ('subject', 'date', 'amount',
'discount', 'invoicenumber','get_pdf',
'edit_item', 'delete_item')
        list_display_links = ('edit_item',)
        filter_horizontal = ('tasks',)
        search_fields = ['subject__first_name','subject__last_name']
        actions = ['create_pdf']
        inlines = (TaskCountInline,)
        form = InvoiceAdminForm

        fieldsets = (
    .... # fieldsets ovverride
        )

        formfield_overrides = {
    models.CharField: {'widget': forms.Textarea},
        }

        def get_pdf(self, obj):
            opts = self.model._meta
            return '<a href=%(reverse_url)s>' \
                   '<img src="/static/admin/img/blue-document-pdf.png"/>' \
                   '</a>' % {
       'reverse_url':reverse(
                           'admin:%s_%s_pdf' % (
                                opts.app_label, 
                                opts.object_name.lower()),
args=(obj.id,)
        ),
            }
        get_pdf.short_description = _("PDF")
        get_pdf.allow_tags = True

        def change_view(self, request, object_id, form_url='', 
extra_context=None):
    ...


        def get_urls(self):
            urls = super(InvoiceAdmin, self).get_urls()
            info = self.model._meta.app_label, self.model._meta.module_name
            extra_urls = patterns('',
                url(r'^(?P<object_id>\d+)/pdf/$',
                    self.admin_site.admin_view(self.pdf_view),
                    name='%s_%s_pdf' % info),
            )
            return extra_urls+urls

        def pdf_view(self, request, object_id, extra_context=None):
            """
            view for generating PDF objects
            """
            ....


        def get_form(self, request, obj=None, **kwargs):
            form = super(InvoiceAdmin, self).get_form(request, obj, 
**kwargs)
            form.base_fields['invoicenumber'].initial 
=self.__get_last_invoice_nr_plus_one()
            ....
            return form

        def __get_last_invoice_nr_plus_one(self):
            ...


I'm trying to test the InvoiceAdminForm. this is the test code:


    # FORM TESTS

    class InvoiceAdminFormTestCase(TestCase):
def setUp(self):
    self.subject = Preople.objects.create(
...
    )
    self.task1 = Task.objects.create(
...
    )
    self.task2 = Task.objects.create(
...
    )
    
    self.data = {
'subject':self.subject.id,
'csrfmiddlewaretoken':csrf._get_new_csrf_key(),
'tip1': 1,
'task_count-0-task': self.task1.id,
'subtotal': 67.00,
'amount': 69.68,
'_continue': 'Save and continue edit',
'task_count-0-id': '',
'task_count-__prefix__-task': '',
'notes': 'example  notes',
'task_count-0-invoice':'',
'task_count-1-num_items': '1',
'invoicenumber': '4',
'task_count-__prefix__-invoice': '',
'adi_end_date': '',
'task_count-MAX_NUM_FORMS': '1000',
'discount': '0',
'dataìe': '25/11/2013',
'task_count-1-id': '',
'adi_start_date': '',
'task_count-1-invoice': '',
'task_count-0-num_items': '1',
'task_count-TOTAL_FORMS': '2',
'task_count-__prefix__-num_items': '1',
'task_count-__prefix__-id': '',
'task_count-INITIAL_FORMS': '0',
'task_count-1-task': self.task2.id,
'expire': ''
    }
    self.form = InvoiceAdminForm(data=self.data)

def test_valid_form(self):
    self.assertTrue(self.form.is_valid(), msg=self.form.errors)
         

the test fails due to the lack of mandatory field 'tasks'. I can't explain 
this. I've tried to save the form using admin interface, and it worked 
without errors. Using ipdb debugger, I  saved the data querydict and I used 
it in the form case. So same data for populating the form, but different 
results. 

this is the traceback:

*    # ./manage.py test gpf2*
*    Creating test database for alias 'default'...*
*    ======================================================================*
*    FAIL: test_valid_form (gpf2.tests.test_forms.InvoiceAdminFormTestCase)*
*    ----------------------------------------------------------------------*
*    Traceback (most recent call last):*
*      File "/data_ext4/src/proj7/gpf2/tests/test_forms.py", line 113, in 
test_valid_form*
* self.assertTrue(self.form.is_valid(), msg=self.form.errors)*
*    AssertionError: <ul class="errorlist"><li>tasks<ul 
class="errorlist"><li>This field is required..</li></ul></li></ul>*

*    ----------------------------------------------------------------------*
*    Ran 13 tests in 0.205s*

*    FAILED (failures=1)*
*    Destroying test database for alias 'default'...*



Any help on that?

thanks
LuKe

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/d744f153-f89a-47bd-b9f7-149e568af760%40googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to