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
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>'
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
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
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("'", ''') 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()
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
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