Jupp, thats about what I meant :-)

Probably the best way, if you don't want to check text.

Regards,

Andréas

2016-07-31 18:01 GMT+02:00 ludovic coues <[email protected]>:

> Currently, I am using lxml. More dependencies but it's the cleanest
> method I've found currently.
> I use it like that:
>
>     from django.test import TestCase
>     from lxml import etree
>
>     class FormTest(TestCase):
>         def test_input(self):
>             response = self.client.get('/accounts/login')
>             self.assertEqual(response.status_code, 200)
>             doc = etree.HTML(response.content)
>
> self.assertEqual(len(doc.findall('.//input[@name="username"]')), 1)
>
>
>
> 2016-07-31 17:46 GMT+02:00 Andreas Kuhne <[email protected]>:
> > 2016-07-31 15:59 GMT+02:00 ludovic coues <[email protected]>:
> >>
> >> Oh, sorry. A bit of misunderstanding and miscommunication on my part.
> >>
> >> The exemple I gave is just a quick way to reproduce my problem. The
> >> real test use self.client, reverse, cast response.content to a string.
> >> What I gave is a minimal exemple.
> >>
> >> Also, I assumed you talked about comparing bit of html element, not
> >> the raw content returned by the view. I'm quite uneasy to have the
> >> test failing if a class is added or removed from the element. But yes,
> >> your solution work for the current state of the application.
> >>
> >> 2016-07-31 14:46 GMT+02:00 Andreas Kuhne <[email protected]>:
> >> > 2016-07-31 13:56 GMT+02:00 ludovic coues <[email protected]>:
> >> >>
> >> >> First, thanks for the suggestion.
> >> >>
> >> >> I just tried that, didn't work.
> >> >> Here is the test file I used:
> >> >>
> >> >>
> >> >>     from django.test import TestCase
> >> >>
> >> >>     class HTMLTestCase(TestCase):
> >> >>
> >> >>         def test_input_in_fieldset(self):
> >> >>             fieldset = """
> >> >>         <fieldset class="form-group">
> >> >>             <input name="login">
> >> >>             <input autofocus="" class="form-control" id="id_username"
> >> >> maxlength="254" name="username" rows="3" type="text" required />
> >> >>         </fieldset>
> >> >>     """
> >> >>             self.assertInHTML('<input name=login>', fieldset)
> >> >>             self.assertInHTML('<input name="username">', fieldset)
> >> >>
> >> >>
> >> >> First input is to have a working exemple, second is taken as is from
> >> >> my view. Not closing the input in assertInHTML give an error
> `Couldn't
> >> >> find '<input name="login"' in response`. I assume I would get the
> same
> >> >> errors with assertContains(*args, html=True)
> >> >>
> >> >> I could copy/past the input directly in my test but if the maxlength
> >> >> or class attribute change, the test will break. Taking the input
> >> >> directly from the django form will test if the django form is
> rendered
> >> >> in the view, not if the view is displaying a suitable form.
> >> >>
> >> >> 2016-07-31 13:22 GMT+02:00 Andreas Kuhne <[email protected]
> >:
> >> >> > 2016-07-31 12:38 GMT+02:00 ludovic coues <[email protected]>:
> >> >> >>
> >> >> >> Hello,
> >> >> >>
> >> >> >> I am trying to test if a view is displaying a form with an input
> >> >> >> element with name=username.
> >> >> >>
> >> >> >> Currently, I have tried a lot of variation around
> >> >> >> `self.assertContains( response, "<input name=\"username\">",
> >> >> >> html=True)` but none work.
> >> >> >> I assume that doesn't work because the view have a field input
> with
> >> >> >> name=username but also autofocus="", a class and a bunch of other
> >> >> >> attribute.
> >> >> >>
> >> >> >> I could extract the form from the context and check the field
> >> >> >> username
> >> >> >> from the form is displayed in the view but I'm not ok with that
> >> >> >> solution. I'm testing if there is a input with name=username, not
> a
> >> >> >> bunch of unrelated attribute.
> >> >> >>
> >> >> >> I could also use a LiveServerTestCase and selenium but that look
> >> >> >> like
> >> >> >> a bit overkill for my need. lxml is another option but it would
> >> >> >> bring
> >> >> >> more dependencies.
> >> >> >>
> >> >> >> A bit of help would be welcome :)
> >> >> >>
> >> >> >>
> >> >> >>
> >> >> >> --
> >> >> >>
> >> >> >> Cordialement, Coues Ludovic
> >> >> >> +336 148 743 42
> >> >> >>
> >> >> >> --
> >> >> >> 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 [email protected].
> >> >> >> To post to this group, send email to
> [email protected].
> >> >> >> Visit this group at https://groups.google.com/group/django-users.
> >> >> >> To view this discussion on the web visit
> >> >> >>
> >> >> >>
> >> >> >>
> https://groups.google.com/d/msgid/django-users/CAEuG%2BTah74hdZMv%2BwdZPPq5PLaJ%3DhxOFMNXuVLfFYSw2Uz4N0w%40mail.gmail.com
> .
> >> >> >> For more options, visit https://groups.google.com/d/optout.
> >> >> >
> >> >> >
> >> >> > Django usually creates the inputs the same way, so what I do in my
> >> >> > tests
> >> >> > is
> >> >> > to first dump the content of the response body on the screen and
> then
> >> >> > copy
> >> >> > the input statement from there. What you probably need is '<input
> >> >> > name="username"', because it doesn't matter for your test if the
> html
> >> >> > tag is
> >> >> > closed. So you should be fine with:
> >> >> > self.assertContains(response, '<input name="username"')
> >> >> >
> >> >> > --
> >> >> > 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 [email protected].
> >> >> > To post to this group, send email to [email protected]
> .
> >> >> > Visit this group at https://groups.google.com/group/django-users.
> >> >> > To view this discussion on the web visit
> >> >> >
> >> >> >
> >> >> >
> https://groups.google.com/d/msgid/django-users/CALXYUbmmotLwzjZY6ZZnAqy21xqZN1%3DiE7ah3g5JxFgEw-POZg%40mail.gmail.com
> .
> >> >> > For more options, visit https://groups.google.com/d/optout.
> >> >>
> >> >>
> >> >>
> >> >> --
> >> >>
> >> >> Cordialement, Coues Ludovic
> >> >> +336 148 743 42
> >> >>
> >> >> --
> >> >> 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 [email protected].
> >> >> To post to this group, send email to [email protected].
> >> >> Visit this group at https://groups.google.com/group/django-users.
> >> >> To view this discussion on the web visit
> >> >>
> >> >>
> https://groups.google.com/d/msgid/django-users/CAEuG%2BTZCWDkkrZuP2N168pth1hL-gc8FrVjMwZnb3xS%2BK1X%2Bxw%40mail.gmail.com
> .
> >> >> For more options, visit https://groups.google.com/d/optout.
> >> >
> >> >
> >> > Hi,
> >> >
> >> > I think you have misunderstood me.
> >> >
> >> > First you need to check against the real response object, otherwise
> your
> >> > test will only test if the item is present in your string, which is
> not
> >> > what
> >> > I meant. I meant that you should check what HTML django is generating
> to
> >> > then get the correct information.
> >> >
> >> > In your case, I am now guessing that the output of django is the
> >> > information
> >> > you put into the fieldset variable?
> >> >
> >> > If so, you need to write
> >> > self.assertContains(response,'<input autofocus="" class="form-control"
> >> > id="id_username" maxlength="254" name="username"')
> >> >
> >> > The assertContains does not parse the html in any way, but uses a
> search
> >> > for
> >> > the text you entered. So if the text has 'autofocus=""
> >> > class="form-control"
> >> > id="id_username" maxlength="254"' before 'name="username"', then you
> >> > need to
> >> > add that as well, otherwise you won't find the text at all.
> >> >
> >> > Regards,
> >> >
> >> > Andréas
> >> >
> >> >
> >> > --
> >> > 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 [email protected].
> >> > To post to this group, send email to [email protected].
> >> > Visit this group at https://groups.google.com/group/django-users.
> >> > To view this discussion on the web visit
> >> >
> >> >
> https://groups.google.com/d/msgid/django-users/CALXYUbkp-oM3Y9dUYEcb8kbQT0kS95hDBqxVWMu8Cn-8iYQv3w%40mail.gmail.com
> .
> >> >
> >> > For more options, visit https://groups.google.com/d/optout.
> >>
> >>
> >>
> >> --
> >>
> >> Cordialement, Coues Ludovic
> >> +336 148 743 42
> >>
> >> --
> >> 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 [email protected].
> >> To post to this group, send email to [email protected].
> >> Visit this group at https://groups.google.com/group/django-users.
> >> To view this discussion on the web visit
> >>
> https://groups.google.com/d/msgid/django-users/CAEuG%2BTY%3DcbadWnm85-M2YEs2%3DwwH6gjLpnOGhLXjEpq-rGLGHw%40mail.gmail.com
> .
> >> For more options, visit https://groups.google.com/d/optout.
> >
> >
> > Hi again,
> >
> > I understand your problem with a test failing if a class is added,
> however,
> > there is no other way to check this (as far as I know). If you want to
> > explicitly check for an input with the name "username", I would probably
> try
> > using xml. That way you could use xpath to search quickly.
> >
> > Regards,
> >
> > Andréas
> >
> > --
> > 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 [email protected].
> > To post to this group, send email to [email protected].
> > Visit this group at https://groups.google.com/group/django-users.
> > To view this discussion on the web visit
> >
> https://groups.google.com/d/msgid/django-users/CALXYUbm5vcL%3Dz7qr7ZeS%2BMuNjH6LYscT9tr3Y3k0X3RLAAbEsQ%40mail.gmail.com
> .
> >
> > For more options, visit https://groups.google.com/d/optout.
>
>
>
> --
>
> Cordialement, Coues Ludovic
> +336 148 743 42
>
> --
> 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 [email protected].
> To post to this group, send email to [email protected].
> Visit this group at https://groups.google.com/group/django-users.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/django-users/CAEuG%2BTYm3Wq_zFzPaObx_5zVBpNQ0HUdnTHRzCtky45u2aZjNw%40mail.gmail.com
> .
> For more options, visit https://groups.google.com/d/optout.
>

-- 
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 [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/CALXYUb%3Do4rzvrEP9cVFB__0qyUwpURseM_WAgRSXkY75v2iibA%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to