示例#1
0
def test_get_post(db_connection, event_loop, test_client, cookies_fixture):
    category1, category2, category3 = event_loop.run_until_complete(
        CategoryFactory.create_batch(3))
    post = event_loop.run_until_complete(PostFactory.create())
    response = test_client.get(f'/admin/blog/{post.title_slug}',
                               cookies=cookies_fixture)

    assert response.status_code == 200
    assert '<form id="update-post" method="post">' \
        in response.text
    assert '<label for="title">Title:</label>' in response.text
    assert f'<input id="title" name="title" type="text" required autofocus ' \
           f'value="{post.title}">' in response.text
    assert '<label for="category_id">Category:</label>' in response.text
    assert '<input id="category_id" name="category_id" list="category_values' \
           f'" required value="{post.category_id}">' in response.text
    assert '<datalist id="category_values">' in response.text
    assert f'<option value="{category1.id}">{category1.name}</option>' \
        in response.text
    assert f'<option value="{category2.id}">{category2.name}</option>' \
        in response.text
    assert f'<option value="{category3.id}">{category3.name}</option>' \
        in response.text
    assert '</datalist>' in response.text
    assert '<label for="description">Description:</label>' in response.text
    assert '<input id="description" name="description" type="text" required ' \
           f'value="{post.description}">' in response.text
    assert '<label for="body">Body:</label>' in response.text
    assert '<textarea id="body" name="body" required>' \
           f'{post.body}</textarea>' in response.text
    assert '<input type="submit" value="Update">' in response.text
    assert '<p>post updated successfully</p>' not in response.text
示例#2
0
def test_published_post_detail_with_pending_comment(db_connection, test_client,
                                                    event_loop):
    post = event_loop.run_until_complete(
        PostFactory.create(state=PostState.PUBLISHED,
                           published_at=datetime.datetime.now()))
    post_comment = event_loop.run_until_complete(
        PostComment.create(name='test name',
                           email='*****@*****.**',
                           body='comment body',
                           post=post))
    response = test_client.get(f'/blog/{post.title_slug}')

    assert response.status_code == 200
    assert f'{post.title.capitalize()}' in response.text
    assert f'{markdown.markdown(post.body)}' in response.text
    assert f'{post.published_at.date()}' in response.text
    assert '<script defer data-api="/analytics/event" data-domain=' \
           '"raiseexception.dev"' in response.text
    # assert '<form id="comment" method="post">' \
    #     in response.text
    assert 'Name' in response.text
    # assert '<input id="name" name="name" type="text" placeholder=' \
    #     '"name or alias">' in response.text
    assert 'Email' in response.text
    # assert '<input id="email" name="email" type="email" placeholder=' \
    #     '"email will not be published"' in response.text
    assert 'Comment *' in response.text
    # assert '<textarea id="body" name="body" required></textarea>' \
    #     in response.text
    # assert '<input type="submit" value="Comment">' in response.text
    assert 'Comments:' not in response.text
    assert f'{post_comment.name}, {post_comment.created_at}' not in \
        response.text
    assert f'<p>{post_comment.body}</p>' not in response.text
    assert '<p>There are no comments.</p>'
示例#3
0
def test_update_post_with_wrong_field(db_connection, event_loop, test_client,
                                      cookies_fixture):
    post = event_loop.run_until_complete(PostFactory.create())
    response = test_client.post(f'/admin/blog/{post.title_slug}',
                                cookies=cookies_fixture,
                                data={'wrong_field': 'value'})
    assert response.status_code == 400
    assert '<p>"wrong_field" is an invalid field</p>'
def test_without_body(db_connection, test_client, event_loop):
    post = event_loop.run_until_complete(
        PostFactory.create(state=PostState.PUBLISHED))
    response = test_client.post(f'/blog/{post.title_slug}', data={})
    comment = event_loop.run_until_complete(
        PostComment.get_or_none(post_id=post.id))

    assert response.status_code == 400
    assert comment is None
def test_with_wrong_email(db_connection, test_client, event_loop):
    post = event_loop.run_until_complete(
        PostFactory.create(state=PostState.PUBLISHED))
    response = test_client.post(f'/blog/{post.title_slug}',
                                data={
                                    'body': 'test comment',
                                    'post_id': post.id,
                                    'email': 'wrong @email'
                                })

    assert response.status_code == 400
    assert 'invalid email' in response.text
示例#6
0
def test_draft_post_detail_with_authenticated_user(db_connection, test_client,
                                                   event_loop,
                                                   cookies_fixture):
    post = event_loop.run_until_complete(PostFactory.create())
    response = test_client.get(f'/blog/{post.title_slug}',
                               cookies=cookies_fixture)

    assert response.status_code == 200
    assert post.title.capitalize() in response.text
    assert f'{markdown.markdown(post.body)}' in response.text
    assert '<script async defer data-domain="raiseexception.dev"' \
        not in response.text
def test_list_comments_with_no_pending_comments(db_connection, test_client,
                                                event_loop, cookies_fixture):
    post = event_loop.run_until_complete(
        PostFactory.create(state=PostState.PUBLISHED))
    event_loop.run_until_complete(
        PostCommentFactory.create_batch(5,
                                        post=post,
                                        state=PostCommentState.APPROVED))
    response = test_client.get('/admin/blog/comments', cookies=cookies_fixture)

    assert response.status_code == 200
    assert 'Pending comments:' not in response.text
    assert 'There are no pending comments.' in response.text
