datatracker/ietf/meeting/tests/api.py
Ole Laursen e63ac36b8f Remove shim layer from ietfauth, delete some dead code and migrate
remaining importers of ietfauth.decorators to ietfauth.utils
 - Legacy-Id: 6797
2013-12-05 16:24:03 +00:00

620 lines
24 KiB
Python

import base64
import sys, datetime
from django.test import Client
from ietf.utils import TestCase
from ietf.person.models import Person
from django.contrib.auth.models import User
from ietf.meeting.models import TimeSlot, Session, ScheduledSession, Meeting
from ietf.ietfauth.utils import has_role
from auths import auth_joeblow, auth_wlo, auth_ietfchair, auth_ferrel
from django.utils import simplejson as json
from ietf.meeting.helpers import get_meeting
import debug
class ApiTestCase(TestCase):
# See ietf.utils.test_utils.TestCase for the use of perma_fixtures vs. fixtures
perma_fixtures = [
'meeting83.json',
'constraint83.json',
'workinggroups.json',
'groupgroup.json',
'person.json', 'users.json' ]
def test_noAuthenticationUpdateAgendaItem(self):
ts_one = TimeSlot.objects.get(pk=2371)
ts_two = TimeSlot.objects.get(pk=2372)
ss_one = ScheduledSession.objects.get(pk=2371)
# confirm that it has old timeslot value
self.assertEqual(ss_one.timeslot, ts_one)
# move this session from one timeslot to another.
self.client.post('/dajaxice/ietf.meeting.update_timeslot/', {
'argv': '{"schedule_id":"%u", "session_id":"%u", "scheduledsession_id":"2372"}' % (ss_one.schedule.id,ts_one.id)
})
# confirm that without login, it does not have new value
ss_one = ScheduledSession.objects.get(pk=2371)
self.assertEqual(ss_one.timeslot, ts_one)
def test_noAuthorizationUpdateAgendaItem(self):
ts_one = TimeSlot.objects.get(pk=2371)
ts_two = TimeSlot.objects.get(pk=2372)
ss_one = ScheduledSession.objects.get(pk=2371)
# confirm that it has old scheduledsession value
self.assertEqual(ss_one.timeslot, ts_one)
# move this session from one scheduledsession to another.
self.client.post('/dajaxice/ietf.meeting.update_timeslot/', {
'argv': '{"schedule_id":"%u", "scheduledsession_id":"%u","session_id":"%u" }' % (ss_one.schedule.id, ts_two.id, ss_one.session.id)
}, **auth_ferrel)
# confirm that without login, it does not have new value
ss_one = ScheduledSession.objects.get(pk=2371)
self.assertEqual(ss_one.timeslot, ts_one)
def test_wrongAuthorizationUpdateAgendaItem(self):
s2157 = Session.objects.get(pk=2157)
ss_one = ScheduledSession.objects.get(pk=2371)
ss_two = ScheduledSession.objects.get(pk=2372)
old_two_s = ss_two.session
# confirm that it has old timeslot value
self.assertEqual(ss_one.session, s2157)
# move this session from one scheduledsession to another.
self.client.post('/dajaxice/ietf.meeting.update_timeslot/', {
'argv': '{"schedule_id":"%u", "scheduledsession_id":"%u", "session_id":"%u"}' % (ss_one.schedule.id, ss_two.id, s2157.id)
}, **auth_joeblow)
# confirm that without login, it does not have new value
ss_one = ScheduledSession.objects.get(pk=2371)
self.assertEqual(ss_one.session, s2157)
# confirm that the new scheduledsession has not changed.
ss_two = ScheduledSession.objects.get(pk=2372)
self.assertEqual(ss_two.session, old_two_s)
def test_wloUpdateAgendaItem(self):
s2157 = Session.objects.get(pk=2157)
ss_one = ScheduledSession.objects.get(pk=2371)
# confirm that it has old session value
self.assertEqual(ss_one.session, s2157)
ss_two = ScheduledSession.objects.get(pk=2372)
self.assertNotEqual(ss_two.session, s2157)
# move this session from one timeslot to another.
self.client.post('/dajaxice/ietf.meeting.update_timeslot/', {
'argv': '{"schedule_id":"%u", "scheduledsession_id":"%u", "session_id":"%u"}' % (ss_one.schedule.id, ss_two.id, s2157.id)
}, **auth_wlo)
# confirm that it new scheduledsession object has new session.
ss_two = ScheduledSession.objects.get(pk=2372)
self.assertEqual(ss_two.session, s2157)
# confirm that it old scheduledsession object has no session.
ss_one = ScheduledSession.objects.get(pk=2371)
self.assertEqual(ss_one.session, None)
def test_wloUpdateAgendaItemToUnscheduled(self):
s2157 = Session.objects.get(pk=2157)
ss_one = ScheduledSession.objects.get(pk=2371)
# confirm that it has old scheduledsession value
self.assertEqual(ss_one.session, s2157)
# move this session from one timeslot to another.
self.client.post('/dajaxice/ietf.meeting.update_timeslot/', {
'argv': '{"schedule_id":"%u", "session_id":"%u", "scheduledsession_id":"0"}' % (ss_one.schedule.id,s2157.id)
}, **auth_wlo)
# confirm that it old scheduledsession object now has no session.
ss_one = ScheduledSession.objects.get(pk=2371)
self.assertEqual(ss_one.session, None)
def test_wloUpdateAgendaItemToNone(self):
s2157 = Session.objects.get(pk=2157)
ss_one = ScheduledSession.objects.get(pk=2371)
# confirm that it has old timeslot value
self.assertEqual(ss_one.session, s2157)
# move this session from one timeslot to another.
self.client.post('/dajaxice/ietf.meeting.update_timeslot/', {
'argv': '{"schedule_id":"%u", "session_id":"%u"}' % (ss_one.schedule.id,s2157.id)
}, **auth_wlo)
# confirm that it old scheduledsession object has no session.
ss_one = ScheduledSession.objects.get(pk=2371)
self.assertEqual(ss_one.session, None)
def test_chairUpdateAgendaItemFails(self):
s2157 = Session.objects.get(pk=2157)
ss_one = ScheduledSession.objects.get(pk=2371)
# confirm that it has old timeslot value
self.assertEqual(ss_one.session, s2157)
# confirm that the slot was none empty.
ss_two_saved = ScheduledSession.objects.get(pk=2372)
# move this session from one timeslot to another.
self.client.post('/dajaxice/ietf.meeting.update_timeslot/', {
'argv': '{"schedule_id":"%u", "session_id":"%u", "scheduledsession_id":"%u"}' % (ss_one.schedule.id,s2157.id, ss_two_saved.id)
}, **auth_ietfchair)
# confirm that it new scheduledsession object has no new session.
ss_two = ScheduledSession.objects.get(pk=2372)
self.assertEqual(ss_two, ss_two_saved)
# confirm that it old scheduledsession object still has old session.
ss_one = ScheduledSession.objects.get(pk=2371)
self.assertEqual(ss_one.session, s2157)
def test_anyoneGetConflictInfo(self):
s2157 = Session.objects.get(pk=2157)
# confirm that a constraint json is generated properly
resp = self.client.get('/meeting/83/session/2157/constraints.json')
conflicts = json.loads(resp.content)
self.assertNotEqual(conflicts, None)
def test_conflictInfoIncludesPeople(self):
mtg83 = get_meeting(83)
clue83 = mtg83.session_set.filter(group__acronym='clue')[0]
# retrive some json that shows the conflict for this session.
resp = self.client.get("/meeting/83/session/%u/constraints.json" % (clue83.pk))
conflicts = json.loads(resp.content)
self.assertNotEqual(conflicts, None)
self.assertEqual(len(conflicts), 39)
def test_getMeetingInfoJson(self):
resp = self.client.get('/meeting/83.json')
mtginfo = json.loads(resp.content)
self.assertNotEqual(mtginfo, None)
def test_getRoomJson(self):
mtg83 = get_meeting(83)
rm243 = mtg83.room_set.get(name = '243')
resp = self.client.get('/meeting/83/room/%s.json' % rm243.pk)
rm243json = json.loads(resp.content)
self.assertNotEqual(rm243json, None)
def test_createNewRoomNonSecretariat(self):
mtg83 = get_meeting(83)
rm221 = mtg83.room_set.filter(name = '221')
self.assertEqual(len(rm221), 0)
# try to create a new room.
self.client.post('/meeting/83/rooms', {
'name' : '221',
'capacity': 50,
}, **auth_joeblow)
# see that in fact the room was not created
rm221 = mtg83.room_set.filter(name = '221')
self.assertEqual(len(rm221), 0)
def test_createNewRoomSecretariat(self):
mtg83 = get_meeting(83)
rm221 = mtg83.room_set.filter(name = '221')
self.assertEqual(len(rm221), 0)
timeslots = mtg83.timeslot_set.all()
timeslot_initial_len = len(timeslots)
self.assertTrue(timeslot_initial_len>0)
extra_headers = auth_wlo
extra_headers['HTTP_ACCEPT']='text/json'
# try to create a new room
self.client.post('/meeting/83/rooms', {
'name' : '221',
'capacity': 50,
}, **extra_headers)
# see that in fact wlo can create a new room.
rm221 = mtg83.room_set.filter(name = '221')
self.assertEqual(len(rm221), 1)
timeslots = mtg83.timeslot_set.all()
timeslot_final_len = len(timeslots)
self.assertEqual((timeslot_final_len - timeslot_initial_len), 26)
def test_deleteNewRoomSecretariat(self):
mtg83 = get_meeting(83)
rm243 = mtg83.room_set.get(name = '243')
slotcount = len(rm243.timeslot_set.all())
self.assertNotEqual(rm243, None)
timeslots = mtg83.timeslot_set.all()
timeslot_initial_len = len(timeslots)
self.assertTrue(timeslot_initial_len>0)
# try to delete a new room
self.client.delete('/meeting/83/room/%s.json' % (rm243.pk), **auth_wlo)
# see that in fact wlo can delete an existing room.
rm243 = mtg83.room_set.filter(name = '243')
self.assertEqual(len(rm243), 0)
timeslots = mtg83.timeslot_set.all()
timeslot_final_len = len(timeslots)
self.assertEqual((timeslot_final_len-timeslot_initial_len), -slotcount)
def test_getGroupInfoJson(self):
resp = self.client.get('/group/pkix.json')
#print "json: %s" % (resp.content)
mtginfo = json.loads(resp.content)
self.assertNotEqual(mtginfo, None)
def test_getPersonInfoJson(self):
# 491 is Adrian Ferrel, an AD
af = User.objects.filter(pk = 491)[0]
person = af.person
resp = self.client.get('/person/%u.json' % (person.pk))
#print "json: %s" % (resp.content)
pinfo = json.loads(resp.content)
self.assertNotEqual(pinfo, None)
def test_getSlotJson(self):
mtg83 = get_meeting(83)
slot0 = mtg83.timeslot_set.all()[0]
resp = self.client.get('/meeting/83/timeslot/%s.json' % slot0.pk)
slot0json = json.loads(resp.content)
self.assertNotEqual(slot0json, None)
def test_createNewSlotNonSecretariat(self):
mtg83 = get_meeting(83)
slot23 = mtg83.timeslot_set.filter(time=datetime.date(year=2012,month=3,day=23))
self.assertEqual(len(slot23), 0)
# try to create a new room.
resp = self.client.post('/meeting/83/timeslots', {
'type' : 'plenary',
'name' : 'Workshop on Smart Object Security',
'time' : '2012-03-23',
'duration_days' : 0,
'duration_hours': 8,
'duration_minutes' : 0,
'duration_seconds' : 0,
}, **auth_joeblow)
self.assertEqual(resp.status_code, 403)
# see that in fact the room was not created
slot23 = mtg83.timeslot_set.filter(time=datetime.date(year=2012,month=3,day=23))
self.assertEqual(len(slot23), 0)
def test_createNewSlotSecretariat(self):
mtg83 = get_meeting(83)
slot23 = mtg83.timeslot_set.filter(time=datetime.date(year=2012,month=3,day=23))
self.assertEqual(len(slot23), 0)
extra_headers = auth_wlo
extra_headers['HTTP_ACCEPT']='text/json'
# try to create a new room.
resp = self.client.post('/meeting/83/timeslots', {
'type' : 'plenary',
'name' : 'Workshop on Smart Object Security',
'time' : '2012-03-23',
'duration': '08:00:00',
}, **extra_headers)
self.assertEqual(resp.status_code, 302)
# see that in fact wlo can create a new timeslot
mtg83 = get_meeting(83)
slot23 = mtg83.timeslot_set.filter(time=datetime.date(year=2012,month=3,day=23))
self.assertEqual(len(slot23), 11)
def test_deleteNewSlotSecretariat(self):
mtg83 = get_meeting(83)
slot0 = mtg83.timeslot_set.all()[0]
# try to delete a new room
self.client.delete('/meeting/83/timeslot/%s.json' % (slot0.pk), **auth_wlo)
# see that in fact wlo can delete an existing room.
slot0n = mtg83.timeslot_set.filter(pk = slot0.pk)
self.assertEqual(len(slot0n), 0)
#
# AGENDA API
#
def test_getAgendaJson(self):
mtg83 = get_meeting(83)
a83 = mtg83.agenda
resp = self.client.get('/meeting/83/agendas/%s.json' % a83.name)
a83json = json.loads(resp.content)
self.assertNotEqual(a83json, None)
def test_createNewAgendaNonSecretariat(self):
mtg83 = get_meeting(83)
# try to create a new agenda
resp = self.client.post('/meeting/83/agendas', {
'type' : 'plenary',
'name' : 'Workshop on Smart Object Security',
'time' : '2012-03-23',
'duration_days' : 0,
'duration_hours': 8,
'duration_minutes' : 0,
'duration_seconds' : 0,
}, **auth_joeblow)
self.assertEqual(resp.status_code, 403)
# see that in fact the room was not created
slot23 = mtg83.timeslot_set.filter(time=datetime.date(year=2012,month=3,day=23))
self.assertEqual(len(slot23), 0)
def test_createNewAgendaSecretariat(self):
mtg83 = get_meeting(83)
a83 = mtg83.agenda
extra_headers = auth_wlo
extra_headers['HTTP_ACCEPT']='text/json'
# try to create a new agenda
resp = self.client.post('/meeting/83/agendas', {
'name' : 'fakeagenda1',
}, **extra_headers)
self.assertEqual(resp.status_code, 302)
# see that in fact wlo can create a new timeslot
mtg83 = get_meeting(83)
n83 = mtg83.schedule_set.filter(name='fakeagenda1')
self.assertNotEqual(n83, None)
def test_updateAgendaSecretariat(self):
mtg83 = get_meeting(83)
a83 = mtg83.agenda
self.assertTrue(a83.visible)
extra_headers = auth_wlo
extra_headers['HTTP_ACCEPT']='application/json'
# try to create a new agenda
resp = self.client.put('/meeting/83/agendas/%s.json' % (a83.name),
data='visible=0',
content_type="application/x-www-form-urlencoded",
**extra_headers)
self.assertEqual(resp.status_code, 200)
# see that in fact wlo can create a new timeslot
mtg83 = get_meeting(83)
a83 = mtg83.agenda
self.assertFalse(a83.visible)
def test_deleteAgendaSecretariat(self):
mtg83 = get_meeting(83)
a83 = mtg83.agenda
self.assertNotEqual(a83, None)
# try to delete an agenda
resp = self.client.delete('/meeting/83/agendas/%s.json' % (a83.name), **auth_wlo)
self.assertEqual(resp.status_code, 200)
# see that in fact wlo can delete an existing room.
mtg83 = get_meeting(83)
a83c = mtg83.schedule_set.filter(pk = a83.pk).count()
self.assertEqual(a83c, 0)
self.assertEqual(mtg83.agenda, None)
#
# MEETING API
#
def test_getMeetingJson(self):
resp = self.client.get('/meeting/83.json')
m83json = json.loads(resp.content)
self.assertNotEqual(m83json, None)
def test_setMeetingAgendaNonSecretariat(self):
mtg83 = get_meeting(83)
self.assertNotEqual(mtg83.agenda, None)
# try to create a new agenda
resp = self.client.put('/meeting/83.json',
data="agenda=None",
content_type="application/x-www-form-urlencoded",
**auth_joeblow)
self.assertEqual(resp.status_code, 403)
self.assertNotEqual(mtg83.agenda, None)
def test_setMeetingAgendaNoneSecretariat(self):
mtg83 = get_meeting(83)
self.assertNotEqual(mtg83.agenda, None)
extra_headers = auth_wlo
extra_headers['HTTP_ACCEPT']='application/json'
# try to create a new agenda
resp = self.client.post('/meeting/83.json',
data="agenda=None",
content_type="application/x-www-form-urlencoded",
**extra_headers)
self.assertEqual(resp.status_code, 200)
# new to reload the object
mtg83 = get_meeting(83)
self.assertEqual(mtg83.agenda, None)
def test_setMeetingAgendaSecretariatPublic(self):
mtg83 = get_meeting(83)
new_sched = mtg83.schedule_set.create(name="funny",
meeting=mtg83,
public=True,
owner=mtg83.agenda.owner)
self.assertNotEqual(mtg83.agenda, new_sched)
extra_headers = auth_wlo
extra_headers['HTTP_ACCEPT']='text/json'
# try to create a new agenda
resp = self.client.put('/meeting/83.json',
data="agenda=%s" % new_sched.name,
content_type="application/x-www-form-urlencoded",
**extra_headers)
self.assertEqual(resp.status_code, 200)
# new to reload the object
mtg83 = get_meeting(83)
self.assertEqual(mtg83.agenda, new_sched)
def test_setNonPublicMeetingAgendaSecretariat(self):
mtg83 = get_meeting(83)
new_sched = mtg83.schedule_set.create(name="funny",
meeting=mtg83,
public=False,
owner=mtg83.agenda.owner)
self.assertNotEqual(mtg83.agenda, new_sched)
extra_headers = auth_wlo
extra_headers['HTTP_ACCEPT']='text/json'
# try to create a new agenda
resp = self.client.put('/meeting/83.json',
data="agenda=%s" % new_sched.name,
content_type="application/x-www-form-urlencoded",
**extra_headers)
self.assertEqual(resp.status_code, 406)
# new to reload the object
mtg83 = get_meeting(83)
self.assertNotEqual(mtg83.agenda, new_sched)
def test_wlo_isSecretariatCanEditSched24(self):
extra_headers = auth_wlo
extra_headers['HTTP_ACCEPT']='text/json'
# check that wlo
resp = self.client.post('/dajaxice/ietf.meeting.readonly/', {
'argv': '{"meeting_num":"83","schedule_id":"24"}'
}, **extra_headers)
m83perm = json.loads(resp.content)
self.assertEqual(m83perm['secretariat'], True)
self.assertEqual(m83perm['owner_href'], "http://testserver/person/108757.json")
self.assertEqual(m83perm['read_only'], False)
self.assertEqual(m83perm['write_perm'], True)
def test_joeblow_isNonUserCanNotSave(self):
extra_headers = auth_joeblow
extra_headers['HTTP_ACCEPT']='text/json'
# check that wlo
resp = self.client.post('/dajaxice/ietf.meeting.readonly/', {
'argv': '{"meeting_num":"83","schedule_id":"24"}'
}, **extra_headers)
m83perm = json.loads(resp.content)
self.assertEqual(m83perm['secretariat'], False)
self.assertEqual(m83perm['owner_href'], "http://testserver/person/108757.json")
self.assertEqual(m83perm['read_only'], True)
self.assertEqual(m83perm['write_perm'], False)
def test_af_IsReadOnlySched24(self):
"""
This test case validates that despite being an AD, and having a login, a schedule
that does not belong to him will be marked as readonly.
"""
extra_headers = auth_ferrel
extra_headers['HTTP_ACCEPT']='text/json'
resp = self.client.post('/dajaxice/ietf.meeting.readonly/', {
'argv': '{"meeting_num":"83","schedule_id":"24"}'
}, **extra_headers)
m83perm = json.loads(resp.content)
self.assertEqual(m83perm['secretariat'], False)
self.assertEqual(m83perm['owner_href'], "http://testserver/person/108757.json")
self.assertEqual(m83perm['read_only'], True)
self.assertEqual(m83perm['write_perm'], True)
self.assertEqual(resp.status_code, 200)
def test_wlo_isNonUserCanNotSave(self):
extra_headers = auth_joeblow
extra_headers['HTTP_ACCEPT']='text/json'
# check that wlo
resp = self.client.post('/dajaxice/ietf.meeting.readonly/', {
'argv': '{"meeting_num":"83","schedule_id":"24"}'
}, **extra_headers)
m83perm = json.loads(resp.content)
self.assertEqual(m83perm['secretariat'], False)
self.assertEqual(m83perm['owner_href'], "http://testserver/person/108757.json")
self.assertEqual(m83perm['read_only'], True)
self.assertEqual(m83perm['write_perm'], False)
def test_setMeetingAgendaSecretariat(self):
mtg83 = get_meeting(83)
new_sched = mtg83.schedule_set.create(name="funny",
meeting=mtg83,
owner=mtg83.agenda.owner)
self.assertNotEqual(mtg83.agenda, new_sched)
extra_headers = auth_wlo
extra_headers['HTTP_ACCEPT']='text/json'
# try to create a new agenda
resp = self.client.put('/meeting/83.json',
data="agenda=%s" % new_sched.name,
content_type="application/x-www-form-urlencoded",
**extra_headers)
self.assertEqual(resp.status_code, 200)
# new to reload the object
mtg83 = get_meeting(83)
self.assertEqual(mtg83.agenda, new_sched)
def test_noAuthenticationUpdatePinned(self):
ss_one = ScheduledSession.objects.get(pk=2371)
# confirm that it has old timeslot value
self.assertEqual(ss_one.pinned, False)
# pin this session to this location
self.client.post('/dajaxice/ietf.meeting.update_timeslot_pinned/', {
'argv': '{"schedule_id":"%u", "scheduledsession_id":"%u", "pinned":"%u"}' % (ss_one.schedule.id, ss_one.id, 1)
})
# confirm that without login, it does not have new value
ss_one = ScheduledSession.objects.get(pk=2371)
self.assertEqual(ss_one.pinned, False)
def test_authenticationUpdatePinned(self):
ss_one = ScheduledSession.objects.get(pk=2371)
# confirm that it has old timeslot value
self.assertEqual(ss_one.pinned, False)
extra_headers = auth_wlo
extra_headers['HTTP_ACCEPT']='text/json'
# pin this session to this location
self.client.post('/dajaxice/ietf.meeting.update_timeslot_pinned/', {
'argv': '{"schedule_id":"%u", "scheduledsession_id":"%u", "pinned":"%u"}' % (ss_one.schedule.id, ss_one.id, 1)
}, **extra_headers)
# confirm that without login, it does not have new value
ss_one = ScheduledSession.objects.get(pk=2371)
self.assertEqual(ss_one.pinned, True)