|
33 | 33 | IprDocRelFactory, |
34 | 34 | IprEventFactory |
35 | 35 | ) |
36 | | -from ietf.ipr.forms import DraftForm |
| 36 | +from ietf.ipr.forms import DraftForm, HolderIprDisclosureForm |
37 | 37 | from ietf.ipr.mail import (process_response_email, get_reply_to, get_update_submitter_emails, |
38 | 38 | get_pseudo_submitter, get_holders, get_update_cc_addrs) |
39 | 39 | from ietf.ipr.models import (IprDisclosureBase,GenericIprDisclosure,HolderIprDisclosure, |
@@ -272,16 +272,16 @@ def test_sitemap(self): |
272 | 272 |
|
273 | 273 | def test_new_generic(self): |
274 | 274 | """Ensure new-generic redirects to new-general""" |
275 | | - url = urlreverse("ietf.ipr.views.new", kwargs={ "type": "generic" }) |
| 275 | + url = urlreverse("ietf.ipr.views.new", kwargs={ "_type": "generic" }) |
276 | 276 | r = self.client.get(url) |
277 | 277 | self.assertEqual(r.status_code,302) |
278 | | - self.assertEqual(urlparse(r["Location"]).path, urlreverse("ietf.ipr.views.new", kwargs={ "type": "general"})) |
| 278 | + self.assertEqual(urlparse(r["Location"]).path, urlreverse("ietf.ipr.views.new", kwargs={ "_type": "general"})) |
279 | 279 |
|
280 | 280 |
|
281 | 281 | def test_new_general(self): |
282 | 282 | """Add a new general disclosure. Note: submitter does not need to be logged in. |
283 | 283 | """ |
284 | | - url = urlreverse("ietf.ipr.views.new", kwargs={ "type": "general" }) |
| 284 | + url = urlreverse("ietf.ipr.views.new", kwargs={ "_type": "general" }) |
285 | 285 |
|
286 | 286 | # invalid post |
287 | 287 | r = self.client.post(url, { |
@@ -319,7 +319,7 @@ def test_new_specific(self): |
319 | 319 | """ |
320 | 320 | draft = WgDraftFactory() |
321 | 321 | rfc = WgRfcFactory() |
322 | | - url = urlreverse("ietf.ipr.views.new", kwargs={ "type": "specific" }) |
| 322 | + url = urlreverse("ietf.ipr.views.new", kwargs={ "_type": "specific" }) |
323 | 323 |
|
324 | 324 | # successful post |
325 | 325 | empty_outbox() |
@@ -375,7 +375,7 @@ def test_new_specific(self): |
375 | 375 | def test_new_specific_no_revision(self): |
376 | 376 | draft = WgDraftFactory() |
377 | 377 | rfc = WgRfcFactory() |
378 | | - url = urlreverse("ietf.ipr.views.new", kwargs={ "type": "specific" }) |
| 378 | + url = urlreverse("ietf.ipr.views.new", kwargs={ "_type": "specific" }) |
379 | 379 |
|
380 | 380 | # successful post |
381 | 381 | empty_outbox() |
@@ -409,7 +409,7 @@ def test_new_thirdparty(self): |
409 | 409 | """ |
410 | 410 | draft = WgDraftFactory() |
411 | 411 | rfc = WgRfcFactory() |
412 | | - url = urlreverse("ietf.ipr.views.new", kwargs={ "type": "third-party" }) |
| 412 | + url = urlreverse("ietf.ipr.views.new", kwargs={ "_type": "third-party" }) |
413 | 413 |
|
414 | 414 | # successful post |
415 | 415 | empty_outbox() |
@@ -456,7 +456,7 @@ def test_edit(self): |
456 | 456 | r = self.client.get(url) |
457 | 457 | self.assertContains(r, original_ipr.holder_legal_name) |
458 | 458 |
|
459 | | - #url = urlreverse("ietf.ipr.views.new", kwargs={ "type": "specific" }) |
| 459 | + #url = urlreverse("ietf.ipr.views.new", kwargs={ "_type": "specific" }) |
460 | 460 | # successful post |
461 | 461 | empty_outbox() |
462 | 462 | post_data = { |
@@ -503,7 +503,7 @@ def test_update(self): |
503 | 503 | r = self.client.get(url) |
504 | 504 | self.assertContains(r, original_ipr.title) |
505 | 505 |
|
506 | | - #url = urlreverse("ietf.ipr.views.new", kwargs={ "type": "specific" }) |
| 506 | + #url = urlreverse("ietf.ipr.views.new", kwargs={ "_type": "specific" }) |
507 | 507 | # successful post |
508 | 508 | empty_outbox() |
509 | 509 | r = self.client.post(url, { |
@@ -543,7 +543,7 @@ def test_update(self): |
543 | 543 |
|
544 | 544 | def test_update_bad_post(self): |
545 | 545 | draft = WgDraftFactory() |
546 | | - url = urlreverse("ietf.ipr.views.new", kwargs={ "type": "specific" }) |
| 546 | + url = urlreverse("ietf.ipr.views.new", kwargs={ "_type": "specific" }) |
547 | 547 |
|
548 | 548 | empty_outbox() |
549 | 549 | r = self.client.post(url, { |
@@ -1022,3 +1022,61 @@ def test_revisions_invalid(self): |
1022 | 1022 | "revisions", |
1023 | 1023 | null_char_error_msg, |
1024 | 1024 | ) |
| 1025 | + |
| 1026 | + |
| 1027 | +class HolderIprDisclosureFormTests(TestCase): |
| 1028 | + def setUp(self): |
| 1029 | + super().setUp() |
| 1030 | + # Checkboxes that are False are left out of the Form data, not sent back at all. These are |
| 1031 | + # commented out - if they were checked, their value would be "on". |
| 1032 | + self.data = { |
| 1033 | + "holder_legal_name": "Test Legal", |
| 1034 | + "holder_contact_name": "Test Holder", |
| 1035 | + "holder_contact_email": "test@holder.com", |
| 1036 | + "holder_contact_info": "555-555-0100", |
| 1037 | + "ietfer_name": "Test Participant", |
| 1038 | + "ietfer_contact_info": "555-555-0101", |
| 1039 | + "iprdocrel_set-TOTAL_FORMS": 2, |
| 1040 | + "iprdocrel_set-INITIAL_FORMS": 0, |
| 1041 | + "iprdocrel_set-0-document": "1234", # fake id - validates but won't save() |
| 1042 | + "iprdocrel_set-0-revisions": '00', |
| 1043 | + "iprdocrel_set-1-document": "4567", # fake id - validates but won't save() |
| 1044 | + # "is_blanket_disclosure": "on", |
| 1045 | + "patent_number": "SE12345678901", |
| 1046 | + "patent_inventor": "A. Nonymous", |
| 1047 | + "patent_title": "A method of transferring bits", |
| 1048 | + "patent_date": "2000-01-01", |
| 1049 | + # "has_patent_pending": "on", |
| 1050 | + "licensing": "reasonable", |
| 1051 | + "submitter_name": "Test Holder", |
| 1052 | + "submitter_email": "test@holder.com", |
| 1053 | + } |
| 1054 | + |
| 1055 | + def test_blanket_disclosure_licensing_restrictions(self): |
| 1056 | + """when is_blanket_disclosure is True only royalty-free licensing is valid |
| 1057 | + |
| 1058 | + Most of the form functionality is tested via the views in IprTests above. More thorough testing |
| 1059 | + of validation ought to move here so we don't have to exercise the whole Django plumbing repeatedly. |
| 1060 | + """ |
| 1061 | + self.assertTrue(HolderIprDisclosureForm(data=self.data).is_valid()) |
| 1062 | + self.data["is_blanket_disclosure"] = "on" |
| 1063 | + self.assertFalse(HolderIprDisclosureForm(data=self.data).is_valid()) |
| 1064 | + self.data["licensing"] = "royalty-free" |
| 1065 | + self.assertTrue(HolderIprDisclosureForm(data=self.data).is_valid()) |
| 1066 | + |
| 1067 | + def test_patent_details_required_unless_blanket(self): |
| 1068 | + self.assertTrue(HolderIprDisclosureForm(data=self.data).is_valid()) |
| 1069 | + patent_fields = ["patent_number", "patent_inventor", "patent_title", "patent_date"] |
| 1070 | + # any of the fields being missing should invalidate the form |
| 1071 | + for pf in patent_fields: |
| 1072 | + val = self.data.pop(pf) |
| 1073 | + self.assertFalse(HolderIprDisclosureForm(data=self.data).is_valid()) |
| 1074 | + self.data[pf] = val |
| 1075 | + |
| 1076 | + # should be optional if is_blanket_disclosure is True |
| 1077 | + self.data["is_blanket_disclosure"] = "on" |
| 1078 | + self.data["licensing"] = "royalty-free" # also needed for a blanket disclosure |
| 1079 | + for pf in patent_fields: |
| 1080 | + val = self.data.pop(pf) |
| 1081 | + self.assertTrue(HolderIprDisclosureForm(data=self.data).is_valid()) |
| 1082 | + self.data[pf] = val |
0 commit comments