annotate test/rest_common.py @ 7183:2de72f75f2f8

Production PBKDF rounds back to 2M, test 1k; fix empty_form (python2)
author John Rouillard <rouilj@ieee.org>
date Sun, 26 Feb 2023 15:38:49 -0500
parents 6f09103a6522
children 886a5c767d7e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6090
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
1 import pytest
5586
8f2fbc88e155 Fixed code convention
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5585
diff changeset
2 import unittest
8f2fbc88e155 Fixed code convention
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5585
diff changeset
3 import os
8f2fbc88e155 Fixed code convention
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5585
diff changeset
4 import shutil
8f2fbc88e155 Fixed code convention
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5585
diff changeset
5 import errno
5801
ddb553d5618c Add import of cgi since import cgi was removed from exceptions
John Rouillard <rouilj@ieee.org>
parents: 5747
diff changeset
6 import cgi
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
7
5732
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
8 from time import sleep
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
9 from datetime import datetime, timedelta
6361
58817c3bf471 Fix roundup/test
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6350
diff changeset
10 from roundup.test.tx_Source_detector import init as tx_Source_init
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
11
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
12 try:
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
13 from datetime import timezone
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
14 myutc = timezone.utc
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
15 except ImportError:
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
16 # python 2
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
17 from datetime import tzinfo
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
18 ZERO = timedelta(0)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
19 class UTC(tzinfo):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
20 """UTC"""
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
21 def utcoffset(self, dt):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
22 return ZERO
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
23
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
24 def tzname(self, dt):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
25 return "UTC"
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
26
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
27 def dst(self, dt):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
28 return ZERO
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
29
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
30 myutc = UTC()
5732
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
31
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
32 from roundup.cgi.exceptions import *
5706
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
33 from roundup.hyperdb import HyperdbValueError
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
34 from roundup.exceptions import *
5586
8f2fbc88e155 Fixed code convention
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5585
diff changeset
35 from roundup import password, hyperdb
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
36 from roundup.rest import RestfulInstance, calculate_etag
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
37 from roundup.backends import list_backends
5586
8f2fbc88e155 Fixed code convention
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5585
diff changeset
38 from roundup.cgi import client
6185
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
39 from roundup.anypy.strings import b2s, s2b, us2u
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
40 import random
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
41
5733
62bdcb874433 Test code was not testing the loop that retries otk database updates
John Rouillard <rouilj@ieee.org>
parents: 5732
diff changeset
42 from roundup.backends.sessions_dbm import OneTimeKeys
62bdcb874433 Test code was not testing the loop that retries otk database updates
John Rouillard <rouilj@ieee.org>
parents: 5732
diff changeset
43 from roundup.anypy.dbm_ import anydbm, whichdb
62bdcb874433 Test code was not testing the loop that retries otk database updates
John Rouillard <rouilj@ieee.org>
parents: 5732
diff changeset
44
5602
c40d04915e23 Python3 fixes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5601
diff changeset
45 from .db_test_base import setupTracker
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
46
6366
f2c31f5ec50b Move mocknull from test to roundup/test
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6361
diff changeset
47 from roundup.test.mocknull import MockNull
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
48
5653
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
49 from io import BytesIO
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
50 import json
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
51
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
52 from copy import copy
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
53
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
54 try:
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
55 import jwt
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
56 skip_jwt = lambda func, *args, **kwargs: func
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
57 except ImportError:
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
58 from .pytest_patcher import mark_class
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
59 jwt=None
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
60 skip_jwt = mark_class(pytest.mark.skip(
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
61 reason='Skipping JWT tests: jwt library not available'))
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
62
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
63 NEEDS_INSTANCE = 1
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
64
5586
8f2fbc88e155 Fixed code convention
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5585
diff changeset
65
5601
fcbeff272828 Integrate REST tests into db framework
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5600
diff changeset
66 class TestCase():
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
67
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
68 backend = None
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
69 url_pfx = 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/'
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
70
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
71 def setUp(self):
6314
a2fbd3592322 pyjwt 2.00 changed return type of jwt.encode from byte to str
John Rouillard <rouilj@ieee.org>
parents: 6312
diff changeset
72 from packaging import version
a2fbd3592322 pyjwt 2.00 changed return type of jwt.encode from byte to str
John Rouillard <rouilj@ieee.org>
parents: 6312
diff changeset
73
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
74 self.dirname = '_test_rest'
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
75 # set up and open a tracker
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
76 # Set optimize=True as code under test (Client.main()::determine_user)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
77 # will close and re-open the database on user changes. This wipes
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
78 # out additions to the schema needed for testing.
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
79 self.instance = setupTracker(self.dirname, self.backend, optimize=True)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
80
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
81 # open the database
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
82 self.db = self.instance.open('admin')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
83
5733
62bdcb874433 Test code was not testing the loop that retries otk database updates
John Rouillard <rouilj@ieee.org>
parents: 5732
diff changeset
84 # Create the Otk db.
62bdcb874433 Test code was not testing the loop that retries otk database updates
John Rouillard <rouilj@ieee.org>
parents: 5732
diff changeset
85 # This allows a test later on to open the existing db and
62bdcb874433 Test code was not testing the loop that retries otk database updates
John Rouillard <rouilj@ieee.org>
parents: 5732
diff changeset
86 # set a class attribute to test the open retry loop
62bdcb874433 Test code was not testing the loop that retries otk database updates
John Rouillard <rouilj@ieee.org>
parents: 5732
diff changeset
87 # just as though this process was using a pre-existing db
62bdcb874433 Test code was not testing the loop that retries otk database updates
John Rouillard <rouilj@ieee.org>
parents: 5732
diff changeset
88 # rather then the new one we create.
62bdcb874433 Test code was not testing the loop that retries otk database updates
John Rouillard <rouilj@ieee.org>
parents: 5732
diff changeset
89 otk = OneTimeKeys(self.db)
62bdcb874433 Test code was not testing the loop that retries otk database updates
John Rouillard <rouilj@ieee.org>
parents: 5732
diff changeset
90 otk.set('key', key="value")
62bdcb874433 Test code was not testing the loop that retries otk database updates
John Rouillard <rouilj@ieee.org>
parents: 5732
diff changeset
91
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
92 # Get user id (user4 maybe). Used later to get data from db.
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
93 self.joeid = self.db.user.create(
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
94 username='joe',
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
95 password=password.Password('random'),
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
96 address='random@home.org',
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
97 realname='Joe Random',
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
98 roles='User'
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
99 )
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
100
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
101 self.db.user.set('1', address="admin@admin.com")
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
102 self.db.user.set('2', address="anon@admin.com")
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
103 self.db.commit()
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
104 self.db.close()
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
105 self.db = self.instance.open('joe')
5604
ed02a1e0aa5d Fix actions
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5602
diff changeset
106 # Allow joe to retire
ed02a1e0aa5d Fix actions
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5602
diff changeset
107 p = self.db.security.addPermission(name='Retire', klass='issue')
ed02a1e0aa5d Fix actions
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5602
diff changeset
108 self.db.security.addPermissionToRole('User', p)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
109
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
110 # add set of roles for testing jwt's.
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
111 self.db.security.addRole(name="User:email",
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
112 description="allow email by jwt")
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
113 # allow the jwt to access everybody's email addresses.
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
114 # this makes it easier to differentiate between User and
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
115 # User:email roles by accessing the /rest/data/user
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
116 # endpoint
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
117 jwt_perms = self.db.security.addPermission(name='View',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
118 klass='user',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
119 properties=('id', 'realname', 'address', 'username'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
120 description="Allow jwt access to email",
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
121 props_only=False)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
122 self.db.security.addPermissionToRole("User:email", jwt_perms)
5879
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
123 self.db.security.addPermissionToRole("User:email", "Rest Access")
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
124
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
125 # add set of roles for testing jwt's.
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
126 # this is like the user:email role, but it missing access to the rest endpoint.
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
127 self.db.security.addRole(name="User:emailnorest",
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
128 description="allow email by jwt")
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
129 jwt_perms = self.db.security.addPermission(name='View',
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
130 klass='user',
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
131 properties=('id', 'realname', 'address', 'username'),
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
132 description="Allow jwt access to email but forget to allow rest",
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
133 props_only=False)
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
134 self.db.security.addPermissionToRole("User:emailnorest", jwt_perms)
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
135
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
136
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
137 if jwt:
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
138 # must be 32 chars in length minimum (I think this is at least
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
139 # 256 bits of data)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
140
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
141 secret = "TestingTheJwtSecretTestingTheJwtSecret"
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
142 self.db.config['WEB_JWT_SECRET'] = secret
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
143
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
144 # generate all timestamps in UTC.
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
145 base_datetime = datetime(1970,1,1, tzinfo=myutc)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
146
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
147 # A UTC timestamp for now.
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
148 dt = datetime.now(myutc)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
149 now_ts = int((dt - base_datetime).total_seconds())
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
150
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
151 # one good for a minute
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
152 dt = dt + timedelta(seconds=60)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
153 plus1min_ts = int((dt - base_datetime).total_seconds())
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
154
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
155 # one that expired a minute ago
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
156 dt = dt - timedelta(seconds=120)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
157 expired_ts = int((dt - base_datetime).total_seconds())
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
158
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
159 # claims match what cgi/client.py::determine_user
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
160 # is looking for
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
161 claim= { 'sub': self.db.getuid(),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
162 'iss': self.db.config.TRACKER_WEB,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
163 'aud': self.db.config.TRACKER_WEB,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
164 'roles': [ 'User' ],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
165 'iat': now_ts,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
166 'exp': plus1min_ts,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
167 }
6314
a2fbd3592322 pyjwt 2.00 changed return type of jwt.encode from byte to str
John Rouillard <rouilj@ieee.org>
parents: 6312
diff changeset
168
a2fbd3592322 pyjwt 2.00 changed return type of jwt.encode from byte to str
John Rouillard <rouilj@ieee.org>
parents: 6312
diff changeset
169 # in version 2.0.0 and newer jwt.encode returns string
a2fbd3592322 pyjwt 2.00 changed return type of jwt.encode from byte to str
John Rouillard <rouilj@ieee.org>
parents: 6312
diff changeset
170 # not bytestring. So we have to skip b2s conversion
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
171
6314
a2fbd3592322 pyjwt 2.00 changed return type of jwt.encode from byte to str
John Rouillard <rouilj@ieee.org>
parents: 6312
diff changeset
172 if version.parse(jwt.__version__) >= version.parse('2.0.0'):
a2fbd3592322 pyjwt 2.00 changed return type of jwt.encode from byte to str
John Rouillard <rouilj@ieee.org>
parents: 6312
diff changeset
173 tostr = lambda x: x
a2fbd3592322 pyjwt 2.00 changed return type of jwt.encode from byte to str
John Rouillard <rouilj@ieee.org>
parents: 6312
diff changeset
174 else:
a2fbd3592322 pyjwt 2.00 changed return type of jwt.encode from byte to str
John Rouillard <rouilj@ieee.org>
parents: 6312
diff changeset
175 tostr = b2s
a2fbd3592322 pyjwt 2.00 changed return type of jwt.encode from byte to str
John Rouillard <rouilj@ieee.org>
parents: 6312
diff changeset
176
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
177 self.jwt = {}
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
178 self.claim = {}
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
179 # generate invalid claim with expired timestamp
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
180 self.claim['expired'] = copy(claim)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
181 self.claim['expired']['exp'] = expired_ts
6314
a2fbd3592322 pyjwt 2.00 changed return type of jwt.encode from byte to str
John Rouillard <rouilj@ieee.org>
parents: 6312
diff changeset
182 self.jwt['expired'] = tostr(jwt.encode(self.claim['expired'], secret,
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
183 algorithm='HS256'))
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
184
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
185 # generate valid claim with user role
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
186 self.claim['user'] = copy(claim)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
187 self.claim['user']['exp'] = plus1min_ts
6314
a2fbd3592322 pyjwt 2.00 changed return type of jwt.encode from byte to str
John Rouillard <rouilj@ieee.org>
parents: 6312
diff changeset
188 self.jwt['user'] = tostr(jwt.encode(self.claim['user'], secret,
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
189 algorithm='HS256'))
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
190 # generate invalid claim bad issuer
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
191 self.claim['badiss'] = copy(claim)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
192 self.claim['badiss']['iss'] = "http://someissuer/bugs"
6314
a2fbd3592322 pyjwt 2.00 changed return type of jwt.encode from byte to str
John Rouillard <rouilj@ieee.org>
parents: 6312
diff changeset
193 self.jwt['badiss'] = tostr(jwt.encode(self.claim['badiss'], secret,
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
194 algorithm='HS256'))
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
195 # generate invalid claim bad aud(ience)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
196 self.claim['badaud'] = copy(claim)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
197 self.claim['badaud']['aud'] = "http://someaudience/bugs"
6314
a2fbd3592322 pyjwt 2.00 changed return type of jwt.encode from byte to str
John Rouillard <rouilj@ieee.org>
parents: 6312
diff changeset
198 self.jwt['badaud'] = tostr(jwt.encode(self.claim['badaud'], secret,
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
199 algorithm='HS256'))
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
200 # generate invalid claim bad sub(ject)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
201 self.claim['badsub'] = copy(claim)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
202 self.claim['badsub']['sub'] = str("99")
6314
a2fbd3592322 pyjwt 2.00 changed return type of jwt.encode from byte to str
John Rouillard <rouilj@ieee.org>
parents: 6312
diff changeset
203 self.jwt['badsub'] = tostr(jwt.encode(self.claim['badsub'], secret,
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
204 algorithm='HS256'))
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
205 # generate invalid claim bad roles
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
206 self.claim['badroles'] = copy(claim)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
207 self.claim['badroles']['roles'] = [ "badrole1", "badrole2" ]
6314
a2fbd3592322 pyjwt 2.00 changed return type of jwt.encode from byte to str
John Rouillard <rouilj@ieee.org>
parents: 6312
diff changeset
208 self.jwt['badroles'] = tostr(jwt.encode(self.claim['badroles'], secret,
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
209 algorithm='HS256'))
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
210 # generate valid claim with limited user:email role
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
211 self.claim['user:email'] = copy(claim)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
212 self.claim['user:email']['roles'] = [ "user:email" ]
6314
a2fbd3592322 pyjwt 2.00 changed return type of jwt.encode from byte to str
John Rouillard <rouilj@ieee.org>
parents: 6312
diff changeset
213 self.jwt['user:email'] = tostr(jwt.encode(self.claim['user:email'], secret,
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
214 algorithm='HS256'))
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
215
5879
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
216 # generate valid claim with limited user:emailnorest role
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
217 self.claim['user:emailnorest'] = copy(claim)
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
218 self.claim['user:emailnorest']['roles'] = [ "user:emailnorest" ]
6314
a2fbd3592322 pyjwt 2.00 changed return type of jwt.encode from byte to str
John Rouillard <rouilj@ieee.org>
parents: 6312
diff changeset
219 self.jwt['user:emailnorest'] = tostr(jwt.encode(self.claim['user:emailnorest'], secret,
5879
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
220 algorithm='HS256'))
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
221
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
222 self.db.tx_Source = 'web'
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
223
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
224 self.db.issue.addprop(tx_Source=hyperdb.String())
5690
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
225 self.db.issue.addprop(anint=hyperdb.Integer())
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
226 self.db.issue.addprop(afloat=hyperdb.Number())
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
227 self.db.issue.addprop(abool=hyperdb.Boolean())
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
228 self.db.issue.addprop(requireme=hyperdb.String(required=True))
6256
29c6dc8ed004 Test handling of unset transitive link field.
John Rouillard <rouilj@ieee.org>
parents: 6185
diff changeset
229 self.db.user.addprop(issue=hyperdb.Link('issue'))
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
230 self.db.msg.addprop(tx_Source=hyperdb.String())
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
231
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
232 self.db.post_init()
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
233
6361
58817c3bf471 Fix roundup/test
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6350
diff changeset
234 tx_Source_init(self.db)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
235
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
236 self.client_env = {
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
237 'PATH_INFO': 'http://localhost/rounduptest/rest/',
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
238 'HTTP_HOST': 'localhost',
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
239 'TRACKER_NAME': 'rounduptest',
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
240 'HTTP_ORIGIN': 'http://tracker.example'
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
241 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
242 self.dummy_client = client.Client(self.instance, MockNull(),
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
243 self.client_env, [], None)
5650
e8ca7072c629 Fix Python 3 issues in REST code.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5647
diff changeset
244 self.dummy_client.request.headers.get = self.get_header
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
245 self.dummy_client.db = self.db
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
246
5591
a25d79e874cb Added filtering and pagination
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5588
diff changeset
247 self.empty_form = cgi.FieldStorage()
7183
2de72f75f2f8 Production PBKDF rounds back to 2M, test 1k; fix empty_form (python2)
John Rouillard <rouilj@ieee.org>
parents: 7156
diff changeset
248 # under python2 invoking:
2de72f75f2f8 Production PBKDF rounds back to 2M, test 1k; fix empty_form (python2)
John Rouillard <rouilj@ieee.org>
parents: 7156
diff changeset
249 # python2 -m pytest --durations=20
2de72f75f2f8 Production PBKDF rounds back to 2M, test 1k; fix empty_form (python2)
John Rouillard <rouilj@ieee.org>
parents: 7156
diff changeset
250 # loads the form with:
2de72f75f2f8 Production PBKDF rounds back to 2M, test 1k; fix empty_form (python2)
John Rouillard <rouilj@ieee.org>
parents: 7156
diff changeset
251 # FieldStorage(None, None, [MiniFieldStorage('--durations', '2')])
2de72f75f2f8 Production PBKDF rounds back to 2M, test 1k; fix empty_form (python2)
John Rouillard <rouilj@ieee.org>
parents: 7156
diff changeset
252 # Invoking it as: python2 -m pytest -v --durations=20
2de72f75f2f8 Production PBKDF rounds back to 2M, test 1k; fix empty_form (python2)
John Rouillard <rouilj@ieee.org>
parents: 7156
diff changeset
253 # results in an empty list. In any case, force it to be empty.
2de72f75f2f8 Production PBKDF rounds back to 2M, test 1k; fix empty_form (python2)
John Rouillard <rouilj@ieee.org>
parents: 7156
diff changeset
254 self.empty_form.list = []
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
255 self.terse_form = cgi.FieldStorage()
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
256 self.terse_form.list = [
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
257 cgi.MiniFieldStorage('@verbose', '0'),
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
258 ]
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
259
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
260 self.server = RestfulInstance(self.dummy_client, self.db)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
261
5710
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
262 self.db.Otk = self.db.getOTKManager()
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
263
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
264 self.db.config['WEB_SECRET_KEY'] = "XyzzykrnKm45Sd"
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
265
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
266 def tearDown(self):
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
267 self.db.close()
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
268 try:
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
269 shutil.rmtree(self.dirname)
5602
c40d04915e23 Python3 fixes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5601
diff changeset
270 except OSError as error:
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
271 if error.errno not in (errno.ENOENT, errno.ESRCH):
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
272 raise
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
273
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
274 def get_header (self, header, not_found=None):
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
275 try:
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
276 return self.headers[header.lower()]
5655
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
277 except (AttributeError, KeyError, TypeError):
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
278 if header.upper() in self.client_env:
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
279 return self.client_env[header.upper()]
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
280 return not_found
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
281
5865
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
282 def create_stati(self):
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
283 try:
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
284 self.db.status.create(name='open', order='9')
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
285 except ValueError:
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
286 pass
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
287 try:
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
288 self.db.status.create(name='closed', order='91')
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
289 except ValueError:
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
290 pass
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
291 try:
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
292 self.db.priority.create(name='normal')
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
293 except ValueError:
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
294 pass
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
295 try:
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
296 self.db.priority.create(name='critical')
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
297 except ValueError:
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
298 pass
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
299
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
300 def create_sampledata(self):
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
301 """ Create sample data common to some test cases
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
302 """
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
303 self.create_stati()
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
304 self.db.issue.create(
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
305 title='foo1',
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
306 status=self.db.status.lookup('open'),
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
307 priority=self.db.priority.lookup('normal'),
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
308 nosy = [ "1", "2" ]
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
309 )
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
310 issue_open_norm = self.db.issue.create(
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
311 title='foo2',
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
312 status=self.db.status.lookup('open'),
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
313 priority=self.db.priority.lookup('normal'),
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
314 assignedto = "3"
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
315 )
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
316 issue_open_crit = self.db.issue.create(
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
317 title='foo5',
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
318 status=self.db.status.lookup('open'),
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
319 priority=self.db.priority.lookup('critical')
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
320 )
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
321
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
322 def testGet(self):
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
323 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
324 Retrieve all three users
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
325 obtain data for 'joe'
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
326 """
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
327 self.server.client.env.update({'REQUEST_METHOD': 'GET'})
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
328 # Retrieve all three users.
5591
a25d79e874cb Added filtering and pagination
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5588
diff changeset
329 results = self.server.get_collection('user', self.empty_form)
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
330 self.assertEqual(self.dummy_client.response_code, 200)
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
331 self.assertEqual(len(results['data']['collection']), 3)
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
332 self.assertEqual(results['data']['@total_size'], 3)
5645
7f4d19867123 Make print into function call for python3 compatibility.
John Rouillard <rouilj@ieee.org>
parents: 5643
diff changeset
333 print(self.dummy_client.additional_headers["X-Count-Total"])
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
334 self.assertEqual(
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
335 self.dummy_client.additional_headers["X-Count-Total"],
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
336 "3"
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
337 )
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
338
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
339 # Obtain data for 'joe'.
5591
a25d79e874cb Added filtering and pagination
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5588
diff changeset
340 results = self.server.get_element('user', self.joeid, self.empty_form)
a25d79e874cb Added filtering and pagination
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5588
diff changeset
341 results = results['data']
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
342 self.assertEqual(self.dummy_client.response_code, 200)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
343 self.assertEqual(results['attributes']['username'], 'joe')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
344 self.assertEqual(results['attributes']['realname'], 'Joe Random')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
345
5678
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
346 # Obtain data for 'joe' via username lookup.
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
347 results = self.server.get_element('user', 'joe', self.empty_form)
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
348 results = results['data']
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
349 self.assertEqual(self.dummy_client.response_code, 200)
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
350 self.assertEqual(results['attributes']['username'], 'joe')
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
351 self.assertEqual(results['attributes']['realname'], 'Joe Random')
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
352
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
353 # Obtain data for 'joe' via username lookup (long form).
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
354 key = 'username=joe'
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
355 results = self.server.get_element('user', key, self.empty_form)
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
356 results = results['data']
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
357 self.assertEqual(self.dummy_client.response_code, 200)
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
358 self.assertEqual(results['attributes']['username'], 'joe')
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
359 self.assertEqual(results['attributes']['realname'], 'Joe Random')
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
360
5585
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
361 # Obtain data for 'joe'.
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
362 results = self.server.get_attribute(
5591
a25d79e874cb Added filtering and pagination
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5588
diff changeset
363 'user', self.joeid, 'username', self.empty_form
5585
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
364 )
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
365 self.assertEqual(self.dummy_client.response_code, 200)
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
366 self.assertEqual(results['data']['data'], 'joe')
5585
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
367
5872
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
368 def testGetTransitive(self):
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
369 """
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
370 Retrieve all issues with an 'o' in status
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
371 sort by status.name (not order)
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
372 """
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
373 base_path = self.db.config['TRACKER_WEB'] + 'rest/data/'
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
374 #self.maxDiff=None
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
375 self.create_sampledata()
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
376 self.db.issue.set('2', status=self.db.status.lookup('closed'))
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
377 self.db.issue.set('3', status=self.db.status.lookup('chatting'))
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
378 expected={'data':
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
379 {'@total_size': 2,
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
380 'collection': [
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
381 { 'id': '2',
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
382 'link': base_path + 'issue/2',
6256
29c6dc8ed004 Test handling of unset transitive link field.
John Rouillard <rouilj@ieee.org>
parents: 6185
diff changeset
383 'assignedto.issue': None,
5872
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
384 'status':
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
385 { 'id': '10',
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
386 'link': base_path + 'status/10'
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
387 }
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
388 },
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
389 { 'id': '1',
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
390 'link': base_path + 'issue/1',
6256
29c6dc8ed004 Test handling of unset transitive link field.
John Rouillard <rouilj@ieee.org>
parents: 6185
diff changeset
391 'assignedto.issue': None,
5872
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
392 'status':
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
393 { 'id': '9',
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
394 'link': base_path + 'status/9'
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
395 }
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
396 },
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
397 ]}
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
398 }
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
399 form = cgi.FieldStorage()
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
400 form.list = [
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
401 cgi.MiniFieldStorage('status.name', 'o'),
6256
29c6dc8ed004 Test handling of unset transitive link field.
John Rouillard <rouilj@ieee.org>
parents: 6185
diff changeset
402 cgi.MiniFieldStorage('@fields', 'status,assignedto.issue'),
5872
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
403 cgi.MiniFieldStorage('@sort', 'status.name'),
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
404 ]
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
405 results = self.server.get_collection('issue', form)
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
406 self.assertDictEqual(expected, results)
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
407
6554
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
408 def testGetBadTransitive(self):
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
409 """
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
410 Mess up the names of various properties and make sure we get a 400
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
411 and a somewhat useful error message.
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
412 """
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
413 base_path = self.db.config['TRACKER_WEB'] + 'rest/data/'
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
414 #self.maxDiff=None
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
415 self.create_sampledata()
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
416 self.db.issue.set('2', status=self.db.status.lookup('closed'))
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
417 self.db.issue.set('3', status=self.db.status.lookup('chatting'))
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
418 expected = [
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
419 {'error': {'msg': KeyError('Unknown property: assignedto.isse',),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
420 'status': 400}},
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
421 {'error': {'msg': KeyError('Unknown property: stat',),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
422 'status': 400}},
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
423 {'error': {'msg': KeyError('Unknown property: status.nam',),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
424 'status': 400}},
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
425 ]
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
426
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
427 ## test invalid transitive property in @fields
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
428 form = cgi.FieldStorage()
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
429 form.list = [
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
430 cgi.MiniFieldStorage('status.name', 'o'),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
431 cgi.MiniFieldStorage('@fields', 'status,assignedto.isse'),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
432 cgi.MiniFieldStorage('@sort', 'status.name'),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
433 ]
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
434 results = self.server.get_collection('issue', form)
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
435 self.assertEqual(self.dummy_client.response_code, 400)
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
436 self.assertEqual(repr(expected[0]['error']['msg']),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
437 repr(results['error']['msg']))
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
438 self.assertEqual(expected[0]['error']['status'],
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
439 results['error']['status'])
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
440
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
441 ## test invalid property in @fields
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
442 form = cgi.FieldStorage()
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
443 form.list = [
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
444 cgi.MiniFieldStorage('status.name', 'o'),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
445 cgi.MiniFieldStorage('@fields', 'stat,assignedto.isuse'),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
446 cgi.MiniFieldStorage('@sort', 'status.name'),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
447 ]
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
448 results = self.server.get_collection('issue', form)
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
449 self.assertEqual(self.dummy_client.response_code, 400)
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
450 self.assertEqual(repr(expected[1]['error']['msg']),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
451 repr(results['error']['msg']))
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
452 self.assertEqual(expected[1]['error']['status'],
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
453 results['error']['status'])
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
454
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
455 ## test invalid transitive property in filter TODO
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
456 form = cgi.FieldStorage()
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
457 form.list = [
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
458 cgi.MiniFieldStorage('status.nam', 'o'),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
459 cgi.MiniFieldStorage('@fields', 'status,assignedto.isuse'),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
460 cgi.MiniFieldStorage('@sort', 'status.name'),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
461 ]
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
462 results = self.server.get_collection('issue', form)
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
463 # is currently 403 not 400
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
464 self.assertEqual(self.dummy_client.response_code, 400)
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
465 self.assertEqual(repr(expected[2]['error']['msg']),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
466 repr(results['error']['msg']))
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
467 self.assertEqual(expected[2]['error']['status'],
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
468 results['error']['status'])
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
469
5874
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
470 def testGetExactMatch(self):
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
471 """ Retrieve all issues with an exact title
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
472 """
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
473 base_path = self.db.config['TRACKER_WEB'] + 'rest/data/'
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
474 #self.maxDiff=None
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
475 self.create_sampledata()
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
476 self.db.issue.set('2', title='This is an exact match')
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
477 self.db.issue.set('3', title='This is an exact match')
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
478 self.db.issue.set('1', title='This is AN exact match')
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
479 expected={'data':
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
480 {'@total_size': 2,
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
481 'collection': [
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
482 { 'id': '2',
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
483 'link': base_path + 'issue/2',
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
484 },
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
485 { 'id': '3',
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
486 'link': base_path + 'issue/3',
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
487 },
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
488 ]}
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
489 }
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
490 form = cgi.FieldStorage()
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
491 form.list = [
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
492 cgi.MiniFieldStorage('title:', 'This is an exact match'),
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
493 cgi.MiniFieldStorage('@sort', 'status.name'),
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
494 ]
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
495 results = self.server.get_collection('issue', form)
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
496 self.assertDictEqual(expected, results)
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
497
5682
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
498 def testOutputFormat(self):
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
499 """ test of @fields and @verbose implementation """
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
500
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
501 self.maxDiff = 4000
5865
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
502 self.create_sampledata()
5682
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
503 base_path = self.db.config['TRACKER_WEB'] + 'rest/data/issue/'
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
504
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
505
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
506 # Check formating for issues status=open; @fields and verbose tests
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
507 form = cgi.FieldStorage()
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
508 form.list = [
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
509 cgi.MiniFieldStorage('status', 'open'),
5825
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
510 cgi.MiniFieldStorage('@fields', 'nosy,status,creator'),
5682
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
511 cgi.MiniFieldStorage('@verbose', '2')
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
512 ]
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
513
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
514 expected={'data':
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
515 {'@total_size': 3,
5825
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
516 'collection': [ {
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
517 'creator': {'id': '3',
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
518 'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/user/3',
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
519 'username': 'joe'},
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
520 'status': {'id': '9',
5682
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
521 'name': 'open',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
522 'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/status/9'},
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
523 'id': '1',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
524 'nosy': [
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
525 {'username': 'admin',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
526 'id': '1',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
527 'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/user/1'},
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
528 {'username': 'anonymous',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
529 'id': '2',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
530 'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/user/2'}
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
531 ],
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
532 'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/issue/1',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
533 'title': 'foo1' },
5825
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
534 { 'creator': {'id': '3',
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
535 'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/user/3',
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
536 'username': 'joe'},
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
537 'status': {
5682
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
538 'id': '9',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
539 'name': 'open',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
540 'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/status/9' },
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
541 'id': '2',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
542 'nosy': [
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
543 {'username': 'joe',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
544 'id': '3',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
545 'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/user/3'}
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
546 ],
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
547 'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/issue/2',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
548 'title': 'foo2'},
5825
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
549 {'creator': {'id': '3',
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
550 'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/user/3',
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
551 'username': 'joe'},
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
552 'status': {
5682
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
553 'id': '9',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
554 'name': 'open',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
555 'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/status/9'},
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
556 'id': '3',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
557 'nosy': [],
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
558 'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/issue/3',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
559 'title': 'foo5'}
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
560 ]}}
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
561
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
562 results = self.server.get_collection('issue', form)
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
563 self.assertDictEqual(expected, results)
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
564
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
565 # Check formating for issues status=open; @fields and verbose tests
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
566 form = cgi.FieldStorage()
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
567 form.list = [
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
568 cgi.MiniFieldStorage('status', 'open')
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
569 # default cgi.MiniFieldStorage('@verbose', '1')
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
570 ]
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
571
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
572 expected={'data':
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
573 {'@total_size': 3,
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
574 'collection': [
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
575 {'id': '1',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
576 'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/issue/1',},
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
577 { 'id': '2',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
578
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
579 'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/issue/2'},
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
580 {'id': '3',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
581 'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/issue/3'} ]}}
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
582
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
583
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
584 results = self.server.get_collection('issue', form)
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
585 self.assertDictEqual(expected, results)
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
586
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
587 # Generate failure case, unknown field.
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
588 form = cgi.FieldStorage()
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
589 form.list = [
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
590 cgi.MiniFieldStorage('status', 'open'),
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
591 cgi.MiniFieldStorage('@fields', 'title,foo')
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
592 ]
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
593
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
594 expected={'error': {
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
595 'msg': UsageError("Failed to find property 'foo' "
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
596 "for class issue.",),
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
597 'status': 400}}
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
598
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
599 results = self.server.get_collection('issue', form)
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
600 # I tried assertDictEqual but seems it can't handle
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
601 # the exception value of 'msg'. So I am using repr to check.
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
602 self.assertEqual(repr(sorted(expected['error'])),
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
603 repr(sorted(results['error']))
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
604 )
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
605
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
606 # Check formating for issues status=open; @fields and verbose tests
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
607 form = cgi.FieldStorage()
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
608 form.list = [
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
609 cgi.MiniFieldStorage('status', 'open'),
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
610 cgi.MiniFieldStorage('@fields', 'nosy,status,assignedto'),
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
611 cgi.MiniFieldStorage('@verbose', '0')
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
612 ]
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
613
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
614 expected={'data': {
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
615 '@total_size': 3,
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
616 'collection': [
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
617 {'assignedto': None,
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
618 'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/issue/1',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
619 'status': '9',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
620 'nosy': ['1', '2'],
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
621 'id': '1'},
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
622 {'assignedto': '3',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
623 'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/issue/2',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
624 'status': '9',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
625 'nosy': ['3'],
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
626 'id': '2'},
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
627 {'assignedto': None,
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
628 'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/issue/3',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
629 'status': '9',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
630 'nosy': [],
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
631 'id': '3'}]}}
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
632
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
633 results = self.server.get_collection('issue', form)
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
634 print(results)
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
635 self.assertDictEqual(expected, results)
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
636
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
637 # check users
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
638 form = cgi.FieldStorage()
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
639 form.list = [
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
640 cgi.MiniFieldStorage('@fields', 'username,queries,password'),
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
641 cgi.MiniFieldStorage('@verbose', '0')
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
642 ]
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
643 # note this is done as user joe, so we only get queries
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
644 # and password for joe.
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
645 expected = {'data': {'collection': [
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
646 {'id': '1',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
647 'username': 'admin',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
648 'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/user/1'},
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
649 {'id': '2',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
650 'username': 'anonymous',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
651 'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/user/2'},
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
652 {'password': '[password hidden scheme PBKDF2]',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
653 'id': '3',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
654 'queries': [],
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
655 'username': 'joe',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
656 'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/user/3'}],
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
657 '@total_size': 3}}
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
658
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
659 results = self.server.get_collection('user', form)
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
660 self.assertDictEqual(expected, results)
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
661
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
662 ## Start testing get_element
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
663 form = cgi.FieldStorage()
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
664 form.list = [
5825
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
665 cgi.MiniFieldStorage('@fields', 'queries,password,creator'),
5682
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
666 cgi.MiniFieldStorage('@verbose', '2')
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
667 ]
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
668 expected = {'data': {
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
669 'id': '3',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
670 'type': 'user',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
671 '@etag': '',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
672 'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/user/3',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
673 'attributes': {
5825
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
674 'creator': {'id': '1',
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
675 'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/user/1',
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
676 'username': 'admin'},
5682
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
677 'password': '[password hidden scheme PBKDF2]',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
678 'queries': [],
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
679 'username': 'joe'
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
680 }
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
681 }}
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
682
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
683 results = self.server.get_element('user', self.joeid, form)
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
684 results['data']['@etag'] = '' # etag depends on date, set to empty
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
685 self.assertDictEqual(expected,results)
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
686
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
687 form = cgi.FieldStorage()
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
688 form.list = [
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
689 cgi.MiniFieldStorage('@fields', 'status:priority'),
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
690 cgi.MiniFieldStorage('@verbose', '1')
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
691 ]
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
692 expected = {'data': {
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
693 'type': 'issue',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
694 'id': '3',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
695 'attributes': {
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
696 'status': {
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
697 'id': '9',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
698 'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/status/9'},
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
699 'priority': {
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
700 'id': '1',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
701 'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/priority/1'}},
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
702 '@etag': '',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
703 'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/issue/3'}}
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
704
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
705 results = self.server.get_element('issue', "3", form)
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
706 results['data']['@etag'] = '' # etag depends on date, set to empty
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
707 self.assertDictEqual(expected,results)
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
708
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
709 form = cgi.FieldStorage()
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
710 form.list = [
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
711 cgi.MiniFieldStorage('@fields', 'status,priority'),
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
712 cgi.MiniFieldStorage('@verbose', '0')
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
713 ]
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
714 expected = {'data': {
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
715 'type': 'issue',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
716 'id': '3',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
717 'attributes': {
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
718 'status': '9',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
719 'priority': '1'},
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
720 '@etag': '',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
721 'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/issue/3'}}
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
722
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
723 results = self.server.get_element('issue', "3", form)
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
724 results['data']['@etag'] = '' # etag depends on date, set to empty
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
725 self.assertDictEqual(expected,results)
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
726
5865
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
727 def testSorting(self):
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
728 self.maxDiff = 4000
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
729 self.create_sampledata()
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
730 self.db.issue.set('1', status='7')
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
731 self.db.issue.set('2', status='2')
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
732 self.db.issue.set('3', status='2')
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
733 self.db.commit()
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
734 base_path = self.db.config['TRACKER_WEB'] + 'rest/data/issue/'
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
735 # change some data for sorting on later
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
736 form = cgi.FieldStorage()
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
737 form.list = [
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
738 cgi.MiniFieldStorage('@fields', 'status'),
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
739 cgi.MiniFieldStorage('@sort', 'status,-id'),
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
740 cgi.MiniFieldStorage('@verbose', '0')
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
741 ]
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
742
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
743 # status is sorted by orderprop (property 'order')
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
744 # which provides the same ordering as the status ID
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
745 expected={'data': {
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
746 '@total_size': 3,
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
747 'collection': [
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
748 {'link': base_path + '3', 'status': '2', 'id': '3'},
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
749 {'link': base_path + '2', 'status': '2', 'id': '2'},
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
750 {'link': base_path + '1', 'status': '7', 'id': '1'}]}}
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
751
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
752 results = self.server.get_collection('issue', form)
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
753 self.assertDictEqual(expected, results)
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
754
6090
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
755 def testTransitiveField(self):
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
756 """ Test a transitive property in @fields """
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
757 base_path = self.db.config['TRACKER_WEB'] + 'rest/data/'
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
758 # create sample data
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
759 self.create_stati()
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
760 self.db.issue.create(
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
761 title='foo4',
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
762 status=self.db.status.lookup('closed'),
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
763 priority=self.db.priority.lookup('critical')
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
764 )
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
765 # Retrieve all issue @fields=status.name
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
766 form = cgi.FieldStorage()
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
767 form.list = [
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
768 cgi.MiniFieldStorage('@fields', 'status.name')
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
769 ]
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
770 results = self.server.get_collection('issue', form)
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
771 self.assertEqual(self.dummy_client.response_code, 200)
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
772
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
773 exp = [
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
774 {'link': base_path + 'issue/1', 'id': '1', 'status.name': 'closed'}]
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
775 self.assertEqual(results['data']['collection'], exp)
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
776
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
777 def testFilter(self):
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
778 """
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
779 Retrieve all three users
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
780 obtain data for 'joe'
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
781 """
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
782 # create sample data
5865
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
783 self.create_stati()
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
784 self.db.issue.create(
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
785 title='foo4',
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
786 status=self.db.status.lookup('closed'),
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
787 priority=self.db.priority.lookup('critical')
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
788 )
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
789 self.db.issue.create(
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
790 title='foo1',
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
791 status=self.db.status.lookup('open'),
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
792 priority=self.db.priority.lookup('normal')
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
793 )
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
794 issue_open_norm = self.db.issue.create(
5842
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
795 title='foo2 normal',
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
796 status=self.db.status.lookup('open'),
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
797 priority=self.db.priority.lookup('normal')
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
798 )
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
799 issue_closed_norm = self.db.issue.create(
5842
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
800 title='foo3 closed normal',
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
801 status=self.db.status.lookup('closed'),
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
802 priority=self.db.priority.lookup('normal')
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
803 )
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
804 issue_closed_crit = self.db.issue.create(
5842
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
805 title='foo4 closed',
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
806 status=self.db.status.lookup('closed'),
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
807 priority=self.db.priority.lookup('critical')
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
808 )
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
809 issue_open_crit = self.db.issue.create(
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
810 title='foo5',
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
811 status=self.db.status.lookup('open'),
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
812 priority=self.db.priority.lookup('critical')
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
813 )
5623
1c4adab65faf use config file setting for creating tracker uri
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
814 base_path = self.db.config['TRACKER_WEB'] + 'rest/data/issue/'
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
815
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
816 # Retrieve all issue status=open
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
817 form = cgi.FieldStorage()
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
818 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
819 cgi.MiniFieldStorage('status', 'open')
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
820 ]
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
821 results = self.server.get_collection('issue', form)
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
822 self.assertEqual(self.dummy_client.response_code, 200)
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
823 self.assertIn(get_obj(base_path, issue_open_norm),
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
824 results['data']['collection'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
825 self.assertIn(get_obj(base_path, issue_open_crit),
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
826 results['data']['collection'])
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
827 self.assertNotIn(
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
828 get_obj(base_path, issue_closed_norm),
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
829 results['data']['collection']
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
830 )
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
831
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
832 # Retrieve all issue status=closed and priority=critical
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
833 form = cgi.FieldStorage()
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
834 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
835 cgi.MiniFieldStorage('status', 'closed'),
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
836 cgi.MiniFieldStorage('priority', 'critical')
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
837 ]
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
838 results = self.server.get_collection('issue', form)
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
839 self.assertEqual(self.dummy_client.response_code, 200)
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
840 self.assertIn(get_obj(base_path, issue_closed_crit),
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
841 results['data']['collection'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
842 self.assertNotIn(get_obj(base_path, issue_open_crit),
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
843 results['data']['collection'])
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
844 self.assertNotIn(
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
845 get_obj(base_path, issue_closed_norm),
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
846 results['data']['collection']
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
847 )
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
848
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
849 # Retrieve all issue status=closed and priority=normal,critical
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
850 form = cgi.FieldStorage()
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
851 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
852 cgi.MiniFieldStorage('status', 'closed'),
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
853 cgi.MiniFieldStorage('priority', 'normal,critical')
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
854 ]
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
855 results = self.server.get_collection('issue', form)
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
856 self.assertEqual(self.dummy_client.response_code, 200)
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
857 self.assertIn(get_obj(base_path, issue_closed_crit),
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
858 results['data']['collection'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
859 self.assertIn(get_obj(base_path, issue_closed_norm),
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
860 results['data']['collection'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
861 self.assertNotIn(get_obj(base_path, issue_open_crit),
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
862 results['data']['collection'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
863 self.assertNotIn(get_obj(base_path, issue_open_norm),
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
864 results['data']['collection'])
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
865
5842
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
866 # Retrieve all issue status=closed and priority=normal,critical
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
867 # using duplicate priority key's.
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
868 form = cgi.FieldStorage()
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
869 form.list = [
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
870 cgi.MiniFieldStorage('status', 'closed'),
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
871 cgi.MiniFieldStorage('priority', 'normal'),
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
872 cgi.MiniFieldStorage('priority', 'critical')
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
873 ]
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
874 results = self.server.get_collection('issue', form)
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
875 self.assertEqual(self.dummy_client.response_code, 200)
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
876 self.assertIn(get_obj(base_path, issue_closed_crit),
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
877 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
878 self.assertIn(get_obj(base_path, issue_closed_norm),
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
879 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
880 self.assertNotIn(get_obj(base_path, issue_open_crit),
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
881 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
882 self.assertNotIn(get_obj(base_path, issue_open_norm),
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
883 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
884
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
885 # Retrieve all issues with title containing
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
886 # closed, normal and 3 using duplicate title filterkeys
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
887 form = cgi.FieldStorage()
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
888 form.list = [
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
889 cgi.MiniFieldStorage('title', 'closed'),
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
890 cgi.MiniFieldStorage('title', 'normal'),
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
891 cgi.MiniFieldStorage('title', '3')
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
892 ]
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
893 results = self.server.get_collection('issue', form)
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
894 self.assertEqual(self.dummy_client.response_code, 200)
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
895 self.assertNotIn(get_obj(base_path, issue_closed_crit),
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
896 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
897 self.assertIn(get_obj(base_path, issue_closed_norm),
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
898 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
899 self.assertNotIn(get_obj(base_path, issue_open_crit),
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
900 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
901 self.assertNotIn(get_obj(base_path, issue_open_norm),
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
902 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
903 self.assertEqual(len(results['data']['collection']), 1)
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
904
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
905 # Retrieve all issues (no hits) with title containing
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
906 # closed, normal and foo3 in this order using title filter
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
907 form = cgi.FieldStorage()
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
908 form.list = [
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
909 cgi.MiniFieldStorage('title', 'closed normal foo3')
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
910 ]
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
911 results = self.server.get_collection('issue', form)
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
912 self.assertEqual(self.dummy_client.response_code, 200)
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
913 self.assertNotIn(get_obj(base_path, issue_closed_crit),
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
914 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
915 self.assertNotIn(get_obj(base_path, issue_closed_norm),
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
916 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
917 self.assertNotIn(get_obj(base_path, issue_open_crit),
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
918 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
919 self.assertNotIn(get_obj(base_path, issue_open_norm),
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
920 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
921 self.assertEqual(len(results['data']['collection']), 0)
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
922
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
923 # Retrieve all issues with title containing
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
924 # foo3, closed and normal in this order using title filter
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
925 form = cgi.FieldStorage()
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
926 form.list = [
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
927 cgi.MiniFieldStorage('title', 'foo3 closed normal')
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
928 ]
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
929 results = self.server.get_collection('issue', form)
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
930 self.assertEqual(self.dummy_client.response_code, 200)
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
931 self.assertNotIn(get_obj(base_path, issue_closed_crit),
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
932 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
933 self.assertIn(get_obj(base_path, issue_closed_norm),
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
934 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
935 self.assertNotIn(get_obj(base_path, issue_open_crit),
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
936 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
937 self.assertNotIn(get_obj(base_path, issue_open_norm),
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
938 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
939 self.assertEqual(len(results['data']['collection']), 1)
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
940
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
941 # Retrieve all issues with word closed in title
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
942 form = cgi.FieldStorage()
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
943 form.list = [
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
944 cgi.MiniFieldStorage('title', 'closed'),
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
945 ]
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
946 results = self.server.get_collection('issue', form)
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
947 self.assertEqual(self.dummy_client.response_code, 200)
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
948 self.assertIn(get_obj(base_path, issue_closed_crit),
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
949 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
950 self.assertIn(get_obj(base_path, issue_closed_norm),
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
951 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
952 self.assertNotIn(get_obj(base_path, issue_open_crit),
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
953 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
954 self.assertNotIn(get_obj(base_path, issue_open_norm),
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
955 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
956 self.assertEqual(len(results['data']['collection']), 2)
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
957
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
958 def testPagination(self):
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
959 """
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
960 Test pagination. page_size is required and is an integer
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
961 starting at 1. page_index is optional and is an integer
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
962 starting at 1. Verify that pagination links are present
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
963 if paging, @total_size and X-Count-Total header match
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
964 number of items.
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
965 """
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
966 # create sample data
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
967 for i in range(0, random.randint(8,15)):
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
968 self.db.issue.create(title='foo' + str(i))
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
969
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
970 # Retrieving all the issues
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
971 results = self.server.get_collection('issue', self.empty_form)
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
972 self.assertEqual(self.dummy_client.response_code, 200)
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
973 total_length = len(results['data']['collection'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
974 # Verify no pagination links if paging not used
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
975 self.assertFalse('@links' in results['data'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
976 self.assertEqual(results['data']['@total_size'], total_length)
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
977 self.assertEqual(
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
978 self.dummy_client.additional_headers["X-Count-Total"],
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
979 str(total_length)
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
980 )
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
981
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
982
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
983 # Pagination will be 45% of the total result
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
984 # So 2 full pages and 1 partial page.
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
985 page_size = total_length * 45 // 100
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
986 page_one_expected = page_size
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
987 page_two_expected = page_size
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
988 page_three_expected = total_length - (2*page_one_expected)
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
989 base_url="http://tracker.example/cgi-bin/roundup.cgi/" \
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
990 "bugs/rest/data/issue"
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
991
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
992 # Retrieve page 1
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
993 form = cgi.FieldStorage()
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
994 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
995 cgi.MiniFieldStorage('@page_size', page_size),
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
996 cgi.MiniFieldStorage('@page_index', 1)
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
997 ]
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
998 results = self.server.get_collection('issue', form)
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
999 self.assertEqual(self.dummy_client.response_code, 200)
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1000 self.assertEqual(len(results['data']['collection']),
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1001 page_one_expected)
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1002 self.assertTrue('@links' in results['data'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1003 self.assertTrue('self' in results['data']['@links'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1004 self.assertTrue('next' in results['data']['@links'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1005 self.assertFalse('prev' in results['data']['@links'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1006 self.assertEqual(results['data']['@links']['self'][0]['uri'],
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
1007 "%s?@page_index=1&@page_size=%s"%(base_url,page_size))
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1008 self.assertEqual(results['data']['@links']['next'][0]['uri'],
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
1009 "%s?@page_index=2&@page_size=%s"%(base_url,page_size))
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1010
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1011 page_one_results = results # save this for later
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1012
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1013 # Retrieve page 2
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1014 form = cgi.FieldStorage()
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1015 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
1016 cgi.MiniFieldStorage('@page_size', page_size),
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
1017 cgi.MiniFieldStorage('@page_index', 2)
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1018 ]
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1019 results = self.server.get_collection('issue', form)
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1020 self.assertEqual(self.dummy_client.response_code, 200)
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1021 self.assertEqual(len(results['data']['collection']), page_two_expected)
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1022 self.assertTrue('@links' in results['data'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1023 self.assertTrue('self' in results['data']['@links'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1024 self.assertTrue('next' in results['data']['@links'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1025 self.assertTrue('prev' in results['data']['@links'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1026 self.assertEqual(results['data']['@links']['self'][0]['uri'],
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
1027 "http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/issue?@page_index=2&@page_size=%s"%page_size)
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1028 self.assertEqual(results['data']['@links']['next'][0]['uri'],
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
1029 "http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/issue?@page_index=3&@page_size=%s"%page_size)
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1030 self.assertEqual(results['data']['@links']['prev'][0]['uri'],
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
1031 "http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/issue?@page_index=1&@page_size=%s"%page_size)
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1032 self.assertEqual(results['data']['@links']['self'][0]['rel'],
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1033 'self')
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1034 self.assertEqual(results['data']['@links']['next'][0]['rel'],
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1035 'next')
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1036 self.assertEqual(results['data']['@links']['prev'][0]['rel'],
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1037 'prev')
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1038
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1039 # Retrieve page 3
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1040 form = cgi.FieldStorage()
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1041 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
1042 cgi.MiniFieldStorage('@page_size', page_size),
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
1043 cgi.MiniFieldStorage('@page_index', 3)
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1044 ]
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1045 results = self.server.get_collection('issue', form)
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1046 self.assertEqual(self.dummy_client.response_code, 200)
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1047 self.assertEqual(len(results['data']['collection']), page_three_expected)
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1048 self.assertTrue('@links' in results['data'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1049 self.assertTrue('self' in results['data']['@links'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1050 self.assertFalse('next' in results['data']['@links'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1051 self.assertTrue('prev' in results['data']['@links'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1052 self.assertEqual(results['data']['@links']['self'][0]['uri'],
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
1053 "http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/issue?@page_index=3&@page_size=%s"%page_size)
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1054 self.assertEqual(results['data']['@links']['prev'][0]['uri'],
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
1055 "http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/issue?@page_index=2&@page_size=%s"%page_size)
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1056
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1057 # Verify that page_index is optional
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1058 # Should start at page 1
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1059 form = cgi.FieldStorage()
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1060 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
1061 cgi.MiniFieldStorage('@page_size', page_size),
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1062 ]
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1063 results = self.server.get_collection('issue', form)
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1064 self.assertEqual(self.dummy_client.response_code, 200)
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1065 self.assertEqual(len(results['data']['collection']), page_size)
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1066 self.assertTrue('@links' in results['data'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1067 self.assertTrue('self' in results['data']['@links'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1068 self.assertTrue('next' in results['data']['@links'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1069 self.assertFalse('prev' in results['data']['@links'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1070 self.assertEqual(page_one_results, results)
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1071
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1072 # FIXME add tests for out of range once we decide what response
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1073 # is needed to:
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1074 # page_size < 0
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1075 # page_index < 0
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1076
5732
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1077 def testRestRateLimit(self):
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1078
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1079 self.db.config['WEB_API_CALLS_PER_INTERVAL'] = 20
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1080 self.db.config['WEB_API_INTERVAL_IN_SEC'] = 60
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1081
5733
62bdcb874433 Test code was not testing the loop that retries otk database updates
John Rouillard <rouilj@ieee.org>
parents: 5732
diff changeset
1082 # Otk code never passes through the
62bdcb874433 Test code was not testing the loop that retries otk database updates
John Rouillard <rouilj@ieee.org>
parents: 5732
diff changeset
1083 # retry loop. Not sure why but I can force it
62bdcb874433 Test code was not testing the loop that retries otk database updates
John Rouillard <rouilj@ieee.org>
parents: 5732
diff changeset
1084 # through the loop by setting the internal _db_type
62bdcb874433 Test code was not testing the loop that retries otk database updates
John Rouillard <rouilj@ieee.org>
parents: 5732
diff changeset
1085 # setting once the db is created by the previous command.
5734
5cd9ac3daed7 Fixes for mysql and postgresql primary db.
John Rouillard <rouilj@ieee.org>
parents: 5733
diff changeset
1086 try:
5cd9ac3daed7 Fixes for mysql and postgresql primary db.
John Rouillard <rouilj@ieee.org>
parents: 5733
diff changeset
1087 self.db.Otk._db_type = whichdb("%s/%s"%(self.db.Otk.dir, self.db.Otk.name))
5cd9ac3daed7 Fixes for mysql and postgresql primary db.
John Rouillard <rouilj@ieee.org>
parents: 5733
diff changeset
1088 except AttributeError:
5cd9ac3daed7 Fixes for mysql and postgresql primary db.
John Rouillard <rouilj@ieee.org>
parents: 5733
diff changeset
1089 # if dir attribute doesn't exist the primary db is not
5cd9ac3daed7 Fixes for mysql and postgresql primary db.
John Rouillard <rouilj@ieee.org>
parents: 5733
diff changeset
1090 # sqlite or anydbm. So don't need to exercise code.
5cd9ac3daed7 Fixes for mysql and postgresql primary db.
John Rouillard <rouilj@ieee.org>
parents: 5733
diff changeset
1091 pass
5733
62bdcb874433 Test code was not testing the loop that retries otk database updates
John Rouillard <rouilj@ieee.org>
parents: 5732
diff changeset
1092
5732
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1093 print("Now realtime start:", datetime.utcnow())
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1094 # don't set an accept header; json should be the default
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1095 # use up all our allowed api calls
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1096 for i in range(20):
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1097 # i is 0 ... 19
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1098 self.client_error_message = []
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1099 self.server.client.env.update({'REQUEST_METHOD': 'GET'})
5732
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1100 results = self.server.dispatch('GET',
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1101 "/rest/data/user/%s/realname"%self.joeid,
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1102 self.empty_form)
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1103
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1104 # is successful
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1105 self.assertEqual(self.server.client.response_code, 200)
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1106 # does not have Retry-After header as we have
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1107 # suceeded with this query
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1108 self.assertFalse("Retry-After" in
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1109 self.server.client.additional_headers)
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1110 # remaining count is correct
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1111 self.assertEqual(
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1112 self.server.client.additional_headers["X-RateLimit-Remaining"],
5937
5d0873a4de4a fix rate limit headers - were ints/floats need to be strings
John Rouillard <rouilj@ieee.org>
parents: 5879
diff changeset
1113 str(self.db.config['WEB_API_CALLS_PER_INTERVAL'] -1 - i)
5732
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1114 )
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1115
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1116 # trip limit
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1117 self.server.client.additional_headers.clear()
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1118 results = self.server.dispatch('GET',
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1119 "/rest/data/user/%s/realname"%self.joeid,
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1120 self.empty_form)
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1121 print(results)
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1122 self.assertEqual(self.server.client.response_code, 429)
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1123
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1124 self.assertEqual(
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1125 self.server.client.additional_headers["X-RateLimit-Limit"],
5937
5d0873a4de4a fix rate limit headers - were ints/floats need to be strings
John Rouillard <rouilj@ieee.org>
parents: 5879
diff changeset
1126 str(self.db.config['WEB_API_CALLS_PER_INTERVAL']))
5732
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1127 self.assertEqual(
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1128 self.server.client.additional_headers["X-RateLimit-Limit-Period"],
5937
5d0873a4de4a fix rate limit headers - were ints/floats need to be strings
John Rouillard <rouilj@ieee.org>
parents: 5879
diff changeset
1129 str(self.db.config['WEB_API_INTERVAL_IN_SEC']))
5732
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1130 self.assertEqual(
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1131 self.server.client.additional_headers["X-RateLimit-Remaining"],
5937
5d0873a4de4a fix rate limit headers - were ints/floats need to be strings
John Rouillard <rouilj@ieee.org>
parents: 5879
diff changeset
1132 '0')
5732
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1133 # value will be almost 60. Allow 1-2 seconds for all 20 rounds.
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1134 self.assertAlmostEqual(
5937
5d0873a4de4a fix rate limit headers - were ints/floats need to be strings
John Rouillard <rouilj@ieee.org>
parents: 5879
diff changeset
1135 float(self.server.client.additional_headers["X-RateLimit-Reset"]),
6660
32c6e98e5a21 Larger delta for X-RateLimit-Reset tests
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6554
diff changeset
1136 59, delta=5)
5732
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1137 self.assertEqual(
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1138 str(self.server.client.additional_headers["Retry-After"]),
5937
5d0873a4de4a fix rate limit headers - were ints/floats need to be strings
John Rouillard <rouilj@ieee.org>
parents: 5879
diff changeset
1139 "3") # check as string
5732
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1140
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1141 print("Reset:", self.server.client.additional_headers["X-RateLimit-Reset"])
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1142 print("Now realtime pre-sleep:", datetime.utcnow())
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1143 sleep(3.1) # sleep as requested so we can do another login
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1144 print("Now realtime post-sleep:", datetime.utcnow())
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1145
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1146 # this should succeed
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1147 self.server.client.additional_headers.clear()
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1148 results = self.server.dispatch('GET',
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1149 "/rest/data/user/%s/realname"%self.joeid,
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1150 self.empty_form)
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1151 print(results)
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1152 print("Reset:", self.server.client.additional_headers["X-RateLimit-Reset-date"])
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1153 print("Now realtime:", datetime.utcnow())
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1154 print("Now ts header:", self.server.client.additional_headers["Now"])
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1155 print("Now date header:", self.server.client.additional_headers["Now-date"])
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1156
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1157 self.assertEqual(self.server.client.response_code, 200)
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1158
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1159 self.assertEqual(
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1160 self.server.client.additional_headers["X-RateLimit-Limit"],
5937
5d0873a4de4a fix rate limit headers - were ints/floats need to be strings
John Rouillard <rouilj@ieee.org>
parents: 5879
diff changeset
1161 str(self.db.config['WEB_API_CALLS_PER_INTERVAL']))
5732
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1162 self.assertEqual(
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1163 self.server.client.additional_headers["X-RateLimit-Limit-Period"],
5937
5d0873a4de4a fix rate limit headers - were ints/floats need to be strings
John Rouillard <rouilj@ieee.org>
parents: 5879
diff changeset
1164 str(self.db.config['WEB_API_INTERVAL_IN_SEC']))
5732
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1165 self.assertEqual(
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1166 self.server.client.additional_headers["X-RateLimit-Remaining"],
5937
5d0873a4de4a fix rate limit headers - were ints/floats need to be strings
John Rouillard <rouilj@ieee.org>
parents: 5879
diff changeset
1167 '0')
5732
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1168 self.assertFalse("Retry-After" in
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1169 self.server.client.additional_headers)
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1170 # we still need to wait a minute for everything to clear
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1171 self.assertAlmostEqual(
5937
5d0873a4de4a fix rate limit headers - were ints/floats need to be strings
John Rouillard <rouilj@ieee.org>
parents: 5879
diff changeset
1172 float(self.server.client.additional_headers["X-RateLimit-Reset"]),
6660
32c6e98e5a21 Larger delta for X-RateLimit-Reset tests
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6554
diff changeset
1173 59, delta=5)
5732
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1174
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1175 # and make sure we need to wait another three seconds
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1176 # as we consumed the last api call
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1177 results = self.server.dispatch('GET',
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1178 "/rest/data/user/%s/realname"%self.joeid,
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1179 self.empty_form)
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1180
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1181 self.assertEqual(self.server.client.response_code, 429)
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1182 self.assertEqual(
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1183 str(self.server.client.additional_headers["Retry-After"]),
5937
5d0873a4de4a fix rate limit headers - were ints/floats need to be strings
John Rouillard <rouilj@ieee.org>
parents: 5879
diff changeset
1184 "3") # check as string
5732
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1185
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1186 json_dict = json.loads(b2s(results))
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1187 self.assertEqual(json_dict['error']['msg'],
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1188 "Api rate limits exceeded. Please wait: 3 seconds.")
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1189
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1190 # reset rest params
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1191 self.db.config['WEB_API_CALLS_PER_INTERVAL'] = 0
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1192 self.db.config['WEB_API_INTERVAL_IN_SEC'] = 3600
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1193
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1194 def testEtagGeneration(self):
5668
a4bb88a1a643 A fix for https://issues.roundup-tracker.org/issue2551034
John Rouillard <rouilj@ieee.org>
parents: 5656
diff changeset
1195 ''' Make sure etag generation is stable
a4bb88a1a643 A fix for https://issues.roundup-tracker.org/issue2551034
John Rouillard <rouilj@ieee.org>
parents: 5656
diff changeset
1196
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1197 This mocks date.Date() when creating the target to be
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1198 etagged. Differing dates make this test impossible.
5668
a4bb88a1a643 A fix for https://issues.roundup-tracker.org/issue2551034
John Rouillard <rouilj@ieee.org>
parents: 5656
diff changeset
1199 '''
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1200 from roundup import date
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1201
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1202 originalDate = date.Date
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1203
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1204 dummy=date.Date('2000-06-26.00:34:02.0')
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1205
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1206 # is a closure the best way to return a static Date object??
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1207 def dummyDate(adate=None):
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1208 def dummyClosure(adate=None, translator=None):
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1209 return dummy
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1210 return dummyClosure
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1211
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1212 date.Date = dummyDate()
5728
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1213 try:
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1214 newuser = self.db.user.create(
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1215 username='john',
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1216 password=password.Password('random1', scheme='plaintext'),
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1217 address='random1@home.org',
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1218 realname='JohnRandom',
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1219 roles='User,Admin'
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1220 )
5668
a4bb88a1a643 A fix for https://issues.roundup-tracker.org/issue2551034
John Rouillard <rouilj@ieee.org>
parents: 5656
diff changeset
1221
5728
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1222 # verify etag matches what we calculated in the past
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1223 node = self.db.user.getnode(newuser)
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1224 etag = calculate_etag(node, self.db.config['WEB_SECRET_KEY'])
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1225 items = node.items(protected=True) # include every item
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1226 print(repr(sorted(items)))
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1227 print(etag)
6256
29c6dc8ed004 Test handling of unset transitive link field.
John Rouillard <rouilj@ieee.org>
parents: 6185
diff changeset
1228 self.assertEqual(etag, '"07c3a7f214d394cf46220e294a5a53c8"')
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1229
5728
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1230 # modify key and verify we have a different etag
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1231 etag = calculate_etag(node, self.db.config['WEB_SECRET_KEY'] + "a")
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1232 items = node.items(protected=True) # include every item
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1233 print(repr(sorted(items)))
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1234 print(etag)
6256
29c6dc8ed004 Test handling of unset transitive link field.
John Rouillard <rouilj@ieee.org>
parents: 6185
diff changeset
1235 self.assertNotEqual(etag, '"07c3a7f214d394cf46220e294a5a53c8"')
5668
a4bb88a1a643 A fix for https://issues.roundup-tracker.org/issue2551034
John Rouillard <rouilj@ieee.org>
parents: 5656
diff changeset
1236
5728
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1237 # change data and verify we have a different etag
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1238 node.username="Paul"
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1239 etag = calculate_etag(node, self.db.config['WEB_SECRET_KEY'])
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1240 items = node.items(protected=True) # include every item
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1241 print(repr(sorted(items)))
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1242 print(etag)
6256
29c6dc8ed004 Test handling of unset transitive link field.
John Rouillard <rouilj@ieee.org>
parents: 6185
diff changeset
1243 self.assertEqual(etag, '"d655801d3a6d51e32891531b06ccecfa"')
5728
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1244 finally:
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1245 date.Date = originalDate
5668
a4bb88a1a643 A fix for https://issues.roundup-tracker.org/issue2551034
John Rouillard <rouilj@ieee.org>
parents: 5656
diff changeset
1246
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1247 def testEtagProcessing(self):
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1248 '''
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1249 Etags can come from two places:
5674
6dc4dba1c225 REST: Use If-Match header for incoming requests
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5673
diff changeset
1250 If-Match http header
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1251 @etags value posted in the form
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1252
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1253 Both will be checked if availble. If either one
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1254 fails, the etag check will fail.
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1255
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1256 Run over header only, etag in form only, both,
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1257 each one broke and no etag. Use the put command
5653
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
1258 to trigger the etag checking code.
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1259 '''
6539
f8df7fed18f6 issue2551175 - Make ETag content-encoding aware.
John Rouillard <rouilj@ieee.org>
parents: 6525
diff changeset
1260 for mode in ('header', 'header-gzip', 'etag', 'etag-br',
f8df7fed18f6 issue2551175 - Make ETag content-encoding aware.
John Rouillard <rouilj@ieee.org>
parents: 6525
diff changeset
1261 'both', 'brokenheader', 'brokenetag', 'none'):
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1262 try:
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1263 # clean up any old header
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1264 del(self.headers)
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1265 except AttributeError:
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1266 pass
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1267
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1268 form = cgi.FieldStorage()
5726
e199d0ae4a25 issue2551033: prevent reverse engineering hidden data by using etags
John Rouillard <rouilj@ieee.org>
parents: 5711
diff changeset
1269 etag = calculate_etag(self.db.user.getnode(self.joeid),
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1270 self.db.config['WEB_SECRET_KEY'])
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1271 form.list = [
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1272 cgi.MiniFieldStorage('data', 'Joe Doe Doe'),
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1273 ]
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1274
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1275 if mode == 'header':
5645
7f4d19867123 Make print into function call for python3 compatibility.
John Rouillard <rouilj@ieee.org>
parents: 5643
diff changeset
1276 print("Mode = %s"%mode)
5674
6dc4dba1c225 REST: Use If-Match header for incoming requests
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5673
diff changeset
1277 self.headers = {'if-match': etag}
6539
f8df7fed18f6 issue2551175 - Make ETag content-encoding aware.
John Rouillard <rouilj@ieee.org>
parents: 6525
diff changeset
1278 elif mode == 'header-gzip':
f8df7fed18f6 issue2551175 - Make ETag content-encoding aware.
John Rouillard <rouilj@ieee.org>
parents: 6525
diff changeset
1279 print("Mode = %s"%mode)
f8df7fed18f6 issue2551175 - Make ETag content-encoding aware.
John Rouillard <rouilj@ieee.org>
parents: 6525
diff changeset
1280 gzip_etag = etag[:-1] + "-gzip" + etag[-1:]
f8df7fed18f6 issue2551175 - Make ETag content-encoding aware.
John Rouillard <rouilj@ieee.org>
parents: 6525
diff changeset
1281 self.headers = {'if-match': gzip_etag}
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1282 elif mode == 'etag':
5645
7f4d19867123 Make print into function call for python3 compatibility.
John Rouillard <rouilj@ieee.org>
parents: 5643
diff changeset
1283 print("Mode = %s"%mode)
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1284 form.list.append(cgi.MiniFieldStorage('@etag', etag))
6539
f8df7fed18f6 issue2551175 - Make ETag content-encoding aware.
John Rouillard <rouilj@ieee.org>
parents: 6525
diff changeset
1285 elif mode == 'etag-br':
f8df7fed18f6 issue2551175 - Make ETag content-encoding aware.
John Rouillard <rouilj@ieee.org>
parents: 6525
diff changeset
1286 print("Mode = %s"%mode)
f8df7fed18f6 issue2551175 - Make ETag content-encoding aware.
John Rouillard <rouilj@ieee.org>
parents: 6525
diff changeset
1287 br_etag = etag[:-1] + "-br" + etag[-1:]
f8df7fed18f6 issue2551175 - Make ETag content-encoding aware.
John Rouillard <rouilj@ieee.org>
parents: 6525
diff changeset
1288 form.list.append(cgi.MiniFieldStorage('@etag', br_etag))
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1289 elif mode == 'both':
5645
7f4d19867123 Make print into function call for python3 compatibility.
John Rouillard <rouilj@ieee.org>
parents: 5643
diff changeset
1290 print("Mode = %s"%mode)
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1291 self.headers = {'etag': etag}
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1292 form.list.append(cgi.MiniFieldStorage('@etag', etag))
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1293 elif mode == 'brokenheader':
5645
7f4d19867123 Make print into function call for python3 compatibility.
John Rouillard <rouilj@ieee.org>
parents: 5643
diff changeset
1294 print("Mode = %s"%mode)
5674
6dc4dba1c225 REST: Use If-Match header for incoming requests
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5673
diff changeset
1295 self.headers = {'if-match': 'bad'}
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1296 form.list.append(cgi.MiniFieldStorage('@etag', etag))
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1297 elif mode == 'brokenetag':
5645
7f4d19867123 Make print into function call for python3 compatibility.
John Rouillard <rouilj@ieee.org>
parents: 5643
diff changeset
1298 print("Mode = %s"%mode)
5674
6dc4dba1c225 REST: Use If-Match header for incoming requests
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5673
diff changeset
1299 self.headers = {'if-match': etag}
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1300 form.list.append(cgi.MiniFieldStorage('@etag', 'bad'))
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1301 elif mode == 'none':
5645
7f4d19867123 Make print into function call for python3 compatibility.
John Rouillard <rouilj@ieee.org>
parents: 5643
diff changeset
1302 print( "Mode = %s"%mode)
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1303 else:
6539
f8df7fed18f6 issue2551175 - Make ETag content-encoding aware.
John Rouillard <rouilj@ieee.org>
parents: 6525
diff changeset
1304 self.fail("unknown mode '%s' found"%mode)
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1305
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1306 results = self.server.put_attribute(
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1307 'user', self.joeid, 'realname', form
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1308 )
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1309 if mode not in ('brokenheader', 'brokenetag', 'none'):
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1310 self.assertEqual(self.dummy_client.response_code, 200)
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1311 else:
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1312 self.assertEqual(self.dummy_client.response_code, 412)
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1313
5993
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1314 def testBinaryFieldStorage(self):
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1315 ''' attempt to exercise all paths in the BinaryFieldStorage
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1316 class
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1317 '''
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1318
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1319 expected={ "data": {
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1320 "link": "http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/issue/1",
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1321 "id": "1"
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1322 }
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1323 }
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1324
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1325 body=b'{ "title": "Joe Doe has problems", \
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1326 "nosy": [ "1", "3" ], \
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1327 "assignedto": "2", \
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1328 "abool": true, \
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1329 "afloat": 2.3, \
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1330 "anint": 567890 \
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1331 }'
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1332 env = { "CONTENT_TYPE": "application/json",
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1333 "CONTENT_LENGTH": len(body),
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1334 "REQUEST_METHOD": "POST"
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1335 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1336 self.server.client.env.update(env)
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1337
5993
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1338 headers={"accept": "application/json; version=1",
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1339 "content-type": env['CONTENT_TYPE'],
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1340 "content-length": env['CONTENT_LENGTH'],
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1341 }
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1342 self.headers=headers
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1343 # we need to generate a FieldStorage the looks like
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1344 # FieldStorage(None, None, 'string') rather than
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1345 # FieldStorage(None, None, [])
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1346 body_file=BytesIO(body) # FieldStorage needs a file
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1347 form = client.BinaryFieldStorage(body_file,
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1348 headers=headers,
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1349 environ=env)
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1350 self.server.client.request.headers.get=self.get_header
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1351 results = self.server.dispatch(env["REQUEST_METHOD"],
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1352 "/rest/data/issue",
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1353 form)
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1354 json_dict = json.loads(b2s(results))
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1355 self.assertEqual(json_dict,expected)
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1356
5690
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1357 def testDispatchPost(self):
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1358 """
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1359 run POST through rest dispatch(). This also tests
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1360 sending json payload through code as dispatch is the
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1361 code that changes json payload into something we can
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1362 process.
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1363 """
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1364
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1365 # TEST #0
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1366 # POST: issue make joe assignee and admin and demo as
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1367 # nosy
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1368 # simulate: /rest/data/issue
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1369 body=b'{ "title": "Joe Doe has problems", \
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1370 "nosy": [ "1", "3" ], \
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1371 "assignedto": "2", \
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1372 "abool": true, \
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1373 "afloat": 2.3, \
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1374 "anint": 567890 \
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1375 }'
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1376 env = { "CONTENT_TYPE": "application/json",
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1377 "CONTENT_LENGTH": len(body),
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1378 "REQUEST_METHOD": "POST"
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1379 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1380 self.server.client.env.update(env)
5690
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1381 headers={"accept": "application/json; version=1",
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1382 "content-type": env['CONTENT_TYPE'],
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1383 "content-length": env['CONTENT_LENGTH'],
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1384 }
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1385 self.headers=headers
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1386 # we need to generate a FieldStorage the looks like
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1387 # FieldStorage(None, None, 'string') rather than
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1388 # FieldStorage(None, None, [])
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1389 body_file=BytesIO(body) # FieldStorage needs a file
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1390 form = client.BinaryFieldStorage(body_file,
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1391 headers=headers,
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1392 environ=env)
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1393 self.server.client.request.headers.get=self.get_header
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1394 results = self.server.dispatch(env["REQUEST_METHOD"],
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1395 "/rest/data/issue",
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1396 form)
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1397
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1398 print(results)
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1399 self.assertEqual(self.server.client.response_code, 201)
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1400 json_dict = json.loads(b2s(results))
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1401 self.assertEqual(json_dict['data']['link'],
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1402 "http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/issue/1")
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1403 self.assertEqual(json_dict['data']['id'], "1")
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1404 self.server.client.env.update({'REQUEST_METHOD': 'GET'})
5690
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1405 results = self.server.dispatch('GET',
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1406 "/rest/data/issue/1", self.empty_form)
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1407 print(results)
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1408 json_dict = json.loads(b2s(results))
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1409 self.assertEqual(json_dict['data']['link'],
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1410 "http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/issue/1")
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1411 self.assertEqual(json_dict['data']['attributes']['abool'], True)
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1412 self.assertEqual(json_dict['data']['attributes']['afloat'], 2.3)
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1413 self.assertEqual(json_dict['data']['attributes']['anint'], 567890)
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1414 self.assertEqual(len(json_dict['data']['attributes']['nosy']), 3)
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1415 self.assertEqual(json_dict['data']['attributes']\
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1416 ['assignedto']['link'],
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1417 "http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/user/2")
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1418
6317
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1419
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1420 def testDispatchDelete(self):
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1421 """
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1422 run Delete through rest dispatch().
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1423 """
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1424
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1425 # TEST #0
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1426 # Delete class raises unauthorized error
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1427 # simulate: /rest/data/issue
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1428 env = { "REQUEST_METHOD": "DELETE"
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1429 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1430 self.server.client.env.update(env)
6317
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1431 headers={"accept": "application/json; version=1",
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1432 }
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1433 self.headers=headers
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1434 self.server.client.request.headers.get=self.get_header
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1435 results = self.server.dispatch(env["REQUEST_METHOD"],
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1436 "/rest/data/issue",
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1437 self.empty_form)
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1438
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1439 print(results)
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1440 self.assertEqual(self.server.client.response_code, 403)
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1441 json_dict = json.loads(b2s(results))
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1442
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1443 self.assertEqual(json_dict['error']['msg'],
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1444 "Deletion of a whole class disabled")
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1445
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1446
6311
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1447 def testDispatchBadContent(self):
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1448 """
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1449 runthrough rest dispatch() with bad content_type patterns.
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1450 """
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1451
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1452 # simulate: /rest/data/issue
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1453 body=b'{ "title": "Joe Doe has problems", \
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1454 "nosy": [ "1", "3" ], \
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1455 "assignedto": "2", \
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1456 "abool": true, \
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1457 "afloat": 2.3, \
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1458 "anint": 567890 \
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1459 }'
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1460 env = { "CONTENT_TYPE": "application/jzot",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1461 "CONTENT_LENGTH": len(body),
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1462 "REQUEST_METHOD": "POST"
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1463 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1464 self.server.client.env.update(env)
6311
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1465
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1466 headers={"accept": "application/json; version=1",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1467 "content-type": env['CONTENT_TYPE'],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1468 "content-length": env['CONTENT_LENGTH'],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1469 }
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1470
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1471 self.headers=headers
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1472 # we need to generate a FieldStorage the looks like
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1473 # FieldStorage(None, None, 'string') rather than
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1474 # FieldStorage(None, None, [])
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1475 body_file=BytesIO(body) # FieldStorage needs a file
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1476 form = client.BinaryFieldStorage(body_file,
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1477 headers=headers,
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1478 environ=env)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1479 self.server.client.request.headers.get=self.get_header
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1480 results = self.server.dispatch(env["REQUEST_METHOD"],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1481 "/rest/data/issue",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1482 form)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1483
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1484 print(results)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1485 self.assertEqual(self.server.client.response_code, 415)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1486 json_dict = json.loads(b2s(results))
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1487 self.assertEqual(json_dict['error']['msg'],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1488 "Unable to process input of type application/jzot")
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1489
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1490 # Test GET as well. I am not sure if this should pass or not.
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1491 # Arguably GET doesn't use any form/json input but....
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1492 results = self.server.dispatch('GET',
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1493 "/rest/data/issue",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1494 form)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1495 print(results)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1496 self.assertEqual(self.server.client.response_code, 415)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1497
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1498
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1499
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1500 def testDispatchBadAccept(self):
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1501 # simulate: /rest/data/issue expect failure unknown accept settings
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1502 body=b'{ "title": "Joe Doe has problems", \
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1503 "nosy": [ "1", "3" ], \
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1504 "assignedto": "2", \
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1505 "abool": true, \
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1506 "afloat": 2.3, \
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1507 "anint": 567890 \
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1508 }'
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1509 env = { "CONTENT_TYPE": "application/json",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1510 "CONTENT_LENGTH": len(body),
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1511 "REQUEST_METHOD": "POST"
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1512 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1513 self.server.client.env.update(env)
6311
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1514 headers={"accept": "application/zot; version=1; q=0.5",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1515 "content-type": env['CONTENT_TYPE'],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1516 "content-length": env['CONTENT_LENGTH'],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1517 }
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1518
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1519 self.headers=headers
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1520 # we need to generate a FieldStorage the looks like
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1521 # FieldStorage(None, None, 'string') rather than
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1522 # FieldStorage(None, None, [])
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1523 body_file=BytesIO(body) # FieldStorage needs a file
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1524 form = client.BinaryFieldStorage(body_file,
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1525 headers=headers,
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1526 environ=env)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1527 self.server.client.request.headers.get=self.get_header
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1528 results = self.server.dispatch(env["REQUEST_METHOD"],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1529 "/rest/data/issue",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1530 form)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1531
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1532 print(results)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1533 self.assertEqual(self.server.client.response_code, 406)
6312
6ef7b66774b4 Fix test. Env without xml fails due to added ,
John Rouillard <rouilj@ieee.org>
parents: 6311
diff changeset
1534 self.assertIn(b"Requested content type 'application/zot; version=1; q=0.5' is not available.\nAcceptable types: */*, application/json", results)
6311
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1535
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1536 # simulate: /rest/data/issue works, multiple acceptable output, one
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1537 # is valid
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1538 env = { "CONTENT_TYPE": "application/json",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1539 "CONTENT_LENGTH": len(body),
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1540 "REQUEST_METHOD": "POST"
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1541 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1542 self.server.client.env.update(env)
6311
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1543 headers={"accept": "application/zot; version=1; q=0.75, "
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1544 "application/json; version=1; q=0.5",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1545 "content-type": env['CONTENT_TYPE'],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1546 "content-length": env['CONTENT_LENGTH'],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1547 }
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1548
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1549 self.headers=headers
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1550 # we need to generate a FieldStorage the looks like
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1551 # FieldStorage(None, None, 'string') rather than
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1552 # FieldStorage(None, None, [])
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1553 body_file=BytesIO(body) # FieldStorage needs a file
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1554 form = client.BinaryFieldStorage(body_file,
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1555 headers=headers,
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1556 environ=env)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1557 self.server.client.request.headers.get=self.get_header
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1558 results = self.server.dispatch(env["REQUEST_METHOD"],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1559 "/rest/data/issue",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1560 form)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1561
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1562 print(results)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1563 self.assertEqual(self.server.client.response_code, 201)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1564 json_dict = json.loads(b2s(results))
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1565 # ERROR this should be 1. What's happening is that the code
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1566 # for handling 406 error code runs through everything and creates
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1567 # the item. Then it throws a 406 after the work is done when it
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1568 # realizes it can't respond as requested. So the 406 post above
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1569 # creates issue 1 and this one creates issue 2.
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1570 self.assertEqual(json_dict['data']['id'], "2")
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1571
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1572
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1573 # test 3 accept is empty. This triggers */* so passes
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1574 headers={"accept": "",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1575 "content-type": env['CONTENT_TYPE'],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1576 "content-length": env['CONTENT_LENGTH'],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1577 }
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1578
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1579 self.headers=headers
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1580 # we need to generate a FieldStorage the looks like
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1581 # FieldStorage(None, None, 'string') rather than
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1582 # FieldStorage(None, None, [])
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1583 body_file=BytesIO(body) # FieldStorage needs a file
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1584 form = client.BinaryFieldStorage(body_file,
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1585 headers=headers,
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1586 environ=env)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1587 self.server.client.request.headers.get=self.get_header
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1588 results = self.server.dispatch(env["REQUEST_METHOD"],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1589 "/rest/data/issue",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1590 form)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1591
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1592 print(results)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1593 self.assertEqual(self.server.client.response_code, 201)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1594 json_dict = json.loads(b2s(results))
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1595 # This is one more than above. Will need to be fixed
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1596 # When error above is fixed.
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1597 self.assertEqual(json_dict['data']['id'], "3")
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1598
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1599 # test 4 accept is random junk.
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1600 headers={"accept": "Xyzzy I am not a mime, type;",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1601 "content-type": env['CONTENT_TYPE'],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1602 "content-length": env['CONTENT_LENGTH'],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1603 }
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1604
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1605 self.headers=headers
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1606 # we need to generate a FieldStorage the looks like
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1607 # FieldStorage(None, None, 'string') rather than
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1608 # FieldStorage(None, None, [])
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1609 body_file=BytesIO(body) # FieldStorage needs a file
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1610 form = client.BinaryFieldStorage(body_file,
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1611 headers=headers,
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1612 environ=env)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1613 self.server.client.request.headers.get=self.get_header
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1614 results = self.server.dispatch(env["REQUEST_METHOD"],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1615 "/rest/data/issue",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1616 form)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1617
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1618 print(results)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1619 self.assertEqual(self.server.client.response_code, 406)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1620 json_dict = json.loads(b2s(results))
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1621 self.assertIn('Unable to parse Accept Header. Invalid media type: Xyzzy I am not a mime. Acceptable types: */* application/json', json_dict['error']['msg'])
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1622
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1623 # test 5 accept mimetype is ok, param is not
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1624 headers={"accept": "*/*; foo",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1625 "content-type": env['CONTENT_TYPE'],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1626 "content-length": env['CONTENT_LENGTH'],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1627 }
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1628
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1629 self.headers=headers
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1630 # we need to generate a FieldStorage the looks like
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1631 # FieldStorage(None, None, 'string') rather than
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1632 # FieldStorage(None, None, [])
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1633 body_file=BytesIO(body) # FieldStorage needs a file
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1634 form = client.BinaryFieldStorage(body_file,
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1635 headers=headers,
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1636 environ=env)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1637 self.server.client.request.headers.get=self.get_header
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1638 results = self.server.dispatch(env["REQUEST_METHOD"],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1639 "/rest/data/issue",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1640 form)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1641
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1642 print(results)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1643 self.assertEqual(self.server.client.response_code, 406)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1644 json_dict = json.loads(b2s(results))
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1645 self.assertIn('Unable to parse Accept Header. Invalid param: foo. Acceptable types: */* application/json', json_dict['error']['msg'])
5690
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1646
6185
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1647 def testStatsGen(self):
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1648 # check stats being returned by put and get ops
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1649 # using dispatch which parses the @stats query param
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1650
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1651 # find correct py2/py3 list comparison ignoring order
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1652 try:
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1653 list_test = self.assertCountEqual # py3
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1654 except AttributeError:
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1655 list_test = self.assertItemsEqual # py2.7+
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1656
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1657 # get stats
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1658 form = cgi.FieldStorage()
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1659 form.list = [
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1660 cgi.MiniFieldStorage('@stats', 'True'),
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1661 ]
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1662 results = self.server.dispatch('GET',
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1663 "/rest/data/user/1/realname",
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1664 form)
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1665 self.assertEqual(self.dummy_client.response_code, 200)
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1666 json_dict = json.loads(b2s(results))
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1667
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1668 # check that @stats are defined
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1669 self.assertTrue( '@stats' in json_dict['data'] )
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1670 # check that the keys are present
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1671 # not validating values as that changes
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1672 valid_fields= [ us2u('elapsed'),
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1673 us2u('cache_hits'),
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1674 us2u('cache_misses'),
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1675 us2u('get_items'),
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1676 us2u('filtering') ]
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1677 list_test(valid_fields,json_dict['data']['@stats'].keys())
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1678
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1679 # Make sure false value works to suppress @stats
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1680 form = cgi.FieldStorage()
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1681 form.list = [
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1682 cgi.MiniFieldStorage('@stats', 'False'),
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1683 ]
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1684 self.server.client.env.update({'REQUEST_METHOD': 'GET'})
6185
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1685 results = self.server.dispatch('GET',
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1686 "/rest/data/user/1/realname",
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1687 form)
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1688 self.assertEqual(self.dummy_client.response_code, 200)
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1689 json_dict = json.loads(b2s(results))
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1690 print(results)
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1691 # check that @stats are not defined
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1692 self.assertTrue( '@stats' not in json_dict['data'] )
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1693
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1694 # Make sure non-true value works to suppress @stats
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1695 # false will always work
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1696 form = cgi.FieldStorage()
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1697 form.list = [
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1698 cgi.MiniFieldStorage('@stats', 'random'),
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1699 ]
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1700 results = self.server.dispatch('GET',
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1701 "/rest/data/user/1/realname",
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1702 form)
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1703 self.assertEqual(self.dummy_client.response_code, 200)
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1704 json_dict = json.loads(b2s(results))
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1705 print(results)
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1706 # check that @stats are not defined
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1707 self.assertTrue( '@stats' not in json_dict['data'] )
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1708
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1709 # if @stats is not defined there should be no stats
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1710 results = self.server.dispatch('GET',
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1711 "/rest/data/user/1/realname",
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1712 self.empty_form)
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1713 self.assertEqual(self.dummy_client.response_code, 200)
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1714 json_dict = json.loads(b2s(results))
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1715
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1716 # check that @stats are not defined
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1717 self.assertTrue( '@stats' not in json_dict['data'] )
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1718
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1719
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1720
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1721 # change admin's realname via a normal web form
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1722 # This generates a FieldStorage that looks like:
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1723 # FieldStorage(None, None, [])
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1724 # use etag from header
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1725 #
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1726 # Also use GET on the uri via the dispatch to retrieve
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1727 # the results from the db.
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1728 etag = calculate_etag(self.db.user.getnode('1'),
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1729 self.db.config['WEB_SECRET_KEY'])
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1730 headers={"if-match": etag,
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1731 "accept": "application/vnd.json.test-v1+json",
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1732 }
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1733 form = cgi.FieldStorage()
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1734 form.list = [
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1735 cgi.MiniFieldStorage('data', 'Joe Doe'),
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1736 cgi.MiniFieldStorage('@apiver', '1'),
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1737 cgi.MiniFieldStorage('@stats', 'true'),
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1738 ]
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1739 self.headers = headers
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1740 self.server.client.request.headers.get = self.get_header
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1741 self.db.setCurrentUser('admin') # must be admin to change user
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1742 self.server.client.env.update({'REQUEST_METHOD': 'PUT'})
6185
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1743 results = self.server.dispatch('PUT',
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1744 "/rest/data/user/1/realname",
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1745 form)
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1746 self.assertEqual(self.dummy_client.response_code, 200)
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1747 json_dict = json.loads(b2s(results))
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1748 list_test(valid_fields,json_dict['data']['@stats'].keys())
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1749
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1750 def testDispatch(self):
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1751 """
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1752 run changes through rest dispatch(). This also tests
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1753 sending json payload through code as dispatch is the
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1754 code that changes json payload into something we can
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1755 process.
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1756 """
5653
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
1757 # TEST #1
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
1758 # PUT: joe's 'realname' using json data.
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1759 # simulate: /rest/data/user/<id>/realname
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1760 # use etag in header
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1761 etag = calculate_etag(self.db.user.getnode(self.joeid),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1762 self.db.config['WEB_SECRET_KEY'])
5651
a02ef29b4242 Fix REST tests for Python 3.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5650
diff changeset
1763 body=b'{ "data": "Joe Doe 1" }'
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1764 env = { "CONTENT_TYPE": "application/json",
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1765 "CONTENT_LENGTH": len(body),
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1766 "REQUEST_METHOD": "PUT",
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1767 "HTTP_ORIGIN": "https://invalid.origin"
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1768 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1769 self.server.client.env.update(env)
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1770
5686
eb51c0d9c9bf Move @apiver version extraction code after the input is parsed for
John Rouillard <rouilj@ieee.org>
parents: 5682
diff changeset
1771 headers={"accept": "application/json; version=1",
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1772 "content-type": env['CONTENT_TYPE'],
5655
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
1773 "content-length": env['CONTENT_LENGTH'],
5674
6dc4dba1c225 REST: Use If-Match header for incoming requests
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5673
diff changeset
1774 "if-match": etag
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1775 }
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1776 self.headers=headers
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1777 # we need to generate a FieldStorage the looks like
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1778 # FieldStorage(None, None, 'string') rather than
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1779 # FieldStorage(None, None, [])
5651
a02ef29b4242 Fix REST tests for Python 3.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5650
diff changeset
1780 body_file=BytesIO(body) # FieldStorage needs a file
5656
d26d2590cd8c Implement different workaround for https://bugs.python.org/issue27777
John Rouillard <rouilj@ieee.org>
parents: 5655
diff changeset
1781 form = client.BinaryFieldStorage(body_file,
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1782 headers=headers,
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1783 environ=env)
5650
e8ca7072c629 Fix Python 3 issues in REST code.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5647
diff changeset
1784 self.server.client.request.headers.get=self.get_header
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1785 results = self.server.dispatch('PUT',
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1786 "/rest/data/user/%s/realname"%self.joeid,
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1787 form)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1788
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1789 # invalid origin, no credentials allowed.
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1790 self.assertNotIn("Access-Control-Allow-Credentials",
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1791 self.server.client.additional_headers)
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1792 self.assertEqual(self.server.client.response_code, 200)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1793 results = self.server.get_element('user', self.joeid, self.empty_form)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1794 self.assertEqual(self.dummy_client.response_code, 200)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1795 self.assertEqual(results['data']['attributes']['realname'],
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1796 'Joe Doe 1')
5686
eb51c0d9c9bf Move @apiver version extraction code after the input is parsed for
John Rouillard <rouilj@ieee.org>
parents: 5682
diff changeset
1797
eb51c0d9c9bf Move @apiver version extraction code after the input is parsed for
John Rouillard <rouilj@ieee.org>
parents: 5682
diff changeset
1798
eb51c0d9c9bf Move @apiver version extraction code after the input is parsed for
John Rouillard <rouilj@ieee.org>
parents: 5682
diff changeset
1799 # substitute the version with an unacceptable version
eb51c0d9c9bf Move @apiver version extraction code after the input is parsed for
John Rouillard <rouilj@ieee.org>
parents: 5682
diff changeset
1800 # and verify it returns 400 code.
eb51c0d9c9bf Move @apiver version extraction code after the input is parsed for
John Rouillard <rouilj@ieee.org>
parents: 5682
diff changeset
1801 self.headers["accept"] = "application/json; version=1.1"
eb51c0d9c9bf Move @apiver version extraction code after the input is parsed for
John Rouillard <rouilj@ieee.org>
parents: 5682
diff changeset
1802 body_file=BytesIO(body) # FieldStorage needs a file
eb51c0d9c9bf Move @apiver version extraction code after the input is parsed for
John Rouillard <rouilj@ieee.org>
parents: 5682
diff changeset
1803 form = client.BinaryFieldStorage(body_file,
eb51c0d9c9bf Move @apiver version extraction code after the input is parsed for
John Rouillard <rouilj@ieee.org>
parents: 5682
diff changeset
1804 headers=headers,
eb51c0d9c9bf Move @apiver version extraction code after the input is parsed for
John Rouillard <rouilj@ieee.org>
parents: 5682
diff changeset
1805 environ=env)
eb51c0d9c9bf Move @apiver version extraction code after the input is parsed for
John Rouillard <rouilj@ieee.org>
parents: 5682
diff changeset
1806 self.server.client.request.headers.get=self.get_header
eb51c0d9c9bf Move @apiver version extraction code after the input is parsed for
John Rouillard <rouilj@ieee.org>
parents: 5682
diff changeset
1807 results = self.server.dispatch('PUT',
eb51c0d9c9bf Move @apiver version extraction code after the input is parsed for
John Rouillard <rouilj@ieee.org>
parents: 5682
diff changeset
1808 "/rest/data/user/%s/realname"%self.joeid,
eb51c0d9c9bf Move @apiver version extraction code after the input is parsed for
John Rouillard <rouilj@ieee.org>
parents: 5682
diff changeset
1809 form)
eb51c0d9c9bf Move @apiver version extraction code after the input is parsed for
John Rouillard <rouilj@ieee.org>
parents: 5682
diff changeset
1810 self.assertEqual(self.server.client.response_code, 400)
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1811 del(self.headers)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1812
5653
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
1813 # TEST #2
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1814 # Set joe's 'realname' using json data.
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1815 # simulate: /rest/data/user/<id>/realname
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1816 # use etag in payload
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1817 etag = calculate_etag(self.db.user.getnode(self.joeid),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1818 self.db.config['WEB_SECRET_KEY'])
5674
6dc4dba1c225 REST: Use If-Match header for incoming requests
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5673
diff changeset
1819 etagb = etag.strip ('"')
6dc4dba1c225 REST: Use If-Match header for incoming requests
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5673
diff changeset
1820 body=s2b('{ "@etag": "\\"%s\\"", "data": "Joe Doe 2" }'%etagb)
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1821 env = { "CONTENT_TYPE": "application/json",
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1822 "CONTENT_LENGTH": len(body),
5655
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
1823 "REQUEST_METHOD": "PUT",
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1824 }
5655
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
1825 self.headers=None # have FieldStorage get len from env.
5651
a02ef29b4242 Fix REST tests for Python 3.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5650
diff changeset
1826 body_file=BytesIO(body) # FieldStorage needs a file
5656
d26d2590cd8c Implement different workaround for https://bugs.python.org/issue27777
John Rouillard <rouilj@ieee.org>
parents: 5655
diff changeset
1827 form = client.BinaryFieldStorage(body_file,
5655
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
1828 headers=None,
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1829 environ=env)
5650
e8ca7072c629 Fix Python 3 issues in REST code.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5647
diff changeset
1830 self.server.client.request.headers.get=self.get_header
5655
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
1831
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
1832 headers={"accept": "application/json",
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
1833 "content-type": env['CONTENT_TYPE'],
5674
6dc4dba1c225 REST: Use If-Match header for incoming requests
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5673
diff changeset
1834 "if-match": etag
5655
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
1835 }
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
1836 self.headers=headers # set for dispatch
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
1837
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1838 results = self.server.dispatch('PUT',
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1839 "/rest/data/user/%s/realname"%self.joeid,
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1840 form)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1841
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1842 self.assertEqual(self.server.client.response_code, 200)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1843 results = self.server.get_element('user', self.joeid, self.empty_form)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1844 self.assertEqual(self.dummy_client.response_code, 200)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1845 self.assertEqual(results['data']['attributes']['realname'],
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1846 'Joe Doe 2')
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1847 del(self.headers)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1848
5653
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
1849 # TEST #3
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1850 # change Joe's realname via a normal web form
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1851 # This generates a FieldStorage that looks like:
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1852 # FieldStorage(None, None, [])
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1853 # use etag from header
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1854 #
5655
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
1855 # Also use GET on the uri via the dispatch to retrieve
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1856 # the results from the db.
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1857 etag = calculate_etag(self.db.user.getnode(self.joeid),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1858 self.db.config['WEB_SECRET_KEY'])
5674
6dc4dba1c225 REST: Use If-Match header for incoming requests
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5673
diff changeset
1859 headers={"if-match": etag,
5686
eb51c0d9c9bf Move @apiver version extraction code after the input is parsed for
John Rouillard <rouilj@ieee.org>
parents: 5682
diff changeset
1860 "accept": "application/vnd.json.test-v1+json",
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1861 }
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1862 form = cgi.FieldStorage()
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1863 form.list = [
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1864 cgi.MiniFieldStorage('data', 'Joe Doe'),
5686
eb51c0d9c9bf Move @apiver version extraction code after the input is parsed for
John Rouillard <rouilj@ieee.org>
parents: 5682
diff changeset
1865 cgi.MiniFieldStorage('@apiver', '1'),
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1866 ]
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1867 self.headers = headers
5650
e8ca7072c629 Fix Python 3 issues in REST code.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5647
diff changeset
1868 self.server.client.request.headers.get = self.get_header
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1869 results = self.server.dispatch('PUT',
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1870 "/rest/data/user/%s/realname"%self.joeid,
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1871 form)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1872 self.assertEqual(self.dummy_client.response_code, 200)
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1873 self.server.client.env.update({'REQUEST_METHOD': "GET"})
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1874 results = self.server.dispatch('GET',
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1875 "/rest/data/user/%s/realname"%self.joeid,
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1876 self.empty_form)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1877 self.assertEqual(self.dummy_client.response_code, 200)
5651
a02ef29b4242 Fix REST tests for Python 3.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5650
diff changeset
1878 json_dict = json.loads(b2s(results))
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1879
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1880 self.assertEqual(json_dict['data']['data'], 'Joe Doe')
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1881 self.assertEqual(json_dict['data']['link'],
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1882 "http://tracker.example/cgi-bin/"
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1883 "roundup.cgi/bugs/rest/data/user/3/realname")
5653
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
1884 self.assertIn(json_dict['data']['type'], ("<class 'str'>",
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
1885 "<type 'str'>"))
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1886 self.assertEqual(json_dict['data']["id"], "3")
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1887 del(self.headers)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1888
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1889
5653
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
1890 # TEST #4
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
1891 # PATCH: joe's email address with json
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1892 # save address so we can use it later
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1893 stored_results = self.server.get_element('user', self.joeid,
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1894 self.empty_form)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1895 self.assertEqual(self.dummy_client.response_code, 200)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1896
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1897 etag = calculate_etag(self.db.user.getnode(self.joeid),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1898 self.db.config['WEB_SECRET_KEY'])
5674
6dc4dba1c225 REST: Use If-Match header for incoming requests
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5673
diff changeset
1899 etagb = etag.strip ('"')
6dc4dba1c225 REST: Use If-Match header for incoming requests
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5673
diff changeset
1900 body=s2b('{ "address": "demo2@example.com", "@etag": "\\"%s\\""}'%etagb)
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1901 env = { "CONTENT_TYPE": "application/json",
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1902 "CONTENT_LENGTH": len(body),
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1903 "REQUEST_METHOD": "PATCH"
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1904 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1905 self.server.client.env.update(env)
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1906 headers={"accept": "application/json",
5655
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
1907 "content-type": env['CONTENT_TYPE'],
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
1908 "content-length": len(body)
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1909 }
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1910 self.headers=headers
5651
a02ef29b4242 Fix REST tests for Python 3.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5650
diff changeset
1911 body_file=BytesIO(body) # FieldStorage needs a file
5656
d26d2590cd8c Implement different workaround for https://bugs.python.org/issue27777
John Rouillard <rouilj@ieee.org>
parents: 5655
diff changeset
1912 form = client.BinaryFieldStorage(body_file,
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1913 headers=headers,
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1914 environ=env)
5650
e8ca7072c629 Fix Python 3 issues in REST code.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5647
diff changeset
1915 self.server.client.request.headers.get=self.get_header
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1916 results = self.server.dispatch('PATCH',
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1917 "/rest/data/user/%s"%self.joeid,
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1918 form)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1919
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1920 self.assertEqual(self.server.client.response_code, 200)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1921 results = self.server.get_element('user', self.joeid, self.empty_form)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1922 self.assertEqual(self.dummy_client.response_code, 200)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1923 self.assertEqual(results['data']['attributes']['address'],
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1924 'demo2@example.com')
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1925
5653
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
1926 # and set it back reusing env and headers from last test
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1927 etag = calculate_etag(self.db.user.getnode(self.joeid),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1928 self.db.config['WEB_SECRET_KEY'])
5674
6dc4dba1c225 REST: Use If-Match header for incoming requests
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5673
diff changeset
1929 etagb = etag.strip ('"')
6dc4dba1c225 REST: Use If-Match header for incoming requests
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5673
diff changeset
1930 body=s2b('{ "address": "%s", "@etag": "\\"%s\\""}'%(
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1931 stored_results['data']['attributes']['address'],
5674
6dc4dba1c225 REST: Use If-Match header for incoming requests
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5673
diff changeset
1932 etagb))
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1933 # reuse env and headers from prior test.
5651
a02ef29b4242 Fix REST tests for Python 3.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5650
diff changeset
1934 body_file=BytesIO(body) # FieldStorage needs a file
5656
d26d2590cd8c Implement different workaround for https://bugs.python.org/issue27777
John Rouillard <rouilj@ieee.org>
parents: 5655
diff changeset
1935 form = client.BinaryFieldStorage(body_file,
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1936 headers=headers,
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1937 environ=env)
5650
e8ca7072c629 Fix Python 3 issues in REST code.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5647
diff changeset
1938 self.server.client.request.headers.get=self.get_header
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1939 results = self.server.dispatch('PATCH',
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1940 "/rest/data/user/%s"%self.joeid,
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1941 form)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1942
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1943 self.assertEqual(self.server.client.response_code, 200)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1944 results = self.server.get_element('user', self.joeid, self.empty_form)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1945 self.assertEqual(self.dummy_client.response_code, 200)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1946 self.assertEqual(results['data']['attributes']['address'],
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1947 'random@home.org')
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1948 del(self.headers)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1949
5653
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
1950 # TEST #5
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
1951 # POST: create new issue
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
1952 # no etag needed
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
1953 etag = "not needed"
5651
a02ef29b4242 Fix REST tests for Python 3.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5650
diff changeset
1954 body=b'{ "title": "foo bar", "priority": "critical" }'
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1955 env = { "CONTENT_TYPE": "application/json",
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1956 "CONTENT_LENGTH": len(body),
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1957 "REQUEST_METHOD": "POST"
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1958 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1959 self.server.client.env.update(env)
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1960 headers={"accept": "application/json",
5655
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
1961 "content-type": env['CONTENT_TYPE'],
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
1962 "content-length": len(body)
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1963 }
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1964 self.headers=headers
5651
a02ef29b4242 Fix REST tests for Python 3.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5650
diff changeset
1965 body_file=BytesIO(body) # FieldStorage needs a file
5656
d26d2590cd8c Implement different workaround for https://bugs.python.org/issue27777
John Rouillard <rouilj@ieee.org>
parents: 5655
diff changeset
1966 form = client.BinaryFieldStorage(body_file,
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1967 headers=headers,
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1968 environ=env)
5650
e8ca7072c629 Fix Python 3 issues in REST code.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5647
diff changeset
1969 self.server.client.request.headers.get=self.get_header
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1970 results = self.server.dispatch('POST',
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1971 "/rest/data/issue",
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1972 form)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1973
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1974 self.assertEqual(self.server.client.response_code, 201)
5653
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
1975 json_dict = json.loads(b2s(results))
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1976 issue_id=json_dict['data']['id']
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1977 results = self.server.get_element('issue',
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1978 str(issue_id), # must be a string not unicode
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1979 self.empty_form)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1980 self.assertEqual(self.dummy_client.response_code, 200)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1981 self.assertEqual(results['data']['attributes']['title'],
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
1982 'foo bar')
5653
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
1983
5711
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
1984 # TEST #6
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
1985 # POST: an invalid class
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
1986 # no etag needed
5710
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
1987 etag = "not needed"
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
1988 body=b'{ "title": "foo bar", "priority": "critical" }'
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
1989 env = { "CONTENT_TYPE": "application/json",
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
1990 "CONTENT_LENGTH": len(body),
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
1991 "REQUEST_METHOD": "POST"
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
1992 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1993 self.server.client.env.update(env)
5710
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
1994 headers={"accept": "application/json",
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
1995 "content-type": env['CONTENT_TYPE'],
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
1996 "content-length": len(body)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
1997 }
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
1998 self.headers=headers
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
1999 body_file=BytesIO(body) # FieldStorage needs a file
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2000 form = client.BinaryFieldStorage(body_file,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2001 headers=headers,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2002 environ=env)
5711
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2003 self.server.client.request.headers.get=self.get_header
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2004 results = self.server.dispatch('POST',
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2005 "/rest/data/nonissue",
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2006 form)
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2007
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2008 self.assertEqual(self.server.client.response_code, 404)
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2009 json_dict = json.loads(b2s(results))
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2010 status=json_dict['error']['status']
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2011 msg=json_dict['error']['msg']
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2012 self.assertEqual(status, 404)
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2013 self.assertEqual(msg, 'Class nonissue not found')
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2014
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2015 # TEST #7
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2016 # POST: status without key field of name
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2017 # also test that version spec in accept header is accepted
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2018 # no etag needed
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2019 etag = "not needed"
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2020 body=b'{ "order": 5 }'
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2021 env = { "CONTENT_TYPE": "application/json",
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2022 "CONTENT_LENGTH": len(body),
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2023 "REQUEST_METHOD": "POST"
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2024 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2025 self.server.client.env.update(env)
5711
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2026 headers={"accept": "application/json; version=1",
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2027 "content-type": env['CONTENT_TYPE'],
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2028 "content-length": len(body)
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2029 }
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2030 self.headers=headers
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2031 body_file=BytesIO(body) # FieldStorage needs a file
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2032 form = client.BinaryFieldStorage(body_file,
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2033 headers=headers,
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2034 environ=env)
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2035 self.server.client.request.headers.get=self.get_header
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2036 self.db.setCurrentUser('admin') # must be admin to create status
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2037 results = self.server.dispatch('POST',
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2038 "/rest/data/status",
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2039 form)
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2040 self.server.client.env.update(env)
5711
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2041 self.assertEqual(self.server.client.response_code, 400)
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2042 json_dict = json.loads(b2s(results))
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2043 status=json_dict['error']['status']
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2044 msg=json_dict['error']['msg']
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2045 self.assertEqual(status, 400)
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2046 self.assertEqual(msg, "Must provide the 'name' property.")
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2047
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2048
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2049 # TEST #8
5984
25a813415d59 issue2551069 - when unsupported type is found report type
John Rouillard <rouilj@ieee.org>
parents: 5937
diff changeset
2050 # DELETE: delete issue 1 also test return type by extension
25a813415d59 issue2551069 - when unsupported type is found report type
John Rouillard <rouilj@ieee.org>
parents: 5937
diff changeset
2051 # test bogus extension as well.
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
2052 etag = calculate_etag(self.db.issue.getnode("1"),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
2053 self.db.config['WEB_SECRET_KEY'])
5711
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2054 etagb = etag.strip ('"')
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2055 env = {"CONTENT_TYPE": "application/json",
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2056 "CONTENT_LEN": 0,
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2057 "REQUEST_METHOD": "DELETE" }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2058 self.server.client.env.update(env)
5711
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2059 # use text/plain header and request json output by appending
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2060 # .json to the url.
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2061 headers={"accept": "text/plain",
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2062 "content-type": env['CONTENT_TYPE'],
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2063 "if-match": '"%s"'%etagb,
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2064 "content-length": 0,
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2065 }
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2066 self.headers=headers
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2067 body_file=BytesIO(b'') # FieldStorage needs a file
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2068 form = client.BinaryFieldStorage(body_file,
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2069 headers=headers,
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2070 environ=env)
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2071 self.server.client.request.headers.get=self.get_header
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2072 self.db.setCurrentUser('admin') # must be admin to delete issue
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2073 results = self.server.dispatch('DELETE',
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2074 "/rest/data/issue/1.json",
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2075 form)
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2076 self.assertEqual(self.server.client.response_code, 200)
5984
25a813415d59 issue2551069 - when unsupported type is found report type
John Rouillard <rouilj@ieee.org>
parents: 5937
diff changeset
2077 print(results)
5711
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2078 json_dict = json.loads(b2s(results))
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2079 status=json_dict['data']['status']
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2080 self.assertEqual(status, 'ok')
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2081
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2082 self.server.client.env.update({'REQUEST_METHOD': 'GET'})
5986
8b88fb789208 still trying to get testing to pass.
John Rouillard <rouilj@ieee.org>
parents: 5985
diff changeset
2083 results = self.server.dispatch('GET',
8b88fb789208 still trying to get testing to pass.
John Rouillard <rouilj@ieee.org>
parents: 5985
diff changeset
2084 "/rest/data/issuetitle:=asdf.jon",
5984
25a813415d59 issue2551069 - when unsupported type is found report type
John Rouillard <rouilj@ieee.org>
parents: 5937
diff changeset
2085 form)
25a813415d59 issue2551069 - when unsupported type is found report type
John Rouillard <rouilj@ieee.org>
parents: 5937
diff changeset
2086 self.assertEqual(self.server.client.response_code, 406)
25a813415d59 issue2551069 - when unsupported type is found report type
John Rouillard <rouilj@ieee.org>
parents: 5937
diff changeset
2087 print(results)
5985
f1191a470598 Fix test to account for mixxing dicttoxml.
John Rouillard <rouilj@ieee.org>
parents: 5984
diff changeset
2088 try: # only verify local copy not system installed copy
f1191a470598 Fix test to account for mixxing dicttoxml.
John Rouillard <rouilj@ieee.org>
parents: 5984
diff changeset
2089 from roundup.dicttoxml import dicttoxml
f1191a470598 Fix test to account for mixxing dicttoxml.
John Rouillard <rouilj@ieee.org>
parents: 5984
diff changeset
2090 includexml = ', application/xml'
f1191a470598 Fix test to account for mixxing dicttoxml.
John Rouillard <rouilj@ieee.org>
parents: 5984
diff changeset
2091 except ImportError:
f1191a470598 Fix test to account for mixxing dicttoxml.
John Rouillard <rouilj@ieee.org>
parents: 5984
diff changeset
2092 includexml = ''
f1191a470598 Fix test to account for mixxing dicttoxml.
John Rouillard <rouilj@ieee.org>
parents: 5984
diff changeset
2093
5984
25a813415d59 issue2551069 - when unsupported type is found report type
John Rouillard <rouilj@ieee.org>
parents: 5937
diff changeset
2094 response="Requested content type 'jon' is not available.\n" \
5985
f1191a470598 Fix test to account for mixxing dicttoxml.
John Rouillard <rouilj@ieee.org>
parents: 5984
diff changeset
2095 "Acceptable types: */*, application/json%s\n"%includexml
5987
ea3485c67f94 Sort accept keys to make p2 and p3 ordering the same
John Rouillard <rouilj@ieee.org>
parents: 5986
diff changeset
2096 self.assertEqual(b2s(results), response)
5984
25a813415d59 issue2551069 - when unsupported type is found report type
John Rouillard <rouilj@ieee.org>
parents: 5937
diff changeset
2097
5741
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2098 # TEST #9
5742
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2099 # GET: test that version can be set with accept:
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2100 # ... ; version=z
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2101 # or
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2102 # application/vnd.x.y-vz+json
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2103 # or
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2104 # @apiver
5741
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2105 # simulate: /rest/data/issue
5742
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2106 form = cgi.FieldStorage()
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2107 form.list = [
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2108 cgi.MiniFieldStorage('@apiver', 'L'),
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2109 ]
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2110
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2111 self.server.client.env.update({'REQUEST_METHOD': 'GET'})
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2112
5742
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2113 headers={"accept": "application/json; notversion=z" }
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2114 self.headers=headers
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2115 self.server.client.request.headers.get=self.get_header
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2116 results = self.server.dispatch('GET',
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2117 "/rest/data/issue/1", form)
5987
ea3485c67f94 Sort accept keys to make p2 and p3 ordering the same
John Rouillard <rouilj@ieee.org>
parents: 5986
diff changeset
2118 print("9a: " + b2s(results))
5742
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2119 json_dict = json.loads(b2s(results))
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2120 self.assertEqual(json_dict['error']['status'], 400)
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2121 self.assertEqual(json_dict['error']['msg'],
6513
1d6c986b3f72 Fix test.
John Rouillard <rouilj@ieee.org>
parents: 6512
diff changeset
2122 "Unrecognized api version: L. See /rest without "
1d6c986b3f72 Fix test.
John Rouillard <rouilj@ieee.org>
parents: 6512
diff changeset
2123 "specifying api version for supported versions.")
5742
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2124
5741
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2125 headers={"accept": "application/json; version=z" }
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2126 self.headers=headers
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2127 self.server.client.request.headers.get=self.get_header
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2128 results = self.server.dispatch('GET',
5742
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2129 "/rest/data/issue/1", form)
5987
ea3485c67f94 Sort accept keys to make p2 and p3 ordering the same
John Rouillard <rouilj@ieee.org>
parents: 5986
diff changeset
2130 print("9b: " + b2s(results))
5741
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2131 json_dict = json.loads(b2s(results))
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2132 self.assertEqual(json_dict['error']['status'], 400)
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2133 self.assertEqual(json_dict['error']['msg'],
6513
1d6c986b3f72 Fix test.
John Rouillard <rouilj@ieee.org>
parents: 6512
diff changeset
2134 "Unrecognized api version: z. See /rest without "
1d6c986b3f72 Fix test.
John Rouillard <rouilj@ieee.org>
parents: 6512
diff changeset
2135 "specifying api version for supported versions.")
5741
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2136
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2137 headers={"accept": "application/vnd.roundup.test-vz+json" }
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2138 self.headers=headers
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2139 self.server.client.request.headers.get=self.get_header
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2140 results = self.server.dispatch('GET',
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2141 "/rest/data/issue/1", self.empty_form)
5987
ea3485c67f94 Sort accept keys to make p2 and p3 ordering the same
John Rouillard <rouilj@ieee.org>
parents: 5986
diff changeset
2142 print("9c:" + b2s(results))
5741
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2143 self.assertEqual(self.server.client.response_code, 400)
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2144 json_dict = json.loads(b2s(results))
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2145 self.assertEqual(json_dict['error']['status'], 400)
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2146 self.assertEqual(json_dict['error']['msg'],
6513
1d6c986b3f72 Fix test.
John Rouillard <rouilj@ieee.org>
parents: 6512
diff changeset
2147 "Unrecognized api version: z. See /rest without "
1d6c986b3f72 Fix test.
John Rouillard <rouilj@ieee.org>
parents: 6512
diff changeset
2148 "specifying api version for supported versions.")
5741
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2149
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2150 # verify that version priority is correct; should be version=...
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2151 headers={"accept": "application/vnd.roundup.test-vz+json; version=a"
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2152 }
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2153 self.headers=headers
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2154 self.server.client.request.headers.get=self.get_header
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2155 results = self.server.dispatch('GET',
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2156 "/rest/data/issue/1", self.empty_form)
5987
ea3485c67f94 Sort accept keys to make p2 and p3 ordering the same
John Rouillard <rouilj@ieee.org>
parents: 5986
diff changeset
2157 print("9d: " + b2s(results))
5741
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2158 self.assertEqual(self.server.client.response_code, 400)
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2159 json_dict = json.loads(b2s(results))
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2160 self.assertEqual(json_dict['error']['status'], 400)
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2161 self.assertEqual(json_dict['error']['msg'],
6513
1d6c986b3f72 Fix test.
John Rouillard <rouilj@ieee.org>
parents: 6512
diff changeset
2162 "Unrecognized api version: a. See /rest without "
1d6c986b3f72 Fix test.
John Rouillard <rouilj@ieee.org>
parents: 6512
diff changeset
2163 "specifying api version for supported versions.")
5741
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2164
5742
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2165 # TEST #10
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2166 # check /rest and /rest/summary and /rest/notthere
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2167 expected_rest = {
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2168 "data": {
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2169 "supported_versions": [
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2170 1
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2171 ],
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2172 "default_version": 1,
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2173 "links": [
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2174 {
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2175 "rel": "self",
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2176 "uri": "http://tracker.example/cgi-bin/roundup.cgi/bugs/rest"
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2177 },
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2178 {
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2179 "rel": "data",
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2180 "uri": "http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data"
6525
c505c774a94d Mutiple changes to REST code.
John Rouillard <rouilj@ieee.org>
parents: 6513
diff changeset
2181 },
c505c774a94d Mutiple changes to REST code.
John Rouillard <rouilj@ieee.org>
parents: 6513
diff changeset
2182 {
c505c774a94d Mutiple changes to REST code.
John Rouillard <rouilj@ieee.org>
parents: 6513
diff changeset
2183 "rel": "summary",
c505c774a94d Mutiple changes to REST code.
John Rouillard <rouilj@ieee.org>
parents: 6513
diff changeset
2184 "uri": "http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/summary"
5742
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2185 }
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2186 ]
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2187 }
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2188 }
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2189
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2190 self.headers={}
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2191 results = self.server.dispatch('GET',
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2192 "/rest", self.empty_form)
5987
ea3485c67f94 Sort accept keys to make p2 and p3 ordering the same
John Rouillard <rouilj@ieee.org>
parents: 5986
diff changeset
2193 print("10a: " + b2s(results))
5742
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2194 self.assertEqual(self.server.client.response_code, 200)
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2195 results_dict = json.loads(b2s(results))
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2196 self.assertEqual(results_dict, expected_rest)
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2197
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2198
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2199 results = self.server.dispatch('GET',
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2200 "/rest/", self.empty_form)
5987
ea3485c67f94 Sort accept keys to make p2 and p3 ordering the same
John Rouillard <rouilj@ieee.org>
parents: 5986
diff changeset
2201 print("10b: " + b2s(results))
5742
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2202 self.assertEqual(self.server.client.response_code, 200)
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2203 results_dict = json.loads(b2s(results))
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2204 self.assertEqual(results_dict, expected_rest)
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2205
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2206 results = self.server.dispatch('GET',
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2207 "/rest/summary", self.empty_form)
5987
ea3485c67f94 Sort accept keys to make p2 and p3 ordering the same
John Rouillard <rouilj@ieee.org>
parents: 5986
diff changeset
2208 print("10c: " + b2s(results))
5742
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2209 self.assertEqual(self.server.client.response_code, 200)
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2210
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2211 results = self.server.dispatch('GET',
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2212 "/rest/summary/", self.empty_form)
5987
ea3485c67f94 Sort accept keys to make p2 and p3 ordering the same
John Rouillard <rouilj@ieee.org>
parents: 5986
diff changeset
2213 print("10d: " + b2s(results))
5742
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2214 self.assertEqual(self.server.client.response_code, 200)
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2215
5746
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2216 expected_data = {
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2217 "data": {
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2218 "issue": {
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2219 "link": "http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/issue"
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2220 },
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2221 "priority": {
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2222 "link": "http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/priority"
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2223 },
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2224 "user": {
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2225 "link": "http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/user"
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2226 },
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2227 "query": {
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2228 "link": "http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/query"
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2229 },
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2230 "status": {
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2231 "link": "http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/status"
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2232 },
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2233 "keyword": {
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2234 "link": "http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/keyword"
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2235 },
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2236 "msg": {
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2237 "link": "http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/msg"
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2238 },
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2239 "file": {
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2240 "link": "http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/file"
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2241 }
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2242 }
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2243 }
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2244
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2245 results = self.server.dispatch('GET',
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2246 "/rest/data", self.empty_form)
5987
ea3485c67f94 Sort accept keys to make p2 and p3 ordering the same
John Rouillard <rouilj@ieee.org>
parents: 5986
diff changeset
2247 print("10e: " + b2s(results))
5746
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2248 self.assertEqual(self.server.client.response_code, 200)
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2249 results_dict = json.loads(b2s(results))
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2250 self.assertEqual(results_dict, expected_data)
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2251
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2252 results = self.server.dispatch('GET',
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2253 "/rest/data/", self.empty_form)
5987
ea3485c67f94 Sort accept keys to make p2 and p3 ordering the same
John Rouillard <rouilj@ieee.org>
parents: 5986
diff changeset
2254 print("10f: " + b2s(results))
5746
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2255 self.assertEqual(self.server.client.response_code, 200)
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2256 results_dict = json.loads(b2s(results))
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2257 self.assertEqual(results_dict, expected_data)
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2258
5742
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2259 results = self.server.dispatch('GET',
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2260 "/rest/notthere", self.empty_form)
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2261 self.assertEqual(self.server.client.response_code, 404)
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2262
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2263 results = self.server.dispatch('GET',
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2264 "/rest/notthere/", self.empty_form)
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2265 self.assertEqual(self.server.client.response_code, 404)
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2266
5711
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2267 del(self.headers)
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2268
5744
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2269 def testAcceptHeaderParsing(self):
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2270 self.server.client.env['REQUEST_METHOD'] = 'GET'
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2271
5744
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2272 # TEST #1
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2273 # json highest priority
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2274 self.server.client.request.headers.get=self.get_header
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2275 headers={"accept": "application/json; version=1,"
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2276 "application/xml; q=0.5; version=2,"
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2277 "text/plain; q=0.75; version=2"
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2278 }
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2279 self.headers=headers
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2280 results = self.server.dispatch('GET',
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2281 "/rest/data/status/1",
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2282 self.empty_form)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2283 print(results)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2284 self.assertEqual(self.server.client.response_code, 200)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2285 self.assertEqual(self.server.client.additional_headers['Content-Type'],
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2286 "application/json")
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2287
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2288 # TEST #2
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2289 # text highest priority
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2290 headers={"accept": "application/json; q=0.5; version=1,"
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2291 "application/xml; q=0.25; version=2,"
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2292 "text/plain; q=1.0; version=3"
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2293 }
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2294 self.headers=headers
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2295 results = self.server.dispatch('GET',
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2296 "/rest/data/status/1",
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2297 self.empty_form)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2298 print(results)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2299 self.assertEqual(self.server.client.response_code, 200)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2300 self.assertEqual(self.server.client.additional_headers['Content-Type'],
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2301 "application/json")
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2302
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2303 # TEST #3
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2304 # no acceptable type
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2305 headers={"accept": "text/plain; q=1.0; version=2"
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2306 }
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2307 self.headers=headers
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2308 results = self.server.dispatch('GET',
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2309 "/rest/data/status/1",
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2310 self.empty_form)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2311 print(results)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2312 self.assertEqual(self.server.client.response_code, 406)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2313 self.assertEqual(self.server.client.additional_headers['Content-Type'],
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2314 "application/json")
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2315
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2316 # TEST #4
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2317 # no accept header, should use default json
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2318 headers={}
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2319 self.headers=headers
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2320 results = self.server.dispatch('GET',
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2321 "/rest/data/status/1",
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2322 self.empty_form)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2323 print(results)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2324 self.assertEqual(self.server.client.response_code, 200)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2325 self.assertEqual(self.server.client.additional_headers['Content-Type'],
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2326 "application/json")
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2327
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2328 # TEST #5
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2329 # wildcard accept header, should use default json
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2330 headers={ "accept": "*/*"}
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2331 self.headers=headers
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2332 results = self.server.dispatch('GET',
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2333 "/rest/data/status/1",
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2334 self.empty_form)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2335 print(results)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2336 self.assertEqual(self.server.client.response_code, 200)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2337 self.assertEqual(self.server.client.additional_headers['Content-Type'],
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2338 "application/json")
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2339
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2340 # TEST #6
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2341 # invalid q factor if not ignored/demoted
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2342 # application/json is selected with invalid version
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2343 # and errors.
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2344 # this ends up choosing */* which triggers json.
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2345 self.server.client.request.headers.get=self.get_header
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2346 headers={"accept": "application/json; q=1.5; version=99,"
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2347 "*/*; q=0.9; version=1,"
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2348 "text/plain; q=3.75; version=2"
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2349 }
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2350 self.headers=headers
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2351 results = self.server.dispatch('GET',
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2352 "/rest/data/status/1",
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2353 self.empty_form)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2354 print(results)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2355 self.assertEqual(self.server.client.response_code, 200)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2356 self.assertEqual(self.server.client.additional_headers['Content-Type'],
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2357 "application/json")
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2358
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2359
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2360 '''
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2361 # only works if dicttoxml.py is installed.
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2362 # not installed for testing
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2363 # TEST #7
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2364 # xml wins
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2365 headers={"accept": "application/json; q=0.5; version=2,"
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2366 "application/xml; q=0.75; version=1,"
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2367 "text/plain; q=1.0; version=2"
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2368 }
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2369 self.headers=headers
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2370 results = self.server.dispatch('GET',
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2371 "/rest/data/status/1",
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2372 self.empty_form)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2373 print(results)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2374 self.assertEqual(self.server.client.response_code, 200)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2375 self.assertEqual(self.server.client.additional_headers['Content-Type'],
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2376 "application/xml")
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2377 '''
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2378
6316
323661f7c89c Test handling of invalid API version using Accept header.
John Rouillard <rouilj@ieee.org>
parents: 6314
diff changeset
2379 # TEST #8
323661f7c89c Test handling of invalid API version using Accept header.
John Rouillard <rouilj@ieee.org>
parents: 6314
diff changeset
2380 # invalid api version
323661f7c89c Test handling of invalid API version using Accept header.
John Rouillard <rouilj@ieee.org>
parents: 6314
diff changeset
2381 # application/json is selected with invalid version
323661f7c89c Test handling of invalid API version using Accept header.
John Rouillard <rouilj@ieee.org>
parents: 6314
diff changeset
2382 self.server.client.request.headers.get=self.get_header
323661f7c89c Test handling of invalid API version using Accept header.
John Rouillard <rouilj@ieee.org>
parents: 6314
diff changeset
2383 headers={"accept": "application/json; version=99"
323661f7c89c Test handling of invalid API version using Accept header.
John Rouillard <rouilj@ieee.org>
parents: 6314
diff changeset
2384 }
323661f7c89c Test handling of invalid API version using Accept header.
John Rouillard <rouilj@ieee.org>
parents: 6314
diff changeset
2385 self.headers=headers
6509
1fc765ef6379 Fix 204 responses, hangs and crashes with REST.
John Rouillard <rouilj@ieee.org>
parents: 6366
diff changeset
2386 results = self.server.dispatch('GET',
1fc765ef6379 Fix 204 responses, hangs and crashes with REST.
John Rouillard <rouilj@ieee.org>
parents: 6366
diff changeset
2387 "/rest/data/status/1",
1fc765ef6379 Fix 204 responses, hangs and crashes with REST.
John Rouillard <rouilj@ieee.org>
parents: 6366
diff changeset
2388 self.empty_form)
6316
323661f7c89c Test handling of invalid API version using Accept header.
John Rouillard <rouilj@ieee.org>
parents: 6314
diff changeset
2389 print(results)
6509
1fc765ef6379 Fix 204 responses, hangs and crashes with REST.
John Rouillard <rouilj@ieee.org>
parents: 6366
diff changeset
2390 json_dict = json.loads(b2s(results))
1fc765ef6379 Fix 204 responses, hangs and crashes with REST.
John Rouillard <rouilj@ieee.org>
parents: 6366
diff changeset
2391 self.assertEqual(self.server.client.response_code, 400)
1fc765ef6379 Fix 204 responses, hangs and crashes with REST.
John Rouillard <rouilj@ieee.org>
parents: 6366
diff changeset
2392 self.assertEqual(self.server.client.additional_headers['Content-Type'],
1fc765ef6379 Fix 204 responses, hangs and crashes with REST.
John Rouillard <rouilj@ieee.org>
parents: 6366
diff changeset
2393 "application/json")
1fc765ef6379 Fix 204 responses, hangs and crashes with REST.
John Rouillard <rouilj@ieee.org>
parents: 6366
diff changeset
2394 self.assertEqual(json_dict['error']['msg'],
6512
b54bb529d701 Fix test.
John Rouillard <rouilj@ieee.org>
parents: 6509
diff changeset
2395 "Unrecognized api version: 99. See /rest "
b54bb529d701 Fix test.
John Rouillard <rouilj@ieee.org>
parents: 6509
diff changeset
2396 "without specifying api version for "
b54bb529d701 Fix test.
John Rouillard <rouilj@ieee.org>
parents: 6509
diff changeset
2397 "supported versions.")
6316
323661f7c89c Test handling of invalid API version using Accept header.
John Rouillard <rouilj@ieee.org>
parents: 6314
diff changeset
2398
5743
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2399 def testMethodOverride(self):
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2400 # TEST #1
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2401 # Use GET, PUT, PATCH to tunnel DELETE expect error
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2402
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2403 body=b'{ "order": 5 }'
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2404 env = { "CONTENT_TYPE": "application/json",
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2405 "CONTENT_LENGTH": len(body),
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2406 "REQUEST_METHOD": "POST"
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2407 }
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2408 body_file=BytesIO(body) # FieldStorage needs a file
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2409 self.server.client.request.headers.get=self.get_header
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2410 for method in ( "GET", "PUT", "PATCH" ):
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2411 headers={"accept": "application/json; version=1",
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2412 "content-type": env['CONTENT_TYPE'],
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2413 "content-length": len(body),
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2414 "x-http-method-override": "DElETE",
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2415 }
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2416 self.headers=headers
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2417 form = client.BinaryFieldStorage(body_file,
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2418 headers=headers,
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2419 environ=env)
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2420 self.db.setCurrentUser('admin') # must be admin to create status
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2421
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2422 self.server.client.env.update({'REQUEST_METHOD': method})
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2423
5743
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2424 results = self.server.dispatch(method,
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2425 "/rest/data/status",
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2426 form)
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2427
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2428 self.assertEqual(self.server.client.response_code, 400)
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2429 json_dict = json.loads(b2s(results))
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2430 status=json_dict['error']['status']
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2431 msg=json_dict['error']['msg']
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2432 self.assertEqual(status, 400)
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2433 self.assertEqual(msg, "X-HTTP-Method-Override: DElETE must be "
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2434 "used with POST method not %s."%method)
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2435
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2436 # TEST #2
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2437 # DELETE: delete issue 1 via post tunnel
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2438 self.assertFalse(self.db.status.is_retired("1"))
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2439 etag = calculate_etag(self.db.status.getnode("1"),
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2440 self.db.config['WEB_SECRET_KEY'])
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2441 etagb = etag.strip ('"')
5744
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2442 headers={"accept": "application/json; q=1.0, application/xml; q=0.75",
5743
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2443 "if-match": '"%s"'%etagb,
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2444 "content-length": 0,
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2445 "x-http-method-override": "DElETE"
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2446 }
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2447 self.headers=headers
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2448 body_file=BytesIO(b'') # FieldStorage needs a file
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2449 form = client.BinaryFieldStorage(body_file,
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2450 headers=headers,
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2451 environ=env)
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2452 self.server.client.request.headers.get=self.get_header
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2453 self.db.setCurrentUser('admin') # must be admin to delete issue
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2454 self.server.client.env.update({'REQUEST_METHOD': 'POST'})
5743
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2455 results = self.server.dispatch('POST',
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2456 "/rest/data/status/1",
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2457 form)
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2458 print(results)
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2459 self.assertEqual(self.server.client.response_code, 200)
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2460 json_dict = json.loads(b2s(results))
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2461 status=json_dict['data']['status']
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2462 self.assertEqual(status, 'ok')
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2463 self.assertTrue(self.db.status.is_retired("1"))
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2464
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2465
5711
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2466 def testPostPOE(self):
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2467 ''' test post once exactly: get POE url, create issue
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2468 using POE url. Use dispatch entry point.
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2469 '''
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2470 import time
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2471 # setup environment
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2472 etag = "not needed"
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2473 empty_body=b''
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2474 env = { "CONTENT_TYPE": "application/json",
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2475 "CONTENT_LENGTH": len(empty_body),
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2476 "REQUEST_METHOD": "POST"
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2477 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2478 self.server.client.env.update(env)
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2479
5711
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2480 headers={"accept": "application/json",
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2481 "content-type": env['CONTENT_TYPE'],
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2482 "content-length": len(empty_body)
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2483 }
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2484 self.headers=headers
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2485 # use empty_body to test code path for missing/empty json
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2486 body_file=BytesIO(empty_body) # FieldStorage needs a file
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2487 form = client.BinaryFieldStorage(body_file,
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2488 headers=headers,
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2489 environ=env)
5710
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2490
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2491 ## Obtain the POE url.
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2492 self.server.client.request.headers.get=self.get_header
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2493 results = self.server.dispatch('POST',
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2494 "/rest/data/issue/@poe",
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2495 form)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2496
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2497 self.assertEqual(self.server.client.response_code, 200)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2498 json_dict = json.loads(b2s(results))
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2499 url=json_dict['data']['link']
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2500
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2501 # strip tracker web prefix leaving leading /.
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2502 url = url[len(self.db.config['TRACKER_WEB'])-1:]
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2503
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2504 ## create an issue using poe url.
5711
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2505 body=b'{ "title": "foo bar", "priority": "critical" }'
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2506 env = { "CONTENT_TYPE": "application/json",
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2507 "CONTENT_LENGTH": len(body),
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2508 "REQUEST_METHOD": "POST"
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2509 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2510 self.server.client.env.update(env)
5711
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2511 headers={"accept": "application/json",
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2512 "content-type": env['CONTENT_TYPE'],
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2513 "content-length": len(body)
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2514 }
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2515 self.headers=headers
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2516 body_file=BytesIO(body) # FieldStorage needs a file
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2517 form = client.BinaryFieldStorage(body_file,
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2518 headers=headers,
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2519 environ=env)
5710
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2520 self.server.client.request.headers.get=self.get_header
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2521 results = self.server.dispatch('POST',
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2522 url,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2523 form)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2524
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2525 self.assertEqual(self.server.client.response_code, 201)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2526 json_dict = json.loads(b2s(results))
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2527 issue_id=json_dict['data']['id']
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2528 results = self.server.get_element('issue',
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2529 str(issue_id), # must be a string not unicode
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2530 self.empty_form)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2531 self.assertEqual(self.dummy_client.response_code, 200)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2532 self.assertEqual(results['data']['attributes']['title'],
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2533 'foo bar')
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2534
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2535 ## Reuse POE url. It will fail.
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2536 self.server.client.request.headers.get=self.get_header
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2537 results = self.server.dispatch('POST',
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2538 url,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2539 form)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2540 # get the last component stripping the trailing /
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2541 poe=url[url.rindex('/')+1:]
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2542 self.assertEqual(self.server.client.response_code, 400)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2543 results = json.loads(b2s(results))
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2544 self.assertEqual(results['error']['status'], 400)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2545 self.assertEqual(results['error']['msg'],
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2546 "POE token \'%s\' not valid."%poe)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2547
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2548 ## Try using GET on POE url. Should fail with method not
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2549 ## allowed (405)
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2550 self.server.client.env.update({'REQUEST_METHOD': 'GET'})
5710
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2551 self.server.client.request.headers.get=self.get_header
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2552 results = self.server.dispatch('GET',
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2553 "/rest/data/issue/@poe",
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2554 form)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2555 self.assertEqual(self.server.client.response_code, 405)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2556
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2557
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2558 ## Try creating generic POE url.
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2559 body_poe=b'{"generic": "null", "lifetime": "100" }'
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2560 body_file=BytesIO(body_poe) # FieldStorage needs a file
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2561 form = client.BinaryFieldStorage(body_file,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2562 headers=headers,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2563 environ=env)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2564 self.server.client.request.headers.get=self.get_header
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2565 self.server.client.env.update({'REQUEST_METHOD': 'POST'})
5710
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2566 results = self.server.dispatch('POST',
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2567 "/rest/data/issue/@poe",
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2568 form)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2569 json_dict = json.loads(b2s(results))
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2570 url=json_dict['data']['link']
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2571
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2572 # strip tracker web prefix leaving leading /.
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2573 url = url[len(self.db.config['TRACKER_WEB'])-1:]
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2574 url = url.replace('/issue/', '/keyword/')
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2575
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2576 body_keyword=b'{"name": "keyword"}'
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2577 body_file=BytesIO(body_keyword) # FieldStorage needs a file
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2578 form = client.BinaryFieldStorage(body_file,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2579 headers=headers,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2580 environ=env)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2581 results = self.server.dispatch('POST',
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2582 url,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2583 form)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2584 self.assertEqual(self.server.client.response_code, 201)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2585 json_dict = json.loads(b2s(results))
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2586 url=json_dict['data']['link']
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2587 id=json_dict['data']['id']
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2588 self.assertEqual(id, "1")
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2589 self.assertEqual(url, "http://tracker.example/cgi-bin/roundup.cgi/bugs/rest/data/keyword/1")
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2590
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2591 ## Create issue POE url and try to use for keyword.
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2592 ## This should fail.
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2593 body_poe=b'{"lifetime": "100" }'
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2594 body_file=BytesIO(body_poe) # FieldStorage needs a file
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2595 form = client.BinaryFieldStorage(body_file,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2596 headers=headers,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2597 environ=env)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2598 self.server.client.request.headers.get=self.get_header
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2599 results = self.server.dispatch('POST',
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2600 "/rest/data/issue/@poe",
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2601 form)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2602 json_dict = json.loads(b2s(results))
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2603 url=json_dict['data']['link']
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2604
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2605 # strip tracker web prefix leaving leading /.
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2606 url = url[len(self.db.config['TRACKER_WEB'])-1:]
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2607 url = url.replace('/issue/', '/keyword/')
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2608
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2609 body_keyword=b'{"name": "keyword"}'
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2610 body_file=BytesIO(body_keyword) # FieldStorage needs a file
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2611 form = client.BinaryFieldStorage(body_file,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2612 headers=headers,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2613 environ=env)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2614 results = self.server.dispatch('POST',
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2615 url,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2616 form)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2617 poe=url[url.rindex('/')+1:]
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2618 self.assertEqual(self.server.client.response_code, 400)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2619 json_dict = json.loads(b2s(results))
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2620 stat=json_dict['error']['status']
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2621 msg=json_dict['error']['msg']
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2622 self.assertEqual(stat, 400)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2623 self.assertEqual(msg, "POE token '%s' not valid for keyword, was generated for class issue"%poe)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2624
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2625
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2626 ## Create POE with 10 minute lifetime and verify
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2627 ## expires is within 10 minutes.
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2628 body_poe=b'{"lifetime": "30" }'
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2629 body_file=BytesIO(body_poe) # FieldStorage needs a file
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2630 form = client.BinaryFieldStorage(body_file,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2631 headers=headers,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2632 environ=env)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2633 self.server.client.request.headers.get=self.get_header
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2634 results = self.server.dispatch('POST',
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2635 "/rest/data/issue/@poe",
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2636 form)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2637 json_dict = json.loads(b2s(results))
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2638 expires=int(json_dict['data']['expires'])
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2639 # allow up to 3 seconds between time stamp creation
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2640 # done under dispatch and this point.
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2641 expected=int(time.time() + 30)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2642 print("expected=%d, expires=%d"%(expected,expires))
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2643 self.assertTrue((expected - expires) < 3 and (expected - expires) >= 0)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2644
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2645
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2646 ## Use a token created above as joe by a different user.
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2647 self.db.setCurrentUser('admin')
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2648 url=json_dict['data']['link']
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2649 # strip tracker web prefix leaving leading /.
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2650 url = url[len(self.db.config['TRACKER_WEB'])-1:]
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2651 body_file=BytesIO(body_keyword) # FieldStorage needs a file
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2652 form = client.BinaryFieldStorage(body_file,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2653 headers=headers,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2654 environ=env)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2655 results = self.server.dispatch('POST',
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2656 url,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2657 form)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2658 print(results)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2659 self.assertEqual(self.server.client.response_code, 400)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2660 json_dict = json.loads(b2s(results))
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2661 # get the last component stripping the trailing /
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2662 poe=url[url.rindex('/')+1:]
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2663 self.assertEqual(json_dict['error']['msg'],
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2664 "POE token '%s' not valid."%poe)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2665
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2666 ## Create POE with bogus lifetime
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2667 body_poe=b'{"lifetime": "10.2" }'
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2668 body_file=BytesIO(body_poe) # FieldStorage needs a file
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2669 form = client.BinaryFieldStorage(body_file,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2670 headers=headers,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2671 environ=env)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2672 self.server.client.request.headers.get=self.get_header
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2673 results = self.server.dispatch('POST',
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2674 "/rest/data/issue/@poe",
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2675 form)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2676 self.assertEqual(self.server.client.response_code, 400)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2677 print(results)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2678 json_dict = json.loads(b2s(results))
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2679 self.assertEqual(json_dict['error']['msg'],
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2680 "Value \'lifetime\' must be an integer specify "
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2681 "lifetime in seconds. Got 10.2.")
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2682
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2683 ## Create POE with lifetime > 1 hour
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2684 body_poe=b'{"lifetime": "3700" }'
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2685 body_file=BytesIO(body_poe) # FieldStorage needs a file
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2686 form = client.BinaryFieldStorage(body_file,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2687 headers=headers,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2688 environ=env)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2689 self.server.client.request.headers.get=self.get_header
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2690 results = self.server.dispatch('POST',
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2691 "/rest/data/issue/@poe",
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2692 form)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2693 self.assertEqual(self.server.client.response_code, 400)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2694 print(results)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2695 json_dict = json.loads(b2s(results))
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2696 self.assertEqual(json_dict['error']['msg'],
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2697 "Value 'lifetime' must be between 1 second and 1 "
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2698 "hour (3600 seconds). Got 3700.")
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2699
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2700 ## Create POE with lifetime < 1 second
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2701 body_poe=b'{"lifetime": "-1" }'
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2702 body_file=BytesIO(body_poe) # FieldStorage needs a file
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2703 form = client.BinaryFieldStorage(body_file,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2704 headers=headers,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2705 environ=env)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2706 self.server.client.request.headers.get=self.get_header
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2707 results = self.server.dispatch('POST',
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2708 "/rest/data/issue/@poe",
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2709 form)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2710 self.assertEqual(self.server.client.response_code, 400)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2711 print(results)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2712 json_dict = json.loads(b2s(results))
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2713 self.assertEqual(json_dict['error']['msg'],
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2714 "Value 'lifetime' must be between 1 second and 1 "
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2715 "hour (3600 seconds). Got -1.")
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2716 del(self.headers)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2717
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2718 def testPutElement(self):
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2719 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2720 Change joe's 'realname'
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2721 Check if we can't change admin's detail
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2722 """
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2723 # fail to change Joe's realname via attribute uri
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2724 # no etag
5585
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
2725 form = cgi.FieldStorage()
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
2726 form.list = [
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
2727 cgi.MiniFieldStorage('data', 'Joe Doe Doe')
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
2728 ]
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2729 results = self.server.put_attribute(
5585
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
2730 'user', self.joeid, 'realname', form
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
2731 )
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2732 self.assertEqual(self.dummy_client.response_code, 412)
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2733 results = self.server.get_attribute(
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2734 'user', self.joeid, 'realname', self.empty_form
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2735 )
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2736 self.assertEqual(self.dummy_client.response_code, 200)
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2737 self.assertEqual(results['data']['data'], 'Joe Random')
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2738
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2739 # change Joe's realname via attribute uri - etag in header
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2740 form = cgi.FieldStorage()
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
2741 etag = calculate_etag(self.db.user.getnode(self.joeid),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
2742 self.db.config['WEB_SECRET_KEY'])
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2743 form.list = [
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2744 cgi.MiniFieldStorage('data', 'Joe Doe Doe'),
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2745 ]
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2746
5674
6dc4dba1c225 REST: Use If-Match header for incoming requests
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5673
diff changeset
2747 self.headers = {'if-match': etag } # use etag in header
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2748 results = self.server.put_attribute(
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2749 'user', self.joeid, 'realname', form
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2750 )
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2751 self.assertEqual(self.dummy_client.response_code, 200)
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2752 results = self.server.get_attribute(
5591
a25d79e874cb Added filtering and pagination
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5588
diff changeset
2753 'user', self.joeid, 'realname', self.empty_form
5585
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
2754 )
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2755 self.assertEqual(self.dummy_client.response_code, 200)
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2756 self.assertEqual(results['data']['data'], 'Joe Doe Doe')
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2757 del(self.headers)
5585
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
2758
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2759 # Reset joe's 'realname'. etag in body
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2760 # Also try to set protected items. The protected items should
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2761 # be ignored on put_element to make it easy to get the item
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2762 # with all fields, change one field and put the result without
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2763 # having to filter out protected items.
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2764 form = cgi.FieldStorage()
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
2765 etag = calculate_etag(self.db.user.getnode(self.joeid),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
2766 self.db.config['WEB_SECRET_KEY'])
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2767 form.list = [
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2768 cgi.MiniFieldStorage('creator', '3'),
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2769 cgi.MiniFieldStorage('realname', 'Joe Doe'),
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2770 cgi.MiniFieldStorage('@etag', etag)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2771 ]
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2772 results = self.server.put_element('user', self.joeid, form)
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2773 self.assertEqual(self.dummy_client.response_code, 200)
5591
a25d79e874cb Added filtering and pagination
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5588
diff changeset
2774 results = self.server.get_element('user', self.joeid, self.empty_form)
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2775 self.assertEqual(self.dummy_client.response_code, 200)
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2776 self.assertEqual(results['data']['attributes']['realname'], 'Joe Doe')
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2777
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2778 # We are joe, so check we can't change admin's details
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2779 results = self.server.put_element('user', '1', form)
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2780 self.assertEqual(self.dummy_client.response_code, 403)
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2781 self.assertEqual(results['error']['status'], 403)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2782
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2783 # Try to reset joe's 'realname' and add a broken prop.
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2784 # This should result in no change to the name and
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2785 # a 400 UsageError stating prop does not exist.
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2786 form = cgi.FieldStorage()
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
2787 etag = calculate_etag(self.db.user.getnode(self.joeid),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
2788 self.db.config['WEB_SECRET_KEY'])
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2789 form.list = [
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2790 cgi.MiniFieldStorage('JustKidding', '3'),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2791 cgi.MiniFieldStorage('realname', 'Joe Doe'),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2792 cgi.MiniFieldStorage('@etag', etag)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2793 ]
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2794 results = self.server.put_element('user', self.joeid, form)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2795 expected= {'error': {'status': 400,
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2796 'msg': UsageError('Property JustKidding not '
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2797 'found in class user')}}
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2798 self.assertEqual(results['error']['status'],
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2799 expected['error']['status'])
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2800 self.assertEqual(type(results['error']['msg']),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2801 type(expected['error']['msg']))
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2802 self.assertEqual(self.dummy_client.response_code, 400)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2803 results = self.server.get_element('user', self.joeid, self.empty_form)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2804 self.assertEqual(self.dummy_client.response_code, 200)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2805 self.assertEqual(results['data']['attributes']['realname'], 'Joe Doe')
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2806
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2807 def testPutAttribute(self):
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2808 # put protected property
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2809 # make sure we don't have permission issues
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2810 self.db.setCurrentUser('admin')
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2811 form = cgi.FieldStorage()
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
2812 etag = calculate_etag(self.db.user.getnode(self.joeid),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
2813 self.db.config['WEB_SECRET_KEY'])
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2814 form.list = [
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2815 cgi.MiniFieldStorage('data', '3'),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2816 cgi.MiniFieldStorage('@etag', etag)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2817 ]
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2818 results = self.server.put_attribute(
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2819 'user', self.joeid, 'creator', form
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2820 )
5707
f9a762678af6 Change some 400 errors to 405 (method not allowed) errors where user is
John Rouillard <rouilj@ieee.org>
parents: 5706
diff changeset
2821 expected= {'error': {'status': 405, 'msg':
f9a762678af6 Change some 400 errors to 405 (method not allowed) errors where user is
John Rouillard <rouilj@ieee.org>
parents: 5706
diff changeset
2822 AttributeError('\'"creator", "actor", "creation" and '
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2823 '"activity" are reserved\'')}}
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2824 print(results)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2825 self.assertEqual(results['error']['status'],
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2826 expected['error']['status'])
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2827 self.assertEqual(type(results['error']['msg']),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2828 type(expected['error']['msg']))
5707
f9a762678af6 Change some 400 errors to 405 (method not allowed) errors where user is
John Rouillard <rouilj@ieee.org>
parents: 5706
diff changeset
2829 self.assertEqual(self.dummy_client.response_code, 405)
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2830
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2831 # put invalid property
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2832 # make sure we don't have permission issues
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2833 self.db.setCurrentUser('admin')
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2834 form = cgi.FieldStorage()
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
2835 etag = calculate_etag(self.db.user.getnode(self.joeid),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
2836 self.db.config['WEB_SECRET_KEY'])
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2837 form.list = [
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2838 cgi.MiniFieldStorage('data', '3'),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2839 cgi.MiniFieldStorage('@etag', etag)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2840 ]
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2841 results = self.server.put_attribute(
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2842 'user', self.joeid, 'youMustBeKiddingMe', form
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2843 )
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2844 expected= {'error': {'status': 400,
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2845 'msg': UsageError("'youMustBeKiddingMe' "
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2846 "is not a property of user")}}
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2847 print(results)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2848 self.assertEqual(results['error']['status'],
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2849 expected['error']['status'])
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2850 self.assertEqual(type(results['error']['msg']),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2851 type(expected['error']['msg']))
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2852 self.assertEqual(self.dummy_client.response_code, 400)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2853
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2854 def testPost(self):
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2855 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2856 Post a new issue with title: foo
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2857 Verify the information of the created issue
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2858 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2859 form = cgi.FieldStorage()
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2860 form.list = [
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2861 cgi.MiniFieldStorage('title', 'foo')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2862 ]
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2863 results = self.server.post_collection('issue', form)
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2864 self.assertEqual(self.dummy_client.response_code, 201)
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2865 issueid = results['data']['id']
5591
a25d79e874cb Added filtering and pagination
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5588
diff changeset
2866 results = self.server.get_element('issue', issueid, self.empty_form)
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2867 self.assertEqual(self.dummy_client.response_code, 200)
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2868 self.assertEqual(results['data']['attributes']['title'], 'foo')
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2869 self.assertEqual(self.db.issue.get(issueid, "tx_Source"), 'web')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2870
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2871 def testPostFile(self):
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2872 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2873 Post a new file with content: hello\r\nthere
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2874 Verify the information of the created file
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2875 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2876 form = cgi.FieldStorage()
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2877 form.list = [
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2878 cgi.MiniFieldStorage('content', 'hello\r\nthere')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2879 ]
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2880 results = self.server.post_collection('file', form)
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2881 self.assertEqual(self.dummy_client.response_code, 201)
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2882 fileid = results['data']['id']
5591
a25d79e874cb Added filtering and pagination
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5588
diff changeset
2883 results = self.server.get_element('file', fileid, self.empty_form)
a25d79e874cb Added filtering and pagination
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5588
diff changeset
2884 results = results['data']
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2885 self.assertEqual(self.dummy_client.response_code, 200)
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
2886 self.assertEqual(results['attributes']['content'],
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
2887 {'link': 'http://tracker.example/cgi-bin/roundup.cgi/bugs/file1/'})
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
2888
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
2889 # File content is only shown with verbose=3
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
2890 form = cgi.FieldStorage()
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
2891 form.list = [
6317
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
2892 cgi.MiniFieldStorage('@verbose', '3'),
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
2893 cgi.MiniFieldStorage('@protected', 'true')
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
2894 ]
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
2895 results = self.server.get_element('file', fileid, form)
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
2896 results = results['data']
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
2897 self.assertEqual(self.dummy_client.response_code, 200)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2898 self.assertEqual(results['attributes']['content'], 'hello\r\nthere')
6317
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
2899 self.assertIn('creator', results['attributes']) # added by @protected
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
2900 self.assertEqual(results['attributes']['creator']['username'], "joe")
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2901
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2902 def testAuthDeniedPut(self):
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2903 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2904 Test unauthorized PUT request
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2905 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2906 # Wrong permissions (caught by roundup security module).
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2907 form = cgi.FieldStorage()
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2908 form.list = [
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2909 cgi.MiniFieldStorage('realname', 'someone')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2910 ]
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2911 results = self.server.put_element('user', '1', form)
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2912 self.assertEqual(self.dummy_client.response_code, 403)
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2913 self.assertEqual(results['error']['status'], 403)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2914
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2915 def testAuthDeniedPost(self):
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2916 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2917 Test unauthorized POST request
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2918 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2919 form = cgi.FieldStorage()
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2920 form.list = [
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2921 cgi.MiniFieldStorage('username', 'blah')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2922 ]
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2923 results = self.server.post_collection('user', form)
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2924 self.assertEqual(self.dummy_client.response_code, 403)
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2925 self.assertEqual(results['error']['status'], 403)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2926
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2927 def testAuthAllowedPut(self):
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2928 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2929 Test authorized PUT request
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2930 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2931 self.db.setCurrentUser('admin')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2932 form = cgi.FieldStorage()
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2933 form.list = [
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2934 cgi.MiniFieldStorage('realname', 'someone')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2935 ]
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2936 try:
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2937 self.server.put_element('user', '2', form)
5602
c40d04915e23 Python3 fixes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5601
diff changeset
2938 except Unauthorised as err:
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2939 self.fail('raised %s' % err)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2940 finally:
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2941 self.db.setCurrentUser('joe')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2942
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2943 def testAuthAllowedPost(self):
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2944 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2945 Test authorized POST request
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2946 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2947 self.db.setCurrentUser('admin')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2948 form = cgi.FieldStorage()
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2949 form.list = [
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2950 cgi.MiniFieldStorage('username', 'blah')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2951 ]
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2952 try:
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2953 self.server.post_collection('user', form)
5602
c40d04915e23 Python3 fixes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5601
diff changeset
2954 except Unauthorised as err:
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2955 self.fail('raised %s' % err)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2956 finally:
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2957 self.db.setCurrentUser('joe')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
2958
5585
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
2959 def testDeleteAttributeUri(self):
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
2960 """
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
2961 Test Delete an attribute
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
2962 """
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
2963 self.maxDiff = 4000
5585
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
2964 # create a new issue with userid 1 in the nosy list
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
2965 issue_id = self.db.issue.create(title='foo', nosy=['1'])
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
2966
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2967 # No etag, so this should return 412 - Precondition Failed
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2968 # With no changes
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2969 results = self.server.delete_attribute(
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2970 'issue', issue_id, 'nosy', self.empty_form
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2971 )
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2972 self.assertEqual(self.dummy_client.response_code, 412)
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2973 results = self.server.get_element('issue', issue_id, self.empty_form)
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2974 results = results['data']
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2975 self.assertEqual(self.dummy_client.response_code, 200)
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2976 self.assertEqual(len(results['attributes']['nosy']), 1)
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
2977 self.assertListEqual(results['attributes']['nosy'],
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
2978 [{'id': '1', 'link': self.url_pfx + 'user/1'}])
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2979
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2980 form = cgi.FieldStorage()
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
2981 etag = calculate_etag(self.db.issue.getnode(issue_id),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
2982 self.db.config['WEB_SECRET_KEY'])
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2983 form.list.append(cgi.MiniFieldStorage('@etag', etag))
5585
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
2984 # remove the title and nosy
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2985 results = self.server.delete_attribute(
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2986 'issue', issue_id, 'title', form
5585
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
2987 )
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2988 self.assertEqual(self.dummy_client.response_code, 200)
5585
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
2989
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2990 del(form.list[-1])
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
2991 etag = calculate_etag(self.db.issue.getnode(issue_id),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
2992 self.db.config['WEB_SECRET_KEY'])
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2993 form.list.append(cgi.MiniFieldStorage('@etag', etag))
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2994 results = self.server.delete_attribute(
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
2995 'issue', issue_id, 'nosy', form
5585
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
2996 )
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
2997 self.assertEqual(self.dummy_client.response_code, 200)
5585
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
2998
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
2999 # verify the result
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3000 results = self.server.get_element('issue', issue_id, self.terse_form)
5591
a25d79e874cb Added filtering and pagination
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5588
diff changeset
3001 results = results['data']
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3002 self.assertEqual(self.dummy_client.response_code, 200)
5585
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
3003 self.assertEqual(len(results['attributes']['nosy']), 0)
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
3004 self.assertListEqual(results['attributes']['nosy'], [])
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
3005 self.assertEqual(results['attributes']['title'], None)
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
3006
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3007 # delete protected property
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3008 etag = calculate_etag(self.db.issue.getnode(issue_id),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3009 self.db.config['WEB_SECRET_KEY'])
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3010 form.list.append(cgi.MiniFieldStorage('@etag', etag))
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3011 results = self.server.delete_attribute(
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3012 'issue', issue_id, 'creator', form
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3013 )
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3014 expected= {'error': {
5707
f9a762678af6 Change some 400 errors to 405 (method not allowed) errors where user is
John Rouillard <rouilj@ieee.org>
parents: 5706
diff changeset
3015 'status': 405,
f9a762678af6 Change some 400 errors to 405 (method not allowed) errors where user is
John Rouillard <rouilj@ieee.org>
parents: 5706
diff changeset
3016 'msg': AttributeError("Attribute 'creator' can not be updated for class issue.")
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3017 }}
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3018
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3019 self.assertEqual(results['error']['status'],
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3020 expected['error']['status'])
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3021 self.assertEqual(type(results['error']['msg']),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3022 type(expected['error']['msg']))
5707
f9a762678af6 Change some 400 errors to 405 (method not allowed) errors where user is
John Rouillard <rouilj@ieee.org>
parents: 5706
diff changeset
3023 self.assertEqual(self.dummy_client.response_code, 405)
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3024
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3025 # delete required property
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3026 etag = calculate_etag(self.db.issue.getnode(issue_id),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3027 self.db.config['WEB_SECRET_KEY'])
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3028 form.list.append(cgi.MiniFieldStorage('@etag', etag))
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3029 results = self.server.delete_attribute(
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3030 'issue', issue_id, 'requireme', form
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3031 )
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3032 expected= {'error': {'status': 400,
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3033 'msg': UsageError("Attribute 'requireme' is "
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3034 "required by class issue and can not be deleted.")}}
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3035 print(results)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3036 self.assertEqual(results['error']['status'],
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3037 expected['error']['status'])
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3038 self.assertEqual(type(results['error']['msg']),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3039 type(expected['error']['msg']))
5706
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3040 self.assertEqual(str(results['error']['msg']),
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3041 str(expected['error']['msg']))
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3042 self.assertEqual(self.dummy_client.response_code, 400)
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3043
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3044 # delete bogus property
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3045 etag = calculate_etag(self.db.issue.getnode(issue_id),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3046 self.db.config['WEB_SECRET_KEY'])
5706
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3047 form.list.append(cgi.MiniFieldStorage('@etag', etag))
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3048 results = self.server.delete_attribute(
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3049 'issue', issue_id, 'nosuchprop', form
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3050 )
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3051 expected= {'error': {'status': 400,
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3052 'msg': UsageError("Attribute 'nosuchprop' not valid "
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3053 "for class issue.")}}
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3054 print(results)
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3055 self.assertEqual(results['error']['status'],
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3056 expected['error']['status'])
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3057 self.assertEqual(type(results['error']['msg']),
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3058 type(expected['error']['msg']))
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3059 self.assertEqual(str(results['error']['msg']),
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3060 str(expected['error']['msg']))
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3061 self.assertEqual(self.dummy_client.response_code, 400)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3062
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3063 def testPatchAdd(self):
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3064 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3065 Test Patch op 'Add'
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3066 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3067 # create a new issue with userid 1 in the nosy list
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3068 issue_id = self.db.issue.create(title='foo', nosy=['1'])
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3069
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3070 # fail to add userid 2 to the nosy list
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3071 # no etag
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3072 form = cgi.FieldStorage()
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3073 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3074 cgi.MiniFieldStorage('@op', 'add'),
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3075 cgi.MiniFieldStorage('nosy', '2')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3076 ]
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3077 results = self.server.patch_element('issue', issue_id, form)
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3078 self.assertEqual(self.dummy_client.response_code, 412)
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3079
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3080 etag = calculate_etag(self.db.issue.getnode(issue_id),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3081 self.db.config['WEB_SECRET_KEY'])
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3082 form = cgi.FieldStorage()
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3083 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3084 cgi.MiniFieldStorage('@op', 'add'),
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3085 cgi.MiniFieldStorage('nosy', '2'),
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3086 cgi.MiniFieldStorage('@etag', etag)
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3087 ]
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3088 results = self.server.patch_element('issue', issue_id, form)
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3089 self.assertEqual(self.dummy_client.response_code, 200)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3090
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3091 # verify the result
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3092 results = self.server.get_element('issue', issue_id, self.terse_form)
5591
a25d79e874cb Added filtering and pagination
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5588
diff changeset
3093 results = results['data']
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3094 self.assertEqual(self.dummy_client.response_code, 200)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3095 self.assertListEqual(results['attributes']['nosy'], ['1', '2'])
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3096
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3097 etag = calculate_etag(self.db.issue.getnode(issue_id),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3098 self.db.config['WEB_SECRET_KEY'])
5706
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3099 form = cgi.FieldStorage()
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3100 form.list = [
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3101 cgi.MiniFieldStorage('@op', 'add'),
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3102 cgi.MiniFieldStorage('data', '3'),
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3103 cgi.MiniFieldStorage('@etag', etag)
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3104 ]
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3105 results = self.server.patch_attribute('issue', issue_id, 'nosy', form)
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3106 self.assertEqual(self.dummy_client.response_code, 200)
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3107
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3108 # verify the result
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3109 results = self.server.get_element('issue', issue_id, self.terse_form)
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3110 results = results['data']
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3111 self.assertEqual(self.dummy_client.response_code, 200)
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3112 self.assertListEqual(results['attributes']['nosy'], ['1', '2', '3'])
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3113
6350
6a69584d117e Remove length checks. We check list content explicitly.
John Rouillard <rouilj@ieee.org>
parents: 6318
diff changeset
3114
5747
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3115 # patch with no new_val/data
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3116 etag = calculate_etag(self.db.issue.getnode(issue_id),
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3117 self.db.config['WEB_SECRET_KEY'])
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3118 form = cgi.FieldStorage()
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3119 form.list = [
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3120 cgi.MiniFieldStorage('@op', 'add'),
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3121 cgi.MiniFieldStorage('data', ''),
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3122 cgi.MiniFieldStorage('@etag', etag)
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3123 ]
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3124 results = self.server.patch_attribute('issue', issue_id, 'nosy', form)
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3125 self.assertEqual(self.dummy_client.response_code, 200)
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3126
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3127 # verify the result
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3128 results = self.server.get_element('issue', issue_id, self.terse_form)
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3129 results = results['data']
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3130 self.assertEqual(self.dummy_client.response_code, 200)
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3131 self.assertListEqual(results['attributes']['nosy'], ['1', '2', '3'])
5706
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3132
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3133 # patch invalid property
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3134 etag = calculate_etag(self.db.issue.getnode(issue_id),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3135 self.db.config['WEB_SECRET_KEY'])
5706
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3136 form = cgi.FieldStorage()
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3137 form.list = [
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3138 cgi.MiniFieldStorage('@op', 'add'),
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3139 cgi.MiniFieldStorage('data', '3'),
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3140 cgi.MiniFieldStorage('@etag', etag)
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3141 ]
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3142 results = self.server.patch_attribute('issue', issue_id, 'notGoingToWork', form)
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3143 self.assertEqual(self.dummy_client.response_code, 400)
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3144 print(results)
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3145 expected={'error': {'status': 400,
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3146 'msg': UsageError(
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3147 HyperdbValueError(
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3148 "'notGoingToWork' is not a property of issue",),)}}
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3149 self.assertEqual(results['error']['status'],
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3150 expected['error']['status'])
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3151 self.assertEqual(type(results['error']['msg']),
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3152 type(expected['error']['msg']))
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3153 self.assertEqual(str(results['error']['msg']),
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3154 str(expected['error']['msg']))
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3155
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3156 def testPatchReplace(self):
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3157 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3158 Test Patch op 'Replace'
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3159 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3160 # create a new issue with userid 1 in the nosy list and status = 1
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3161 issue_id = self.db.issue.create(title='foo', nosy=['1'], status='1')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3162
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3163 # fail to replace userid 2 to the nosy list and status = 3
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3164 # no etag.
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3165 form = cgi.FieldStorage()
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3166 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3167 cgi.MiniFieldStorage('@op', 'replace'),
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3168 cgi.MiniFieldStorage('nosy', '2'),
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3169 cgi.MiniFieldStorage('status', '3')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3170 ]
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3171 results = self.server.patch_element('issue', issue_id, form)
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3172 self.assertEqual(self.dummy_client.response_code, 412)
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3173 results = self.server.get_element('issue', issue_id, self.terse_form)
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3174 results = results['data']
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3175 self.assertEqual(self.dummy_client.response_code, 200)
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3176 self.assertEqual(results['attributes']['status'], '1')
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3177 self.assertListEqual(results['attributes']['nosy'], ['1'])
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3178
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3179 # replace userid 2 to the nosy list and status = 3
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3180 etag = calculate_etag(self.db.issue.getnode(issue_id),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3181 self.db.config['WEB_SECRET_KEY'])
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3182 form = cgi.FieldStorage()
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3183 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3184 cgi.MiniFieldStorage('@op', 'replace'),
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3185 cgi.MiniFieldStorage('nosy', '2'),
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3186 cgi.MiniFieldStorage('status', '3'),
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3187 cgi.MiniFieldStorage('@etag', etag)
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3188 ]
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3189 results = self.server.patch_element('issue', issue_id, form)
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3190 self.assertEqual(self.dummy_client.response_code, 200)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3191 # verify the result
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3192 results = self.server.get_element('issue', issue_id, self.terse_form)
5591
a25d79e874cb Added filtering and pagination
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5588
diff changeset
3193 results = results['data']
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3194 self.assertEqual(self.dummy_client.response_code, 200)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3195 self.assertEqual(results['attributes']['status'], '3')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3196 self.assertListEqual(results['attributes']['nosy'], ['2'])
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3197
5706
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3198 # replace status = 2 using status attribute
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3199 etag = calculate_etag(self.db.issue.getnode(issue_id),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3200 self.db.config['WEB_SECRET_KEY'])
5706
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3201 form = cgi.FieldStorage()
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3202 form.list = [
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3203 cgi.MiniFieldStorage('@op', 'replace'),
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3204 cgi.MiniFieldStorage('data', '2'),
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3205 cgi.MiniFieldStorage('@etag', etag)
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3206 ]
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3207 results = self.server.patch_attribute('issue', issue_id, 'status',
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3208 form)
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3209 self.assertEqual(self.dummy_client.response_code, 200)
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3210 # verify the result
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3211 results = self.server.get_element('issue', issue_id, self.terse_form)
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3212 results = results['data']
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3213 self.assertEqual(self.dummy_client.response_code, 200)
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3214 self.assertEqual(results['attributes']['status'], '2')
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3215
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3216 # try to set a protected prop. It should fail.
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3217 etag = calculate_etag(self.db.issue.getnode(issue_id),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3218 self.db.config['WEB_SECRET_KEY'])
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3219 form = cgi.FieldStorage()
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3220 form.list = [
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3221 cgi.MiniFieldStorage('@op', 'replace'),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3222 cgi.MiniFieldStorage('creator', '2'),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3223 cgi.MiniFieldStorage('@etag', etag)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3224 ]
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3225 results = self.server.patch_element('issue', issue_id, form)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3226 expected= {'error': {'status': 400,
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3227 'msg': KeyError('"creator", "actor", "creation" and "activity" are reserved',)}}
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3228 print(results)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3229 self.assertEqual(results['error']['status'],
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3230 expected['error']['status'])
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3231 self.assertEqual(type(results['error']['msg']),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3232 type(expected['error']['msg']))
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3233 self.assertEqual(str(results['error']['msg']),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3234 str(expected['error']['msg']))
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3235 self.assertEqual(self.dummy_client.response_code, 400)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3236
5708
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3237 # try to set a protected prop using patch_attribute. It should
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3238 # fail with a 405 bad/unsupported method.
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3239 etag = calculate_etag(self.db.issue.getnode(issue_id),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3240 self.db.config['WEB_SECRET_KEY'])
5708
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3241 form = cgi.FieldStorage()
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3242 form.list = [
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3243 cgi.MiniFieldStorage('@op', 'replace'),
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3244 cgi.MiniFieldStorage('data', '2'),
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3245 cgi.MiniFieldStorage('@etag', etag)
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3246 ]
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3247 results = self.server.patch_attribute('issue', issue_id, 'creator',
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3248 form)
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3249 expected= {'error': {'status': 405,
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3250 'msg': AttributeError("Attribute 'creator' can not be updated for class issue.",)}}
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3251 print(results)
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3252 self.assertEqual(results['error']['status'],
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3253 expected['error']['status'])
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3254 self.assertEqual(type(results['error']['msg']),
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3255 type(expected['error']['msg']))
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3256 self.assertEqual(str(results['error']['msg']),
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3257 str(expected['error']['msg']))
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3258 self.assertEqual(self.dummy_client.response_code, 405)
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3259
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3260 def testPatchRemoveAll(self):
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3261 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3262 Test Patch Action 'Remove'
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3263 """
5595
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3264 # create a new issue with userid 1 and 2 in the nosy list
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3265 issue_id = self.db.issue.create(title='foo', nosy=['1', '2'])
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3266
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3267 # fail to remove the nosy list and the title
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3268 # no etag
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3269 form = cgi.FieldStorage()
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3270 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3271 cgi.MiniFieldStorage('@op', 'remove'),
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3272 cgi.MiniFieldStorage('nosy', ''),
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3273 cgi.MiniFieldStorage('title', '')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3274 ]
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3275 results = self.server.patch_element('issue', issue_id, form)
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3276 self.assertEqual(self.dummy_client.response_code, 412)
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3277 results = self.server.get_element('issue', issue_id, self.terse_form)
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3278 results = results['data']
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3279 self.assertEqual(self.dummy_client.response_code, 200)
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3280 self.assertEqual(results['attributes']['title'], 'foo')
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3281 self.assertEqual(len(results['attributes']['nosy']), 2)
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3282 self.assertEqual(results['attributes']['nosy'], ['1', '2'])
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3283
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3284 # remove the nosy list and the title
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3285 form = cgi.FieldStorage()
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3286 etag = calculate_etag(self.db.issue.getnode(issue_id),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3287 self.db.config['WEB_SECRET_KEY'])
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3288 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3289 cgi.MiniFieldStorage('@op', 'remove'),
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3290 cgi.MiniFieldStorage('nosy', ''),
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3291 cgi.MiniFieldStorage('title', ''),
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3292 cgi.MiniFieldStorage('@etag', etag)
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3293 ]
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3294 results = self.server.patch_element('issue', issue_id, form)
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3295 self.assertEqual(self.dummy_client.response_code, 200)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3296
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3297 # verify the result
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3298 results = self.server.get_element('issue', issue_id, self.terse_form)
5591
a25d79e874cb Added filtering and pagination
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5588
diff changeset
3299 results = results['data']
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3300 self.assertEqual(self.dummy_client.response_code, 200)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3301 self.assertEqual(results['attributes']['title'], None)
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3302 self.assertEqual(len(results['attributes']['nosy']), 0)
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3303 self.assertEqual(results['attributes']['nosy'], [])
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3304
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3305 # try to remove a protected prop. It should fail.
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3306 etag = calculate_etag(self.db.issue.getnode(issue_id),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3307 self.db.config['WEB_SECRET_KEY'])
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3308 form = cgi.FieldStorage()
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3309 form.list = [
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3310 cgi.MiniFieldStorage('@op', 'remove'),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3311 cgi.MiniFieldStorage('creator', '2'),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3312 cgi.MiniFieldStorage('@etag', etag)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3313 ]
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3314 results = self.server.patch_element('issue', issue_id, form)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3315 expected= {'error': {'status': 400,
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3316 'msg': KeyError('"creator", "actor", "creation" and "activity" are reserved',)}}
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3317 print(results)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3318 self.assertEqual(results['error']['status'],
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3319 expected['error']['status'])
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3320 self.assertEqual(type(results['error']['msg']),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3321 type(expected['error']['msg']))
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3322 self.assertEqual(str(results['error']['msg']),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3323 str(expected['error']['msg']))
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3324 self.assertEqual(self.dummy_client.response_code, 400)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3325
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3326 # try to remove a required prop. it should fail
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3327 etag = calculate_etag(self.db.issue.getnode(issue_id),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3328 self.db.config['WEB_SECRET_KEY'])
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3329 form.list = [
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3330 cgi.MiniFieldStorage('@op', 'remove'),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3331 cgi.MiniFieldStorage('requireme', ''),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3332 cgi.MiniFieldStorage('@etag', etag)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3333 ]
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3334 results = self.server.patch_element('issue', issue_id, form)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3335 expected= {'error': {'status': 400,
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3336 'msg': UsageError("Attribute 'requireme' is required by class issue and can not be removed.")
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3337 }}
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3338 print(results)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3339 self.assertEqual(results['error']['status'],
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3340 expected['error']['status'])
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3341 self.assertEqual(type(results['error']['msg']),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3342 type(expected['error']['msg']))
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3343 self.assertEqual(str(results['error']['msg']),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3344 str(expected['error']['msg']))
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3345 self.assertEqual(self.dummy_client.response_code, 400)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3346
5599
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3347 def testPatchAction(self):
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3348 """
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3349 Test Patch Action 'Action'
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3350 """
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3351 # create a new issue with userid 1 and 2 in the nosy list
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3352 issue_id = self.db.issue.create(title='foo')
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3353
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3354 # fail to execute action retire
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3355 # no etag
5599
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3356 form = cgi.FieldStorage()
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3357 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3358 cgi.MiniFieldStorage('@op', 'action'),
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3359 cgi.MiniFieldStorage('@action_name', 'retire')
5599
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3360 ]
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3361 results = self.server.patch_element('issue', issue_id, form)
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3362 self.assertEqual(self.dummy_client.response_code, 412)
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3363 self.assertFalse(self.db.issue.is_retired(issue_id))
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3364
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3365 # execute action retire
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3366 form = cgi.FieldStorage()
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3367 etag = calculate_etag(self.db.issue.getnode(issue_id),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3368 self.db.config['WEB_SECRET_KEY'])
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3369 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3370 cgi.MiniFieldStorage('@op', 'action'),
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3371 cgi.MiniFieldStorage('@action_name', 'retire'),
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3372 cgi.MiniFieldStorage('@etag', etag)
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3373 ]
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3374 results = self.server.patch_element('issue', issue_id, form)
5599
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3375 self.assertEqual(self.dummy_client.response_code, 200)
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3376
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3377 # verify the result
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3378 self.assertTrue(self.db.issue.is_retired(issue_id))
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3379
5747
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3380 # execute action restore
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3381 form = cgi.FieldStorage()
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3382 etag = calculate_etag(self.db.issue.getnode(issue_id),
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3383 self.db.config['WEB_SECRET_KEY'])
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3384 form.list = [
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3385 cgi.MiniFieldStorage('@op', 'action'),
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3386 cgi.MiniFieldStorage('@action_name', 'restore'),
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3387 cgi.MiniFieldStorage('@etag', etag)
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3388 ]
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3389 results = self.server.patch_element('issue', issue_id, form)
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3390 self.assertEqual(self.dummy_client.response_code, 200)
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3391
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3392 # verify the result
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3393 self.assertTrue(not self.db.issue.is_retired(issue_id))
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3394
6318
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3395 def testPatchBadAction(self):
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3396 """
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3397 Test Patch Action 'Unknown'
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3398 """
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3399 # create a new issue with userid 1 and 2 in the nosy list
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3400 issue_id = self.db.issue.create(title='foo')
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3401
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3402 # execute action retire
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3403 form = cgi.FieldStorage()
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3404 etag = calculate_etag(self.db.issue.getnode(issue_id),
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3405 self.db.config['WEB_SECRET_KEY'])
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3406 form.list = [
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3407 cgi.MiniFieldStorage('@op', 'action'),
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3408 cgi.MiniFieldStorage('@action_name', 'unknown'),
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3409 cgi.MiniFieldStorage('@etag', etag)
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3410 ]
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3411 results = self.server.patch_element('issue', issue_id, form)
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3412 self.assertEqual(self.dummy_client.response_code, 400)
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3413 # verify the result, note order of allowed elements changes
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3414 # for python2/3 so just check prefix.
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3415 self.assertIn('action "unknown" is not supported, allowed: ',
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3416 results['error']['msg'].args[0])
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3417
5595
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3418 def testPatchRemove(self):
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3419 """
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3420 Test Patch Action 'Remove' only some element from a list
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3421 """
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3422 # create a new issue with userid 1, 2, 3 in the nosy list
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3423 issue_id = self.db.issue.create(title='foo', nosy=['1', '2', '3'])
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3424
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3425 # fail to remove the nosy list and the title
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3426 # no etag
5595
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3427 form = cgi.FieldStorage()
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3428 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3429 cgi.MiniFieldStorage('@op', 'remove'),
5595
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3430 cgi.MiniFieldStorage('nosy', '1, 2'),
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3431 ]
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3432 results = self.server.patch_element('issue', issue_id, form)
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3433 self.assertEqual(self.dummy_client.response_code, 412)
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3434 results = self.server.get_element('issue', issue_id, self.terse_form)
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3435 results = results['data']
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3436 self.assertEqual(self.dummy_client.response_code, 200)
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3437 self.assertEqual(len(results['attributes']['nosy']), 3)
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3438 self.assertEqual(results['attributes']['nosy'], ['1', '2', '3'])
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3439
5747
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3440 # remove 1 and 2 from the nosy list
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3441 form = cgi.FieldStorage()
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3442 etag = calculate_etag(self.db.issue.getnode(issue_id),
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3443 self.db.config['WEB_SECRET_KEY'])
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3444 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3445 cgi.MiniFieldStorage('@op', 'remove'),
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3446 cgi.MiniFieldStorage('nosy', '1, 2'),
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3447 cgi.MiniFieldStorage('@etag', etag)
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3448 ]
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3449 results = self.server.patch_element('issue', issue_id, form)
5595
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3450 self.assertEqual(self.dummy_client.response_code, 200)
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3451
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3452 # verify the result
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3453 results = self.server.get_element('issue', issue_id, self.terse_form)
5595
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3454 results = results['data']
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3455 self.assertEqual(self.dummy_client.response_code, 200)
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3456 self.assertEqual(len(results['attributes']['nosy']), 1)
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3457 self.assertEqual(results['attributes']['nosy'], ['3'])
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3458
5747
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3459 # delete last element: 3
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3460 etag = calculate_etag(self.db.issue.getnode(issue_id),
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3461 self.db.config['WEB_SECRET_KEY'])
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3462 form = cgi.FieldStorage()
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3463 form.list = [
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3464 cgi.MiniFieldStorage('@op', 'remove'),
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3465 cgi.MiniFieldStorage('data', '3'),
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3466 cgi.MiniFieldStorage('@etag', etag)
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3467 ]
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3468 results = self.server.patch_attribute('issue', issue_id, 'nosy', form)
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3469 self.assertEqual(self.dummy_client.response_code, 200)
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3470
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3471 # verify the result
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3472 results = self.server.get_element('issue', issue_id, self.terse_form)
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3473 results = results['data']
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3474 self.assertEqual(self.dummy_client.response_code, 200)
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3475 self.assertEqual(len(results['attributes']['nosy']), 0)
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3476 self.assertListEqual(results['attributes']['nosy'], [])
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3477
7156
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3478 def testRestExposeHeaders(self):
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3479
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3480 local_client = self.server.client
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3481 body = b'{ "data": "Joe Doe 1" }'
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3482 env = { "CONTENT_TYPE": "application/json",
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3483 "CONTENT_LENGTH": len(body),
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3484 "REQUEST_METHOD": "PUT",
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3485 "HTTP_ORIGIN": "http://tracker.example"
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3486 }
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3487 local_client.env.update(env)
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3488
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3489 local_client.db.config["WEB_ALLOWED_API_ORIGINS"] = " * "
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3490
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3491 headers={"accept": "application/json; version=1",
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3492 "content-type": env['CONTENT_TYPE'],
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3493 "content-length": env['CONTENT_LENGTH'],
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3494 "origin": env['HTTP_ORIGIN']
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3495 }
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3496 self.headers=headers
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3497 # we need to generate a FieldStorage the looks like
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3498 # FieldStorage(None, None, 'string') rather than
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3499 # FieldStorage(None, None, [])
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3500 body_file=BytesIO(body) # FieldStorage needs a file
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3501 form = client.BinaryFieldStorage(body_file,
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3502 headers=headers,
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3503 environ=env)
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3504 local_client.request.headers.get=self.get_header
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3505 results = self.server.dispatch('PUT',
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3506 "/rest/data/user/%s/realname"%self.joeid,
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3507 form)
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3508
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3509 for header in [ "X-RateLimit-Limit",
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3510 "X-RateLimit-Remaining",
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3511 "X-RateLimit-Reset",
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3512 "X-RateLimit-Limit-Period",
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3513 "Retry-After",
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3514 "Sunset",
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3515 "Allow",
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3516 ]:
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3517 self.assertIn(
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3518 header,
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3519 self.server.client.additional_headers[
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3520 "Access-Control-Expose-Headers"])
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3521
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3522 def testRestMatchWildcardOrigin(self):
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3523 # cribbed from testDispatch #1
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3524 # PUT: joe's 'realname' using json data.
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3525 # simulate: /rest/data/user/<id>/realname
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3526 # use etag in header
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3527
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3528 # verify that credential header is missing, valid allow origin
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3529 # header and vary includes origin.
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3530
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3531 local_client = self.server.client
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3532 etag = calculate_etag(self.db.user.getnode(self.joeid),
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3533 self.db.config['WEB_SECRET_KEY'])
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3534 body = b'{ "data": "Joe Doe 1" }'
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3535 env = { "CONTENT_TYPE": "application/json",
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3536 "CONTENT_LENGTH": len(body),
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3537 "REQUEST_METHOD": "PUT",
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3538 "HTTP_ORIGIN": "https://bad.origin"
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3539 }
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3540 local_client.env.update(env)
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3541
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3542 local_client.db.config["WEB_ALLOWED_API_ORIGINS"] = " * "
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3543
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3544 headers={"accept": "application/json; version=1",
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3545 "content-type": env['CONTENT_TYPE'],
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3546 "content-length": env['CONTENT_LENGTH'],
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3547 "if-match": etag,
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3548 "origin": env['HTTP_ORIGIN']
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3549 }
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3550 self.headers=headers
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3551 # we need to generate a FieldStorage the looks like
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3552 # FieldStorage(None, None, 'string') rather than
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3553 # FieldStorage(None, None, [])
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3554 body_file=BytesIO(body) # FieldStorage needs a file
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3555 form = client.BinaryFieldStorage(body_file,
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3556 headers=headers,
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3557 environ=env)
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3558 local_client.request.headers.get=self.get_header
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3559 results = self.server.dispatch('PUT',
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3560 "/rest/data/user/%s/realname"%self.joeid,
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3561 form)
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3562
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3563 self.assertNotIn("Access-Control-Allow-Credentials",
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3564 local_client.additional_headers)
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3565
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3566 self.assertIn("Access-Control-Allow-Origin",
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3567 local_client.additional_headers)
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3568 self.assertEqual(
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3569 headers['origin'],
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3570 local_client.additional_headers["Access-Control-Allow-Origin"])
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3571
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3572
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3573 self.assertIn("Vary", local_client.additional_headers)
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3574 self.assertIn("Origin",
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3575 local_client.additional_headers['Vary'])
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3576
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3577 self.assertEqual(local_client.response_code, 200)
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3578 results = self.server.get_element('user', self.joeid, self.empty_form)
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3579 self.assertEqual(self.dummy_client.response_code, 200)
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3580 self.assertEqual(results['data']['attributes']['realname'],
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3581 'Joe Doe 1')
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3582
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3583 @skip_jwt
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3584 def test_expired_jwt(self):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3585 # self.dummy_client.main() closes database, so
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3586 # we need a new test with setup called for each test
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3587 out = []
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3588 def wh(s):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3589 out.append(s)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3590
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3591 secret = self.db.config.WEB_JWT_SECRET
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3592
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3593 # verify library and tokens are correct
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3594 self.assertRaises(jwt.exceptions.InvalidTokenError,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3595 jwt.decode, self.jwt['expired'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3596 secret, algorithms=['HS256'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3597 audience=self.db.config.TRACKER_WEB,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3598 issuer=self.db.config.TRACKER_WEB)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3599
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3600 result = jwt.decode(self.jwt['user'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3601 secret, algorithms=['HS256'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3602 audience=self.db.config.TRACKER_WEB,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3603 issuer=self.db.config.TRACKER_WEB)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3604 self.assertEqual(self.claim['user'],result)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3605
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3606 result = jwt.decode(self.jwt['user:email'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3607 secret, algorithms=['HS256'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3608 audience=self.db.config.TRACKER_WEB,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3609 issuer=self.db.config.TRACKER_WEB)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3610 self.assertEqual(self.claim['user:email'],result)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3611
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3612 # set environment for all jwt tests
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3613 env = {
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3614 'PATH_INFO': 'rest/data/user',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3615 'HTTP_HOST': 'localhost',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3616 'TRACKER_NAME': 'rounduptest',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3617 "REQUEST_METHOD": "GET"
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3618 }
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3619 self.dummy_client = client.Client(self.instance, MockNull(), env,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3620 [], None)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3621 self.dummy_client.db = self.db
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3622 self.dummy_client.request.headers.get = self.get_header
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3623 self.empty_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3624 self.terse_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3625 self.terse_form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3626 cgi.MiniFieldStorage('@verbose', '0'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3627 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3628 self.dummy_client.form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3629 self.dummy_client.form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3630 cgi.MiniFieldStorage('@fields', 'username,address'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3631 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3632 # accumulate json output for further analysis
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3633 self.dummy_client.write = wh
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3634
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3635 # set up for expired token first
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3636 env['HTTP_AUTHORIZATION'] = 'bearer %s'%self.jwt['expired']
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3637 self.dummy_client.main()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3638
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3639 # this will be the admin still as auth failed
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3640 self.assertEqual('1', self.db.getuid())
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3641 self.assertEqual(out[0], b'Invalid Login - Signature has expired')
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3642 del(out[0])
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3643
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3644
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3645 @skip_jwt
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3646 def test_user_jwt(self):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3647 # self.dummy_client.main() closes database, so
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3648 # we need a new test with setup called for each test
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3649 out = []
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3650 def wh(s):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3651 out.append(s)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3652
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3653 secret = self.db.config.WEB_JWT_SECRET
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3654
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3655 # verify library and tokens are correct
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3656 self.assertRaises(jwt.exceptions.InvalidTokenError,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3657 jwt.decode, self.jwt['expired'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3658 secret, algorithms=['HS256'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3659 audience=self.db.config.TRACKER_WEB,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3660 issuer=self.db.config.TRACKER_WEB)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3661
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3662 result = jwt.decode(self.jwt['user'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3663 secret, algorithms=['HS256'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3664 audience=self.db.config.TRACKER_WEB,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3665 issuer=self.db.config.TRACKER_WEB)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3666 self.assertEqual(self.claim['user'],result)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3667
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3668 result = jwt.decode(self.jwt['user:email'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3669 secret, algorithms=['HS256'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3670 audience=self.db.config.TRACKER_WEB,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3671 issuer=self.db.config.TRACKER_WEB)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3672 self.assertEqual(self.claim['user:email'],result)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3673
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3674 # set environment for all jwt tests
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3675 env = {
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3676 'PATH_INFO': 'rest/data/user',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3677 'HTTP_HOST': 'localhost',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3678 'TRACKER_NAME': 'rounduptest',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3679 "REQUEST_METHOD": "GET"
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3680 }
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3681 self.dummy_client = client.Client(self.instance, MockNull(), env,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3682 [], None)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3683 self.dummy_client.db = self.db
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3684 self.dummy_client.request.headers.get = self.get_header
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3685 self.empty_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3686 self.terse_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3687 self.terse_form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3688 cgi.MiniFieldStorage('@verbose', '0'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3689 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3690 self.dummy_client.form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3691 self.dummy_client.form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3692 cgi.MiniFieldStorage('@fields', 'username,address'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3693 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3694 # accumulate json output for further analysis
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3695 self.dummy_client.write = wh
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3696
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3697 # set up for standard user role token
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3698 env['HTTP_AUTHORIZATION'] = 'bearer %s'%self.jwt['user']
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3699 self.dummy_client.main()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3700 print(out[0])
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3701 json_dict = json.loads(b2s(out[0]))
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3702 print(json_dict)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3703 # user will be joe id 3 as auth works
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3704 self.assertTrue('3', self.db.getuid())
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3705 # there should be three items in the collection admin, anon, and joe
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3706 self.assertEqual(3, len(json_dict['data']['collection']))
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3707 # since this token has no access to email addresses, only joe
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3708 # should have email addresses. Order is by id by default.
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3709 self.assertFalse('address' in json_dict['data']['collection'][0])
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3710 self.assertFalse('address' in json_dict['data']['collection'][1])
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3711 self.assertTrue('address' in json_dict['data']['collection'][2])
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3712 del(out[0])
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3713 self.db.setCurrentUser('admin')
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3714
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3715 @skip_jwt
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3716 def test_user_email_jwt(self):
5879
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3717 '''tests "Rest Access" permission present case'''
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3718 # self.dummy_client.main() closes database, so
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3719 # we need a new test with setup called for each test
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3720 out = []
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3721 def wh(s):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3722 out.append(s)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3723
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3724 secret = self.db.config.WEB_JWT_SECRET
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3725
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3726 # verify library and tokens are correct
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3727 self.assertRaises(jwt.exceptions.InvalidTokenError,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3728 jwt.decode, self.jwt['expired'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3729 secret, algorithms=['HS256'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3730 audience=self.db.config.TRACKER_WEB,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3731 issuer=self.db.config.TRACKER_WEB)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3732
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3733 result = jwt.decode(self.jwt['user'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3734 secret, algorithms=['HS256'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3735 audience=self.db.config.TRACKER_WEB,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3736 issuer=self.db.config.TRACKER_WEB)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3737 self.assertEqual(self.claim['user'],result)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3738
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3739 result = jwt.decode(self.jwt['user:email'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3740 secret, algorithms=['HS256'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3741 audience=self.db.config.TRACKER_WEB,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3742 issuer=self.db.config.TRACKER_WEB)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3743 self.assertEqual(self.claim['user:email'],result)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3744
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3745 # set environment for all jwt tests
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3746 env = {
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3747 'PATH_INFO': 'rest/data/user',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3748 'HTTP_HOST': 'localhost',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3749 'TRACKER_NAME': 'rounduptest',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3750 "REQUEST_METHOD": "GET"
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3751 }
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3752 self.dummy_client = client.Client(self.instance, MockNull(), env,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3753 [], None)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3754 self.dummy_client.db = self.db
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3755 self.dummy_client.request.headers.get = self.get_header
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3756 self.empty_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3757 self.terse_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3758 self.terse_form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3759 cgi.MiniFieldStorage('@verbose', '0'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3760 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3761 self.dummy_client.form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3762 self.dummy_client.form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3763 cgi.MiniFieldStorage('@fields', 'username,address'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3764 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3765 # accumulate json output for further analysis
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3766 self.dummy_client.write = wh
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3767
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3768 # set up for limited user:email role token
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3769 env['HTTP_AUTHORIZATION'] = 'bearer %s'%self.jwt['user:email']
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3770 self.dummy_client.main()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3771 json_dict = json.loads(b2s(out[0]))
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3772 print(json_dict)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3773 # user will be joe id 3 as auth works
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3774 self.assertTrue('3', self.db.getuid())
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3775 # there should be three items in the collection admin, anon, and joe
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3776 self.assertEqual(3, len(json_dict['data']['collection']))
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3777 # However this token has access to email addresses, so all three
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3778 # should have email addresses. Order is by id by default.
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3779 self.assertTrue('address' in json_dict['data']['collection'][0])
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3780 self.assertTrue('address' in json_dict['data']['collection'][1])
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3781 self.assertTrue('address' in json_dict['data']['collection'][2])
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3782
5879
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3783 @skip_jwt
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3784 def test_user_emailnorest_jwt(self):
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3785 '''tests "Rest Access" permission missing case'''
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3786 # self.dummy_client.main() closes database, so
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3787 # we need a new test with setup called for each test
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3788 out = []
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3789 def wh(s):
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3790 out.append(s)
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3791
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3792 secret = self.db.config.WEB_JWT_SECRET
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3793
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3794 # verify library and tokens are correct
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3795 self.assertRaises(jwt.exceptions.InvalidTokenError,
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3796 jwt.decode, self.jwt['expired'],
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3797 secret, algorithms=['HS256'],
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3798 audience=self.db.config.TRACKER_WEB,
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3799 issuer=self.db.config.TRACKER_WEB)
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3800
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3801 result = jwt.decode(self.jwt['user'],
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3802 secret, algorithms=['HS256'],
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3803 audience=self.db.config.TRACKER_WEB,
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3804 issuer=self.db.config.TRACKER_WEB)
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3805 self.assertEqual(self.claim['user'],result)
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3806
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3807 result = jwt.decode(self.jwt['user:email'],
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3808 secret, algorithms=['HS256'],
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3809 audience=self.db.config.TRACKER_WEB,
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3810 issuer=self.db.config.TRACKER_WEB)
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3811 self.assertEqual(self.claim['user:email'],result)
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3812
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3813 # set environment for all jwt tests
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3814 env = {
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3815 'PATH_INFO': 'rest/data/user',
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3816 'HTTP_HOST': 'localhost',
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3817 'TRACKER_NAME': 'rounduptest',
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3818 "REQUEST_METHOD": "GET"
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3819 }
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3820 self.dummy_client = client.Client(self.instance, MockNull(), env,
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3821 [], None)
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3822 self.dummy_client.db = self.db
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3823 self.dummy_client.request.headers.get = self.get_header
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3824 self.empty_form = cgi.FieldStorage()
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3825 self.terse_form = cgi.FieldStorage()
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3826 self.terse_form.list = [
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3827 cgi.MiniFieldStorage('@verbose', '0'),
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3828 ]
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3829 self.dummy_client.form = cgi.FieldStorage()
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3830 self.dummy_client.form.list = [
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3831 cgi.MiniFieldStorage('@fields', 'username,address'),
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3832 ]
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3833 # accumulate json output for further analysis
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3834 self.dummy_client.write = wh
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3835
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3836 # set up for limited user:email role token
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3837 env['HTTP_AUTHORIZATION'] = 'bearer %s'%self.jwt['user:emailnorest']
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3838 self.dummy_client.main()
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3839 json_dict = json.loads(b2s(out[0]))
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3840 # user will be joe id 3 as auth works
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3841 self.assertTrue('1', self.db.getuid())
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3842 { "error": { "status": 403, "msg": "Forbidden." } }
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3843 self.assertTrue('error' in json_dict)
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3844 self.assertTrue(json_dict['error']['status'], 403)
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
3845 self.assertTrue(json_dict['error']['msg'], "Forbidden.")
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3846
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3847 @skip_jwt
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3848 def test_disabled_jwt(self):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3849 # self.dummy_client.main() closes database, so
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3850 # we need a new test with setup called for each test
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3851 out = []
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3852 def wh(s):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3853 out.append(s)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3854
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3855 # set environment for all jwt tests
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3856 env = {
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3857 'PATH_INFO': 'rest/data/user',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3858 'HTTP_HOST': 'localhost',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3859 'TRACKER_NAME': 'rounduptest',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3860 "REQUEST_METHOD": "GET"
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3861 }
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3862 self.dummy_client = client.Client(self.instance, MockNull(), env,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3863 [], None)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3864 self.dummy_client.db = self.db
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3865 self.dummy_client.request.headers.get = self.get_header
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3866 self.empty_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3867 self.terse_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3868 self.terse_form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3869 cgi.MiniFieldStorage('@verbose', '0'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3870 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3871 self.dummy_client.form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3872 self.dummy_client.form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3873 cgi.MiniFieldStorage('@fields', 'username,address'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3874 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3875 # accumulate json output for further analysis
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3876 self.dummy_client.write = wh
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3877 # disable jwt validation by making secret too short
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3878 # use the default value for this in configure.py.
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3879 self.db.config['WEB_JWT_SECRET'] = "disabled"
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3880 env['HTTP_AUTHORIZATION'] = 'bearer %s'%self.jwt['user']
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3881 self.dummy_client.main()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3882 # user will be 1 as there is no auth
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3883 self.assertTrue('1', self.db.getuid())
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3884 self.assertEqual(out[0], b'Invalid Login - Support for jwt disabled by admin.')
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3885
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3886 @skip_jwt
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3887 def test_bad_issue_jwt(self):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3888 # self.dummy_client.main() closes database, so
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3889 # we need a new test with setup called for each test
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3890 out = []
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3891 def wh(s):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3892 out.append(s)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3893
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3894 # set environment for all jwt tests
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3895 env = {
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3896 'PATH_INFO': 'rest/data/user',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3897 'HTTP_HOST': 'localhost',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3898 'TRACKER_NAME': 'rounduptest',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3899 "REQUEST_METHOD": "GET"
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3900 }
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3901 self.dummy_client = client.Client(self.instance, MockNull(), env,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3902 [], None)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3903 self.dummy_client.db = self.db
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3904 self.dummy_client.request.headers.get = self.get_header
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3905 self.empty_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3906 self.terse_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3907 self.terse_form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3908 cgi.MiniFieldStorage('@verbose', '0'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3909 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3910 self.dummy_client.form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3911 self.dummy_client.form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3912 cgi.MiniFieldStorage('@fields', 'username,address'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3913 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3914 # accumulate json output for further analysis
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3915 self.dummy_client.write = wh
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3916 env['HTTP_AUTHORIZATION'] = 'bearer %s'%self.jwt['badiss']
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3917 self.dummy_client.main()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3918 # user will be 1 as there is no auth
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3919 self.assertTrue('1', self.db.getuid())
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3920 self.assertEqual(out[0], b'Invalid Login - Invalid issuer')
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3921
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3922 @skip_jwt
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3923 def test_bad_audience_jwt(self):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3924 # self.dummy_client.main() closes database, so
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3925 # we need a new test with setup called for each test
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3926 out = []
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3927 def wh(s):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3928 out.append(s)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3929
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3930 # set environment for all jwt tests
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3931 env = {
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3932 'PATH_INFO': 'rest/data/user',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3933 'HTTP_HOST': 'localhost',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3934 'TRACKER_NAME': 'rounduptest',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3935 "REQUEST_METHOD": "GET"
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3936 }
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3937 self.dummy_client = client.Client(self.instance, MockNull(), env,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3938 [], None)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3939 self.dummy_client.db = self.db
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3940 self.dummy_client.request.headers.get = self.get_header
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3941 self.empty_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3942 self.terse_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3943 self.terse_form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3944 cgi.MiniFieldStorage('@verbose', '0'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3945 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3946 self.dummy_client.form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3947 self.dummy_client.form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3948 cgi.MiniFieldStorage('@fields', 'username,address'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3949 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3950 # accumulate json output for further analysis
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3951 self.dummy_client.write = wh
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3952 env['HTTP_AUTHORIZATION'] = 'bearer %s'%self.jwt['badaud']
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3953 self.dummy_client.main()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3954 # user will be 1 as there is no auth
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3955 self.assertTrue('1', self.db.getuid())
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3956 self.assertEqual(out[0], b'Invalid Login - Invalid audience')
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3957
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3958 @skip_jwt
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3959 def test_bad_roles_jwt(self):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3960 # self.dummy_client.main() closes database, so
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3961 # we need a new test with setup called for each test
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3962 out = []
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3963 def wh(s):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3964 out.append(s)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3965
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3966 # set environment for all jwt tests
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3967 env = {
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3968 'PATH_INFO': 'rest/data/user',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3969 'HTTP_HOST': 'localhost',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3970 'TRACKER_NAME': 'rounduptest',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3971 "REQUEST_METHOD": "GET"
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3972 }
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3973 self.dummy_client = client.Client(self.instance, MockNull(), env,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3974 [], None)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3975 self.dummy_client.db = self.db
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3976 self.dummy_client.request.headers.get = self.get_header
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3977 self.empty_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3978 self.terse_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3979 self.terse_form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3980 cgi.MiniFieldStorage('@verbose', '0'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3981 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3982 self.dummy_client.form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3983 self.dummy_client.form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3984 cgi.MiniFieldStorage('@fields', 'username,address'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3985 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3986 # accumulate json output for further analysis
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3987 self.dummy_client.write = wh
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3988 env['HTTP_AUTHORIZATION'] = 'bearer %s'%self.jwt['badroles']
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3989 self.dummy_client.main()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3990 # user will be 1 as there is no auth
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3991 self.assertTrue('1', self.db.getuid())
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3992 self.assertEqual(out[0], b'Invalid Login - Token roles are invalid.')
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3993
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3994 @skip_jwt
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3995 def test_bad_subject_jwt(self):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3996 # self.dummy_client.main() closes database, so
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3997 # we need a new test with setup called for each test
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3998 out = []
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3999 def wh(s):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4000 out.append(s)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4001
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4002 # set environment for all jwt tests
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4003 env = {
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4004 'PATH_INFO': 'rest/data/user',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4005 'HTTP_HOST': 'localhost',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4006 'TRACKER_NAME': 'rounduptest',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4007 "REQUEST_METHOD": "GET"
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4008 }
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4009 self.dummy_client = client.Client(self.instance, MockNull(), env,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4010 [], None)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4011 self.dummy_client.db = self.db
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4012 self.dummy_client.request.headers.get = self.get_header
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4013 self.empty_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4014 self.terse_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4015 self.terse_form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4016 cgi.MiniFieldStorage('@verbose', '0'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4017 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4018 self.dummy_client.form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4019 self.dummy_client.form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4020 cgi.MiniFieldStorage('@fields', 'username,address'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4021 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4022 # accumulate json output for further analysis
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4023 self.dummy_client.write = wh
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4024 env['HTTP_AUTHORIZATION'] = 'bearer %s'%self.jwt['badsub']
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4025 self.dummy_client.main()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4026 # user will be 1 as there is no auth
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4027 self.assertTrue('1', self.db.getuid())
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4028 self.assertEqual(out[0], b'Invalid Login - Token subject is invalid.')
5586
8f2fbc88e155 Fixed code convention
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5585
diff changeset
4029
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
4030 def get_obj(path, id):
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
4031 return {
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
4032 'id': id,
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
4033 'link': path + id
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
4034 }
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
4035
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
4036 if __name__ == '__main__':
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
4037 runner = unittest.TextTestRunner()
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
4038 unittest.main(testRunner=runner)

Roundup Issue Tracker: http://roundup-tracker.org/