|
45 | 45 | StatusChangeFactory, DocExtResourceFactory, RgDraftFactory, BcpFactory) |
46 | 46 | from ietf.doc.forms import NotifyForm |
47 | 47 | from ietf.doc.fields import SearchableDocumentsField |
48 | | -from ietf.doc.utils import create_ballot_if_not_open, uppercase_std_abbreviated_name, DraftAliasGenerator |
| 48 | +from ietf.doc.utils import create_ballot_if_not_open, investigate_fragment, uppercase_std_abbreviated_name, DraftAliasGenerator |
49 | 49 | from ietf.group.models import Group, Role |
50 | 50 | from ietf.group.factories import GroupFactory, RoleFactory |
51 | 51 | from ietf.ipr.factories import HolderIprDisclosureFactory |
@@ -3141,3 +3141,137 @@ def test_state_index(self): |
3141 | 3141 | if not '-' in name: |
3142 | 3142 | self.assertIn(name, content) |
3143 | 3143 |
|
| 3144 | +class InvestigateTests(TestCase): |
| 3145 | + settings_temp_path_overrides = TestCase.settings_temp_path_overrides + [ |
| 3146 | + "AGENDA_PATH", |
| 3147 | + # "INTERNET_DRAFT_PATH", |
| 3148 | + # "INTERNET_DRAFT_ARCHIVE_DIR", |
| 3149 | + # "INTERNET_ALL_DRAFTS_ARCHIVE_DIR", |
| 3150 | + ] |
| 3151 | + |
| 3152 | + def setUp(self): |
| 3153 | + super().setUp() |
| 3154 | + # Contort the draft archive dir temporary replacement |
| 3155 | + # to match the "collections" concept |
| 3156 | + archive_tmp_dir = Path(settings.INTERNET_DRAFT_ARCHIVE_DIR) |
| 3157 | + new_archive_dir = archive_tmp_dir / "draft-archive" |
| 3158 | + new_archive_dir.mkdir() |
| 3159 | + settings.INTERNET_DRAFT_ARCHIVE_DIR = str(new_archive_dir) |
| 3160 | + donated_personal_copy_dir = archive_tmp_dir / "donated-personal-copy" |
| 3161 | + donated_personal_copy_dir.mkdir() |
| 3162 | + meeting_dir = Path(settings.AGENDA_PATH) / "666" |
| 3163 | + meeting_dir.mkdir() |
| 3164 | + all_archive_dir = Path(settings.INTERNET_ALL_DRAFTS_ARCHIVE_DIR) |
| 3165 | + repository_dir = Path(settings.INTERNET_DRAFT_PATH) |
| 3166 | + |
| 3167 | + for path in [repository_dir, all_archive_dir]: |
| 3168 | + (path / "draft-this-is-active-00.txt").touch() |
| 3169 | + for path in [new_archive_dir, all_archive_dir]: |
| 3170 | + (path / "draft-old-but-can-authenticate-00.txt").touch() |
| 3171 | + (path / "draft-has-mixed-provenance-01.txt").touch() |
| 3172 | + for path in [donated_personal_copy_dir, all_archive_dir]: |
| 3173 | + (path / "draft-donated-from-a-personal-collection-00.txt").touch() |
| 3174 | + (path / "draft-has-mixed-provenance-00.txt").touch() |
| 3175 | + (path / "draft-has-mixed-provenance-00.txt.Z").touch() |
| 3176 | + (all_archive_dir / "draft-this-should-not-be-possible-00.txt").touch() |
| 3177 | + (meeting_dir / "draft-this-predates-the-archive-00.txt").touch() |
| 3178 | + |
| 3179 | + def test_investigate_fragment(self): |
| 3180 | + |
| 3181 | + result = investigate_fragment("this-is-active") |
| 3182 | + self.assertEqual(len(result["can_verify"]), 1) |
| 3183 | + self.assertEqual(len(result["unverifiable_collections"]), 0) |
| 3184 | + self.assertEqual(len(result["unexpected"]), 0) |
| 3185 | + self.assertEqual( |
| 3186 | + list(result["can_verify"])[0].name, "draft-this-is-active-00.txt" |
| 3187 | + ) |
| 3188 | + |
| 3189 | + result = investigate_fragment("old-but-can") |
| 3190 | + self.assertEqual(len(result["can_verify"]), 1) |
| 3191 | + self.assertEqual(len(result["unverifiable_collections"]), 0) |
| 3192 | + self.assertEqual(len(result["unexpected"]), 0) |
| 3193 | + self.assertEqual( |
| 3194 | + list(result["can_verify"])[0].name, "draft-old-but-can-authenticate-00.txt" |
| 3195 | + ) |
| 3196 | + |
| 3197 | + result = investigate_fragment("predates") |
| 3198 | + self.assertEqual(len(result["can_verify"]), 1) |
| 3199 | + self.assertEqual(len(result["unverifiable_collections"]), 0) |
| 3200 | + self.assertEqual(len(result["unexpected"]), 0) |
| 3201 | + self.assertEqual( |
| 3202 | + list(result["can_verify"])[0].name, "draft-this-predates-the-archive-00.txt" |
| 3203 | + ) |
| 3204 | + |
| 3205 | + result = investigate_fragment("personal-collection") |
| 3206 | + self.assertEqual(len(result["can_verify"]), 0) |
| 3207 | + self.assertEqual(len(result["unverifiable_collections"]), 1) |
| 3208 | + self.assertEqual(len(result["unexpected"]), 0) |
| 3209 | + self.assertEqual( |
| 3210 | + list(result["unverifiable_collections"])[0].name, |
| 3211 | + "draft-donated-from-a-personal-collection-00.txt", |
| 3212 | + ) |
| 3213 | + |
| 3214 | + result = investigate_fragment("mixed-provenance") |
| 3215 | + self.assertEqual(len(result["can_verify"]), 1) |
| 3216 | + self.assertEqual(len(result["unverifiable_collections"]), 2) |
| 3217 | + self.assertEqual(len(result["unexpected"]), 0) |
| 3218 | + self.assertEqual( |
| 3219 | + list(result["can_verify"])[0].name, "draft-has-mixed-provenance-01.txt" |
| 3220 | + ) |
| 3221 | + self.assertEqual( |
| 3222 | + set([p.name for p in result["unverifiable_collections"]]), |
| 3223 | + set( |
| 3224 | + [ |
| 3225 | + "draft-has-mixed-provenance-00.txt", |
| 3226 | + "draft-has-mixed-provenance-00.txt.Z", |
| 3227 | + ] |
| 3228 | + ), |
| 3229 | + ) |
| 3230 | + |
| 3231 | + result = investigate_fragment("not-be-possible") |
| 3232 | + self.assertEqual(len(result["can_verify"]), 0) |
| 3233 | + self.assertEqual(len(result["unverifiable_collections"]), 0) |
| 3234 | + self.assertEqual(len(result["unexpected"]), 1) |
| 3235 | + self.assertEqual( |
| 3236 | + list(result["unexpected"])[0].name, |
| 3237 | + "draft-this-should-not-be-possible-00.txt", |
| 3238 | + ) |
| 3239 | + |
| 3240 | + def test_investigate(self): |
| 3241 | + url = urlreverse("ietf.doc.views_doc.investigate") |
| 3242 | + login_testing_unauthorized(self, "secretary", url) |
| 3243 | + r = self.client.get(url) |
| 3244 | + self.assertEqual(r.status_code, 200) |
| 3245 | + q = PyQuery(r.content) |
| 3246 | + self.assertEqual(len(q("form#investigate")), 1) |
| 3247 | + self.assertEqual(len(q("div#results")), 0) |
| 3248 | + r = self.client.post(url, dict(name_fragment="this-is-not-found")) |
| 3249 | + self.assertEqual(r.status_code, 200) |
| 3250 | + q = PyQuery(r.content) |
| 3251 | + self.assertEqual(len(q("div#results")), 1) |
| 3252 | + self.assertEqual(len(q("table#authenticated")), 0) |
| 3253 | + self.assertEqual(len(q("table#unverifiable")), 0) |
| 3254 | + self.assertEqual(len(q("table#unexpected")), 0) |
| 3255 | + r = self.client.post(url, dict(name_fragment="mixed-provenance")) |
| 3256 | + self.assertEqual(r.status_code, 200) |
| 3257 | + q = PyQuery(r.content) |
| 3258 | + self.assertEqual(len(q("div#results")), 1) |
| 3259 | + self.assertEqual(len(q("table#authenticated")), 1) |
| 3260 | + self.assertEqual(len(q("table#unverifiable")), 1) |
| 3261 | + self.assertEqual(len(q("table#unexpected")), 0) |
| 3262 | + r = self.client.post(url, dict(name_fragment="not-be-possible")) |
| 3263 | + self.assertEqual(r.status_code, 200) |
| 3264 | + q = PyQuery(r.content) |
| 3265 | + self.assertEqual(len(q("div#results")), 1) |
| 3266 | + self.assertEqual(len(q("table#authenticated")), 0) |
| 3267 | + self.assertEqual(len(q("table#unverifiable")), 0) |
| 3268 | + self.assertEqual(len(q("table#unexpected")), 1) |
| 3269 | + r = self.client.post(url, dict(name_fragment="short")) |
| 3270 | + self.assertEqual(r.status_code, 200) |
| 3271 | + q = PyQuery(r.content) |
| 3272 | + self.assertEqual(len(q("#id_name_fragment.is-invalid")), 1) |
| 3273 | + for char in ["*", "%", "/", "\\"]: |
| 3274 | + r = self.client.post(url, dict(name_fragment=f"bad{char}character")) |
| 3275 | + self.assertEqual(r.status_code, 200) |
| 3276 | + q = PyQuery(r.content) |
| 3277 | + self.assertEqual(len(q("#id_name_fragment.is-invalid")), 1) |
0 commit comments