# Copyright The IETF Trust 2013-2020, All Rights Reserved # -*- coding: utf-8 -*- import datetime import io import os import shutil from collections import OrderedDict from django.conf import settings from django.urls import reverse as urlreverse from django.utils.http import urlencode from pyquery import PyQuery import debug # pyflakes:ignore from ietf.doc.expire import expire_draft from ietf.doc.factories import WgDraftFactory from ietf.doc.models import Document from ietf.group.factories import RoleFactory from ietf.meeting.factories import MeetingFactory from ietf.person.factories import PersonFactory, EmailFactory from ietf.person.models import Person from ietf.submit.models import Preapproval from ietf.utils.mail import outbox from ietf.utils.test_utils import TestCase, login_testing_unauthorized from ietf.secr.drafts.email import get_email_initial SECR_USER='secretary' class SecrDraftsTestCase(TestCase): def setUp(self): self.saved_internet_draft_path = settings.INTERNET_DRAFT_PATH self.repository_dir = self.tempdir('submit-repository') settings.INTERNET_DRAFT_PATH = self.repository_dir self.saved_internet_draft_archive_dir = settings.INTERNET_DRAFT_ARCHIVE_DIR self.archive_dir = self.tempdir('submit-archive') settings.INTERNET_DRAFT_ARCHIVE_DIR = self.archive_dir self.saved_idsubmit_manual_staging_dir = settings.IDSUBMIT_MANUAL_STAGING_DIR self.manual_dir = self.tempdir('submit-manual') settings.IDSUBMIT_MANUAL_STAGING_DIR = self.manual_dir def tearDown(self): shutil.rmtree(self.repository_dir) shutil.rmtree(self.archive_dir) shutil.rmtree(self.manual_dir) settings.INTERNET_DRAFT_PATH = self.saved_internet_draft_path settings.INTERNET_DRAFT_ARCHIVE_DIR = self.saved_internet_draft_archive_dir settings.IDSUBMIT_MANUAL_STAGING_DIR = self.saved_idsubmit_manual_staging_dir def test_abstract(self): draft = WgDraftFactory() url = urlreverse('ietf.secr.drafts.views.abstract', kwargs={'id':draft.name}) self.client.login(username="secretary", password="secretary+password") response = self.client.get(url) self.assertEqual(response.status_code, 200) def test_approvals(self): Preapproval.objects.create(name='draft-dummy', by=Person.objects.get(name="(System)")) url = urlreverse('ietf.secr.drafts.views.approvals') self.client.login(username="secretary", password="secretary+password") response = self.client.get(url) self.assertContains(response, 'draft-dummy') def test_edit(self): draft = WgDraftFactory(states=[('draft','active'),('draft-stream-ietf','wg-doc'),('draft-iesg','ad-eval')], shepherd=EmailFactory()) url = urlreverse('ietf.secr.drafts.views.edit', kwargs={'id':draft.name}) self.client.login(username="secretary", password="secretary+password") response = self.client.get(url) self.assertEqual(response.status_code, 200) response = self.client.post(url,{'title':draft.title,'name':draft.name,'rev':draft.rev,'state':4,'group':draft.group.pk,'iesg_state':draft.get_state('draft-iesg').pk}) self.assertEqual(response.status_code, 302) draft = Document.objects.get(pk=draft.pk) self.assertEqual(draft.get_state().slug,'repl') def test_email(self): # can't test this directly, test via drafts actions pass def test_get_email_initial(self): # Makes sure that a manual posting by the Secretariat of an I-D that is # in the RFC Editor Queue will result in notification of the RFC Editor draft = WgDraftFactory(authors=PersonFactory.create_batch(1),shepherd=EmailFactory()) RoleFactory(group=draft.group, name_id='chair') data = get_email_initial(draft,action='extend',input={'expiration_date': '2050-01-01'}) self.assertTrue('Extension of Expiration Date' in data['subject']) def test_makerfc(self): draft = WgDraftFactory(intended_std_level_id='ps') url = urlreverse('ietf.secr.drafts.views.edit', kwargs={'id':draft.name}) self.client.login(username="secretary", password="secretary+password") response = self.client.get(url) self.assertEqual(response.status_code, 200) # It's not clear what this is testing. Was there supposed to be a POST here? self.assertTrue(draft.intended_std_level) def test_search(self): WgDraftFactory() # Test exercises branch that requires >1 doc found draft = WgDraftFactory() url = urlreverse('ietf.secr.drafts.views.search') self.client.login(username="secretary", password="secretary+password") response = self.client.get(url) self.assertEqual(response.status_code, 200) post = dict(filename='draft',state=1,submit='submit') response = self.client.post(url, post) self.assertContains(response, draft.name) def test_view(self): draft = WgDraftFactory() url = urlreverse('ietf.secr.drafts.views.view', kwargs={'id':draft.name}) self.client.login(username="secretary", password="secretary+password") response = self.client.get(url) self.assertEqual(response.status_code, 200) def test_author_delete(self): draft = WgDraftFactory(authors=PersonFactory.create_batch(2)) author = draft.documentauthor_set.first() id = author.id url = urlreverse('ietf.secr.drafts.views.author_delete', kwargs={'id':draft.name, 'oid':id}) self.client.login(username="secretary", password="secretary+password") response = self.client.get(url) self.assertEqual(response.status_code, 200) redirect_url = urlreverse('ietf.secr.drafts.views.authors', kwargs={'id':draft.name}) response = self.client.post(url, {'post':'yes'}) self.assertRedirects(response, redirect_url) self.assertFalse(draft.documentauthor_set.filter(id=id)) def test_resurrect(self): draft = WgDraftFactory() path = os.path.join(self.repository_dir, draft.filename_with_rev()) with io.open(path, 'w') as file: file.write('test') expire_draft(draft) email_url = urlreverse('ietf.secr.drafts.views.email', kwargs={'id':draft.name}) + "?action=resurrect" confirm_url = urlreverse('ietf.secr.drafts.views.confirm', kwargs={'id':draft.name}) do_action_url = urlreverse('ietf.secr.drafts.views.do_action', kwargs={'id':draft.name}) view_url = urlreverse('ietf.secr.drafts.views.view', kwargs={'id':draft.name}) subject = 'Resurrection of %s' % draft.get_base_name() self.client.login(username="secretary", password="secretary+password") response = self.client.get(email_url) self.assertContains(response, '