"""Unit tests for render.py.""" import copy from granary import as2 from granary.tests.test_as1 import ACTOR, COMMENT, DELETE_OF_ID, UPDATE from flask_app import app import common from models import Object import render from . import testutil EXPECTED_HTML = """\
tag:fake.com:123456 fake.com/123456
A ☕ reply
""" EXPECTED_AUTHOR_HTML = """\
tag:fake.com:123456 Bob fake.com/123456
A ☕ reply
""" class RenderTest(testutil.TestCase): def test_render_errors(self): resp = self.client.get(f'/render?id=') self.assertEqual(400, resp.status_code) resp = self.client.get(f'/render') self.assertEqual(400, resp.status_code) # no Object resp = self.client.get('/render?id=abc') self.assertEqual(404, resp.status_code) def test_render(self): with self.request_context: Object(id='abc', as2=as2.from_as1(COMMENT)).put() resp = self.client.get('/render?id=abc') self.assertEqual(200, resp.status_code) self.assert_multiline_equals(EXPECTED_HTML, resp.get_data(as_text=True), ignore_blanks=True) def test_render_with_author(self): with self.request_context: Object(id='abc', as2=as2.from_as1({**COMMENT, 'author': 'def'}), source_protocol='activitypub').put() Object(id='def', as2=as2.from_as1(ACTOR), source_protocol='activitypub').put() resp = self.client.get('/render?id=abc') self.assertEqual(200, resp.status_code) self.assert_multiline_equals( EXPECTED_AUTHOR_HTML, resp.get_data(as_text=True), ignore_blanks=True) def test_render_no_url(self): comment = copy.deepcopy(COMMENT) del comment['url'] with self.request_context: Object(id='abc', as2=as2.from_as1(comment)).put() resp = self.client.get('/render?id=abc') self.assertEqual(200, resp.status_code) expected = EXPECTED_HTML.replace( '\n', '' ).replace('fake.com/123456', '') self.assert_multiline_equals(expected, resp.get_data(as_text=True), ignore_blanks=True) def test_render_deleted_object(self): with self.request_context: Object(id='abc', as2={'content': 'foo'}, deleted=True).put() resp = self.client.get('/render?id=abc') self.assertEqual(410, resp.status_code) def test_render_delete_activity(self): with self.request_context: Object(id='abc', as2=as2.from_as1(DELETE_OF_ID)).put() resp = self.client.get('/render?id=abc') self.assertEqual(410, resp.status_code) def test_render_update_inner_obj_exists_redirect(self): with self.request_context: # UPDATE's object field is a full object Object(id='abc', as2=as2.from_as1(UPDATE)).put() Object(id=UPDATE['object']['id'], as2={'content': 'foo'}).put() resp = self.client.get('/render?id=abc') self.assertEqual(301, resp.status_code) self.assertEqual(f'/render?id=tag%3Afake.com%3A123456', resp.headers['Location']) def test_render_delete_inner_obj_exists_redirect(self): with self.request_context: # DELETE_OF_ID's object field is a bare string id Object(id='abc', as2=as2.from_as1(DELETE_OF_ID)).put() Object(id=DELETE_OF_ID['object'], as2={'content': 'foo'}).put() resp = self.client.get('/render?id=abc') self.assertEqual(301, resp.status_code) self.assertEqual(f'/render?id=tag%3Afake.com%3A123456', resp.headers['Location']) def test_render_update_no_inner_obj_serve_as_is(self): with self.request_context: # UPDATE's object field is a full object Object(id='abc', as2=as2.from_as1(UPDATE)).put() resp = self.client.get('/render?id=abc') self.assertEqual(200, resp.status_code) self.assert_multiline_in("""\
A ☕ reply
""", resp.get_data(as_text=True), ignore_blanks=True) def test_render_update_inner_obj_too_minimal_serve_as_is(self): with self.request_context: # UPDATE's object field is a full object Object(id='abc', as2=as2.from_as1(UPDATE)).put() Object(id=UPDATE['object']['id'], as2={'id': 'foo'}).put() resp = self.client.get('/render?id=abc') self.assertEqual(200, resp.status_code) self.assert_multiline_in("""\
A ☕ reply
""", resp.get_data(as_text=True), ignore_blanks=True)