Beispiel #1
0
class BootstrapTestCase(unittest.TestCase):
    def setUp(self):
        self.app = Flask(__name__)
        self.app.testing = True
        self.app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///'
        self.app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
        self.app.secret_key = 'for test'
        self.bootstrap = Bootstrap(self.app)  # noqa

        @self.app.route('/')
        def index():
            return render_template_string(
                '{{ bootstrap.load_css() }}{{ bootstrap.load_js() }}')

        self.context = self.app.test_request_context()
        self.context.push()
        self.client = self.app.test_client()

    def tearDown(self):
        self.context.pop()

    def test_extension_init(self):
        self.assertIn('bootstrap', current_app.extensions)

    def test_load_css(self):
        rv = self.bootstrap.load_css()
        self.assertIn('bootstrap.min.css', rv)

    def test_load_js(self):
        rv = self.bootstrap.load_js()
        self.assertIn('bootstrap.min.js', rv)

    def test_local_resources(self):
        current_app.config['BOOTSTRAP_SERVE_LOCAL'] = True

        response = self.client.get('/')
        data = response.get_data(as_text=True)
        self.assertNotIn('https://cdn.jsdelivr.net/npm/bootstrap', data)
        self.assertIn('bootstrap.min.js', data)
        self.assertIn('bootstrap.min.css', data)
        self.assertIn('jquery.min.js', data)

        css_response = self.client.get(
            '/bootstrap/static/css/bootstrap.min.css')
        js_response = self.client.get('/bootstrap/static/js/bootstrap.min.js')
        jquery_response = self.client.get('/bootstrap/static/jquery.min.js')
        self.assertNotEqual(css_response.status_code, 404)
        self.assertNotEqual(js_response.status_code, 404)
        self.assertNotEqual(jquery_response.status_code, 404)

        css_rv = self.bootstrap.load_css()
        js_rv = self.bootstrap.load_js()
        self.assertIn('/bootstrap/static/css/bootstrap.min.css', css_rv)
        self.assertIn('/bootstrap/static/js/bootstrap.min.js', js_rv)
        self.assertNotIn('https://cdn.jsdelivr.net/npm/bootstrap', css_rv)
        self.assertNotIn('https://cdn.jsdelivr.net/npm/bootstrap', js_rv)

    def test_cdn_resources(self):
        response = self.client.get('/')
        data = response.get_data(as_text=True)
        self.assertIn('https://cdn.jsdelivr.net/npm/bootstrap', data)
        self.assertIn('bootstrap.min.js', data)
        self.assertIn('bootstrap.min.css', data)

        css_rv = self.bootstrap.load_css()
        js_rv = self.bootstrap.load_js()
        self.assertNotIn('/bootstrap/static/css/bootstrap.min.css', css_rv)
        self.assertNotIn('/bootstrap/static/js/bootstrap.min.js', js_rv)
        self.assertIn('https://cdn.jsdelivr.net/npm/bootstrap', css_rv)
        self.assertIn('https://cdn.jsdelivr.net/npm/bootstrap', js_rv)

    def test_render_field(self):
        @self.app.route('/field')
        def test():
            form = HelloForm()
            return render_template_string('''
            {% from 'bootstrap/form.html' import render_field %}
            {{ render_field(form.username) }}
            {{ render_field(form.password) }}
            ''',
                                          form=form)

        response = self.client.get('/field')
        data = response.get_data(as_text=True)
        self.assertIn(
            '<input class="form-control" id="username" name="username"', data)
        self.assertIn(
            '<input class="form-control" id="password" name="password"', data)

    def test_render_form(self):
        @self.app.route('/form')
        def test():
            form = HelloForm()
            return render_template_string('''
                    {% from 'bootstrap/form.html' import render_form %}
                    {{ render_form(form) }}
                    ''',
                                          form=form)

        response = self.client.get('/form')
        data = response.get_data(as_text=True)
        self.assertIn(
            '<input class="form-control" id="username" name="username"', data)
        self.assertIn(
            '<input class="form-control" id="password" name="password"', data)

    def test_render_form_row(self):
        @self.app.route('/form')
        def test():
            form = HelloForm()
            return render_template_string('''
                    {% from 'bootstrap/form.html' import render_form_row %}
                    {{ render_form_row([form.username, form.password]) }}
                    ''',
                                          form=form)

        response = self.client.get('/form')
        data = response.get_data(as_text=True)
        self.assertIn('<div class="form-row">', data)
        self.assertIn('<div class="col">', data)

    def test_render_form_row_row_class(self):
        @self.app.route('/form')
        def test():
            form = HelloForm()
            return render_template_string('''
                    {% from 'bootstrap/form.html' import render_form_row %}
                    {{ render_form_row([form.username, form.password], row_class='row') }}
                    ''',
                                          form=form)

        response = self.client.get('/form')
        data = response.get_data(as_text=True)
        self.assertIn('<div class="row">', data)

    def test_render_form_row_col_class_default(self):
        @self.app.route('/form')
        def test():
            form = HelloForm()
            return render_template_string('''
                    {% from 'bootstrap/form.html' import render_form_row %}
                    {{ render_form_row([form.username, form.password], col_class_default='col-md-6') }}
                    ''',
                                          form=form)

        response = self.client.get('/form')
        data = response.get_data(as_text=True)
        self.assertIn('<div class="col-md-6">', data)

    def test_render_form_row_col_map(self):
        @self.app.route('/form')
        def test():
            form = HelloForm()
            return render_template_string('''
                    {% from 'bootstrap/form.html' import render_form_row %}
                    {{ render_form_row([form.username, form.password], col_map={'username': '******'}) }}
                    ''',
                                          form=form)

        response = self.client.get('/form')
        data = response.get_data(as_text=True)
        self.assertIn('<div class="col">', data)
        self.assertIn('<div class="col-md-6">', data)

    def test_render_pager(self):
        db = SQLAlchemy(self.app)

        class Message(db.Model):
            id = db.Column(db.Integer, primary_key=True)

        @self.app.route('/pager')
        def test():
            db.drop_all()
            db.create_all()
            for i in range(100):
                m = Message()
                db.session.add(m)
            db.session.commit()
            page = request.args.get('page', 1, type=int)
            pagination = Message.query.paginate(page, per_page=10)
            messages = pagination.items
            return render_template_string('''
                            {% from 'bootstrap/pagination.html' import render_pager %}
                            {{ render_pager(pagination) }}
                            ''',
                                          pagination=pagination,
                                          messages=messages)

        response = self.client.get('/pager')
        data = response.get_data(as_text=True)
        self.assertIn('<nav aria-label="Page navigation">', data)
        self.assertIn('Previous', data)
        self.assertIn('Next', data)
        self.assertIn('<li class="page-item disabled">', data)

        response = self.client.get('/pager?page=2')
        data = response.get_data(as_text=True)
        self.assertIn('<nav aria-label="Page navigation">', data)
        self.assertIn('Previous', data)
        self.assertIn('Next', data)
        self.assertNotIn('<li class="page-item disabled">', data)

    def test_render_pagination(self):
        db = SQLAlchemy(self.app)

        class Message(db.Model):
            id = db.Column(db.Integer, primary_key=True)

        @self.app.route('/pagination')
        def test():
            db.drop_all()
            db.create_all()
            for i in range(100):
                m = Message()
                db.session.add(m)
            db.session.commit()
            page = request.args.get('page', 1, type=int)
            pagination = Message.query.paginate(page, per_page=10)
            messages = pagination.items
            return render_template_string('''
                                    {% from 'bootstrap/pagination.html' import render_pagination %}
                                    {{ render_pagination(pagination) }}
                                    ''',
                                          pagination=pagination,
                                          messages=messages)

        response = self.client.get('/pagination')
        data = response.get_data(as_text=True)
        self.assertIn('<nav aria-label="Page navigation">', data)
        self.assertIn(
            '<a class="page-link" href="#">1 <span class="sr-only">(current)</span></a>',
            data)
        self.assertIn('10</a>', data)

        response = self.client.get('/pagination?page=2')
        data = response.get_data(as_text=True)
        self.assertIn('<nav aria-label="Page navigation">', data)
        self.assertIn('1</a>', data)
        self.assertIn(
            '<a class="page-link" href="#">2 <span class="sr-only">(current)</span></a>',
            data)
        self.assertIn('10</a>', data)

    def test_render_nav_item(self):
        @self.app.route('/nav_item')
        def test():
            return render_template_string('''
                    {% from 'bootstrap/nav.html' import render_nav_item %}
                    {{ render_nav_item('test', 'Home') }}
                    ''')

        response = self.client.get('/nav_item')
        data = response.get_data(as_text=True)
        self.assertIn('<a class="nav-item nav-link active"', data)

    def test_render_breadcrumb_item(self):
        @self.app.route('/breadcrumb_item')
        def test():
            return render_template_string('''
                    {% from 'bootstrap/nav.html' import render_breadcrumb_item %}
                    {{ render_breadcrumb_item('test', 'Home') }}
                    ''')

        response = self.client.get('/breadcrumb_item')
        data = response.get_data(as_text=True)
        self.assertIn(
            '<li class="breadcrumb-item active"  aria-current="page">', data)

    def test_render_static(self):
        @self.app.route('/test_static')
        def test():
            return render_template_string('''
                            {% from 'bootstrap/utils.html' import render_static %}
                            {{ render_static('css', 'test.css') }}
                            {{ render_static('js', 'test.js') }}
                            {{ render_static('icon', 'test.ico') }}
                            ''')

        response = self.client.get('/test_static')
        data = response.get_data(as_text=True)
        self.assertIn(
            '<link rel="stylesheet" href="/static/test.css" type="text/css">',
            data)
        self.assertIn(
            '<script type="text/javascript" src="/static/test.js"></script>',
            data)
        self.assertIn('<link rel="icon" href="/static/test.ico">', data)

    def test_render_messages(self):
        @self.app.route('/messages')
        def test_messages():
            flash('test message', 'danger')
            return render_template_string('''
                            {% from 'bootstrap/utils.html' import render_messages %}
                            {{ render_messages() }}
                            ''')

        @self.app.route('/container')
        def test_container():
            flash('test message', 'danger')
            return render_template_string('''
                            {% from 'bootstrap/utils.html' import render_messages %}
                            {{ render_messages(container=True) }}
                            ''')

        @self.app.route('/dismissible')
        def test_dismissible():
            flash('test message', 'danger')
            return render_template_string('''
                            {% from 'bootstrap/utils.html' import render_messages %}
                            {{ render_messages(dismissible=True) }}
                            ''')

        @self.app.route('/dismiss_animate')
        def test_dismiss_animate():
            flash('test message', 'danger')
            return render_template_string('''
                            {% from 'bootstrap/utils.html' import render_messages %}
                            {{ render_messages(dismissible=True, dismiss_animate=True) }}
                            ''')

        response = self.client.get('/messages')
        data = response.get_data(as_text=True)
        self.assertIn('<div class="alert alert-danger"', data)

        response = self.client.get('/container')
        data = response.get_data(as_text=True)
        self.assertIn('<div class="container flashed-messages">', data)

        response = self.client.get('/dismissible')
        data = response.get_data(as_text=True)
        self.assertIn('alert-dismissible', data)
        self.assertIn(
            '<button type="button" class="close" data-dismiss="alert"', data)
        self.assertNotIn('fade show', data)

        response = self.client.get('/dismiss_animate')
        data = response.get_data(as_text=True)
        self.assertIn('alert-dismissible', data)
        self.assertIn(
            '<button type="button" class="close" data-dismiss="alert"', data)
        self.assertIn('fade show', data)

    # test WTForm fields for render_form and render_field
    def test_render_form_enctype(self):
        class SingleUploadForm(FlaskForm):
            avatar = FileField('Avatar')

        class MultiUploadForm(FlaskForm):
            photos = MultipleFileField('Multiple photos')

        @self.app.route('/single')
        def single():
            form = SingleUploadForm()
            return render_template_string('''
            {% from 'bootstrap/form.html' import render_form %}
            {{ render_form(form) }}
            ''',
                                          form=form)

        @self.app.route('/multi')
        def multi():
            form = SingleUploadForm()
            return render_template_string('''
            {% from 'bootstrap/form.html' import render_form %}
            {{ render_form(form) }}
            ''',
                                          form=form)

        response = self.client.get('/single')
        data = response.get_data(as_text=True)
        self.assertIn('multipart/form-data', data)

        response = self.client.get('/multi')
        data = response.get_data(as_text=True)
        self.assertIn('multipart/form-data', data)

    # test render_kw class for WTForms field
    def test_form_render_kw_class(self):
        class TestForm(FlaskForm):
            username = StringField('Username')
            password = PasswordField('Password',
                                     render_kw={'class': 'my-password-class'})
            submit = SubmitField(render_kw={'class': 'my-awesome-class'})

        @self.app.route('/render_kw')
        def render_kw():
            form = TestForm()
            return render_template_string('''
            {% from 'bootstrap/form.html' import render_form %}
            {{ render_form(form) }}
            ''',
                                          form=form)

        response = self.client.get('/render_kw')
        data = response.get_data(as_text=True)
        self.assertIn('class="form-control"', data)
        self.assertNotIn('class="form-control "', data)
        self.assertIn('class="form-control my-password-class"', data)
        self.assertIn('my-awesome-class', data)
        self.assertIn('btn', data)

    # test WTForm field description for BooleanField
    def test_form_description_for_booleanfield(self):
        class TestForm(FlaskForm):
            remember = BooleanField('Remember me',
                                    description='Just check this')

        @self.app.route('/description')
        def description():
            form = TestForm()
            return render_template_string('''
            {% from 'bootstrap/form.html' import render_form %}
            {{ render_form(form) }}
            ''',
                                          form=form)

        response = self.client.get('/description')
        data = response.get_data(as_text=True)
        self.assertIn('Remember me', data)
        self.assertIn(
            '<small class="form-text text-muted">Just check this</small>',
            data)

    def test_button_size(self):
        self.assertEqual(current_app.config['BOOTSTRAP_BTN_SIZE'], 'md')
        current_app.config['BOOTSTRAP_BTN_SIZE'] = 'lg'

        @self.app.route('/form')
        def test():
            form = HelloForm()
            return render_template_string('''
            {% from 'bootstrap/form.html' import render_form %}
            {{ render_form(form) }}
            ''',
                                          form=form)

        response = self.client.get('/form')
        data = response.get_data(as_text=True)
        self.assertIn('btn-lg', data)

        @self.app.route('/form2')
        def test_overwrite():
            form = HelloForm()
            return render_template_string('''
            {% from 'bootstrap/form.html' import render_form %}
            {{ render_form(form, button_size='sm') }}
            ''',
                                          form=form)

        response = self.client.get('/form2')
        data = response.get_data(as_text=True)
        self.assertNotIn('btn-lg', data)
        self.assertIn('btn-sm', data)

    def test_button_style(self):
        self.assertEqual(current_app.config['BOOTSTRAP_BTN_STYLE'],
                         'secondary')
        current_app.config['BOOTSTRAP_BTN_STYLE'] = 'primary'

        @self.app.route('/form')
        def test():
            form = HelloForm()
            return render_template_string('''
            {% from 'bootstrap/form.html' import render_form %}
            {{ render_form(form) }}
            ''',
                                          form=form)

        response = self.client.get('/form')
        data = response.get_data(as_text=True)
        self.assertIn('btn-primary', data)

        @self.app.route('/form2')
        def test_overwrite():
            form = HelloForm()
            return render_template_string('''
            {% from 'bootstrap/form.html' import render_form %}
            {{ render_form(form, button_style='success') }}
            ''',
                                          form=form)

        response = self.client.get('/form2')
        data = response.get_data(as_text=True)
        self.assertNotIn('btn-primary', data)
        self.assertIn('btn-success', data)

        @self.app.route('/form3')
        def test_button_map():
            form = HelloForm()
            return render_template_string('''
            {% from 'bootstrap/form.html' import render_form %}
            {{ render_form(form, button_map={'submit': 'warning'}) }}
            ''',
                                          form=form)

        response = self.client.get('/form3')
        data = response.get_data(as_text=True)
        self.assertNotIn('btn-primary', data)
        self.assertIn('btn-warning', data)

    def test_error_message_for_radiofield_and_booleanfield(self):
        class TestForm(FlaskForm):
            remember = BooleanField('Remember me', validators=[DataRequired()])
            option = RadioField(choices=[('dog', 'Dog'), ('cat', 'Cat'),
                                         ('bird', 'Bird'), ('alien', 'Alien')],
                                validators=[DataRequired()])

        @self.app.route('/error', methods=['GET', 'POST'])
        def error():
            form = TestForm()
            if form.validate_on_submit():
                pass
            return render_template_string('''
            {% from 'bootstrap/form.html' import render_form %}
            {{ render_form(form) }}
            ''',
                                          form=form)

        response = self.client.post('/error', follow_redirects=True)
        data = response.get_data(as_text=True)
        self.assertIn('This field is required', data)

    def test_render_simple_table(self):
        db = SQLAlchemy(self.app)

        class Message(db.Model):
            id = db.Column(db.Integer, primary_key=True)
            text = db.Column(db.Text)

        @self.app.route('/table')
        def test():
            db.drop_all()
            db.create_all()
            for i in range(10):
                m = Message(text='Test message {}'.format(i + 1))
                db.session.add(m)
            db.session.commit()
            page = request.args.get('page', 1, type=int)
            pagination = Message.query.paginate(page, per_page=10)
            messages = pagination.items
            titles = [('id', '#'), ('text', 'Message')]
            return render_template_string('''
                                    {% from 'bootstrap/table.html' import render_table %}
                                    {{ render_table(messages, titles) }}
                                    ''',
                                          titles=titles,
                                          messages=messages)

        response = self.client.get('/table')
        data = response.get_data(as_text=True)
        self.assertIn('<table class="table">', data)
        self.assertIn('<th scope="col">#</th>', data)
        self.assertIn('<th scope="col">Message</th>', data)
        self.assertIn('<th scope="col">Message</th>', data)
        self.assertIn('<th scope="row">1</th>', data)
        self.assertIn('<td>Test message 1</td>', data)

    def test_render_customized_table(self):
        db = SQLAlchemy(self.app)

        class Message(db.Model):
            id = db.Column(db.Integer, primary_key=True)
            text = db.Column(db.Text)

        @self.app.route('/table')
        def test():
            db.drop_all()
            db.create_all()
            for i in range(10):
                m = Message(text='Test message {}'.format(i + 1))
                db.session.add(m)
            db.session.commit()
            page = request.args.get('page', 1, type=int)
            pagination = Message.query.paginate(page, per_page=10)
            messages = pagination.items
            titles = [('id', '#'), ('text', 'Message')]
            return render_template_string('''
                                    {% from 'bootstrap/table.html' import render_table %}
                                    {{ render_table(messages, titles, table_classes='table-striped',
                                    header_classes='thead-dark', caption='Messages') }}
                                    ''',
                                          titles=titles,
                                          messages=messages)

        response = self.client.get('/table')
        data = response.get_data(as_text=True)
        self.assertIn('<table class="table table-striped">', data)
        self.assertIn('<thead class="thead-dark">', data)
        self.assertIn('<caption>Messages</caption>', data)

    def test_render_responsive_table(self):
        db = SQLAlchemy(self.app)

        class Message(db.Model):
            id = db.Column(db.Integer, primary_key=True)
            text = db.Column(db.Text)

        @self.app.route('/table')
        def test():
            db.drop_all()
            db.create_all()
            for i in range(10):
                m = Message(text='Test message {}'.format(i + 1))
                db.session.add(m)
            db.session.commit()
            page = request.args.get('page', 1, type=int)
            pagination = Message.query.paginate(page, per_page=10)
            messages = pagination.items
            titles = [('id', '#'), ('text', 'Message')]
            return render_template_string('''
                                    {% from 'bootstrap/table.html' import render_table %}
                                    {{ render_table(messages, titles, responsive=True,
                                    responsive_class='table-responsive-sm') }}
                                    ''',
                                          titles=titles,
                                          messages=messages)

        response = self.client.get('/table')
        data = response.get_data(as_text=True)
        self.assertIn('<div class="table-responsive-sm">', data)

    def test_build_table_titles(self):
        db = SQLAlchemy(self.app)

        class Message(db.Model):
            id = db.Column(db.Integer, primary_key=True)
            text = db.Column(db.Text)

        @self.app.route('/table')
        def test():
            db.drop_all()
            db.create_all()
            for i in range(10):
                m = Message(text='Test message {}'.format(i + 1))
                db.session.add(m)
            db.session.commit()
            page = request.args.get('page', 1, type=int)
            pagination = Message.query.paginate(page, per_page=10)
            messages = pagination.items
            return render_template_string('''
                                    {% from 'bootstrap/table.html' import render_table %}
                                    {{ render_table(messages) }}
                                    ''',
                                          messages=messages)

        response = self.client.get('/table')
        data = response.get_data(as_text=True)
        self.assertIn('<table class="table">', data)
        self.assertIn('<th scope="col">#</th>', data)
        self.assertIn('<th scope="col">Text</th>', data)
        self.assertIn('<th scope="col">Text</th>', data)
        self.assertIn('<th scope="row">1</th>', data)
        self.assertIn('<td>Test message 1</td>', data)

    def test_build_table_titles_with_empty_data(self):
        @self.app.route('/table')
        def test():
            messages = []
            return render_template_string('''
                                    {% from 'bootstrap/table.html' import render_table %}
                                    {{ render_table(messages) }}
                                    ''',
                                          messages=messages)

        response = self.client.get('/table')
        self.assertEqual(response.status_code, 200)
