datatracker/ietf/ipr/tests.py
Henrik Levkowetz aa5e61d958 Updated all urlpatterns to use ietf.utils.urls.url() instead of django's,
in order to autogenerate dotted path url pattern names.  Updated a number
of url reverses to use dotted path, and removed explicit url pattern names
as needed.

Changed some imports to prevent import of ietf.urls before django
initialization was complete.


Changed 3 cases of form classes being curried to functions; django 1.10
didn't accept that.

Started converting old-style middleware classes to new-style middleware
functions (incomplete).

Tweaked a nomcom decorator to preserve function names and attributes, like
a good decorator should.

Replaced the removed django templatetag 'removetags' with our own version
which uses bleach, and does sanitizing in addition to removing explicitly
mentionied html tags.

Rewrote the filename argument handling in a management command which had
broken with the upgrade.
 - Legacy-Id: 12818
2017-02-11 14:43:01 +00:00

597 lines
25 KiB
Python

import datetime
import urllib
from pyquery import PyQuery
from django.core.urlresolvers import reverse as urlreverse
import debug # pyflakes:ignore
from ietf.doc.models import DocAlias
from ietf.ipr.mail import (process_response_email, get_reply_to, get_update_submitter_emails,
get_pseudo_submitter, get_holders, get_update_cc_addrs)
from ietf.ipr.models import (IprDisclosureBase,GenericIprDisclosure,HolderIprDisclosure,
ThirdPartyIprDisclosure,RelatedIpr)
from ietf.ipr.utils import get_genitive, get_ipr_summary
from ietf.message.models import Message
from ietf.utils.test_utils import TestCase, login_testing_unauthorized, unicontent
from ietf.utils.test_data import make_test_data
from ietf.utils.mail import outbox, empty_outbox
from ietf.mailtrigger.utils import gather_address_lists
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'")
def test_get_holders(self):
make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
update = HolderIprDisclosure.objects.create(
by_id=1,
title="Statement regarding rights Update",
holder_legal_name="Native Martians United",
state_id='pending',
patent_info='US12345',
holder_contact_name='Update Holder',
holder_contact_email='update_holder@acme.com',
licensing_id='royalty-free',
submitter_name='George',
submitter_email='george@acme.com',
)
RelatedIpr.objects.create(target=ipr,source=update,relationship_id='updates')
result = get_holders(update)
self.assertEqual(result,['update_holder@acme.com','george@acme.com'])
def test_get_ipr_summary(self):
make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
self.assertEqual(get_ipr_summary(ipr),'draft-ietf-mars-test')
def test_get_pseudo_submitter(self):
make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights').get_child()
self.assertEqual(get_pseudo_submitter(ipr),(ipr.submitter_name,ipr.submitter_email))
ipr.submitter_name=''
ipr.submitter_email=''
self.assertEqual(get_pseudo_submitter(ipr),(ipr.holder_contact_name,ipr.holder_contact_email))
ipr.holder_contact_name=''
ipr.holder_contact_email=''
self.assertEqual(get_pseudo_submitter(ipr),('UNKNOWN NAME - NEED ASSISTANCE HERE','UNKNOWN EMAIL - NEED ASSISTANCE HERE'))
def test_get_update_cc_addrs(self):
make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
update = HolderIprDisclosure.objects.create(
by_id=1,
title="Statement regarding rights Update",
holder_legal_name="Native Martians United",
state_id='pending',
patent_info='US12345',
holder_contact_name='Update Holder',
holder_contact_email='update_holder@acme.com',
licensing_id='royalty-free',
submitter_name='George',
submitter_email='george@acme.com',
)
RelatedIpr.objects.create(target=ipr,source=update,relationship_id='updates')
result = get_update_cc_addrs(update)
self.assertEqual(result,'update_holder@acme.com,george@acme.com')
def test_get_update_submitter_emails(self):
make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights').get_child()
update = HolderIprDisclosure.objects.create(
by_id=1,
title="Statement regarding rights Update",
holder_legal_name="Native Martians United",
state_id='pending',
patent_info='US12345',
holder_contact_name='George',
holder_contact_email='george@acme.com',
licensing_id='royalty-free',
submitter_name='George',
submitter_email='george@acme.com',
)
RelatedIpr.objects.create(target=ipr,source=update,relationship_id='updates')
messages = get_update_submitter_emails(update)
self.assertEqual(len(messages),1)
self.assertTrue(messages[0].startswith('To: george@acme.com'))
def test_showlist(self):
make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
r = self.client.get(urlreverse("ietf.ipr.views.showlist"))
self.assertEqual(r.status_code, 200)
self.assertTrue(ipr.title in unicontent(r))
def test_show_posted(self):
make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
r = self.client.get(urlreverse("ietf.ipr.views.show", kwargs=dict(id=ipr.pk)))
self.assertEqual(r.status_code, 200)
self.assertTrue(ipr.title in unicontent(r))
def test_show_parked(self):
make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
ipr.set_state('parked')
r = self.client.get(urlreverse("ietf.ipr.views.show", kwargs=dict(id=ipr.pk)))
self.assertEqual(r.status_code, 404)
def test_show_pending(self):
make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
ipr.set_state('pending')
r = self.client.get(urlreverse("ietf.ipr.views.show", kwargs=dict(id=ipr.pk)))
self.assertEqual(r.status_code, 404)
def test_show_rejected(self):
make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
ipr.set_state('rejected')
r = self.client.get(urlreverse("ietf.ipr.views.show", kwargs=dict(id=ipr.pk)))
self.assertEqual(r.status_code, 404)
def test_show_removed(self):
make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
ipr.set_state('removed')
r = self.client.get(urlreverse("ietf.ipr.views.show", kwargs=dict(id=ipr.pk)))
self.assertEqual(r.status_code, 200)
self.assertTrue('This IPR disclosure was removed' in unicontent(r))
def test_iprs_for_drafts(self):
draft = make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
r = self.client.get(urlreverse("ietf.ipr.views.by_draft_txt"))
self.assertEqual(r.status_code, 200)
self.assertTrue(draft.name in unicontent(r))
self.assertTrue(str(ipr.pk) in unicontent(r))
def test_iprs_for_drafts_recursive(self):
draft = make_test_data()
replaced = draft.all_related_that_doc(['replaces'])
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
r = self.client.get(urlreverse("ietf.ipr.views.by_draft_recursive_txt"))
self.assertEqual(r.status_code, 200)
self.assertTrue(draft.name in unicontent(r))
for alias in replaced:
self.assertTrue(alias.name in unicontent(r))
self.assertTrue(str(ipr.pk) in unicontent(r))
def test_about(self):
r = self.client.get(urlreverse("ietf.ipr.views.about"))
self.assertEqual(r.status_code, 200)
self.assertTrue("File a disclosure" in unicontent(r))
def test_search(self):
draft = make_test_data()
ipr = IprDisclosureBase.objects.get(title="Statement regarding rights").get_child()
url = urlreverse("ietf.ipr.views.search")
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
q = PyQuery(r.content)
self.assertTrue(q("form input[name=draft]"))
# find by id
r = self.client.get(url + "?submit=draft&id=%s" % draft.name)
self.assertEqual(r.status_code, 200)
self.assertTrue(ipr.title in unicontent(r))
# find draft
r = self.client.get(url + "?submit=draft&draft=%s" % draft.name)
self.assertEqual(r.status_code, 200)
self.assertTrue(ipr.title in unicontent(r))
# search + select document
r = self.client.get(url + "?submit=draft&draft=draft")
self.assertEqual(r.status_code, 200)
self.assertTrue(draft.name in unicontent(r))
self.assertTrue(ipr.title not in unicontent(r))
DocAlias.objects.create(name="rfc321", document=draft)
# find RFC
r = self.client.get(url + "?submit=rfc&rfc=321")
self.assertEqual(r.status_code, 200)
self.assertTrue(ipr.title in unicontent(r))
# find by patent owner
r = self.client.get(url + "?submit=holder&holder=%s" % ipr.holder_legal_name)
self.assertEqual(r.status_code, 200)
self.assertTrue(ipr.title in unicontent(r))
# find by patent info
r = self.client.get(url + "?submit=patent&patent=%s" % ipr.patent_info)
self.assertEqual(r.status_code, 200)
self.assertTrue(ipr.title in unicontent(r))
r = self.client.get(url + "?submit=patent&patent=US12345")
self.assertEqual(r.status_code, 200)
self.assertTrue(ipr.title in unicontent(r))
# find by group acronym
r = self.client.get(url + "?submit=group&group=%s" % draft.group.pk)
self.assertEqual(r.status_code, 200)
self.assertTrue(ipr.title in unicontent(r))
# find by doc title
r = self.client.get(url + "?submit=doctitle&doctitle=%s" % urllib.quote(draft.title))
self.assertEqual(r.status_code, 200)
self.assertTrue(ipr.title in unicontent(r))
# find by ipr title
r = self.client.get(url + "?submit=iprtitle&iprtitle=%s" % urllib.quote(ipr.title))
self.assertEqual(r.status_code, 200)
self.assertTrue(ipr.title in unicontent(r))
def test_feed(self):
make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
r = self.client.get("/feed/ipr/")
self.assertEqual(r.status_code, 200)
self.assertTrue(ipr.title in unicontent(r))
def test_sitemap(self):
make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
r = self.client.get("/sitemap-ipr.xml")
self.assertEqual(r.status_code, 200)
self.assertTrue("/ipr/%s/" % ipr.pk in unicontent(r))
def test_new_generic(self):
"""Add a new generic disclosure. Note: submitter does not need to be logged in.
"""
make_test_data()
url = urlreverse("ietf.ipr.views.new", kwargs={ "type": "generic" })
# invalid post
r = self.client.post(url, {
"holder_legal_name": "Test Legal",
})
self.assertEqual(r.status_code, 200)
q = PyQuery(r.content)
self.assertTrue(len(q("form .has-error")) > 0)
# successful post
empty_outbox()
r = self.client.post(url, {
"holder_legal_name": "Test Legal",
"holder_contact_name": "Test Holder",
"holder_contact_email": "test@holder.com",
"holder_contact_info": "555-555-0100",
"submitter_name": "Test Holder",
"submitter_email": "test@holder.com",
"notes": "some notes"
})
self.assertEqual(r.status_code, 200)
self.assertTrue("Your IPR disclosure has been submitted" in unicontent(r))
self.assertEqual(len(outbox),1)
self.assertTrue('New IPR Submission' in outbox[0]['Subject'])
self.assertTrue('ietf-ipr@' in outbox[0]['To'])
iprs = IprDisclosureBase.objects.filter(title__icontains="General License Statement")
self.assertEqual(len(iprs), 1)
ipr = iprs[0]
self.assertEqual(ipr.holder_legal_name, "Test Legal")
self.assertEqual(ipr.state.slug, 'pending')
self.assertTrue(isinstance(ipr.get_child(),GenericIprDisclosure))
def test_new_specific(self):
"""Add a new specific disclosure. Note: submitter does not need to be logged in.
"""
draft = make_test_data()
url = urlreverse("ietf.ipr.views.new", kwargs={ "type": "specific" })
# successful post
empty_outbox()
r = self.client.post(url, {
"holder_legal_name": "Test Legal",
"holder_contact_name": "Test Holder",
"holder_contact_email": "test@holder.com",
"holder_contact_info": "555-555-0100",
"ietfer_name": "Test Participant",
"ietfer_contact_info": "555-555-0101",
"iprdocrel_set-TOTAL_FORMS": 2,
"iprdocrel_set-INITIAL_FORMS": 0,
"iprdocrel_set-0-document": "%s" % draft.docalias_set.first().pk,
"iprdocrel_set-0-revisions": '00',
"iprdocrel_set-1-document": DocAlias.objects.filter(name__startswith="rfc").first().pk,
"patent_info": "none",
"has_patent_pending": False,
"licensing": "royalty-free",
"submitter_name": "Test Holder",
"submitter_email": "test@holder.com",
})
self.assertEqual(r.status_code, 200)
# print r.content
self.assertTrue("Your IPR disclosure has been submitted" in unicontent(r))
iprs = IprDisclosureBase.objects.filter(title__icontains=draft.name)
self.assertEqual(len(iprs), 1)
ipr = iprs[0]
self.assertEqual(ipr.holder_legal_name, "Test Legal")
self.assertEqual(ipr.state.slug, 'pending')
self.assertTrue(isinstance(ipr.get_child(),HolderIprDisclosure))
self.assertEqual(len(outbox),1)
self.assertTrue('New IPR Submission' in outbox[0]['Subject'])
self.assertTrue('ietf-ipr@' in outbox[0]['To'])
def test_new_thirdparty(self):
"""Add a new third-party disclosure. Note: submitter does not need to be logged in.
"""
draft = make_test_data()
url = urlreverse("ietf.ipr.views.new", kwargs={ "type": "third-party" })
# successful post
empty_outbox()
r = self.client.post(url, {
"holder_legal_name": "Test Legal",
"ietfer_name": "Test Participant",
"ietfer_contact_email": "test@ietfer.com",
"ietfer_contact_info": "555-555-0101",
"iprdocrel_set-TOTAL_FORMS": 2,
"iprdocrel_set-INITIAL_FORMS": 0,
"iprdocrel_set-0-document": "%s" % draft.docalias_set.first().pk,
"iprdocrel_set-0-revisions": '00',
"iprdocrel_set-1-document": DocAlias.objects.filter(name__startswith="rfc").first().pk,
"patent_info": "none",
"has_patent_pending": False,
"licensing": "royalty-free",
"submitter_name": "Test Holder",
"submitter_email": "test@holder.com",
})
self.assertEqual(r.status_code, 200)
self.assertTrue("Your IPR disclosure has been submitted" in unicontent(r))
iprs = IprDisclosureBase.objects.filter(title__icontains="belonging to Test Legal")
self.assertEqual(len(iprs), 1)
ipr = iprs[0]
self.assertEqual(ipr.holder_legal_name, "Test Legal")
self.assertEqual(ipr.state.slug, "pending")
self.assertTrue(isinstance(ipr.get_child(),ThirdPartyIprDisclosure))
self.assertEqual(len(outbox),1)
self.assertTrue('New IPR Submission' in outbox[0]['Subject'])
self.assertTrue('ietf-ipr@' in outbox[0]['To'])
def test_update(self):
draft = make_test_data()
original_ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
url = urlreverse("ietf.ipr.views.new", kwargs={ "type": "specific" })
# successful post
empty_outbox()
r = self.client.post(url, {
"updates": str(original_ipr.pk),
"holder_legal_name": "Test Legal",
"holder_contact_name": "Test Holder",
"holder_contact_email": "test@holder.com",
"holder_contact_info": "555-555-0100",
"ietfer_name": "Test Participant",
"ietfer_contact_info": "555-555-0101",
"iprdocrel_set-TOTAL_FORMS": 2,
"iprdocrel_set-INITIAL_FORMS": 0,
"iprdocrel_set-0-document": "%s" % draft.docalias_set.first().pk,
"iprdocrel_set-0-revisions": '00',
"iprdocrel_set-1-document": DocAlias.objects.filter(name__startswith="rfc").first().pk,
"patent_info": "none",
"has_patent_pending": False,
"licensing": "royalty-free",
"submitter_name": "Test Holder",
"submitter_email": "test@holder.com",
})
self.assertEqual(r.status_code, 200)
self.assertTrue("Your IPR disclosure has been submitted" in unicontent(r))
iprs = IprDisclosureBase.objects.filter(title__icontains=draft.name)
self.assertEqual(len(iprs), 1)
ipr = iprs[0]
self.assertEqual(ipr.holder_legal_name, "Test Legal")
self.assertEqual(ipr.state.slug, 'pending')
self.assertTrue(ipr.relatedipr_source_set.filter(target=original_ipr))
self.assertEqual(len(outbox),1)
self.assertTrue('New IPR Submission' in outbox[0]['Subject'])
self.assertTrue('ietf-ipr@' in outbox[0]['To'])
def test_update_bad_post(self):
draft = make_test_data()
url = urlreverse("ietf.ipr.views.new", kwargs={ "type": "specific" })
# successful post
empty_outbox()
r = self.client.post(url, {
"updates": "this is supposed to be an integer",
"holder_legal_name": "Test Legal",
"holder_contact_name": "Test Holder",
"holder_contact_email": "test@holder.com",
"iprdocrel_set-TOTAL_FORMS": 1,
"iprdocrel_set-INITIAL_FORMS": 0,
"iprdocrel_set-0-document": "%s" % draft.docalias_set.first().pk,
"iprdocrel_set-0-revisions": '00',
"patent_info": "none",
"has_patent_pending": False,
"licensing": "royalty-free",
"submitter_name": "Test Holder",
"submitter_email": "test@holder.com",
})
self.assertEqual(r.status_code, 200)
q = PyQuery(r.content)
self.assertTrue(q("#id_updates").parents(".form-group").hasClass("has-error"))
def test_addcomment(self):
make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
url = urlreverse("ipr_add_comment", kwargs={ "id": ipr.id })
self.client.login(username="secretary", password="secretary+password")
r = self.client.get(url)
self.assertEqual(r.status_code,200)
# public comment
comment = 'Test comment'
r = self.client.post(url, dict(comment=comment))
self.assertEqual(r.status_code,302)
qs = ipr.iprevent_set.filter(type='comment',desc=comment)
self.assertTrue(qs.count(),1)
# private comment
r = self.client.post(url, dict(comment='Private comment',private=True),follow=True)
self.assertEqual(r.status_code,200)
self.assertTrue('Private comment' in unicontent(r))
self.client.logout()
r = self.client.get(url)
self.assertFalse('Private comment' in unicontent(r))
def test_addemail(self):
make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
url = urlreverse("ipr_add_email", kwargs={ "id": ipr.id })
self.client.login(username="secretary", password="secretary+password")
r = self.client.get(url)
self.assertEqual(r.status_code,200)
# post
r = self.client.post(url, {
"direction": 'incoming',
"message": """From: test@acme.com
To: ietf-ipr@ietf.org
Subject: RE: The Cisco Statement
Date: Wed, 24 Sep 2014 14:25:02 -0700
Hello,
I would like to revoke this declaration.
"""})
msg = Message.objects.get(frm='test@acme.com')
qs = ipr.iprevent_set.filter(type='msgin',message=msg)
self.assertTrue(qs.count(),1)
def test_admin_pending(self):
make_test_data()
url = urlreverse("ipr_admin",kwargs={'state':'pending'})
self.client.login(username="secretary", password="secretary+password")
# test for presence of pending ipr
ipr = IprDisclosureBase.objects.first()
ipr.state_id = 'pending'
ipr.save()
num = IprDisclosureBase.objects.filter(state='pending').count()
r = self.client.get(url)
self.assertEqual(r.status_code,200)
q = PyQuery(r.content)
x = len(q('table.ipr-table tbody tr'))
self.assertEqual(num,x)
def test_admin_removed(self):
make_test_data()
url = urlreverse("ipr_admin",kwargs={'state':'removed'})
self.client.login(username="secretary", password="secretary+password")
# test for presence of pending ipr
ipr = IprDisclosureBase.objects.first()
ipr.state_id = 'removed'
ipr.save()
num = IprDisclosureBase.objects.filter(state__in=('removed','rejected')).count()
r = self.client.get(url)
self.assertEqual(r.status_code,200)
q = PyQuery(r.content)
x = len(q('table.ipr-table tbody tr'))
self.assertEqual(num,x)
def test_admin_parked(self):
pass
def test_post(self):
make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
url = urlreverse("ipr_post", kwargs={ "id": ipr.id })
login_testing_unauthorized(self, "secretary", url)
r = self.client.get(url,follow=True)
self.assertEqual(r.status_code,200)
len_before = len(outbox)
# successful post
self.client.login(username="secretary", password="secretary+password")
r = self.client.get(url,follow=True)
self.assertEqual(r.status_code,200)
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
self.assertEqual(ipr.state.slug,'posted')
url = urlreverse('ipr_notify',kwargs={ 'id':ipr.id, 'type':'posted'})
r = self.client.get(url,follow=True)
q = PyQuery(r.content)
data = dict()
for name in ['form-TOTAL_FORMS','form-INITIAL_FORMS','form-MIN_NUM_FORMS','form-MAX_NUM_FORMS']:
data[name] = q('form input[name=%s]'%name).val()
for i in range(0,int(data['form-TOTAL_FORMS'])):
name = 'form-%d-type' % i
data[name] = q('form input[name=%s]'%name).val()
text_name = 'form-%d-text' % i
data[text_name] = q('form textarea[name=%s]'%text_name).html().strip()
# Do not try to use
#data[text_name] = q('form textarea[name=%s]'%text_name).text()
# .text does not work - the field will likely contain <> characters
r = self.client.post(url, data )
self.assertEqual(r.status_code,302)
self.assertEqual(len(outbox),len_before+2)
self.assertTrue('george@acme.com' in outbox[len_before]['To'])
self.assertTrue('draft-ietf-mars-test@ietf.org' in outbox[len_before+1]['To'])
self.assertTrue('mars-wg@ietf.org' in outbox[len_before+1]['Cc'])
def test_process_response_email(self):
# first send a mail
make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
url = urlreverse("ipr_email",kwargs={ "id": ipr.id })
self.client.login(username="secretary", password="secretary+password")
yesterday = datetime.date.today() - datetime.timedelta(1)
data = dict(
to='joe@test.com',
frm='ietf-ipr@ietf.org',
subject='test',
reply_to=get_reply_to(),
body='Testing.',
response_due=yesterday.isoformat())
empty_outbox()
r = self.client.post(url,data,follow=True)
#print r.content
self.assertEqual(r.status_code,200)
q = Message.objects.filter(reply_to=data['reply_to'])
self.assertEqual(q.count(),1)
event = q[0].msgevents.first()
self.assertTrue(event.response_past_due())
self.assertEqual(len(outbox), 1)
self.assertTrue('joe@test.com' in outbox[0]['To'])
# test process response uninteresting message
addrs = gather_address_lists('ipr_disclosure_submitted').as_strings()
message_string = """To: {}
Cc: {}
From: joe@test.com
Date: {}
Subject: test
""".format(addrs.to, addrs.cc, datetime.datetime.now().ctime())
result = process_response_email(message_string)
self.assertIsNone(result)
# test process response
message_string = """To: {}
From: joe@test.com
Date: {}
Subject: test
""".format(data['reply_to'],datetime.datetime.now().ctime())
result = process_response_email(message_string)
self.assertIsInstance(result,Message)
self.assertFalse(event.response_past_due())