def test_contains_partial():
    c = SimpleTestCase()
    needle = "<span></span>"
    html = "<form>%s</form>"
    c.assertTrue(contains_partial(html % needle, needle))

    needle = "<span></span><b></b>"
    c.assertRaises(NotImplementedError, contains_partial, html % needle,
                   needle)

    needle = "<span>a</span>"
    c.assertRaises(NotImplementedError, contains_partial, html % needle,
                   needle)

    needle = '<span id="e"></span>'
    html = '<form id="tt"><span id="f"></span>%s</form>'
    c.assertTrue(contains_partial(html % needle, needle))

    missing = "<script></script>"
    c.assertFalse(contains_partial(html % missing, needle))

    needle = '<span id="e"></span>'
    html = '<form id="tt"><span id="f"></span>%s</form>'
    missing = '<span id="g"></span>'
    c.assertFalse(contains_partial(html % missing, needle))

    needle = '<div id="r"><span>toto</span></div>'
    html = '<form><div id="r"></div></form>'
    c.assertRaises(NotImplementedError, contains_partial, html, needle)
    # as we do not look at the children, needle is equivalent to <div id="r"></div> which IS in html
    c.assertTrue(contains_partial(html, needle, ignore_needle_children=True))
    def test_prepended_appended_text(self, settings):
        test_form = SampleForm()
        test_form.helper = FormHelper()
        test_form.helper.layout = Layout(
            PrependedAppendedText("email", "@", "gmail.com"),
            AppendedText("password1", "#"),
            PrependedText("password2", "$"),
        )
        html = render_crispy_form(test_form)
        dom = parse_html(html)

        # Check form parameters
        if settings.CRISPY_TEMPLATE_PACK == "css":
            assert dom.count(parse_html('<span class="add-on">@</span>')) == 1
            assert dom.count(
                parse_html('<span class="add-on">gmail.com</span>')) == 1
            assert dom.count(parse_html('<span class="add-on">#</span>')) == 1
            assert dom.count(parse_html('<span class="add-on">$</span>')) == 1

        if settings.CRISPY_TEMPLATE_PACK == "bootstrap3":
            assert html.count('<span class="input-group-addon">@</span>') == 1
            assert html.count(
                '<span class="input-group-addon">gmail.com</span>') == 1
            assert html.count('<span class="input-group-addon">#</span>') == 1
            assert html.count('<span class="input-group-addon">$</span>') == 1
            test_form.helper.layout = Layout(
                PrependedAppendedText("email",
                                      "@",
                                      "gmail.com",
                                      css_class="input-lg"), )
            html = render_crispy_form(test_form)

            assert 'class="input-lg' in html
            assert contains_partial(
                html, '<span class="input-group-addon input-lg"/>')

        if settings.CRISPY_TEMPLATE_PACK == "bootstrap4":
            assert html.count('<span class="input-group-text">@</span>') == 1
            assert html.count(
                '<span class="input-group-text">gmail.com</span>') == 1
            assert html.count('<span class="input-group-text">#</span>') == 1
            assert html.count('<span class="input-group-text">$</span>') == 1
            test_form.helper.layout = Layout(
                PrependedAppendedText("email",
                                      "@",
                                      "gmail.com",
                                      css_class="form-control-lg"), )
            html = render_crispy_form(test_form)

            assert 'class="form-control-lg' in html
            assert contains_partial(html, '<span class="input-group-text"/>')
    def test_prepended_appended_text(self, settings):
        test_form = SampleForm()
        test_form.helper = FormHelper()
        test_form.helper.layout = Layout(
            PrependedAppendedText('email', '@', 'gmail.com'),
            AppendedText('password1', '#'),
            PrependedText('password2', '$'),
        )
        html = render_crispy_form(test_form)
        dom = parse_html(html)

        # Check form parameters
        if settings.CRISPY_TEMPLATE_PACK == 'bootstrap':
            assert dom.count(parse_html('<span class="add-on">@</span>')) == 1
            assert dom.count(
                parse_html('<span class="add-on">gmail.com</span>')) == 1
            assert dom.count(parse_html('<span class="add-on">#</span>')) == 1
            assert dom.count(parse_html('<span class="add-on">$</span>')) == 1

        if settings.CRISPY_TEMPLATE_PACK in ['bootstrap3', 'bootstrap4']:
            assert html.count('<span class="input-group-addon">@</span>') == 1
            assert html.count(
                '<span class="input-group-addon">gmail.com</span>') == 1
            assert html.count('<span class="input-group-addon">#</span>') == 1
            assert html.count('<span class="input-group-addon">$</span>') == 1

        if settings.CRISPY_TEMPLATE_PACK == 'bootstrap3':
            test_form.helper.layout = Layout(
                PrependedAppendedText('email',
                                      '@',
                                      'gmail.com',
                                      css_class='input-lg'), )
            html = render_crispy_form(test_form)

            assert 'class="input-lg' in html
            assert contains_partial(
                html, '<span class="input-group-addon input-lg"/>')

        if settings.CRISPY_TEMPLATE_PACK == 'bootstrap4':
            test_form.helper.layout = Layout(
                PrependedAppendedText('email',
                                      '@',
                                      'gmail.com',
                                      css_class='form-control-lg'), )
            html = render_crispy_form(test_form)

            assert 'class="form-control-lg' in html
            assert contains_partial(html, '<span class="input-group-addon"/>')
    def test_prepended_appended_text(self, settings):
        test_form = SampleForm()
        test_form.helper = FormHelper()
        test_form.helper.layout = Layout(
            PrependedAppendedText("email", "@", "gmail.com"),
            AppendedText("password1", "#"),
            PrependedText("password2", "$"),
        )
        html = render_crispy_form(test_form)

        # Check form parameters
        assert html.count('<span class="input-group-text">@</span>') == 1
        assert html.count(
            '<span class="input-group-text">gmail.com</span>') == 1
        assert html.count('<span class="input-group-text">#</span>') == 1
        assert html.count('<span class="input-group-text">$</span>') == 1
        test_form.helper.layout = Layout(
            PrependedAppendedText("email",
                                  "@",
                                  "gmail.com",
                                  css_class="form-control-lg"))
        html = render_crispy_form(test_form)

        assert 'class="form-control-lg' in html
        assert contains_partial(html, '<span class="input-group-text"/>')
    def test_prepended_appended_text(self, settings):
        test_form = SampleForm()
        test_form.helper = FormHelper()
        test_form.helper.layout = Layout(
            PrependedAppendedText('email', '@', 'gmail.com'),
            AppendedText('password1', '#'),
            PrependedText('password2', '$'),
        )
        html = render_crispy_form(test_form)
        dom = parse_html(html)

        # Check form parameters
        if settings.CRISPY_TEMPLATE_PACK == 'bootstrap':
            assert dom.count(parse_html('<span class="add-on">@</span>')) == 1
            assert dom.count(parse_html('<span class="add-on">gmail.com</span>')) == 1
            assert dom.count(parse_html('<span class="add-on">#</span>')) == 1
            assert dom.count(parse_html('<span class="add-on">$</span>')) == 1

        if settings.CRISPY_TEMPLATE_PACK == 'bootstrap3':
            assert html.count('<span class="input-group-addon">@</span>') == 1
            assert html.count(
                '<span class="input-group-addon">gmail.com</span>') == 1
            assert html.count('<span class="input-group-addon">#</span>') == 1
            assert html.count('<span class="input-group-addon">$</span>') == 1
            test_form.helper.layout = Layout(
                PrependedAppendedText('email', '@', 'gmail.com',
                                      css_class='input-lg'), )
            html = render_crispy_form(test_form)

            assert 'class="input-lg' in html
            assert contains_partial(html, '<span class="input-group-addon input-lg"/>')

        if settings.CRISPY_TEMPLATE_PACK == 'bootstrap4':
            assert html.count('<span class="input-group-text">@</span>') == 1
            assert html.count(
                '<span class="input-group-text">gmail.com</span>') == 1
            assert html.count('<span class="input-group-text">#</span>') == 1
            assert html.count('<span class="input-group-text">$</span>') == 1
            test_form.helper.layout = Layout(
                PrependedAppendedText('email', '@', 'gmail.com',
                                      css_class='form-control-lg'), )
            html = render_crispy_form(test_form)

            assert 'class="form-control-lg' in html
            assert contains_partial(html, '<span class="input-group-text"/>')