Beispiel #2
0
class BootstrapTestCase(unittest.TestCase):
    def setUp(self):
        self.app = Flask(__name__)
        self.app.testing = True
        self.app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///'
        self.app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
        self.app.secret_key = 'for test'
        self.bootstrap = Bootstrap(self.app)  # noqa

        @self.app.route('/')
        def index():
            return render_template_string(
                '{{ bootstrap.load_css() }}{{ bootstrap.load_js() }}')

        self.context = self.app.test_request_context()
        self.context.push()
        self.client = self.app.test_client()

    def tearDown(self):
        self.context.pop()

    def test_extension_init(self):
        self.assertIn('bootstrap', current_app.extensions)

    def test_load_css(self):
        rv = self.bootstrap.load_css()
        self.assertIn('bootstrap.min.css', rv)

    def test_load_js(self):
        rv = self.bootstrap.load_js()
        self.assertIn('bootstrap.min.js', rv)

    def test_local_resources(self):
        current_app.config['BOOTSTRAP_SERVE_LOCAL'] = True

        response = self.client.get('/')
        data = response.get_data(as_text=True)
        self.assertNotIn('https://cdn.jsdelivr.net/npm/bootstrap', data)
        self.assertIn('bootstrap.min.js', data)
        self.assertIn('bootstrap.min.css', data)
        self.assertIn('jquery.min.js', data)

        css_response = self.client.get(
            '/bootstrap/static/css/bootstrap.min.css')
        js_response = self.client.get('/bootstrap/static/js/bootstrap.min.js')
        jquery_response = self.client.get('/bootstrap/static/jquery.min.js')
        self.assertNotEqual(css_response.status_code, 404)
        self.assertNotEqual(js_response.status_code, 404)
        self.assertNotEqual(jquery_response.status_code, 404)

        css_rv = self.bootstrap.load_css()
        js_rv = self.bootstrap.load_js()
        self.assertIn('/bootstrap/static/css/bootstrap.min.css', css_rv)
        self.assertIn('/bootstrap/static/js/bootstrap.min.js', js_rv)
        self.assertNotIn('https://cdn.jsdelivr.net/npm/bootstrap', css_rv)
        self.assertNotIn('https://cdn.jsdelivr.net/npm/bootstrap', js_rv)

    def test_cdn_resources(self):
        response = self.client.get('/')
        data = response.get_data(as_text=True)
        self.assertIn('https://cdn.jsdelivr.net/npm/bootstrap', data)
        self.assertIn('bootstrap.min.js', data)
        self.assertIn('bootstrap.min.css', data)

        css_rv = self.bootstrap.load_css()
        js_rv = self.bootstrap.load_js()
        self.assertNotIn('/bootstrap/static/css/bootstrap.min.css', css_rv)
        self.assertNotIn('/bootstrap/static/js/bootstrap.min.js', js_rv)
        self.assertIn('https://cdn.jsdelivr.net/npm/bootstrap', css_rv)
        self.assertIn('https://cdn.jsdelivr.net/npm/bootstrap', js_rv)

    def test_render_field(self):
        @self.app.route('/field')
        def test():
            form = HelloForm()
            return render_template_string('''
            {% from 'bootstrap/form.html' import render_field %}
            {{ render_field(form.username) }}
            {{ render_field(form.password) }}
            ''',
                                          form=form)

        response = self.client.get('/field')
        data = response.get_data(as_text=True)
        self.assertIn(
            '<input class="form-control" id="username" name="username"', data)
        self.assertIn(
            '<input class="form-control" id="password" name="password"', data)

    def test_render_form(self):
        @self.app.route('/form')
        def test():
            form = HelloForm()
            return render_template_string('''
                    {% from 'bootstrap/form.html' import render_form %}
                    {{ render_form(form) }}
                    ''',
                                          form=form)

        response = self.client.get('/form')
        data = response.get_data(as_text=True)
        self.assertIn(
            '<input class="form-control" id="username" name="username"', data)
        self.assertIn(
            '<input class="form-control" id="password" name="password"', data)

    def test_render_form_row(self):
        @self.app.route('/form')
        def test():
            form = HelloForm()
            return render_template_string('''
                    {% from 'bootstrap/form.html' import render_form_row %}
                    {{ render_form_row([form.username, form.password]) }}
                    ''',
                                          form=form)

        response = self.client.get('/form')
        data = response.get_data(as_text=True)
        self.assertIn('<div class="form-row">', data)
        self.assertIn('<div class="col">', data)

    def test_render_form_row_row_class(self):
        @self.app.route('/form')
        def test():
            form = HelloForm()
            return render_template_string('''
                    {% from 'bootstrap/form.html' import render_form_row %}
                    {{ render_form_row([form.username, form.password], row_class='row') }}
                    ''',
                                          form=form)

        response = self.client.get('/form')
        data = response.get_data(as_text=True)
        self.assertIn('<div class="row">', data)

    def test_render_form_row_col_class_default(self):
        @self.app.route('/form')
        def test():
            form = HelloForm()
            return render_template_string('''
                    {% from 'bootstrap/form.html' import render_form_row %}
                    {{ render_form_row([form.username, form.password], col_class_default='col-md-6') }}
                    ''',
                                          form=form)

        response = self.client.get('/form')
        data = response.get_data(as_text=True)
        self.assertIn('<div class="col-md-6">', data)

    def test_render_form_row_col_map(self):
        @self.app.route('/form')
        def test():
            form = HelloForm()
            return render_template_string('''
                    {% from 'bootstrap/form.html' import render_form_row %}
                    {{ render_form_row([form.username, form.password], col_map={'username': '******'}) }}
                    ''',
                                          form=form)

        response = self.client.get('/form')
        data = response.get_data(as_text=True)
        self.assertIn('<div class="col">', data)
        self.assertIn('<div class="col-md-6">', data)

    def test_render_pager(self):
        db = SQLAlchemy(self.app)

        class Message(db.Model):
            id = db.Column(db.Integer, primary_key=True)

        @self.app.route('/pager')
        def test():
            db.drop_all()
            db.create_all()
            for i in range(100):
                m = Message()
                db.session.add(m)
            db.session.commit()
            page = request.args.get('page', 1, type=int)
            pagination = Message.query.paginate(page, per_page=10)
            messages = pagination.items
            return render_template_string('''
                            {% from 'bootstrap/pagination.html' import render_pager %}
                            {{ render_pager(pagination) }}
                            ''',
                                          pagination=pagination,
                                          messages=messages)

        response = self.client.get('/pager')
        data = response.get_data(as_text=True)
        self.assertIn('<nav aria-label="Page navigation">', data)
        self.assertIn('Previous', data)
        self.assertIn('Next', data)
        self.assertIn('<li class="page-item disabled">', data)

        response = self.client.get('/pager?page=2')
        data = response.get_data(as_text=True)
        self.assertIn('<nav aria-label="Page navigation">', data)
        self.assertIn('Previous', data)
        self.assertIn('Next', data)
        self.assertNotIn('<li class="page-item disabled">', data)

    def test_render_pagination(self):
        db = SQLAlchemy(self.app)

        class Message(db.Model):
            id = db.Column(db.Integer, primary_key=True)

        @self.app.route('/pagination')
        def test():
            db.drop_all()
            db.create_all()
            for i in range(100):
                m = Message()
                db.session.add(m)
            db.session.commit()
            page = request.args.get('page', 1, type=int)
            pagination = Message.query.paginate(page, per_page=10)
            messages = pagination.items
            return render_template_string('''
                                    {% from 'bootstrap/pagination.html' import render_pagination %}
                                    {{ render_pagination(pagination) }}
                                    ''',
                                          pagination=pagination,
                                          messages=messages)

        response = self.client.get('/pagination')
        data = response.get_data(as_text=True)
        self.assertIn('<nav aria-label="Page navigation">', data)
        self.assertIn(
            '<a class="page-link" href="#">1 <span class="sr-only">(current)</span></a>',
            data)
        self.assertIn('10</a>', data)

        response = self.client.get('/pagination?page=2')
        data = response.get_data(as_text=True)
        self.assertIn('<nav aria-label="Page navigation">', data)
        self.assertIn('1</a>', data)
        self.assertIn(
            '<a class="page-link" href="#">2 <span class="sr-only">(current)</span></a>',
            data)
        self.assertIn('10</a>', data)

    def test_render_nav_item(self):
        @self.app.route('/nav_item')
        def test():
            return render_template_string('''
                    {% from 'bootstrap/nav.html' import render_nav_item %}
                    {{ render_nav_item('test', 'Home') }}
                    ''')

        response = self.client.get('/nav_item')
        data = response.get_data(as_text=True)
        self.assertIn('<a class="nav-item nav-link active"', data)

    def test_render_breadcrumb_item(self):
        @self.app.route('/breadcrumb_item')
        def test():
            return render_template_string('''
                    {% from 'bootstrap/nav.html' import render_breadcrumb_item %}
                    {{ render_breadcrumb_item('test', 'Home') }}
                    ''')

        response = self.client.get('/breadcrumb_item')
        data = response.get_data(as_text=True)
        self.assertIn(
            '<li class="breadcrumb-item active"  aria-current="page">', data)

    def test_render_static(self):
        @self.app.route('/test_static')
        def test():
            return render_template_string('''
                            {% from 'bootstrap/utils.html' import render_static %}
                            {{ render_static('css', 'test.css') }}
                            {{ render_static('js', 'test.js') }}
                            {{ render_static('icon', 'test.ico') }}
                            ''')

        response = self.client.get('/test_static')
        data = response.get_data(as_text=True)
        self.assertIn(
            '<link rel="stylesheet" href="/static/test.css" type="text/css">',
            data)
        self.assertIn(
            '<script type="text/javascript" src="/static/test.js"></script>',
            data)
        self.assertIn('<link rel="icon" href="/static/test.ico">', data)

    def test_render_messages(self):
        @self.app.route('/messages')
        def test_messages():
            flash('test message', 'danger')
            return render_template_string('''
                            {% from 'bootstrap/utils.html' import render_messages %}
                            {{ render_messages() }}
                            ''')

        @self.app.route('/container')
        def test_container():
            flash('test message', 'danger')
            return render_template_string('''
                            {% from 'bootstrap/utils.html' import render_messages %}
                            {{ render_messages(container=True) }}
                            ''')

        @self.app.route('/dismissible')
        def test_dismissible():
            flash('test message', 'danger')
            return render_template_string('''
                            {% from 'bootstrap/utils.html' import render_messages %}
                            {{ render_messages(dismissible=True) }}
                            ''')

        @self.app.route('/dismiss_animate')
        def test_dismiss_animate():
            flash('test message', 'danger')
            return render_template_string('''
                            {% from 'bootstrap/utils.html' import render_messages %}
                            {{ render_messages(dismissible=True, dismiss_animate=True) }}
                            ''')

        response = self.client.get('/messages')
        data = response.get_data(as_text=True)
        self.assertIn('<div class="alert alert-danger"', data)

        response = self.client.get('/container')
        data = response.get_data(as_text=True)
        self.assertIn('<div class="container flashed-messages">', data)

        response = self.client.get('/dismissible')
        data = response.get_data(as_text=True)
        self.assertIn('alert-dismissible', data)
        self.assertIn(
            '<button type="button" class="close" data-dismiss="alert"', data)
        self.assertNotIn('fade show', data)

        response = self.client.get('/dismiss_animate')
        data = response.get_data(as_text=True)
        self.assertIn('alert-dismissible', data)
        self.assertIn(
            '<button type="button" class="close" data-dismiss="alert"', data)
        self.assertIn('fade show', data)
Beispiel #3
0
 def editor_replace_bootstrap_style():
     theme = request.form['theme']
     if theme == 'default':
         theme = ''
     flaskapp.config['BOOTSTRAP_BOOTSWATCH_THEME'] = theme
     return Bootstrap.load_css()