def test_without_name_or_email(db_connection, test_client, event_loop):
    post = event_loop.run_until_complete(
        PostFactory.create(state=PostState.PUBLISHED))
    response = test_client.post(f'/blog/{post.title_slug}',
                                data={
                                    'body': 'test comment',
                                    'post_id': post.id,
                                })
    comment = event_loop.run_until_complete(PostComment.get(post_id=post.id))

    assert response.status_code == 201
    assert comment.name == 'anonymous'
    assert comment.post_id == post.id
    assert comment.email is None
示例#9
0
def test_publish_post(db_connection, event_loop, test_client, cookies_fixture,
                      mocker):
    post = event_loop.run_until_complete(PostFactory.create())
    event_loop.run_until_complete(SubscriptionFactory.create(verified=True))
    mail_client_spy = mocker.spy(MailClient, 'send')
    response = test_client.post('/admin/blog/publish',
                                cookies=cookies_fixture,
                                data={'post_id': post.id})
    published_post = event_loop.run_until_complete(Post.get(id=post.id))

    assert response.status_code == 302
    assert published_post.state == PostState.PUBLISHED
    assert published_post.published_at.date() == datetime.date.today()
    mail_client_spy.assert_called_once()
def test_list_comments(db_connection, test_client, event_loop,
                       cookies_fixture):
    post = event_loop.run_until_complete(
        PostFactory.create(state=PostState.PUBLISHED))
    comments = event_loop.run_until_complete(
        PostCommentFactory.create_batch(5, post=post))
    response = test_client.get('/admin/blog/comments', cookies=cookies_fixture)

    assert response.status_code == 200
    assert 'Pending comments:' in response.text
    for comment in comments:
        assert comment.name in response.text
        assert comment.post.title in response.text
        assert comment.body in response.text
        assert f'<input name="approve" type="checkbox" value="{post.id}">' \
            in response.text
def test_approve_comments(db_connection, test_client, event_loop,
                          cookies_fixture, mocker):
    post = event_loop.run_until_complete(
        PostFactory.create(state=PostState.PUBLISHED))
    comments = event_loop.run_until_complete(
        PostCommentFactory.create_batch(5, post=post))
    mail_client_spy = mocker.patch.object(MailClient,
                                          'send',
                                          new_callable=AsyncMock)
    response = test_client.post(
        '/admin/blog/comments',
        data={'approve': [comment.id for comment in comments]},
        cookies=cookies_fixture)
    comments = event_loop.run_until_complete(PostComment.all())

    assert response.status_code == 302
    for comment in comments:
        assert comment.state == PostCommentState.APPROVED
    assert mail_client_spy.await_count == 5
def test_success(db_connection, test_client, event_loop, mocker):
    post = event_loop.run_until_complete(
        PostFactory.create(state=PostState.PUBLISHED))
    mail_client_spy = mocker.spy(MailClient, 'send')
    response = test_client.post(f'/blog/{post.title_slug}',
                                data={
                                    'name': 'Julián',
                                    'body': 'test comment',
                                    'email': '*****@*****.**',
                                })
    comment = event_loop.run_until_complete(PostComment.get(post_id=post.id))

    assert response.status_code == 201
    assert comment.name == 'Julián'
    assert comment.post_id == post.id
    assert comment.email == '*****@*****.**'
    assert "<p>The comment has been created in pending state. It will be " \
           "displayed when it's approved. I'll let you know by email if the " \
           "email was sent.</p>".replace("'", '&#39;') in response.text

    event_loop.run_until_complete(asyncio.sleep(1))
    assert mail_client_spy.spy_return is True
    mail_client_spy.assert_called_once()
示例#13
0
def test_update_post(db_connection, event_loop, test_client, cookies_fixture,
                     post_data):
    post = event_loop.run_until_complete(PostFactory.create())
    response = test_client.post(f'/admin/blog/{post.title_slug}',
                                cookies=cookies_fixture,
                                data=post_data)
    updated_post = event_loop.run_until_complete(Post.get(id=post.id))

    assert response.status_code == 200
    assert post.modified_at != updated_post.modified_at
    if 'state' in post_data:
        assert updated_post.state != post.state
        assert updated_post.state == PostState(post_data['state'])
    if 'title' in post_data:
        assert updated_post.title != post.title
        assert updated_post.title_slug != post.title_slug
        assert updated_post.title == post_data['title']
    if 'body' in post_data:
        assert updated_post.body != post.body
        assert updated_post.body == post_data['body']
    if 'description' in post_data:
        assert updated_post.description != post.description
        assert updated_post.description == post_data['description']
    assert '<p>post updated successfully</p>' in response.text
示例#14
0
def test_draft_post_detail_with_anonymous_user(db_connection, test_client,
                                               event_loop):
    post = event_loop.run_until_complete(PostFactory.create())
    response = test_client.get(f'/blog/{post.title_slug}')
    assert response.status_code == 404