def test_gather_ignores_links(client, root_doc, simple_user): user_profile_url = simple_user.get_absolute_url() content = """ <ul> <li><a href="/en-US/docs/Absolute/Link">Absolute Link</a></li> <li><a href="Relative/Link">Relative Link</a></li> <li><a href="#later">Later in this page.</a></li> <li><a href="%s">Profile Link</a></li> </ul> """ % user_profile_url new_rev = Revision( document=root_doc, creator=root_doc.current_revision.creator, content=content, created=datetime(2017, 6, 5)) new_rev.save() base_path = root_doc.get_absolute_url() html = client.get(base_path).content source = LinksSource(base_path) requester = mock_requester(content=html) storage = mock_storage() resources = source.gather(requester, storage) assert source.state == source.STATE_DONE assert source.freshness == source.FRESH_YES expected = ('document', '/en-US/docs/Absolute/Link', {}) assert expected in resources for doc, path, options in resources: assert base_path not in path assert "Relative/Link" not in path assert "#later" not in path assert user_profile_url not in path
def test_gather_ignores_links(client, root_doc, simple_user): user_profile_url = simple_user.get_absolute_url() content = """ <ul> <li><a href="/en-US/docs/Absolute/Link">Absolute Link</a></li> <li><a href="Relative/Link">Relative Link</a></li> <li><a href="#later">Later in this page.</a></li> <li><a href="%s">Profile Link</a></li> </ul> """ % user_profile_url new_rev = Revision(document=root_doc, creator=root_doc.current_revision.creator, content=content, created=datetime(2017, 6, 5)) new_rev.save() base_path = root_doc.get_absolute_url() html = client.get(base_path, HTTP_HOST=settings.WIKI_HOST).content source = LinksSource(base_path) requester = mock_requester(content=html) storage = mock_storage() resources = source.gather(requester, storage) assert source.state == source.STATE_DONE assert source.freshness == source.FRESH_YES expected = ('document', '/en-US/docs/Absolute/Link', {}) assert expected in resources for doc, path, options in resources: assert "Relative/Link" not in path assert "#later" not in path assert user_profile_url not in path
def revision(save=False, **kwargs): """Return an empty revision with enough stuff filled out that it can be saved. Revision's is_approved=False unless you specify otherwise. Requires a users fixture if no creator is provided. """ doc = None if 'document' not in kwargs: doc = document(save=True) else: doc = kwargs['document'] defaults = { 'summary': 'Some summary', 'content': 'Some content', 'comment': 'Some comment', 'creator': kwargs.get('creator', get_user()), 'document': doc, 'tags': '"some", "tags"', 'toc_depth': 1, } defaults.update(kwargs) rev = Revision(**defaults) if save: rev.save() return rev
def handle(self, *args, **options): # get first user to be the creator u = User.objects.all()[0] loaded_docs = [] skipped_docs = [] for slug in KS_AUTOLOAD_MODULES: template_response = requests.get(RAW_TEMPLATE_URL % slug) doc = Document(title=slug, slug=slug, category=Document.CATEGORIES[0][0]) try: doc.save() loaded_docs.append(slug) except SlugCollision: # skip modules already in the db skipped_docs.append(slug) continue rev = Revision(document=doc, content=template_response.content, creator=u) rev.save() print "Loaded docs:" for slug in loaded_docs: print "%s" % slug print "\nSkipped docs that were already loaded:" for slug in skipped_docs: print "%s" % slug
def revision(save=False, **kwargs): """Return an empty revision with enough stuff filled out that it can be saved. Revision's is_approved=False unless you specify otherwise. Requires a users fixture if no creator is provided. """ doc = None if "document" not in kwargs: doc = document(save=True) else: doc = kwargs["document"] defaults = { "summary": "Some summary", "content": "Some content", "comment": "Some comment", "creator": kwargs.get("creator", get_user()), "document": doc, "tags": '"some", "tags"', "toc_depth": 1, } defaults.update(kwargs) rev = Revision(**defaults) if save: rev.save() return rev
def _create_document(title="Test Document", parent=None, locale=settings.WIKI_DEFAULT_LANGUAGE): d = document( title=title, html="<div>Lorem Ipsum</div>", category=10, locale=locale, parent=parent, is_localizable=True ) d.save() r = Revision( document=d, keywords="key1, key2", summary="lipsum", content="<div>Lorem Ipsum</div>", creator_id=8, is_approved=True, comment="Good job!", ) r.save() return d
def test_another_translation_to_locale(self, get_current, edited_fire): """Create the second translation of a doc.""" get_current.return_value.domain = "testserver" rev_es = self._create_and_approve_first_translation() # Create and approve a new en-US revision rev_enUS = Revision( summary="lipsum", content="lorem ipsum dolor sit amet new", keywords="kw1 kw2", document=self.d, creator_id=8, is_approved=True, ) rev_enUS.save() # Verify the form renders with correct content translate_uri = self._translate_uri() response = self.client.get(translate_uri) doc = pq(response.content) eq_(rev_es.content, doc("#id_content").text()) eq_(rev_enUS.content, doc("article.approved .translate-rendered").text()) # Post the translation and verify data = _translation_data() data["content"] = "loremo ipsumo doloro sito ameto nuevo" response = self.client.post(translate_uri, data) eq_(302, response.status_code) eq_("http://testserver/es/docs/un-test-articulo", response["location"]) doc = Document.objects.get(slug=data["slug"]) rev = doc.revisions.filter(content=data["content"])[0] eq_(data["keywords"], rev.keywords) eq_(data["summary"], rev.summary) eq_(data["content"], rev.content) edited_fire.assert_called() # subsequent translations should NOT include slug input self.client.logout() self.client.login(username="******", password="******") response = self.client.get(translate_uri) doc = pq(response.content) eq_(0, len(doc('form input[name="slug"]')))
def test_new_revision_GET_based_on(self): """HTTP GET to new revision URL based on another revision. This case should render the form with the fields pre-populated with the based-on revision info. """ r = Revision( document=self.d, keywords="ky1, kw2", summary="the summary", content="<div>The content here</div>", creator_id=7, ) r.save() response = self.client.get(reverse("wiki.new_revision_based_on", args=[self.d.full_path, r.id])) eq_(200, response.status_code) doc = pq(response.content) eq_(doc("#id_content")[0].value, r.content)
class CompareRevisionTests(TestCaseBase): """Tests for Review Revisions""" fixtures = ["test_users.json"] def setUp(self): super(CompareRevisionTests, self).setUp() self.document = _create_document() self.revision1 = self.document.current_revision user = User.objects.get(username="******") self.revision2 = Revision( summary="lipsum", content="<div>Lorem Ipsum Dolor</div>", keywords="kw1 kw2", document=self.document, creator=user, ) self.revision2.save() self.client.login(username="******", password="******") def test_bad_parameters(self): """Ensure badly-formed revision parameters do not cause errors""" url = reverse("wiki.compare_revisions", args=[self.document.slug]) query = {"from": "1e309", "to": u"1e309"} url = urlparams(url, **query) response = self.client.get(url) eq_(404, response.status_code) def test_compare_revisions(self): """Compare two revisions""" url = reverse("wiki.compare_revisions", args=[self.document.slug]) query = {"from": self.revision1.id, "to": self.revision2.id} url = urlparams(url, **query) response = self.client.get(url) eq_(200, response.status_code) doc = pq(response.content) eq_("Dolor", doc("span.diff_add").text()) def test_compare_revisions_invalid_to_int(self): """Provide invalid 'to' int for revision ids.""" url = reverse("wiki.compare_revisions", args=[self.document.slug]) query = {"from": "", "to": "invalid"} url = urlparams(url, **query) response = self.client.get(url) eq_(404, response.status_code) def test_compare_revisions_invalid_from_int(self): """Provide invalid 'from' int for revision ids.""" url = reverse("wiki.compare_revisions", args=[self.document.slug]) query = {"from": "invalid", "to": ""} url = urlparams(url, **query) response = self.client.get(url) eq_(404, response.status_code) def test_compare_revisions_missing_query_param(self): """Try to compare two revisions, with a missing query string param.""" url = reverse("wiki.compare_revisions", args=[self.document.slug]) query = {"from": self.revision1.id} url = urlparams(url, **query) response = self.client.get(url) eq_(404, response.status_code) url = reverse("wiki.compare_revisions", args=[self.document.slug]) query = {"to": self.revision1.id} url = urlparams(url, **query) response = self.client.get(url) eq_(404, response.status_code) def test_compare_unmatched_document_url(self): """Comparing two revisions of unlinked document should cause error.""" unmatched_document = _create_document(title="Invalid document") url = reverse("wiki.compare_revisions", args=[unmatched_document.slug]) query = {"from": self.revision1.id, "to": self.revision2.id} url = urlparams(url, **query) response = self.client.get(url) eq_(404, response.status_code)