From 81d9234d5436a982cabf3f4b4ea85127fb9c7030 Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Fri, 5 Nov 2021 19:45:57 +0000 Subject: [PATCH] Use temporary directories instead of "real" filesystem for tests. Fixes #3414. Commit ready for merge. - Legacy-Id: 19555 --- ietf/api/tests.py | 10 +- ietf/doc/tests.py | 95 ++++++--------- ietf/doc/tests_ballot.py | 1 + ietf/doc/tests_bofreq.py | 17 +-- ietf/doc/tests_charter.py | 22 ++-- ietf/doc/tests_conflict_review.py | 11 +- ietf/doc/tests_downref.py | 1 + ietf/doc/tests_draft.py | 59 ++++------ ietf/doc/tests_irsg_ballot.py | 3 + ietf/doc/tests_material.py | 21 ++-- ietf/doc/tests_review.py | 2 + ietf/doc/tests_status_change.py | 11 +- ietf/doc/tests_utils.py | 1 + ietf/group/tests.py | 5 + ietf/group/tests_info.py | 31 ++--- ietf/idindex/tests.py | 16 +-- ietf/iesg/tests.py | 14 +-- ietf/ietfauth/tests.py | 2 + ietf/ipr/tests.py | 6 - ietf/liaisons/tests.py | 19 +-- ietf/mailtrigger/test_utils.py | 1 + ietf/meeting/tests_schedule_generator.py | 1 + ietf/meeting/tests_views.py | 69 +++-------- ietf/nomcom/management/tests.py | 1 + ietf/nomcom/tests.py | 27 ++++- ietf/review/tests_policies.py | 3 +- ietf/secr/announcement/tests.py | 1 + ietf/secr/meetings/tests.py | 26 ++--- ietf/secr/proceedings/tests.py | 10 +- ietf/secr/roles/tests.py | 1 + ietf/secr/sreq/tests.py | 2 + ietf/submit/tests.py | 142 +++++++---------------- ietf/sync/tests.py | 21 +--- ietf/utils/test_utils.py | 39 ++++++- ietf/utils/tests.py | 6 +- 35 files changed, 278 insertions(+), 419 deletions(-) diff --git a/ietf/api/tests.py b/ietf/api/tests.py index a2db65d80..856e79a18 100644 --- a/ietf/api/tests.py +++ b/ietf/api/tests.py @@ -5,7 +5,6 @@ import json import html import os -import shutil import sys from importlib import import_module @@ -38,14 +37,7 @@ OMITTED_APPS = ( ) class CustomApiTests(TestCase): - def setUp(self): - self.agenda_path = self.tempdir('materials') - self.saved_agenda_path = settings.AGENDA_PATH - settings.AGENDA_PATH = self.agenda_path - - def tearDown(self): - shutil.rmtree(self.agenda_path) - settings.AGENDA_PATH = self.saved_agenda_path + settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['AGENDA_PATH'] # Using mock to patch the import functions in ietf.meeting.views, where # api_import_recordings() are using them: diff --git a/ietf/doc/tests.py b/ietf/doc/tests.py index c3ab7efa4..310fe6de7 100644 --- a/ietf/doc/tests.py +++ b/ietf/doc/tests.py @@ -3,7 +3,6 @@ import os -import shutil import datetime import io import lxml @@ -13,6 +12,7 @@ import json import copy from http.cookies import SimpleCookie +from pathlib import Path from pyquery import PyQuery from urllib.parse import urlparse, parse_qs from tempfile import NamedTemporaryFile @@ -523,19 +523,10 @@ Man Expires September 22, 2015 [Page 3] """ def setUp(self): - self.id_dir = self.tempdir('id') - self.saved_internet_draft_path = settings.INTERNET_DRAFT_PATH - settings.INTERNET_DRAFT_PATH = self.id_dir - self.saved_internet_all_drafts_archive_dir = settings.INTERNET_ALL_DRAFTS_ARCHIVE_DIR - settings.INTERNET_ALL_DRAFTS_ARCHIVE_DIR = self.id_dir - f = io.open(os.path.join(self.id_dir, 'draft-ietf-mars-test-01.txt'), 'w') - f.write(self.draft_text) - f.close() - - def tearDown(self): - settings.INTERNET_ALL_DRAFTS_ARCHIVE_DIR = self.saved_internet_all_drafts_archive_dir - settings.INTERNET_DRAFT_PATH = self.saved_internet_draft_path - shutil.rmtree(self.id_dir) + super().setUp() + for dir in [settings.INTERNET_ALL_DRAFTS_ARCHIVE_DIR, settings.INTERNET_DRAFT_PATH]: + with (Path(dir) / 'draft-ietf-mars-test-01.txt').open('w') as f: + f.write(self.draft_text) def test_document_draft(self): draft = WgDraftFactory(name='draft-ietf-mars-test',rev='01') @@ -694,6 +685,7 @@ Man Expires September 22, 2015 [Page 3] self.assertEqual(r.status_code, 200) rfc = WgRfcFactory() + (Path(settings.RFC_PATH) / rfc.get_base_name()).touch() r = self.client.get(urlreverse("ietf.doc.views_doc.document_html", kwargs=dict(name=rfc.canonical_name()))) self.assertEqual(r.status_code, 200) r = self.client.get(urlreverse("ietf.doc.views_doc.document_html", kwargs=dict(name=rfc.rfc_number()))) @@ -1895,6 +1887,7 @@ class ReferencesTest(TestCase): class GenerateDraftAliasesTests(TestCase): def setUp(self): + super().setUp() self.doc_aliases_file = NamedTemporaryFile(delete=False, mode='w+') self.doc_aliases_file.close() self.doc_virtual_file = NamedTemporaryFile(delete=False, mode='w+') @@ -1909,6 +1902,7 @@ class GenerateDraftAliasesTests(TestCase): settings.DRAFT_VIRTUAL_PATH = self.saved_draft_virtual_path os.unlink(self.doc_aliases_file.name) os.unlink(self.doc_virtual_file.name) + super().tearDown() def testManagementCommand(self): a_month_ago = datetime.datetime.now() - datetime.timedelta(30) @@ -2013,6 +2007,7 @@ class GenerateDraftAliasesTests(TestCase): class EmailAliasesTests(TestCase): def setUp(self): + super().setUp() WgDraftFactory(name='draft-ietf-mars-test',group__acronym='mars') WgDraftFactory(name='draft-ietf-ames-test',group__acronym='ames') RoleFactory(group__type_id='review', group__acronym='yangdoctors', name_id='secr') @@ -2044,6 +2039,7 @@ expand-draft-ietf-ames-test.all@virtual.ietf.org ames-author@example.ames, ames def tearDown(self): settings.DRAFT_VIRTUAL_PATH = self.saved_draft_virtual_path os.unlink(self.doc_alias_file.name) + super().tearDown() def testAliases(self): PersonFactory(user__username='plain') @@ -2068,6 +2064,7 @@ expand-draft-ietf-ames-test.all@virtual.ietf.org ames-author@example.ames, ames class DocumentMeetingTests(TestCase): def setUp(self): + super().setUp() self.group = GroupFactory(type_id='wg',state_id='active') self.group_chair = PersonFactory() self.group.role_set.create(name_id='chair',person=self.group_chair,email=self.group_chair.email()) @@ -2384,17 +2381,15 @@ class FieldTests(TestCase): ) class MaterialsTests(TestCase): - + settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['AGENDA_PATH'] def setUp(self): - self.id_dir = self.tempdir('id') - self.saved_agenda_path = settings.AGENDA_PATH - settings.AGENDA_PATH = self.id_dir + super().setUp() meeting_number='111' - meeting_dir = os.path.join(f'{settings.AGENDA_PATH}',f'{meeting_number}') - os.mkdir(meeting_dir) - agenda_dir = os.path.join(meeting_dir,'agenda') - os.mkdir(agenda_dir) + meeting_dir = Path(settings.AGENDA_PATH) / meeting_number + meeting_dir.mkdir() + agenda_dir = meeting_dir / 'agenda' + agenda_dir.mkdir() group_acronym='bogons' @@ -2402,35 +2397,26 @@ class MaterialsTests(TestCase): # * build the DocumentHistory correctly # * maybe do something by default with uploaded_filename # and there should be a more usable unit to save bits to disk (handle_file_upload isn't quite right) that tests can leverage - try: - uploaded_filename_00 = f'agenda-{meeting_number}-{group_acronym}-00.txt' - uploaded_filename_01 = f'agenda-{meeting_number}-{group_acronym}-01.md' - f = io.open(os.path.join(agenda_dir, uploaded_filename_00), 'w') - f.write('This is some unremarkable text') - f.close() - f = io.open(os.path.join(agenda_dir, uploaded_filename_01), 'w') - f.write('This links to [an unusual place](https://unusual.example).') - f.close() + uploaded_filename_00 = f'agenda-{meeting_number}-{group_acronym}-00.txt' + uploaded_filename_01 = f'agenda-{meeting_number}-{group_acronym}-01.md' + f = io.open(os.path.join(agenda_dir, uploaded_filename_00), 'w') + f.write('This is some unremarkable text') + f.close() + f = io.open(os.path.join(agenda_dir, uploaded_filename_01), 'w') + f.write('This links to [an unusual place](https://unusual.example).') + f.close() - self.doc = DocumentFactory(type_id='agenda',rev='00',group__acronym=group_acronym, newrevisiondocevent=None, name=f'agenda-{meeting_number}-{group_acronym}', uploaded_filename=uploaded_filename_00) - e = NewRevisionDocEventFactory(doc=self.doc,rev='00') - self.doc.save_with_history([e]) - self.doc.rev = '01' - self.doc.uploaded_filename = uploaded_filename_01 - e = NewRevisionDocEventFactory(doc=self.doc, rev='01') - self.doc.save_with_history([e]) + self.doc = DocumentFactory(type_id='agenda',rev='00',group__acronym=group_acronym, newrevisiondocevent=None, name=f'agenda-{meeting_number}-{group_acronym}', uploaded_filename=uploaded_filename_00) + e = NewRevisionDocEventFactory(doc=self.doc,rev='00') + self.doc.save_with_history([e]) + self.doc.rev = '01' + self.doc.uploaded_filename = uploaded_filename_01 + e = NewRevisionDocEventFactory(doc=self.doc, rev='01') + self.doc.save_with_history([e]) - # This is necessary for the view to be able to find the document - # which hints that the view has an issue : if a materials document is taken out of all SessionPresentations, it is no longer accessable by this view - SessionPresentationFactory(session__meeting__number=meeting_number, session__group=self.doc.group, document=self.doc) - - except: - shutil.rmtree(self.id_dir) - raise - - def tearDown(self): - settings.AGENDA_PATH = self.saved_agenda_path - shutil.rmtree(self.id_dir) + # This is necessary for the view to be able to find the document + # which hints that the view has an issue : if a materials document is taken out of all SessionPresentations, it is no longer accessable by this view + SessionPresentationFactory(session__meeting__number=meeting_number, session__group=self.doc.group, document=self.doc) def test_markdown_and_text(self): url = urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=self.doc.name,rev='00')) @@ -2446,15 +2432,7 @@ class MaterialsTests(TestCase): self.assertEqual(q('#materials-content .panel-body a').attr['href'],'https://unusual.example') class Idnits2SupportTests(TestCase): - - def setUp(self): - self.derived_dir = self.tempdir('derived') - self.saved_derived_dir = settings.DERIVED_DIR - settings.DERIVED_DIR = self.derived_dir - - def tearDown(self): - settings.DERIVED_DIR = self.saved_derived_dir - shutil.rmtree(self.derived_dir) + settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['DERIVED_DIR'] def test_obsoleted(self): rfc = WgRfcFactory(alias2__name='rfc1001') @@ -2506,6 +2484,7 @@ class Idnits2SupportTests(TestCase): class RfcdiffSupportTests(TestCase): def setUp(self): + super().setUp() self.target_view = 'ietf.doc.views_doc.rfcdiff_latest_json' def getJson(self, view_args): diff --git a/ietf/doc/tests_ballot.py b/ietf/doc/tests_ballot.py index cb4951858..9db73becc 100644 --- a/ietf/doc/tests_ballot.py +++ b/ietf/doc/tests_ballot.py @@ -1056,6 +1056,7 @@ class DeferUndeferTestCase(TestCase): # when charters support being deferred, be sure to test them here def setUp(self): + super().setUp() IndividualDraftFactory(name='draft-ietf-mars-test',states=[('draft','active'),('draft-iesg','iesg-eva')], ad=Person.objects.get(user__username='ad')) DocumentFactory(type_id='statchg',name='status-change-imaginary-mid-review',states=[('statchg','iesgeval')]) diff --git a/ietf/doc/tests_bofreq.py b/ietf/doc/tests_bofreq.py index f8b86d30d..2950a7165 100644 --- a/ietf/doc/tests_bofreq.py +++ b/ietf/doc/tests_bofreq.py @@ -2,10 +2,9 @@ import datetime import debug # pyflakes:ignore -import io import os -import shutil +from pathlib import Path from pyquery import PyQuery from random import randint from tempfile import NamedTemporaryFile @@ -24,19 +23,11 @@ from ietf.utils.test_utils import TestCase, reload_db_objects, unicontent, login class BofreqTests(TestCase): - - def setUp(self): - self.bofreq_dir = self.tempdir('bofreq') - self.saved_bofreq_path = settings.BOFREQ_PATH - settings.BOFREQ_PATH = self.bofreq_dir - - def tearDown(self): - settings.BOFREQ_PATH = self.saved_bofreq_path - shutil.rmtree(self.bofreq_dir) + settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['BOFREQ_PATH'] def write_bofreq_file(self, bofreq): - fname = os.path.join(self.bofreq_dir, "%s-%s.md" % (bofreq.canonical_name(), bofreq.rev)) - with io.open(fname, "w") as f: + fname = Path(settings.BOFREQ_PATH) / ("%s-%s.md" % (bofreq.canonical_name(), bofreq.rev)) + with fname.open("w") as f: f.write(f"""# This is a test bofreq. Version: {bofreq.rev} diff --git a/ietf/doc/tests_charter.py b/ietf/doc/tests_charter.py index c0aad851e..6edc6743d 100644 --- a/ietf/doc/tests_charter.py +++ b/ietf/doc/tests_charter.py @@ -4,9 +4,8 @@ import datetime import io -import os -import shutil +from pathlib import Path from pyquery import PyQuery from django.conf import settings @@ -84,17 +83,12 @@ class ViewCharterTests(TestCase): class EditCharterTests(TestCase): - def setUp(self): - self.charter_dir = self.tempdir('charter') - self.saved_charter_path = settings.CHARTER_PATH - settings.CHARTER_PATH = self.charter_dir - - def tearDown(self): - settings.CHARTER_PATH = self.saved_charter_path - shutil.rmtree(self.charter_dir) + settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['CHARTER_PATH'] def write_charter_file(self, charter): - with io.open(os.path.join(self.charter_dir, "%s-%s.txt" % (charter.canonical_name(), charter.rev)), "w") as f: + with (Path(settings.CHARTER_PATH) / + ("%s-%s.txt" % (charter.canonical_name(), charter.rev)) + ).open("w") as f: f.write("This is a charter.") def test_startstop_process(self): @@ -513,7 +507,7 @@ class EditCharterTests(TestCase): self.assertEqual(charter.rev, next_revision(prev_rev)) self.assertTrue("new_revision" in charter.latest_event().type) - with io.open(os.path.join(self.charter_dir, charter.canonical_name() + "-" + charter.rev + ".txt"), encoding='utf-8') as f: + with (Path(settings.CHARTER_PATH) / (charter.canonical_name() + "-" + charter.rev + ".txt")).open(encoding='utf-8') as f: self.assertEqual(f.read(), "Windows line\nMac line\nUnix line\n" + utf_8_snippet.decode('utf-8')) def test_submit_initial_charter(self): @@ -792,7 +786,9 @@ class EditCharterTests(TestCase): self.assertTrue(not charter.ballot_open("approve")) self.assertEqual(charter.rev, "01") - self.assertTrue(os.path.exists(os.path.join(self.charter_dir, "charter-ietf-%s-%s.txt" % (group.acronym, charter.rev)))) + self.assertTrue( + (Path(settings.CHARTER_PATH) / ("charter-ietf-%s-%s.txt" % (group.acronym, charter.rev))).exists() + ) self.assertEqual(len(outbox), 2) # diff --git a/ietf/doc/tests_conflict_review.py b/ietf/doc/tests_conflict_review.py index 8be3e89f0..1d3b0deca 100644 --- a/ietf/doc/tests_conflict_review.py +++ b/ietf/doc/tests_conflict_review.py @@ -4,7 +4,6 @@ import io import os -import shutil from pyquery import PyQuery from textwrap import wrap @@ -367,11 +366,13 @@ class ConflictReviewTests(TestCase): self.assertEqual(len(outbox), 0) def setUp(self): + super().setUp() IndividualDraftFactory(name='draft-imaginary-independent-submission') ConflictReviewFactory(name='conflict-review-imaginary-irtf-submission',review_of=IndividualDraftFactory(name='draft-imaginary-irtf-submission',stream_id='irtf'),notify='notifyme@example.net') class ConflictReviewSubmitTests(TestCase): + settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['CONFLICT_REVIEW_PATH'] def test_initial_submission(self): doc = Document.objects.get(name='conflict-review-imaginary-irtf-submission') url = urlreverse('ietf.doc.views_conflict_review.submit',kwargs=dict(name=doc.name)) @@ -447,11 +448,5 @@ class ConflictReviewSubmitTests(TestCase): self.assertTrue(q('textarea')[0].text.strip().startswith("[Edit this page")) def setUp(self): + super().setUp() ConflictReviewFactory(name='conflict-review-imaginary-irtf-submission',review_of=IndividualDraftFactory(name='draft-imaginary-irtf-submission',stream_id='irtf'),notify='notifyme@example.net') - self.test_dir = self.tempdir('conflict-review') - self.saved_conflict_review_path = settings.CONFLICT_REVIEW_PATH - settings.CONFLICT_REVIEW_PATH = self.test_dir - - def tearDown(self): - settings.CONFLICT_REVIEW_PATH = self.saved_conflict_review_path - shutil.rmtree(self.test_dir) diff --git a/ietf/doc/tests_downref.py b/ietf/doc/tests_downref.py index 62b20db29..d04b43e46 100644 --- a/ietf/doc/tests_downref.py +++ b/ietf/doc/tests_downref.py @@ -16,6 +16,7 @@ from ietf.utils.test_utils import login_testing_unauthorized class Downref(TestCase): def setUp(self): + super().setUp() PersonFactory(name='Plain Man',user__username='plain') self.draft = WgDraftFactory(name='draft-ietf-mars-test') self.draftalias = self.draft.docalias.get(name='draft-ietf-mars-test') diff --git a/ietf/doc/tests_draft.py b/ietf/doc/tests_draft.py index 4d8cb7000..dbf6abea9 100644 --- a/ietf/doc/tests_draft.py +++ b/ietf/doc/tests_draft.py @@ -3,12 +3,12 @@ import os -import shutil import datetime import io import mock from collections import Counter +from pathlib import Path from pyquery import PyQuery from django.urls import reverse as urlreverse @@ -547,27 +547,14 @@ class EditInfoTests(TestCase): class DraftFileMixin(): '''A mixin to setup temporary draft directories and files''' def setUp(self): - self.saved_id_dir = settings.INTERNET_DRAFT_PATH - self.saved_archive_dir = settings.INTERNET_DRAFT_ARCHIVE_DIR - self.id_dir = self.tempdir('id') - self.archive_dir = self.tempdir('id-archive') - os.mkdir(os.path.join(self.archive_dir, "unknown_ids")) - os.mkdir(os.path.join(self.archive_dir, "deleted_tombstones")) - os.mkdir(os.path.join(self.archive_dir, "expired_without_tombstone")) - - settings.INTERNET_DRAFT_PATH = self.id_dir - settings.INTERNET_DRAFT_ARCHIVE_DIR = self.archive_dir - - def tearDown(self): - shutil.rmtree(self.id_dir) - shutil.rmtree(self.archive_dir) - settings.INTERNET_DRAFT_PATH = self.saved_id_dir - settings.INTERNET_DRAFT_ARCHIVE_DIR = self.saved_archive_dir + super().setUp() + (Path(settings.INTERNET_DRAFT_ARCHIVE_DIR) / "unknown_ids").mkdir() + (Path(settings.INTERNET_DRAFT_ARCHIVE_DIR) / "deleted_tombstones").mkdir() + (Path(settings.INTERNET_DRAFT_ARCHIVE_DIR) / "expired_without_tombstone").mkdir() def write_draft_file(self, name, size): - f = io.open(os.path.join(self.id_dir, name), 'w') - f.write("a" * size) - f.close() + with (Path(settings.INTERNET_DRAFT_PATH) / name).open('w') as f: + f.write("a" * size) class ResurrectTests(DraftFileMixin, TestCase): @@ -638,8 +625,8 @@ class ResurrectTests(DraftFileMixin, TestCase): self.assertTrue('aread' in outbox[-1]['To']) # ensure file restored from archive directory - self.assertTrue(os.path.exists(os.path.join(self.id_dir, txt))) - self.assertTrue(not os.path.exists(os.path.join(self.archive_dir, txt))) + self.assertTrue(os.path.exists(os.path.join(settings.INTERNET_DRAFT_PATH, txt))) + self.assertTrue(not os.path.exists(os.path.join(settings.INTERNET_DRAFT_ARCHIVE_DIR, txt))) class ExpireIDsTests(DraftFileMixin, TestCase): @@ -749,8 +736,8 @@ class ExpireIDsTests(DraftFileMixin, TestCase): self.assertTrue(draft.latest_event(type="expired_document")) self.assertCountEqual(draft.action_holders.all(), []) self.assertIn('Removed all action holders', draft.latest_event(type='changed_action_holders').desc) - self.assertTrue(not os.path.exists(os.path.join(self.id_dir, txt))) - self.assertTrue(os.path.exists(os.path.join(self.archive_dir, txt))) + self.assertTrue(not os.path.exists(os.path.join(settings.INTERNET_DRAFT_PATH, txt))) + self.assertTrue(os.path.exists(os.path.join(settings.INTERNET_DRAFT_ARCHIVE_DIR, txt))) draft.delete() @@ -772,8 +759,8 @@ class ExpireIDsTests(DraftFileMixin, TestCase): clean_up_draft_files() - self.assertTrue(not os.path.exists(os.path.join(self.id_dir, unknown))) - self.assertTrue(os.path.exists(os.path.join(self.archive_dir, "unknown_ids", unknown))) + self.assertTrue(not os.path.exists(os.path.join(settings.INTERNET_DRAFT_PATH, unknown))) + self.assertTrue(os.path.exists(os.path.join(settings.INTERNET_DRAFT_ARCHIVE_DIR, "unknown_ids", unknown))) # put file with malformed name (no revision) @@ -782,8 +769,8 @@ class ExpireIDsTests(DraftFileMixin, TestCase): clean_up_draft_files() - self.assertTrue(not os.path.exists(os.path.join(self.id_dir, malformed))) - self.assertTrue(os.path.exists(os.path.join(self.archive_dir, "unknown_ids", malformed))) + self.assertTrue(not os.path.exists(os.path.join(settings.INTERNET_DRAFT_PATH, malformed))) + self.assertTrue(os.path.exists(os.path.join(settings.INTERNET_DRAFT_ARCHIVE_DIR, "unknown_ids", malformed))) # RFC draft @@ -796,11 +783,11 @@ class ExpireIDsTests(DraftFileMixin, TestCase): clean_up_draft_files() - self.assertTrue(not os.path.exists(os.path.join(self.id_dir, txt))) - self.assertTrue(os.path.exists(os.path.join(self.archive_dir, txt))) + self.assertTrue(not os.path.exists(os.path.join(settings.INTERNET_DRAFT_PATH, txt))) + self.assertTrue(os.path.exists(os.path.join(settings.INTERNET_DRAFT_ARCHIVE_DIR, txt))) - self.assertTrue(not os.path.exists(os.path.join(self.id_dir, pdf))) - self.assertTrue(os.path.exists(os.path.join(self.archive_dir, pdf))) + self.assertTrue(not os.path.exists(os.path.join(settings.INTERNET_DRAFT_PATH, pdf))) + self.assertTrue(os.path.exists(os.path.join(settings.INTERNET_DRAFT_ARCHIVE_DIR, pdf))) # expire draft draft.set_state(State.objects.get(used=True, type="draft", slug="expired")) @@ -817,8 +804,8 @@ class ExpireIDsTests(DraftFileMixin, TestCase): clean_up_draft_files() - self.assertTrue(not os.path.exists(os.path.join(self.id_dir, txt))) - self.assertTrue(os.path.exists(os.path.join(self.archive_dir, txt))) + self.assertTrue(not os.path.exists(os.path.join(settings.INTERNET_DRAFT_PATH, txt))) + self.assertTrue(os.path.exists(os.path.join(settings.INTERNET_DRAFT_ARCHIVE_DIR, txt))) class ExpireLastCallTests(TestCase): @@ -898,6 +885,7 @@ class ExpireLastCallTests(TestCase): class IndividualInfoFormsTests(TestCase): def setUp(self): + super().setUp() doc = WgDraftFactory(group__acronym='mars',shepherd=PersonFactory(user__username='plain',name='Plain Man').email_set.first()) self.docname = doc.name @@ -1373,6 +1361,7 @@ class IndividualInfoFormsTests(TestCase): class SubmitToIesgTests(TestCase): def setUp(self): + super().setUp() role=RoleFactory(group__acronym='mars',name_id='chair',person=PersonFactory(user__username='marschairman')) doc=WgDraftFactory( name='draft-ietf-mars-test', @@ -1798,7 +1787,7 @@ class ChangeStreamStateTests(TestCase): class ChangeReplacesTests(TestCase): def setUp(self): - + super().setUp() role = RoleFactory(name_id='chair',group__acronym='mars',group__list_email='mars-wg@ietf.org',person__user__username='marschairman',person__name='WG Cháir Man') RoleFactory(name_id='delegate',group=role.group,person__user__email='marsdelegate@ietf.org') #draft = WgDraftFactory(group=role.group) diff --git a/ietf/doc/tests_irsg_ballot.py b/ietf/doc/tests_irsg_ballot.py index 294aa6563..f178bb4e5 100644 --- a/ietf/doc/tests_irsg_ballot.py +++ b/ietf/doc/tests_irsg_ballot.py @@ -424,12 +424,14 @@ class BaseManipulationTests(): class IRTFChairTests(BaseManipulationTests, TestCase): def setUp(self): + super().setUp() self.username = 'irtf-chair' self.balloter = '' class SecretariatTests(BaseManipulationTests, TestCase): def setUp(self): + super().setUp() self.username = 'secretary' self.balloter = '?balloter={}'.format(Person.objects.get(user__username='irtf-chair').pk) @@ -437,6 +439,7 @@ class SecretariatTests(BaseManipulationTests, TestCase): class IRSGMemberTests(TestCase): def setUp(self): + super().setUp() self.username = get_active_irsg()[0].user.username def test_cant_issue_irsg_ballot(self): diff --git a/ietf/doc/tests_material.py b/ietf/doc/tests_material.py index 8d4482139..7738dcc5d 100644 --- a/ietf/doc/tests_material.py +++ b/ietf/doc/tests_material.py @@ -7,6 +7,7 @@ import shutil import datetime import io +from pathlib import Path from pyquery import PyQuery import debug # pyflakes:ignore @@ -25,26 +26,24 @@ from ietf.utils.test_utils import TestCase, login_testing_unauthorized class GroupMaterialTests(TestCase): + settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['AGENDA_PATH'] def setUp(self): + super().setUp() self.materials_dir = self.tempdir("materials") - self.slides_dir = os.path.join(self.materials_dir, "slides") - if not os.path.exists(self.slides_dir): - os.mkdir(self.slides_dir) + self.slides_dir = Path(self.materials_dir) / "slides" + if not self.slides_dir.exists(): + self.slides_dir.mkdir() self.saved_document_path_pattern = settings.DOCUMENT_PATH_PATTERN settings.DOCUMENT_PATH_PATTERN = self.materials_dir + "/{doc.type_id}/" - self.agenda_dir = self.tempdir("agenda") - self.meeting_slides_dir = os.path.join(self.agenda_dir, "42", "slides") - if not os.path.exists(self.meeting_slides_dir): - os.makedirs(self.meeting_slides_dir) - self.saved_agenda_path = settings.AGENDA_PATH - settings.AGENDA_PATH = self.agenda_dir + self.meeting_slides_dir = Path(settings.AGENDA_PATH) / "42" / "slides" + if not self.meeting_slides_dir.exists(): + self.meeting_slides_dir.mkdir(parents=True) def tearDown(self): settings.DOCUMENT_PATH_PATTERN = self.saved_document_path_pattern shutil.rmtree(self.materials_dir) - settings.AGENDA_PATH = self.saved_agenda_path - shutil.rmtree(self.agenda_dir) + super().tearDown() def create_slides(self): diff --git a/ietf/doc/tests_review.py b/ietf/doc/tests_review.py index 3d513c515..e9881d0b6 100644 --- a/ietf/doc/tests_review.py +++ b/ietf/doc/tests_review.py @@ -41,6 +41,7 @@ from ietf.utils.text import strip_prefix, xslugify class ReviewTests(TestCase): def setUp(self): + super().setUp() self.review_dir = self.tempdir('review') self.old_document_path_pattern = settings.DOCUMENT_PATH_PATTERN settings.DOCUMENT_PATH_PATTERN = self.review_dir + "/{doc.type_id}/" @@ -52,6 +53,7 @@ class ReviewTests(TestCase): def tearDown(self): shutil.rmtree(self.review_dir) settings.DOCUMENT_PATH_PATTERN = self.old_document_path_pattern + super().tearDown() def test_request_review(self): doc = WgDraftFactory(group__acronym='mars',rev='01') diff --git a/ietf/doc/tests_status_change.py b/ietf/doc/tests_status_change.py index 5daa5adab..c6067d9b4 100644 --- a/ietf/doc/tests_status_change.py +++ b/ietf/doc/tests_status_change.py @@ -4,7 +4,6 @@ import io import os -import shutil import debug # pyflakes:ignore @@ -441,12 +440,14 @@ class StatusChangeTests(TestCase): self.assertTrue(doc.latest_event(DocEvent,type="added_comment").desc.startswith('Affected RFC list changed.')) def setUp(self): + super().setUp() IndividualRfcFactory(alias2__name='rfc14',name='draft-was-never-issued',std_level_id='unkn') WgRfcFactory(alias2__name='rfc9999',name='draft-ietf-random-thing',std_level_id='ps') WgRfcFactory(alias2__name='rfc9998',name='draft-ietf-random-other-thing',std_level_id='inf') DocumentFactory(type_id='statchg',name='status-change-imaginary-mid-review',notify='notify@example.org') class StatusChangeSubmitTests(TestCase): + settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['STATUS_CHANGE_PATH'] def test_initial_submission(self): doc = Document.objects.get(name='status-change-imaginary-mid-review') url = urlreverse('ietf.doc.views_status_change.submit',kwargs=dict(name=doc.name)) @@ -532,11 +533,5 @@ class StatusChangeSubmitTests(TestCase): self.assertContains(r, "This is the old proposal.") def setUp(self): + super().setUp() DocumentFactory(type_id='statchg',name='status-change-imaginary-mid-review',notify='notify@example.org') - self.test_dir = self.tempdir('status-change') - self.saved_status_change_path = settings.STATUS_CHANGE_PATH - settings.STATUS_CHANGE_PATH = self.test_dir - - def tearDown(self): - settings.STATUS_CHANGE_PATH = self.saved_status_change_path - shutil.rmtree(self.test_dir) diff --git a/ietf/doc/tests_utils.py b/ietf/doc/tests_utils.py index cd6be0a3d..165594cf4 100644 --- a/ietf/doc/tests_utils.py +++ b/ietf/doc/tests_utils.py @@ -17,6 +17,7 @@ class ActionHoldersTests(TestCase): def setUp(self): """Set up helper for the update_action_holders tests""" + super().setUp() self.authors = PersonFactory.create_batch(3) self.ad = Person.objects.get(user__username='ad') self.group = GroupFactory() diff --git a/ietf/group/tests.py b/ietf/group/tests.py index 6323211a8..74995e60c 100644 --- a/ietf/group/tests.py +++ b/ietf/group/tests.py @@ -76,6 +76,7 @@ class StreamTests(TestCase): class GroupDocDependencyGraphTests(TestCase): def setUp(self): + super().setUp() set_coverage_checking(False) a = WgDraftFactory() b = WgDraftFactory() @@ -83,6 +84,7 @@ class GroupDocDependencyGraphTests(TestCase): def tearDown(self): set_coverage_checking(True) + super().tearDown() def test_group_document_dependency_dotfile(self): for group in Group.objects.filter(Q(type="wg") | Q(type="rg")): @@ -123,6 +125,7 @@ class GroupDocDependencyGraphTests(TestCase): class GenerateGroupAliasesTests(TestCase): def setUp(self): + super().setUp() self.doc_aliases_file = NamedTemporaryFile(delete=False, mode='w+') self.doc_aliases_file.close() self.doc_virtual_file = NamedTemporaryFile(delete=False, mode='w+') @@ -137,6 +140,7 @@ class GenerateGroupAliasesTests(TestCase): settings.GROUP_VIRTUAL_PATH = self.saved_draft_virtual_path os.unlink(self.doc_aliases_file.name) os.unlink(self.doc_virtual_file.name) + super().tearDown() def testManagementCommand(self): a_month_ago = datetime.datetime.now() - datetime.timedelta(30) @@ -237,6 +241,7 @@ class GenerateGroupAliasesTests(TestCase): class GroupRoleEmailTests(TestCase): def setUp(self): + super().setUp() # make_immutable_base_data makes two areas, and puts a group in one of them # the tests below assume all areas have groups for area in Group.objects.filter(type_id='area'): diff --git a/ietf/group/tests_info.py b/ietf/group/tests_info.py index 006199025..aba0f975e 100644 --- a/ietf/group/tests_info.py +++ b/ietf/group/tests_info.py @@ -3,12 +3,12 @@ import os -import shutil import calendar import datetime import io import bleach +from pathlib import Path from pyquery import PyQuery from tempfile import NamedTemporaryFile @@ -52,14 +52,7 @@ def pklist(docs): return [ str(doc.pk) for doc in docs.all() ] class GroupPagesTests(TestCase): - def setUp(self): - self.charter_dir = self.tempdir('charter') - self.saved_charter_path = settings.CHARTER_PATH - settings.CHARTER_PATH = self.charter_dir - - def tearDown(self): - settings.CHARTER_PATH = self.saved_charter_path - shutil.rmtree(self.charter_dir) + settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['CHARTER_PATH'] def test_active_groups(self): area = GroupFactory.create(type_id='area') @@ -120,7 +113,7 @@ class GroupPagesTests(TestCase): chair = Email.objects.filter(role__group=group, role__name="chair")[0] - with io.open(os.path.join(self.charter_dir, "%s-%s.txt" % (group.charter.canonical_name(), group.charter.rev)), "w") as f: + with (Path(settings.CHARTER_PATH) / ("%s-%s.txt" % (group.charter.canonical_name(), group.charter.rev))).open("w") as f: f.write("This is a charter.") url = urlreverse('ietf.group.views.wg_summary_area', kwargs=dict(group_type="wg")) @@ -252,7 +245,7 @@ class GroupPagesTests(TestCase): group = CharterFactory().group draft = WgDraftFactory(group=group) - with io.open(os.path.join(self.charter_dir, "%s-%s.txt" % (group.charter.canonical_name(), group.charter.rev)), "w") as f: + with (Path(settings.CHARTER_PATH) / ("%s-%s.txt" % (group.charter.canonical_name(), group.charter.rev))).open("w") as f: f.write("This is a charter.") milestone = GroupMilestone.objects.create( @@ -465,14 +458,7 @@ class GroupPagesTests(TestCase): class GroupEditTests(TestCase): - def setUp(self): - self.charter_dir = self.tempdir('charter') - self.saved_charter_path = settings.CHARTER_PATH - settings.CHARTER_PATH = self.charter_dir - - def tearDown(self): - settings.CHARTER_PATH = self.saved_charter_path - shutil.rmtree(self.charter_dir) + settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['CHARTER_PATH'] def test_create(self): @@ -632,7 +618,7 @@ class GroupEditTests(TestCase): self.assertTrue(len(q('form .has-error')) > 0) # edit info - with io.open(os.path.join(self.charter_dir, "%s-%s.txt" % (group.charter.canonical_name(), group.charter.rev)), "w") as f: + with (Path(settings.CHARTER_PATH) / ("%s-%s.txt" % (group.charter.canonical_name(), group.charter.rev))).open("w") as f: f.write("This is a charter.") area = group.parent ad = Person.objects.get(name="Areað Irector") @@ -673,7 +659,7 @@ class GroupEditTests(TestCase): self.assertEqual(group.list_subscribe, "subscribe.mars") self.assertEqual(group.list_archive, "archive.mars") - self.assertTrue(os.path.exists(os.path.join(self.charter_dir, "%s-%s.txt" % (group.charter.canonical_name(), group.charter.rev)))) + self.assertTrue((Path(settings.CHARTER_PATH) / ("%s-%s.txt" % (group.charter.canonical_name(), group.charter.rev))).exists()) self.assertEqual(len(outbox), 2) self.assertTrue('Personnel change' in outbox[0]['Subject']) for prefix in ['ad1','ad2','aread','marschairman','marsdelegate']: @@ -1558,6 +1544,7 @@ class CustomizeWorkflowTests(TestCase): class EmailAliasesTests(TestCase): def setUp(self): + super().setUp() PersonFactory(user__username='plain') GroupFactory(acronym='mars',parent=GroupFactory(type_id='area')) GroupFactory(acronym='ames',parent=GroupFactory(type_id='area')) @@ -1580,6 +1567,7 @@ expand-ames-chairs@virtual.ietf.org mars_chair@ietf def tearDown(self): settings.GROUP_VIRTUAL_PATH = self.saved_group_virtual_path os.unlink(self.group_alias_file.name) + super().tearDown() def testAliases(self): url = urlreverse('ietf.group.urls_info_details.redirect.email', kwargs=dict(acronym="mars")) @@ -1644,6 +1632,7 @@ class AjaxTests(TestCase): class MeetingInfoTests(TestCase): def setUp(self): + super().setUp() self.group = GroupFactory.create(type_id='wg') today = datetime.date.today() SessionFactory.create(meeting__type_id='ietf',group=self.group,meeting__date=today-datetime.timedelta(days=14)) diff --git a/ietf/idindex/tests.py b/ietf/idindex/tests.py index 101d9aa26..413e3a4ed 100644 --- a/ietf/idindex/tests.py +++ b/ietf/idindex/tests.py @@ -3,9 +3,8 @@ import datetime -import io -import os -import shutil + +from pathlib import Path from django.conf import settings @@ -20,17 +19,8 @@ from ietf.person.factories import PersonFactory, EmailFactory from ietf.utils.test_utils import TestCase class IndexTests(TestCase): - def setUp(self): - self.id_dir = self.tempdir('id') - self.saved_internet_draft_path = settings.INTERNET_DRAFT_PATH - settings.INTERNET_DRAFT_PATH = self.id_dir - - def tearDown(self): - settings.INTERNET_DRAFT_PATH = self.saved_internet_draft_path - shutil.rmtree(self.id_dir) - def write_draft_file(self, name, size): - with io.open(os.path.join(self.id_dir, name), 'w') as f: + with (Path(settings.INTERNET_DRAFT_PATH) / name).open('w') as f: f.write("a" * size) def test_all_id_txt(self): diff --git a/ietf/iesg/tests.py b/ietf/iesg/tests.py index 4993c2da7..31d693911 100644 --- a/ietf/iesg/tests.py +++ b/ietf/iesg/tests.py @@ -4,10 +4,9 @@ import datetime import io -import os -import shutil import tarfile +from pathlib import Path from pyquery import PyQuery from django.conf import settings @@ -98,6 +97,7 @@ class IESGTests(TestCase): class IESGAgendaTests(TestCase): def setUp(self): + super().setUp() mars = GroupFactory(acronym='mars',parent=Group.objects.get(acronym='farfut')) wgdraft = WgDraftFactory(name='draft-ietf-mars-test', group=mars, intended_std_level_id='ps') rfc = IndividualRfcFactory.create(stream_id='irtf', other_aliases=['rfc6666',], states=[('draft','rfc'),('draft-iesg','pub')], std_level_id='inf', ) @@ -122,10 +122,6 @@ class IESGAgendaTests(TestCase): by = Person.objects.get(name="Areað Irector") date = get_agenda_date() - self.draft_dir = self.tempdir('agenda-draft') - self.saved_internet_draft_path = settings.INTERNET_DRAFT_PATH - settings.INTERNET_DRAFT_PATH = self.draft_dir - for d in list(self.telechat_docs.values()): TelechatDocEvent.objects.create(type="scheduled_for_telechat", doc=d, @@ -138,10 +134,6 @@ class IESGAgendaTests(TestCase): for i in range(0, 10): self.mgmt_items.append(IESGMgmtItemFactory()) - def tearDown(self): - settings.INTERNET_DRAFT_PATH = self.saved_internet_draft_path - shutil.rmtree(self.draft_dir) - def test_fill_in_agenda_docs(self): draft = self.telechat_docs["ietf_draft"] statchg = self.telechat_docs["statchg"] @@ -479,7 +471,7 @@ class IESGAgendaTests(TestCase): d1_filename = "%s-%s.txt" % (d1.name, d1.rev) d2_filename = "%s-%s.txt" % (d2.name, d2.rev) - with io.open(os.path.join(self.draft_dir, d1_filename), "w") as f: + with (Path(settings.INTERNET_DRAFT_PATH) / d1_filename).open("w") as f: f.write("test content") url = urlreverse("ietf.iesg.views.telechat_docs_tarfile", kwargs=dict(date=get_agenda_date().isoformat())) diff --git a/ietf/ietfauth/tests.py b/ietf/ietfauth/tests.py index ec23b69a6..9f1430cdd 100644 --- a/ietf/ietfauth/tests.py +++ b/ietf/ietfauth/tests.py @@ -58,6 +58,7 @@ else: class IetfAuthTests(TestCase): def setUp(self): + super().setUp() self.saved_use_python_htdigest = getattr(settings, "USE_PYTHON_HTDIGEST", None) settings.USE_PYTHON_HTDIGEST = True @@ -74,6 +75,7 @@ class IetfAuthTests(TestCase): settings.USE_PYTHON_HTDIGEST = self.saved_use_python_htdigest settings.HTPASSWD_FILE = self.saved_htpasswd_file settings.HTDIGEST_REALM = self.saved_htdigest_realm + super().tearDown() def test_index(self): self.assertEqual(self.client.get(urlreverse(ietf.ietfauth.views.index)).status_code, 200) diff --git a/ietf/ipr/tests.py b/ietf/ipr/tests.py index f31a312ea..2a65b3be6 100644 --- a/ietf/ipr/tests.py +++ b/ietf/ipr/tests.py @@ -44,12 +44,6 @@ def make_data_from_content(content): return data class IprTests(TestCase): - def setUp(self): - pass - - def tearDown(self): - pass - def test_get_genitive(self): self.assertEqual(get_genitive("Cisco"),"Cisco's") self.assertEqual(get_genitive("Ross"),"Ross'") diff --git a/ietf/liaisons/tests.py b/ietf/liaisons/tests.py index 7c7d5b8fe..a2b7083a4 100644 --- a/ietf/liaisons/tests.py +++ b/ietf/liaisons/tests.py @@ -4,11 +4,11 @@ import datetime import io -import os -import shutil import debug # pyflakes:ignore +from pathlib import Path + from django.conf import settings from django.contrib.auth.models import User from django.urls import reverse as urlreverse @@ -260,14 +260,7 @@ class ManagementCommandTests(TestCase): class LiaisonManagementTests(TestCase): - def setUp(self): - self.saved_liaison_attach_path = settings.LIAISON_ATTACH_PATH - self.liaison_dir = self.tempdir('liaison') - settings.LIAISON_ATTACH_PATH = self.liaison_dir - - def tearDown(self): - settings.LIAISON_ATTACH_PATH = self.saved_liaison_attach_path - shutil.rmtree(self.liaison_dir) + settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['LIAISON_ATTACH_PATH'] def test_add_restrictions(self): # incoming restrictions @@ -443,7 +436,7 @@ class LiaisonManagementTests(TestCase): self.assertEqual(new_liaison.attachments.count(), attachments_before + 1) attachment = new_liaison.attachments.order_by("-name")[0] self.assertEqual(attachment.title, "attachment") - with io.open(os.path.join(self.liaison_dir, attachment.uploaded_filename)) as f: + with (Path(settings.LIAISON_ATTACH_PATH) / attachment.uploaded_filename).open() as f: written_content = f.read() test_file.seek(0) @@ -747,7 +740,7 @@ class LiaisonManagementTests(TestCase): self.assertEqual(l.attachments.count(), 1) attachment = l.attachments.all()[0] self.assertEqual(attachment.title, "attachment") - with io.open(os.path.join(self.liaison_dir, attachment.uploaded_filename)) as f: + with (Path(settings.LIAISON_ATTACH_PATH) / attachment.uploaded_filename).open() as f: written_content = f.read() test_file.seek(0) @@ -826,7 +819,7 @@ class LiaisonManagementTests(TestCase): self.assertEqual(l.attachments.count(), 1) attachment = l.attachments.all()[0] self.assertEqual(attachment.title, "attachment") - with io.open(os.path.join(self.liaison_dir, attachment.uploaded_filename)) as f: + with (Path(settings.LIAISON_ATTACH_PATH) / attachment.uploaded_filename).open() as f: written_content = f.read() test_file.seek(0) diff --git a/ietf/mailtrigger/test_utils.py b/ietf/mailtrigger/test_utils.py index aef1a2997..b3ccf367d 100644 --- a/ietf/mailtrigger/test_utils.py +++ b/ietf/mailtrigger/test_utils.py @@ -10,6 +10,7 @@ from ietf.utils.test_utils import TestCase class GatherAddressListsTests(TestCase): def setUp(self): + super().setUp() self.doc = WgDraftFactory(group__acronym='mars', rev='01') self.author_address = self.doc.name + '@ietf.org' diff --git a/ietf/meeting/tests_schedule_generator.py b/ietf/meeting/tests_schedule_generator.py index 12754ee05..d414805d3 100644 --- a/ietf/meeting/tests_schedule_generator.py +++ b/ietf/meeting/tests_schedule_generator.py @@ -18,6 +18,7 @@ import debug # pyflakes:ignore class ScheduleGeneratorTest(TestCase): def setUp(self): + super().setUp() # Create a meeting of 2 days, 5 sessions per day, in 2 rooms. There are 3 days # actually created, but sundays are ignored. # Two rooms is a fairly low level of simultaneous schedules, this is needed diff --git a/ietf/meeting/tests_views.py b/ietf/meeting/tests_views.py index eb7a61b1b..fcf26bc7b 100644 --- a/ietf/meeting/tests_views.py +++ b/ietf/meeting/tests_views.py @@ -82,23 +82,19 @@ class BaseMeetingTestCase(TestCase): superclass methods. """ def setUp(self): + super().setUp() self.materials_dir = self.tempdir('materials') - self.id_dir = self.tempdir('id') - self.archive_dir = self.tempdir('id-archive') self.storage_dir = self.tempdir('storage') # - os.mkdir(os.path.join(self.archive_dir, "unknown_ids")) - os.mkdir(os.path.join(self.archive_dir, "deleted_tombstones")) - os.mkdir(os.path.join(self.archive_dir, "expired_without_tombstone")) + archive_dir = Path(settings.INTERNET_DRAFT_ARCHIVE_DIR) + (archive_dir / "unknown_ids").mkdir() + (archive_dir / "deleted_tombstones").mkdir() + (archive_dir / "expired_without_tombstone").mkdir() # self.saved_agenda_path = settings.AGENDA_PATH - self.saved_id_dir = settings.INTERNET_DRAFT_PATH - self.saved_archive_dir = settings.INTERNET_DRAFT_ARCHIVE_DIR self.saved_meetinghost_logo_path = settings.MEETINGHOST_LOGO_PATH # settings.AGENDA_PATH = self.materials_dir - settings.INTERNET_DRAFT_PATH = self.id_dir - settings.INTERNET_DRAFT_ARCHIVE_DIR = self.archive_dir settings.MEETINGHOST_LOGO_PATH = self.storage_dir # The FileSystemStorage has already set its location before @@ -116,14 +112,11 @@ class BaseMeetingTestCase(TestCase): self.patcher.stop() # shutil.rmtree(self.storage_dir) - shutil.rmtree(self.id_dir) - shutil.rmtree(self.archive_dir) shutil.rmtree(self.materials_dir) # settings.AGENDA_PATH = self.saved_agenda_path - settings.INTERNET_DRAFT_PATH = self.saved_id_dir - settings.INTERNET_DRAFT_ARCHIVE_DIR = self.saved_archive_dir settings.MEETINGHOST_LOGO_PATH = self.saved_meetinghost_logo_path + super().tearDown() def write_materials_file(self, meeting, doc, content): path = os.path.join(self.materials_dir, "%s/%s/%s" % (meeting.number, doc.type_id, doc.uploaded_filename)) @@ -2006,6 +1999,7 @@ class ReorderSlidesTests(TestCase): class EditTests(TestCase): def setUp(self): + super().setUp() # make sure we have the colors of the area from ietf.group.colors import fg_group_colors, bg_group_colors area_upper = "FARFUT" @@ -2803,6 +2797,7 @@ class SessionDetailsTests(TestCase): class EditScheduleListTests(TestCase): def setUp(self): + super().setUp() self.mtg = MeetingFactory(type_id='ietf') ScheduleFactory(meeting=self.mtg, name='secretary1') @@ -2921,14 +2916,7 @@ class EditScheduleListTests(TestCase): # ------------------------------------------------- class InterimTests(TestCase): - def setUp(self): - self.materials_dir = self.tempdir('materials') - self.saved_agenda_path = settings.AGENDA_PATH - settings.AGENDA_PATH = self.materials_dir - - def tearDown(self): - settings.AGENDA_PATH = self.saved_agenda_path - shutil.rmtree(self.materials_dir) + settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['AGENDA_PATH'] # test_interim_announce subsumed by test_appears_on_announce @@ -4299,12 +4287,6 @@ class AjaxTests(TestCase): self.assertEqual(data['utc'], '20:00') class FloorPlanTests(TestCase): - def setUp(self): - pass - - def tearDown(self): - pass - def test_floor_plan_page(self): make_meeting_test_data() meeting = Meeting.objects.filter(type_id='ietf').order_by('id').last() @@ -4319,12 +4301,6 @@ class FloorPlanTests(TestCase): self.assertEqual(r.status_code, 200) class IphoneAppJsonTests(TestCase): - def setUp(self): - pass - - def tearDown(self): - pass - def test_iphone_app_json_interim(self): make_interim_test_data() meeting = Meeting.objects.filter(type_id='interim').order_by('id').last() @@ -4383,22 +4359,19 @@ class FinalizeProceedingsTests(TestCase): self.assertEqual(meeting.session_set.filter(group__acronym="mars").first().sessionpresentation_set.filter(document__type="draft").first().rev,'00') class MaterialsTests(TestCase): - + settings_temp_path_overrides = TestCase.settings_temp_path_overrides + [ + 'AGENDA_PATH', + 'SLIDE_STAGING_PATH' + ] def setUp(self): + super().setUp() self.materials_dir = self.tempdir('materials') - self.staging_dir = self.tempdir('staging') if not os.path.exists(self.materials_dir): os.mkdir(self.materials_dir) - self.saved_agenda_path = settings.AGENDA_PATH - settings.AGENDA_PATH = self.materials_dir - self.saved_staging_path = settings.SLIDE_STAGING_PATH - settings.SLIDE_STAGING_PATH = self.staging_dir def tearDown(self): - settings.AGENDA_PATH = self.saved_agenda_path - settings.SLIDE_STAGING_PATH = self.saved_staging_path shutil.rmtree(self.materials_dir) - shutil.rmtree(self.staging_dir) + super().tearDown() def crawl_materials(self, url, top): seen = set() @@ -4926,17 +4899,7 @@ class SessionTests(TestCase): self.assertEqual(len(outbox),1) class HasMeetingsTests(TestCase): - def setUp(self): - self.materials_dir = self.tempdir('materials') - # - self.saved_agenda_path = settings.AGENDA_PATH - # - settings.AGENDA_PATH = self.materials_dir - - def tearDown(self): - shutil.rmtree(self.materials_dir) - # - settings.AGENDA_PATH = self.saved_agenda_path + settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['AGENDA_PATH'] def do_request_interim(self, url, group, user, meeting_count): login_testing_unauthorized(self,user.username, url) diff --git a/ietf/nomcom/management/tests.py b/ietf/nomcom/management/tests.py index 82522b9f3..03739d043 100644 --- a/ietf/nomcom/management/tests.py +++ b/ietf/nomcom/management/tests.py @@ -15,6 +15,7 @@ from ietf.utils.test_utils import TestCase, name_of_file_containing @override_settings(ADMINS=(('Some Admin', 'admin@example.com'),)) class FeedbackEmailTests(TestCase): def setUp(self): + super().setUp() self.year = 2021 self.nomcom = NomComFactory(group__acronym=f'nomcom{self.year}') diff --git a/ietf/nomcom/tests.py b/ietf/nomcom/tests.py index d7a8c9cc0..e977bef19 100644 --- a/ietf/nomcom/tests.py +++ b/ietf/nomcom/tests.py @@ -76,6 +76,7 @@ class NomcomViewsTest(TestCase): return response def setUp(self): + super().setUp() setup_test_public_keys_dir(self) nomcom_test_data() self.cert_file, self.privatekey_file = get_cert_files() @@ -107,6 +108,7 @@ class NomcomViewsTest(TestCase): def tearDown(self): teardown_test_public_keys_dir(self) + super().tearDown() def access_member_url(self, url): login_testing_unauthorized(self, COMMUNITY_USER, url) @@ -954,12 +956,14 @@ class NomineePositionStateSaveTest(TestCase): """Tests for the NomineePosition save override method""" def setUp(self): + super().setUp() setup_test_public_keys_dir(self) nomcom_test_data() self.nominee = Nominee.objects.get(email__person__user__username=COMMUNITY_USER) def tearDown(self): teardown_test_public_keys_dir(self) + super().tearDown() def test_state_autoset(self): """Verify state is autoset correctly""" @@ -989,6 +993,7 @@ class NomineePositionStateSaveTest(TestCase): class FeedbackTest(TestCase): def setUp(self): + super().setUp() setup_test_public_keys_dir(self) nomcom_test_data() @@ -996,6 +1001,7 @@ class FeedbackTest(TestCase): def tearDown(self): teardown_test_public_keys_dir(self) + super().tearDown() def test_encrypted_comments(self): @@ -1022,6 +1028,7 @@ class FeedbackTest(TestCase): class ReminderTest(TestCase): def setUp(self): + super().setUp() setup_test_public_keys_dir(self) nomcom_test_data() self.nomcom = get_nomcom_by_year(NOMCOM_YEAR) @@ -1065,6 +1072,7 @@ class ReminderTest(TestCase): def tearDown(self): teardown_test_public_keys_dir(self) + super().tearDown() def test_is_time_to_send(self): self.nomcom.reminder_interval = 4 @@ -1120,6 +1128,7 @@ class ReminderTest(TestCase): class InactiveNomcomTests(TestCase): def setUp(self): + super().setUp() setup_test_public_keys_dir(self) self.nc = NomComFactory.create(**nomcom_kwargs_for_year(group__state_id='conclude')) self.plain_person = PersonFactory.create() @@ -1128,6 +1137,7 @@ class InactiveNomcomTests(TestCase): def tearDown(self): teardown_test_public_keys_dir(self) + super().tearDown() def test_feedback_closed(self): for view in ['ietf.nomcom.views.public_feedback', 'ietf.nomcom.views.private_feedback']: @@ -1314,6 +1324,7 @@ class InactiveNomcomTests(TestCase): class FeedbackLastSeenTests(TestCase): def setUp(self): + super().setUp() setup_test_public_keys_dir(self) self.nc = NomComFactory.create(**nomcom_kwargs_for_year()) self.author = PersonFactory.create().email_set.first().address @@ -1334,6 +1345,7 @@ class FeedbackLastSeenTests(TestCase): def tearDown(self): teardown_test_public_keys_dir(self) + super().tearDown() def test_feedback_index_badges(self): url = reverse('ietf.nomcom.views.view_feedback',kwargs={'year':self.nc.year()}) @@ -1420,6 +1432,7 @@ class FeedbackLastSeenTests(TestCase): class NewActiveNomComTests(TestCase): def setUp(self): + super().setUp() setup_test_public_keys_dir(self) self.nc = NomComFactory.create(**nomcom_kwargs_for_year()) self.chair = self.nc.group.role_set.filter(name='chair').first().person @@ -1428,6 +1441,7 @@ class NewActiveNomComTests(TestCase): def tearDown(self): teardown_test_public_keys_dir(self) settings.DAYS_TO_EXPIRE_NOMINATION_LINK = self.saved_days_to_expire_nomination_link + super().tearDown() def test_help(self): url = reverse('ietf.nomcom.views.configuration_help',kwargs={'year':self.nc.year()}) @@ -1875,6 +1889,7 @@ Junk body for testing class NomComIndexTests(TestCase): def setUp(self): + super().setUp() for year in range(2000,2014): NomComFactory.create(**nomcom_kwargs_for_year(year=year,populate_positions=False,populate_personnel=False)) @@ -1885,6 +1900,7 @@ class NomComIndexTests(TestCase): class NoPublicKeyTests(TestCase): def setUp(self): + super().setUp() self.nc = NomComFactory.create(**nomcom_kwargs_for_year(public_key=None)) self.chair = self.nc.group.role_set.filter(name='chair').first().person @@ -1914,6 +1930,7 @@ class NoPublicKeyTests(TestCase): class AcceptingTests(TestCase): def setUp(self): + super().setUp() setup_test_public_keys_dir(self) self.nc = NomComFactory(**nomcom_kwargs_for_year()) self.plain_person = PersonFactory.create() @@ -1921,6 +1938,7 @@ class AcceptingTests(TestCase): def tearDown(self): teardown_test_public_keys_dir(self) + super().tearDown() def test_public_accepting_nominations(self): url = reverse('ietf.nomcom.views.public_nominate',kwargs={'year':self.nc.year()}) @@ -2021,12 +2039,14 @@ class AcceptingTests(TestCase): class ShowNomineeTests(TestCase): def setUp(self): + super().setUp() setup_test_public_keys_dir(self) self.nc = NomComFactory(**nomcom_kwargs_for_year()) self.plain_person = PersonFactory.create() def tearDown(self): teardown_test_public_keys_dir(self) + super().tearDown() def test_feedback_pictures(self): url = reverse('ietf.nomcom.views.public_nominate',kwargs={'year':self.nc.year()}) @@ -2042,6 +2062,7 @@ class ShowNomineeTests(TestCase): class TopicTests(TestCase): def setUp(self): + super().setUp() setup_test_public_keys_dir(self) self.nc = NomComFactory(**nomcom_kwargs_for_year(populate_topics=False)) self.plain_person = PersonFactory.create() @@ -2049,7 +2070,8 @@ class TopicTests(TestCase): def tearDown(self): teardown_test_public_keys_dir(self) - + super().tearDown() + def testAddEditListRemoveTopic(self): self.assertFalse(self.nc.topic_set.exists()) @@ -2192,6 +2214,7 @@ class EligibilityUnitTests(TestCase): class rfc8713EligibilityTests(TestCase): def setUp(self): + super().setUp() self.nomcom = NomComFactory(group__acronym='nomcom2019', populate_personnel=False, first_call_for_volunteers=datetime.date(2019,5,1)) meetings = [ MeetingFactory(date=date,type_id='ietf') for date in ( @@ -2249,6 +2272,7 @@ class rfc8713EligibilityTests(TestCase): class rfc8788EligibilityTests(TestCase): def setUp(self): + super().setUp() self.nomcom = NomComFactory(group__acronym='nomcom2020', populate_personnel=False, first_call_for_volunteers=datetime.date(2020,5,1)) meetings = [MeetingFactory(number=number, date=date, type_id='ietf') for number,date in [ @@ -2286,6 +2310,7 @@ class rfc8788EligibilityTests(TestCase): class rfc8989EligibilityTests(TestCase): def setUp(self): + super().setUp() self.nomcom = NomComFactory(group__acronym='nomcom2021', populate_personnel=False, first_call_for_volunteers=datetime.date(2021,5,15)) # make_immutable_test_data makes things this test does not want Role.objects.filter(name_id__in=('chair','secr')).delete() diff --git a/ietf/review/tests_policies.py b/ietf/review/tests_policies.py index e1826e9ea..1969e0566 100644 --- a/ietf/review/tests_policies.py +++ b/ietf/review/tests_policies.py @@ -76,7 +76,8 @@ class _Wrapper(TestCase): reviewer_queue_policy_id = '' def setUp(self): - self.team = ReviewTeamFactory(acronym="rotationteam", + super().setUp() + self.team = ReviewTeamFactory(acronym="rotationteam", name="Review Team", list_email="rotationteam@ietf.org", parent=Group.objects.get(acronym="farfut")) diff --git a/ietf/secr/announcement/tests.py b/ietf/secr/announcement/tests.py index f7a349cbb..c50e997f9 100644 --- a/ietf/secr/announcement/tests.py +++ b/ietf/secr/announcement/tests.py @@ -23,6 +23,7 @@ AD_USER='' class SecrAnnouncementTestCase(TestCase): def setUp(self): + super().setUp() chair = RoleName.objects.get(slug='chair') secr = RoleName.objects.get(slug='secr') ietf = Group.objects.get(acronym='ietf') diff --git a/ietf/secr/meetings/tests.py b/ietf/secr/meetings/tests.py index 1bc74aa0b..0d6573338 100644 --- a/ietf/secr/meetings/tests.py +++ b/ietf/secr/meetings/tests.py @@ -5,6 +5,8 @@ import datetime import os import shutil + +from pathlib import Path from pyquery import PyQuery from io import StringIO @@ -25,27 +27,25 @@ from ietf.utils.test_utils import TestCase class SecrMeetingTestCase(TestCase): + settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['AGENDA_PATH'] def setUp(self): - self.proceedings_dir = self.tempdir('proceedings') - self.saved_secr_proceedings_dir = settings.SECR_PROCEEDINGS_DIR - settings.SECR_PROCEEDINGS_DIR = self.proceedings_dir - self.saved_agenda_path = settings.AGENDA_PATH - settings.AGENDA_PATH = self.proceedings_dir - + super().setUp() self.bluesheet_dir = self.tempdir('bluesheet') self.bluesheet_path = os.path.join(self.bluesheet_dir,'blue_sheet.rtf') self.saved_secr_blue_sheet_path = settings.SECR_BLUE_SHEET_PATH settings.SECR_BLUE_SHEET_PATH = self.bluesheet_path - self.materials_dir = self.tempdir('materials') - + # n.b., the bluesheet upload relies on SECR_PROCEEDINGS_DIR being the same + # as AGENDA_PATH. This is probably a bug, but may not be worth fixing if + # the secr app is on the way out. + self.saved_secr_proceedings_dir = settings.SECR_PROCEEDINGS_DIR + settings.SECR_PROCEEDINGS_DIR = settings.AGENDA_PATH + def tearDown(self): settings.SECR_PROCEEDINGS_DIR = self.saved_secr_proceedings_dir - settings.AGENDA_PATH = self.saved_agenda_path settings.SECR_BLUE_SHEET_PATH = self.saved_secr_blue_sheet_path - shutil.rmtree(self.proceedings_dir) shutil.rmtree(self.bluesheet_dir) - shutil.rmtree(self.materials_dir) + super().tearDown() def test_main(self): "Main Test" @@ -170,8 +170,8 @@ class SecrMeetingTestCase(TestCase): def test_blue_sheets_upload(self): "Test Bluesheets" meeting = make_meeting_test_data() - os.makedirs(os.path.join(self.proceedings_dir,str(meeting.number),'bluesheets')) - + (Path(settings.SECR_PROCEEDINGS_DIR) / str(meeting.number) / 'bluesheets').mkdir(parents=True) + url = reverse('ietf.secr.meetings.views.blue_sheet',kwargs={'meeting_id':meeting.number}) self.client.login(username="secretary", password="secretary+password") response = self.client.get(url) diff --git a/ietf/secr/proceedings/tests.py b/ietf/secr/proceedings/tests.py index e6ee6a593..9d3f3d27b 100644 --- a/ietf/secr/proceedings/tests.py +++ b/ietf/secr/proceedings/tests.py @@ -6,7 +6,6 @@ import debug # pyflakes:ignore import io import json import os -import shutil from django.conf import settings from django.urls import reverse @@ -65,14 +64,7 @@ class VideoRecordingTestCase(TestCase): self.assertEqual(urls[0]['url'],'https://www.youtube.com/watch?v=lhYWB5FFkg4&list=PLC86T-6ZTP5jo6kIuqdyeYYhsKv9sUwG1') class RecordingTestCase(TestCase): - def setUp(self): - self.meeting_recordings_dir = self.tempdir('meeting-recordings') - self.saved_meeting_recordings_dir = settings.MEETING_RECORDINGS_DIR - settings.MEETING_RECORDINGS_DIR = self.meeting_recordings_dir - - def tearDown(self): - shutil.rmtree(self.meeting_recordings_dir) - settings.MEETING_RECORDINGS_DIR = self.saved_meeting_recordings_dir + settings_temp_path_overrides = TestCase.settings_temp_path_overrides + ['MEETING_RECORDINGS_DIR'] def test_page(self): meeting = MeetingFactory(type_id='ietf') diff --git a/ietf/secr/roles/tests.py b/ietf/secr/roles/tests.py index 242d396db..8c14ec239 100644 --- a/ietf/secr/roles/tests.py +++ b/ietf/secr/roles/tests.py @@ -15,6 +15,7 @@ SECR_USER='secretary' class SecrRolesMainTestCase(TestCase): def setUp(self): + super().setUp() GroupFactory(type_id='sdo') # need this for the RoleForm initialization def test_main(self): diff --git a/ietf/secr/sreq/tests.py b/ietf/secr/sreq/tests.py index 9beb96ed7..b6165670c 100644 --- a/ietf/secr/sreq/tests.py +++ b/ietf/secr/sreq/tests.py @@ -456,6 +456,7 @@ class SubmitRequestCase(TestCase): class LockAppTestCase(TestCase): def setUp(self): + super().setUp() self.meeting = MeetingFactory(type_id='ietf', date=datetime.date.today(),session_request_lock_message='locked') self.group = GroupFactory(acronym='mars') RoleFactory(name_id='chair', group=self.group, person__user__username='marschairman') @@ -531,6 +532,7 @@ class RetrievePreviousCase(TestCase): class SessionFormTest(TestCase): def setUp(self): + super().setUp() self.meeting = MeetingFactory(type_id='ietf') self.group1 = GroupFactory() self.group2 = GroupFactory() diff --git a/ietf/submit/tests.py b/ietf/submit/tests.py index 7764b2726..5714e0898 100644 --- a/ietf/submit/tests.py +++ b/ietf/submit/tests.py @@ -7,7 +7,6 @@ import email import io import os import re -import shutil import sys import mock @@ -43,6 +42,40 @@ from ietf.utils.models import VersionInfo from ietf.utils.test_utils import login_testing_unauthorized, TestCase from ietf.utils.draft import Draft + +class BaseSubmitTestCase(TestCase): + settings_temp_path_overrides = TestCase.settings_temp_path_overrides + [ + 'IDSUBMIT_STAGING_PATH', + 'SUBMIT_YANG_RFC_MODEL_DIR', + 'SUBMIT_YANG_DRAFT_MODEL_DIR', + 'SUBMIT_YANG_IANA_MODEL_DIR', + 'SUBMIT_YANG_CATALOG_DIR', + ] + + def setUp(self): + super().setUp() + + # The system apparently relies on these paths being equal. If they are not, + # old drafts may not be moved out of the way properly. + self.saved_repository_path = settings.IDSUBMIT_REPOSITORY_PATH + settings.IDSUBMIT_REPOSITORY_PATH = settings.INTERNET_DRAFT_PATH + + def tearDown(self): + settings.IDSUBMIT_REPOSITORY_PATH = self.saved_repository_path + super().tearDown() + + @property + def staging_dir(self): + return settings.IDSUBMIT_STAGING_PATH + + @property + def repository_dir(self): + return settings.IDSUBMIT_REPOSITORY_PATH + + @property + def archive_dir(self): + return settings.INTERNET_DRAFT_ARCHIVE_DIR + def submission_file(name, rev, group, format, templatename, author=None, email=None, title=None, year=None, ascii=True): # construct appropriate text draft f = io.open(os.path.join(settings.BASE_DIR, "submit", templatename)) @@ -112,58 +145,12 @@ def create_draft_submission_with_rev_mismatch(rev='01'): return draft, sub -class SubmitTests(TestCase): +class SubmitTests(BaseSubmitTestCase): def setUp(self): - self.saved_idsubmit_staging_path = settings.IDSUBMIT_STAGING_PATH - self.staging_dir = self.tempdir('submit-staging') - settings.IDSUBMIT_STAGING_PATH = self.staging_dir - - self.saved_internet_draft_path = settings.INTERNET_DRAFT_PATH - self.saved_idsubmit_repository_path = settings.IDSUBMIT_REPOSITORY_PATH - self.repository_dir = self.tempdir('submit-repository') - settings.INTERNET_DRAFT_PATH = settings.IDSUBMIT_REPOSITORY_PATH = self.repository_dir - - self.saved_archive_dir = settings.INTERNET_DRAFT_ARCHIVE_DIR - self.archive_dir = self.tempdir('submit-archive') - settings.INTERNET_DRAFT_ARCHIVE_DIR = self.archive_dir - - self.saved_yang_rfc_model_dir = settings.SUBMIT_YANG_RFC_MODEL_DIR - self.yang_rfc_model_dir = self.tempdir('yang-rfc-model') - settings.SUBMIT_YANG_RFC_MODEL_DIR = self.yang_rfc_model_dir - - self.saved_yang_draft_model_dir = settings.SUBMIT_YANG_DRAFT_MODEL_DIR - self.yang_draft_model_dir = self.tempdir('yang-draft-model') - settings.SUBMIT_YANG_DRAFT_MODEL_DIR = self.yang_draft_model_dir - - self.saved_yang_iana_model_dir = settings.SUBMIT_YANG_IANA_MODEL_DIR - self.yang_iana_model_dir = self.tempdir('yang-iana-model') - settings.SUBMIT_YANG_IANA_MODEL_DIR = self.yang_iana_model_dir - - self.saved_yang_catalog_model_dir = settings.SUBMIT_YANG_CATALOG_MODEL_DIR - self.yang_catalog_model_dir = self.tempdir('yang-catalog-model') - settings.SUBMIT_YANG_CATALOG_MODEL_DIR = self.yang_catalog_model_dir - + super().setUp() # Submit views assume there is a "next" IETF to look for cutoff dates against MeetingFactory(type_id='ietf', date=datetime.date.today()+datetime.timedelta(days=180)) - def tearDown(self): - shutil.rmtree(self.staging_dir) - shutil.rmtree(self.repository_dir) - shutil.rmtree(self.archive_dir) - shutil.rmtree(self.yang_rfc_model_dir) - shutil.rmtree(self.yang_draft_model_dir) - shutil.rmtree(self.yang_iana_model_dir) - shutil.rmtree(self.yang_catalog_model_dir) - settings.IDSUBMIT_STAGING_PATH = self.saved_idsubmit_staging_path - settings.INTERNET_DRAFT_PATH = self.saved_internet_draft_path - settings.IDSUBMIT_REPOSITORY_PATH = self.saved_idsubmit_repository_path - settings.INTERNET_DRAFT_ARCHIVE_DIR = self.saved_archive_dir - settings.SUBMIT_YANG_RFC_MODEL_DIR = self.saved_yang_rfc_model_dir - settings.SUBMIT_YANG_DRAFT_MODEL_DIR = self.saved_yang_draft_model_dir - settings.SUBMIT_YANG_IANA_MODEL_DIR = self.saved_yang_iana_model_dir - settings.SUBMIT_YANG_CATALOG_MODEL_DIR = self.saved_yang_catalog_model_dir - - def create_and_post_submission(self, name, rev, author, group=None, formats=("txt",), base_filename=None): """Helper to create and post a submission @@ -2107,7 +2094,7 @@ class SubmitTests(TestCase): self.assertEqual(len(kept_div('span.label:contains("Removed")')), 0) self.assertEqual(len(kept_div('span.label:contains("New")')), 0) -class ApprovalsTestCase(TestCase): +class ApprovalsTestCase(BaseSubmitTestCase): def test_approvals(self): RoleFactory(name_id='chair', group__acronym='mars', @@ -2278,7 +2265,7 @@ class ApprovalsTestCase(TestCase): self.assertEqual(len(Preapproval.objects.filter(name=preapproval.name)), 0) -class ManualPostsTestCase(TestCase): +class ManualPostsTestCase(BaseSubmitTestCase): def test_manual_posts(self): GroupFactory(acronym='mars') @@ -2723,60 +2710,13 @@ Subject: test return r -class ApiSubmitTests(TestCase): +class ApiSubmitTests(BaseSubmitTestCase): def setUp(self): + super().setUp() # break early in case of missing configuration self.assertTrue(os.path.exists(settings.IDSUBMIT_IDNITS_BINARY)) - - self.saved_idsubmit_staging_path = settings.IDSUBMIT_STAGING_PATH - self.staging_dir = self.tempdir('submit-staging') - settings.IDSUBMIT_STAGING_PATH = self.staging_dir - - self.saved_internet_draft_path = settings.INTERNET_DRAFT_PATH - self.saved_idsubmit_repository_path = settings.IDSUBMIT_REPOSITORY_PATH - self.repository_dir = self.tempdir('submit-repository') - settings.INTERNET_DRAFT_PATH = settings.IDSUBMIT_REPOSITORY_PATH = self.repository_dir - - self.saved_archive_dir = settings.INTERNET_DRAFT_ARCHIVE_DIR - self.archive_dir = self.tempdir('submit-archive') - settings.INTERNET_DRAFT_ARCHIVE_DIR = self.archive_dir - - self.saved_yang_rfc_model_dir = settings.SUBMIT_YANG_RFC_MODEL_DIR - self.rfc_model_dir = self.tempdir('yang-rfcmod') - settings.SUBMIT_YANG_RFC_MODEL_DIR = self.rfc_model_dir - - self.saved_yang_draft_model_dir = settings.SUBMIT_YANG_DRAFT_MODEL_DIR - self.draft_model_dir = self.tempdir('yang-draftmod') - settings.SUBMIT_YANG_DRAFT_MODEL_DIR = self.draft_model_dir - - self.saved_yang_iana_model_dir = settings.SUBMIT_YANG_IANA_MODEL_DIR - self.iana_model_dir = self.tempdir('yang-ianamod') - settings.SUBMIT_YANG_IANA_MODEL_DIR = self.iana_model_dir - - self.saved_yang_catalog_model_dir = settings.SUBMIT_YANG_CATALOG_MODEL_DIR - self.catalog_model_dir = self.tempdir('yang-catalogmod') - settings.SUBMIT_YANG_CATALOG_MODEL_DIR = self.catalog_model_dir - MeetingFactory(type_id='ietf', date=datetime.date.today()+datetime.timedelta(days=60)) - def tearDown(self): - shutil.rmtree(self.staging_dir) - shutil.rmtree(self.repository_dir) - shutil.rmtree(self.archive_dir) - shutil.rmtree(self.rfc_model_dir) - shutil.rmtree(self.draft_model_dir) - shutil.rmtree(self.iana_model_dir) - shutil.rmtree(self.catalog_model_dir) - - settings.IDSUBMIT_STAGING_PATH = self.saved_idsubmit_staging_path - settings.INTERNET_DRAFT_PATH = self.saved_internet_draft_path - settings.IDSUBMIT_REPOSITORY_PATH = self.saved_idsubmit_repository_path - settings.INTERNET_DRAFT_ARCHIVE_DIR = self.saved_archive_dir - settings.SUBMIT_YANG_RFC_MODEL_DIR = self.saved_yang_rfc_model_dir - settings.SUBMIT_YANG_DRAFT_MODEL_DIR = self.saved_yang_draft_model_dir - settings.SUBMIT_YANG_IANA_MODEL_DIR = self.saved_yang_iana_model_dir - settings.SUBMIT_YANG_CATALOG_MODEL_DIR = self.saved_yang_catalog_model_dir - def do_post_submission(self, rev, author=None, name=None, group=None, email=None, title=None, year=None): url = urlreverse('ietf.submit.views.api_submit') if author is None: @@ -2904,7 +2844,7 @@ class ApiSubmitTests(TestCase): ) -class RefsTests(TestCase): +class RefsTests(BaseSubmitTestCase): def test_draft_refs_identification(self): diff --git a/ietf/sync/tests.py b/ietf/sync/tests.py index f0badf1d5..8bfd922bf 100644 --- a/ietf/sync/tests.py +++ b/ietf/sync/tests.py @@ -7,7 +7,6 @@ import io import json import datetime import quopri -import shutil from django.conf import settings from django.urls import reverse as urlreverse @@ -219,22 +218,8 @@ ICANN class RFCSyncTests(TestCase): - def setUp(self): - self.save_id_dir = settings.INTERNET_DRAFT_PATH - self.save_archive_dir = settings.INTERNET_DRAFT_ARCHIVE_DIR - self.id_dir = self.tempdir('id') - self.archive_dir = self.tempdir('id-archive') - settings.INTERNET_DRAFT_PATH = self.id_dir - settings.INTERNET_DRAFT_ARCHIVE_DIR = self.archive_dir - - def tearDown(self): - shutil.rmtree(self.id_dir) - shutil.rmtree(self.archive_dir) - settings.INTERNET_DRAFT_PATH = self.save_id_dir - settings.INTERNET_DRAFT_ARCHIVE_DIR = self.save_archive_dir - def write_draft_file(self, name, size): - with io.open(os.path.join(self.id_dir, name), 'w') as f: + with io.open(os.path.join(settings.INTERNET_DRAFT_PATH, name), 'w') as f: f.write("a" * size) def test_rfc_index(self): @@ -382,8 +367,8 @@ class RFCSyncTests(TestCase): self.assertEqual(doc.get_state_slug("draft-stream-ise"), "pub") self.assertEqual(doc.std_level_id, "ps") self.assertEqual(doc.pages, 42) - self.assertTrue(not os.path.exists(os.path.join(self.id_dir, draft_filename))) - self.assertTrue(os.path.exists(os.path.join(self.archive_dir, draft_filename))) + self.assertTrue(not os.path.exists(os.path.join(settings.INTERNET_DRAFT_PATH, draft_filename))) + self.assertTrue(os.path.exists(os.path.join(settings.INTERNET_DRAFT_ARCHIVE_DIR, draft_filename))) # make sure we can apply it again with no changes changed = list(rfceditor.update_docs_from_rfc_index(data, errata, today - datetime.timedelta(days=30))) diff --git a/ietf/utils/test_utils.py b/ietf/utils/test_utils.py index 6d3e10cc0..add7bedfd 100644 --- a/ietf/utils/test_utils.py +++ b/ietf/utils/test_utils.py @@ -38,6 +38,7 @@ import os import re import email import html5lib +import shutil import sys from urllib.parse import unquote @@ -151,9 +152,27 @@ class ReverseLazyTest(django.test.TestCase): self.assertRedirects(response, "/ipr/", status_code=301) class TestCase(django.test.TestCase): + """IETF TestCase class + + Based on django.test.TestCase, but adds a few things: + * asserts for html5 validation. + * tempdir() convenience method + * setUp() and tearDown() that override settings paths with temp directories + + The setUp() and tearDown() methods create / remove temporary paths and override + Django's settings with the temp dir names. Subclasses of this class must + be sure to call the superclass methods if they are overridden. These are created + anew for each test to avoid risk of cross-talk between test cases. Overriding + the settings_temp_path_overrides class value will modify which path settings are + replaced with temp test dirs. """ - Does basically the same as django.test.TestCase, but adds asserts for html5 validation. - """ + # These settings will be overridden with empty temporary directories + settings_temp_path_overrides = [ + 'RFC_PATH', + 'INTERNET_ALL_DRAFTS_ARCHIVE_DIR', + 'INTERNET_DRAFT_ARCHIVE_DIR', + 'INTERNET_DRAFT_PATH', + ] parser = html5lib.HTMLParser(strict=True) @@ -238,4 +257,18 @@ class TestCase(django.test.TestCase): def __str__(self): return u"%s (%s.%s)" % (self._testMethodName, strclass(self.__class__),self._testMethodName) - + + def setUp(self): + # Replace settings paths with temporary directories. + super().setUp() + self._ietf_temp_dirs = {} # trashed during tearDown, DO NOT put paths you care about in this + for setting in self.settings_temp_path_overrides: + self._ietf_temp_dirs[setting] = self.tempdir(slugify(setting)) + self._ietf_saved_context = django.test.utils.override_settings(**self._ietf_temp_dirs) + self._ietf_saved_context.enable() + + def tearDown(self): + self._ietf_saved_context.disable() + for dir in self._ietf_temp_dirs.values(): + shutil.rmtree(dir) + super().tearDown() diff --git a/ietf/utils/tests.py b/ietf/utils/tests.py index bf9f26578..87ed366a5 100644 --- a/ietf/utils/tests.py +++ b/ietf/utils/tests.py @@ -188,6 +188,7 @@ class TemplateChecksTestCase(TestCase): templates = {} # type: Dict[str, Template] def setUp(self): + super().setUp() set_coverage_checking(False) self.paths = list(get_template_paths()) self.paths.sort() @@ -199,7 +200,7 @@ class TemplateChecksTestCase(TestCase): def tearDown(self): set_coverage_checking(True) - pass + super().tearDown() def test_parse_templates(self): errors = [] @@ -294,6 +295,7 @@ class TemplateChecksTestCase(TestCase): class TestWikiGlueManagementCommand(TestCase): def setUp(self): + super().setUp() # We create temporary wiki and svn directories, and provide them to the management # command through command line switches. We have to do it this way because the # management command reads in its own copy of settings.py in its own python @@ -310,6 +312,7 @@ class TestWikiGlueManagementCommand(TestCase): shutil.rmtree(os.path.dirname(self.wiki_dir_pattern)) shutil.rmtree(os.path.dirname(self.svn_dir_pattern)) set_coverage_checking(True) + super().tearDown() def test_wiki_create_output(self): for group_type in ['wg','rg','ag','area','rag']: @@ -423,6 +426,7 @@ class TestBowerStaticFiles(TestCase): class DraftTests(TestCase): def setUp(self): + super().setUp() file,_ = submission_file(name='draft-test-draft-class',rev='00',format='txt',templatename='test_submission.txt',group=None) self.draft = Draft(text=file.getvalue(),source='draft-test-draft-class-00.txt',name_from_source=False)