annotate test/rest_common.py @ 8020:60c98a8a23bd

fix: make If-None-Match work for static file (@@file) case Found by Redbot testing.
author John Rouillard <rouilj@ieee.org>
date Sun, 02 Jun 2024 20:35:47 -0400
parents 171ff2e487df
children 8e310a7b5e09
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 shutil
8f2fbc88e155 Fixed code convention
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5585
diff changeset
4 import errno
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
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
6 from time import sleep
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
7 from datetime import datetime, timedelta
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
8 from roundup.anypy.cgi_ import cgi
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
9 from roundup.anypy.datetime_ import utcnow
7853
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
10 from roundup.exceptions import UsageError
6361
58817c3bf471 Fix roundup/test
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6350
diff changeset
11 from roundup.test.tx_Source_detector import init as tx_Source_init
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
12
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
13
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
14 try:
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
15 from datetime import timezone
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
16 myutc = timezone.utc
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
17 except ImportError:
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
18 # python 2
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
19 from datetime import tzinfo
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
20 ZERO = timedelta(0)
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
21
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
22 class UTC(tzinfo):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
23 """UTC"""
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
24 def utcoffset(self, dt):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
25 return ZERO
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
26
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
27 def tzname(self, dt):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
28 return "UTC"
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
29
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
30 def dst(self, dt):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
31 return ZERO
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
32
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
33 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
34
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
35 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
36 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
37 from roundup.exceptions import *
5586
8f2fbc88e155 Fixed code convention
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5585
diff changeset
38 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
39 from roundup.rest import RestfulInstance, calculate_etag
5586
8f2fbc88e155 Fixed code convention
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5585
diff changeset
40 from roundup.cgi import client
6185
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
41 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
42 import random
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
43
5733
62bdcb874433 Test code was not testing the loop that retries otk database updates
John Rouillard <rouilj@ieee.org>
parents: 5732
diff changeset
44 from roundup.backends.sessions_dbm import OneTimeKeys
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
45 from roundup.anypy.dbm_ import whichdb
5733
62bdcb874433 Test code was not testing the loop that retries otk database updates
John Rouillard <rouilj@ieee.org>
parents: 5732
diff changeset
46
5602
c40d04915e23 Python3 fixes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5601
diff changeset
47 from .db_test_base import setupTracker
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
48
6366
f2c31f5ec50b Move mocknull from test to roundup/test
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6361
diff changeset
49 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
50
5653
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
51 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
52 import json
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
53
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
54 from copy import copy
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
55
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
56 try:
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
57 import jwt
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
58 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
59 except ImportError:
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
60 from .pytest_patcher import mark_class
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
61 jwt = None
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
62 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
63 reason='Skipping JWT tests: jwt library not available'))
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
64
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
65 NEEDS_INSTANCE = 1
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
66
5586
8f2fbc88e155 Fixed code convention
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5585
diff changeset
67
5601
fcbeff272828 Integrate REST tests into db framework
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5600
diff changeset
68 class TestCase():
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
69
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
70 backend = None
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
71 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
72
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
73 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
74 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
75
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
76 self.dirname = '_test_rest'
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
77 # 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
78 # 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
79 # 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
80 # 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
81 self.instance = setupTracker(self.dirname, self.backend, optimize=True)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
82
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
83 # open the database
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
84 self.db = self.instance.open('admin')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
85
5733
62bdcb874433 Test code was not testing the loop that retries otk database updates
John Rouillard <rouilj@ieee.org>
parents: 5732
diff changeset
86 # 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
87 # 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
88 # 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
89 # 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
90 # 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
91 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
92 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
93
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
94 # 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
95 self.joeid = self.db.user.create(
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
96 username='joe',
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
97 password=password.Password('random'),
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
98 address='random@home.org',
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
99 realname='Joe Random',
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
100 roles='User'
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
101 )
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
102
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
103 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
104 self.db.user.set('2', address="anon@admin.com")
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
105 self.db.commit()
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
106 self.db.close()
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
107 self.db = self.instance.open('joe')
5604
ed02a1e0aa5d Fix actions
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5602
diff changeset
108 # Allow joe to retire
ed02a1e0aa5d Fix actions
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5602
diff changeset
109 p = self.db.security.addPermission(name='Retire', klass='issue')
ed02a1e0aa5d Fix actions
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5602
diff changeset
110 self.db.security.addPermissionToRole('User', p)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
111
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
112 # 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
113 self.db.security.addRole(name="User:email",
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
114 description="allow email by jwt")
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
115 # 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
116 # 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
117 # 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
118 # endpoint
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
119 jwt_perms = self.db.security.addPermission(
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
120 name='View',
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
121 klass='user',
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
122 properties=('id', 'realname', 'address', 'username'),
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
123 description="Allow jwt access to email",
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
124 props_only=False)
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
125 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
126 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
127
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
128 # 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
129 # 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
130 self.db.security.addRole(name="User:emailnorest",
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
131 description="allow email by jwt")
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
132 jwt_perms = self.db.security.addPermission(
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
133 name='View',
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
134 klass='user',
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
135 properties=('id', 'realname', 'address', 'username'),
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
136 description="Allow jwt access to email but forget to allow rest",
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
137 props_only=False)
5879
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
138 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
139
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
140 if jwt:
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
141 # 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
142 # 256 bits of data)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
143
7809
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
144 self.old_secret = "TestingTheJwtSecretTestingTheJwtSecret"
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
145 self.new_secret = "TestingTheNEW JwtSecretTestingTheNEWJwtSecret"
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
146 self.db.config['WEB_JWT_SECRET'] = self.old_secret
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
147
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
148 # generate all timestamps in UTC.
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
149 base_datetime = datetime(1970, 1, 1, tzinfo=myutc)
5878
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 # A UTC timestamp for now.
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
152 dt = datetime.now(myutc)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
153 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
154
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
155 # one good for a minute
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
156 dt = dt + timedelta(seconds=60)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
157 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
158
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
159 # one that expired a minute ago
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
160 dt = dt - timedelta(seconds=120)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
161 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
162
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
163 # 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
164 # is looking for
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
165 claim = {'sub': self.db.getuid(),
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
166 'iss': self.db.config.TRACKER_WEB,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
167 'aud': self.db.config.TRACKER_WEB,
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
168 'roles': ['User'],
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
169 'iat': now_ts,
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
170 '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
171
a2fbd3592322 pyjwt 2.00 changed return type of jwt.encode from byte to str
John Rouillard <rouilj@ieee.org>
parents: 6312
diff changeset
172 # 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
173 # not bytestring. So we have to skip b2s conversion
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
174
6314
a2fbd3592322 pyjwt 2.00 changed return type of jwt.encode from byte to str
John Rouillard <rouilj@ieee.org>
parents: 6312
diff changeset
175 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
176 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
177 else:
a2fbd3592322 pyjwt 2.00 changed return type of jwt.encode from byte to str
John Rouillard <rouilj@ieee.org>
parents: 6312
diff changeset
178 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
179
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
180 self.jwt = {}
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
181 self.claim = {}
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
182 # generate invalid claim with expired timestamp
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
183 self.claim['expired'] = copy(claim)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
184 self.claim['expired']['exp'] = expired_ts
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
185 self.jwt['expired'] = tostr(jwt.encode(
7809
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
186 self.claim['expired'], self.old_secret,
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
187 algorithm='HS256'))
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
188
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
189 # generate valid claim with user role
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
190 self.claim['user'] = copy(claim)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
191 self.claim['user']['exp'] = plus1min_ts
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
192 self.jwt['user'] = tostr(jwt.encode(
7809
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
193 self.claim['user'], self.old_secret,
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
194 algorithm='HS256'))
7809
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
195
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
196 # generate valid claim with user role and new secret
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
197 self.claim['user_new_secret'] = copy(claim)
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
198 self.claim['user_new_secret']['exp'] = plus1min_ts
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
199 self.jwt['user_new_secret'] = tostr(jwt.encode(
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
200 self.claim['user'], self.new_secret,
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
201 algorithm='HS256'))
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
202
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
203 # generate invalid claim bad issuer
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
204 self.claim['badiss'] = copy(claim)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
205 self.claim['badiss']['iss'] = "http://someissuer/bugs"
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
206 self.jwt['badiss'] = tostr(jwt.encode(
7809
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
207 self.claim['badiss'], self.old_secret,
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
208 algorithm='HS256'))
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
209 # generate invalid claim bad aud(ience)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
210 self.claim['badaud'] = copy(claim)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
211 self.claim['badaud']['aud'] = "http://someaudience/bugs"
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
212 self.jwt['badaud'] = tostr(jwt.encode(
7809
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
213 self.claim['badaud'], self.old_secret,
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
214 algorithm='HS256'))
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
215 # generate invalid claim bad sub(ject)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
216 self.claim['badsub'] = copy(claim)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
217 self.claim['badsub']['sub'] = str("99")
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
218 self.jwt['badsub'] = tostr(
7809
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
219 jwt.encode(self.claim['badsub'], self.old_secret,
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
220 algorithm='HS256'))
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
221 # generate invalid claim bad roles
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
222 self.claim['badroles'] = copy(claim)
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
223 self.claim['badroles']['roles'] = ["badrole1", "badrole2"]
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
224 self.jwt['badroles'] = tostr(jwt.encode(
7809
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
225 self.claim['badroles'], self.old_secret,
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
226 algorithm='HS256'))
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
227 # 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
228 self.claim['user:email'] = copy(claim)
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
229 self.claim['user:email']['roles'] = ["user:email"]
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
230 self.jwt['user:email'] = tostr(jwt.encode(
7809
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
231 self.claim['user:email'], self.old_secret,
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
232 algorithm='HS256'))
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
233
5879
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
234 # 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
235 self.claim['user:emailnorest'] = copy(claim)
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
236 self.claim['user:emailnorest']['roles'] = ["user:emailnorest"]
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
237 self.jwt['user:emailnorest'] = tostr(jwt.encode(
7809
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
238 self.claim['user:emailnorest'], self.old_secret,
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
239 algorithm='HS256'))
5879
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
240
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
241 self.db.tx_Source = 'web'
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
242
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
243 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
244 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
245 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
246 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
247 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
248 self.db.user.addprop(issue=hyperdb.Link('issue'))
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
249 self.db.msg.addprop(tx_Source=hyperdb.String())
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
250
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
251 self.db.post_init()
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
252
6361
58817c3bf471 Fix roundup/test
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6350
diff changeset
253 tx_Source_init(self.db)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
254
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
255 self.client_env = {
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
256 'PATH_INFO': 'http://localhost/rounduptest/rest/',
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
257 'HTTP_HOST': 'localhost',
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
258 'TRACKER_NAME': 'rounduptest',
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
259 'HTTP_ORIGIN': 'http://tracker.example'
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
260 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
261 self.dummy_client = client.Client(self.instance, MockNull(),
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
262 self.client_env, [], None)
5650
e8ca7072c629 Fix Python 3 issues in REST code.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5647
diff changeset
263 self.dummy_client.request.headers.get = self.get_header
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
264 self.dummy_client.db = self.db
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
265
5591
a25d79e874cb Added filtering and pagination
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5588
diff changeset
266 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
267 # 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
268 # 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
269 # 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
270 # 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
271 # 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
272 # 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
273 self.empty_form.list = []
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
274 self.terse_form = cgi.FieldStorage()
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
275 self.terse_form.list = [
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
276 cgi.MiniFieldStorage('@verbose', '0'),
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
277 ]
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
278
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
279 self.server = RestfulInstance(self.dummy_client, self.db)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
280
5710
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
281 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
282
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
283 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
284
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
285 def tearDown(self):
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
286 self.db.close()
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
287 try:
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
288 shutil.rmtree(self.dirname)
5602
c40d04915e23 Python3 fixes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5601
diff changeset
289 except OSError as error:
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
290 if error.errno not in (errno.ENOENT, errno.ESRCH):
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
291 raise
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
292
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
293 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
294 try:
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
295 return self.headers[header.lower()]
5655
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
296 except (AttributeError, KeyError, TypeError):
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
297 if header.upper() in self.client_env:
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
298 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
299 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
300
5865
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
301 def create_stati(self):
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
302 try:
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
303 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
304 except ValueError:
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
305 pass
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
306 try:
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
307 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
308 except ValueError:
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
309 pass
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
310 try:
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
311 self.db.priority.create(name='normal')
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
312 except ValueError:
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
313 pass
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
314 try:
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
315 self.db.priority.create(name='critical')
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
316 except ValueError:
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
317 pass
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
318
7854
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
319 def create_sampledata(self, data_max=3):
5865
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
320 """ 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
321 """
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
322 self.create_stati()
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
323 self.db.issue.create(
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
324 title='foo1',
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
325 status=self.db.status.lookup('open'),
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
326 priority=self.db.priority.lookup('normal'),
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
327 nosy=["1", "2"]
5865
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
328 )
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
329 issue_open_norm = self.db.issue.create(
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
330 title='foo2',
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
331 status=self.db.status.lookup('open'),
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
332 priority=self.db.priority.lookup('normal'),
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
333 assignedto="3"
5865
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
334 )
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
335 issue_open_crit = self.db.issue.create(
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
336 title='foo5',
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
337 status=self.db.status.lookup('open'),
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
338 priority=self.db.priority.lookup('critical')
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
339 )
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
340
7854
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
341 if data_max > 10:
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
342 raise ValueError('data_max must be less than 10')
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
343
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
344 if data_max == 3:
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
345 return
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
346
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
347 sample_data = [
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
348 ["foo6", "normal", "closed"],
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
349 ["foo7", "critical", "open"],
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
350 ["foo8", "normal", "open"],
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
351 ["foo9", "critical", "open"],
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
352 ["foo10", "normal", "closed"],
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
353 ["foo11", "critical", "open"],
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
354 ["foo12", "normal", "closed"],
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
355 ["foo13", "normal", "open"],
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
356
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
357 ]
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
358
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
359 for title, priority, status in sample_data:
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
360 new_issue = self.db.issue.create(
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
361 title=title,
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
362 status=self.db.status.lookup(status),
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
363 priority=self.db.priority.lookup(priority)
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
364 )
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
365
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
366 if int(new_issue) == data_max:
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
367 break
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
368
7853
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
369 def test_no_next_link_on_full_last_page(self):
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
370 """Make sure that there is no next link
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
371 on the last page where the total number of entries
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
372 is a multiple of the page size.
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
373 """
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
374
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
375 self.server.client.env.update({'REQUEST_METHOD': 'GET'})
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
376
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
377 # Retrieve third user of the total of 3.
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
378 form = cgi.FieldStorage()
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
379 form.list = [
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
380 cgi.MiniFieldStorage('@page_index', '3'),
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
381 cgi.MiniFieldStorage('@page_size', '1'),
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
382 ]
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
383 results = self.server.get_collection('user', form)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
384 self.assertEqual(self.dummy_client.response_code, 200)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
385 self.assertEqual(len(results['data']['collection']), 1)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
386 self.assertEqual(results['data']['collection'][0]['id'], "3")
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
387 self.assertEqual(results['data']['@total_size'], 3)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
388 print(self.dummy_client.additional_headers["X-Count-Total"])
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
389 self.assertEqual(
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
390 self.dummy_client.additional_headers["X-Count-Total"],
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
391 "3"
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
392 )
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
393 self.assertNotIn('next', results['data']['@links'])
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
394 self.dummy_client.additional_headers.clear()
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
395
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
396 # Retrieve first user of the total of 3.
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
397 form = cgi.FieldStorage()
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
398 form.list = [
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
399 cgi.MiniFieldStorage('@page_index', '1'),
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
400 cgi.MiniFieldStorage('@page_size', '1'),
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
401 ]
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
402 results = self.server.get_collection('user', form)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
403 self.assertEqual(self.dummy_client.response_code, 200)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
404 self.assertEqual(len(results['data']['collection']), 1)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
405 self.assertEqual(results['data']['collection'][0]['id'], "1")
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
406 self.assertEqual(results['data']['@total_size'], 3)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
407 print(self.dummy_client.additional_headers["X-Count-Total"])
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
408 self.assertEqual(
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
409 self.dummy_client.additional_headers["X-Count-Total"],
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
410 "3"
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
411 )
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
412 self.assertIn('next', results['data']['@links'])
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
413 self.dummy_client.additional_headers.clear()
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
414
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
415 def testTotal_size(self):
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
416 """Make sure that total_size is properly set if @page_size
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
417 is specified.
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
418
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
419 Also test for the cases:
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
420
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
421 @page_size >= the max number of retreivable rows.
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
422 raises UsageError (and error code 400)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
423 @page_size < max retreivable rows, but
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
424 the amount of matching rows is > max retreivable rows.
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
425 total_size/X-Count-Total should be -1
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
426
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
427 no @page_size and limit < total results returns
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
428 limit size and -1 for total.
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
429
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
430 Check:
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
431 http response code
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
432 length of collection
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
433 An expected id at end of collection
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
434 @total_size in payload
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
435 X-Count-Total in http headers
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
436
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
437 """
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
438 from roundup.rest import RestfulInstance
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
439
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
440 self.server.client.env.update({'REQUEST_METHOD': 'GET'})
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
441
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
442 # Retrieve one user of the total of 3. limit 10M+1
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
443 form = cgi.FieldStorage()
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
444 form.list = [
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
445 cgi.MiniFieldStorage('@page_index', '1'),
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
446 cgi.MiniFieldStorage('@page_size', '1'),
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
447 ]
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
448 results = self.server.get_collection('user', form)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
449 self.assertEqual(self.dummy_client.response_code, 200)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
450 self.assertEqual(len(results['data']['collection']), 1)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
451 self.assertEqual(results['data']['collection'][0]['id'], "1")
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
452 self.assertEqual(results['data']['@total_size'], 3)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
453 print(self.dummy_client.additional_headers["X-Count-Total"])
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
454 self.assertEqual(
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
455 self.dummy_client.additional_headers["X-Count-Total"],
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
456 "3"
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
457 )
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
458 self.dummy_client.additional_headers.clear()
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
459
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
460 # set max number of returned rows
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
461 self.stored_max = RestfulInstance.max_response_row_size
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
462 RestfulInstance.max_response_row_size = 2
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
463
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
464 # Retrieve whole class (no @page_*) with max rows restricted.
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
465 form = cgi.FieldStorage()
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
466 results = self.server.get_collection('user', self.empty_form)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
467 # reset so changes don't affect other tests if any assetion fails.
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
468 RestfulInstance.max_response_row_size = self.stored_max
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
469 self.assertEqual(self.dummy_client.response_code, 200)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
470 self.assertEqual(len(results['data']['collection']), 2)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
471 self.assertEqual(results['data']['collection'][1]['id'], "2")
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
472 self.assertEqual(results['data']['@total_size'], -1)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
473 print(self.dummy_client.additional_headers["X-Count-Total"])
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
474 self.assertEqual(
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
475 self.dummy_client.additional_headers["X-Count-Total"],
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
476 "-1"
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
477 )
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
478 self.dummy_client.additional_headers.clear()
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
479
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
480 # Make sure we can access items that are returned
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
481 # in rows RestfulInstance.max_response_row_size + 1.
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
482 # so can we access item 2
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
483 form = cgi.FieldStorage()
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
484 form.list = [
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
485 cgi.MiniFieldStorage('@page_index', '2'),
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
486 cgi.MiniFieldStorage('@page_size', '1'),
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
487 ]
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
488 RestfulInstance.max_response_row_size = 2
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
489 results = self.server.get_collection('user', form)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
490 RestfulInstance.max_response_row_size = self.stored_max
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
491 self.assertEqual(self.dummy_client.response_code, 200)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
492 self.assertEqual(len(results['data']['collection']), 1)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
493 self.assertEqual(results['data']['collection'][0]['id'], "2")
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
494 self.assertEqual(results['data']['@total_size'], -1)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
495 print(self.dummy_client.additional_headers["X-Count-Total"])
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
496 self.assertEqual(
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
497 self.dummy_client.additional_headers["X-Count-Total"],
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
498 "-1"
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
499 )
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
500 self.dummy_client.additional_headers.clear()
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
501
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
502 # Same as above, but access item 3
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
503 form = cgi.FieldStorage()
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
504 form.list = [
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
505 cgi.MiniFieldStorage('@page_index', '3'),
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
506 cgi.MiniFieldStorage('@page_size', '1'),
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
507 ]
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
508 RestfulInstance.max_response_row_size = 2
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
509 results = self.server.get_collection('user', form)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
510 RestfulInstance.max_response_row_size = self.stored_max
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
511 self.assertEqual(self.dummy_client.response_code, 200)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
512 self.assertEqual(len(results['data']['collection']), 1)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
513 self.assertEqual(results['data']['collection'][0]['id'], "3")
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
514 self.assertEqual(results['data']['@total_size'], 3)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
515 print(self.dummy_client.additional_headers["X-Count-Total"])
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
516 self.assertEqual(
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
517 self.dummy_client.additional_headers["X-Count-Total"],
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
518 "3"
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
519 )
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
520 self.dummy_client.additional_headers.clear()
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
521
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
522 # Retrieve one user but max number of rows is set to 2,
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
523 # and we retrieve two users from the db.
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
524 # So we don't know how many total users there are.
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
525
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
526 form = cgi.FieldStorage()
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
527 form.list = [
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
528 cgi.MiniFieldStorage('@page_index', '1'),
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
529 cgi.MiniFieldStorage('@page_size', '1'),
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
530 ]
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
531 RestfulInstance.max_response_row_size = 2
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
532 results = self.server.get_collection('user', form)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
533 RestfulInstance.max_response_row_size = self.stored_max
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
534 self.assertEqual(self.dummy_client.response_code, 200)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
535 self.assertEqual(len(results['data']['collection']), 1)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
536 self.assertEqual(results['data']['collection'][0]['id'], "1")
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
537 self.assertEqual(results['data']['@total_size'], -1)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
538 print(self.dummy_client.additional_headers["X-Count-Total"])
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
539 self.assertEqual(
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
540 self.dummy_client.additional_headers["X-Count-Total"],
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
541 "-1"
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
542 )
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
543 self.dummy_client.additional_headers.clear()
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
544
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
545
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
546 # Set the page size to be >= the max number of rows returned.
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
547 # and verify the exception returned.
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
548 form = cgi.FieldStorage()
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
549 form.list = [
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
550 cgi.MiniFieldStorage('@page_index', '2'),
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
551 cgi.MiniFieldStorage('@page_size', '2'),
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
552 ]
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
553 RestfulInstance.max_response_row_size = 2
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
554 results = self.server.get_collection('user', form)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
555 RestfulInstance.max_response_row_size = self.stored_max
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
556 self.assertEqual(self.dummy_client.response_code, 400)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
557 self.assertEqual(results['error']['status'], 400)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
558 self.assertTrue(isinstance(results['error']['msg'], UsageError))
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
559 self.assertEqual(results['error']['msg'].args[0],
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
560 "Page size 2 must be less than "
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
561 "admin limit on query result size: 2.")
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
562 self.assertTrue('@total_size' not in results)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
563 self.assertTrue('@data' not in results)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
564 self.assertTrue("X-Count-Total" not in
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
565 self.dummy_client.additional_headers)
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
566
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
567 # reset environment just in case I forgot a reset above.
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
568 RestfulInstance.max_response_row_size = self.stored_max
03c1b7ae3a68 issue2551328/issue2551264 unneeded next link and total_count incorrect
John Rouillard <rouilj@ieee.org>
parents: 7809
diff changeset
569
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
570 def testGet(self):
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
571 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
572 Retrieve all three users
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
573 obtain data for 'joe'
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
574 """
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
575 self.server.client.env.update({'REQUEST_METHOD': 'GET'})
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
576 # Retrieve all three users.
5591
a25d79e874cb Added filtering and pagination
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5588
diff changeset
577 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
578 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
579 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
580 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
581 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
582 self.assertEqual(
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
583 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
584 "3"
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
585 )
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
586
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
587 # Obtain data for 'joe'.
5591
a25d79e874cb Added filtering and pagination
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5588
diff changeset
588 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
589 results = results['data']
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
590 self.assertEqual(self.dummy_client.response_code, 200)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
591 self.assertEqual(results['attributes']['username'], 'joe')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
592 self.assertEqual(results['attributes']['realname'], 'Joe Random')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
593
5678
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
594 # Obtain data for 'joe' via username lookup.
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
595 results = self.server.get_element('user', 'joe', self.empty_form)
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
596 results = results['data']
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
597 self.assertEqual(self.dummy_client.response_code, 200)
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
598 self.assertEqual(results['attributes']['username'], 'joe')
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
599 self.assertEqual(results['attributes']['realname'], 'Joe Random')
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
600
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
601 # Obtain data for 'joe' via username lookup (long form).
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
602 key = 'username=joe'
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
603 results = self.server.get_element('user', key, self.empty_form)
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
604 results = results['data']
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
605 self.assertEqual(self.dummy_client.response_code, 200)
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
606 self.assertEqual(results['attributes']['username'], 'joe')
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
607 self.assertEqual(results['attributes']['realname'], 'Joe Random')
b8e8b1b3ec77 REST: Add key lookup
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5674
diff changeset
608
5585
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
609 # Obtain data for 'joe'.
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
610 results = self.server.get_attribute(
5591
a25d79e874cb Added filtering and pagination
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5588
diff changeset
611 '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
612 )
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
613 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
614 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
615
5872
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
616 def testGetTransitive(self):
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
617 """
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
618 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
619 sort by status.name (not order)
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
620 """
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
621 base_path = self.db.config['TRACKER_WEB'] + 'rest/data/'
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
622 # self.maxDiff=None
5872
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
623 self.create_sampledata()
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
624 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
625 self.db.issue.set('3', status=self.db.status.lookup('chatting'))
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
626 expected = {'data':
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
627 {'@total_size': 2,
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
628 'collection': [
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
629 {'id': '2',
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
630 'link': base_path + 'issue/2',
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
631 'assignedto.issue': None,
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
632 'status':
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
633 {'id': '10',
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
634 'link': base_path + 'status/10'
5872
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
635 }
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
636 },
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
637 {'id': '1',
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
638 'link': base_path + 'issue/1',
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
639 'assignedto.issue': None,
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
640 'status':
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
641 {'id': '9',
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
642 'link': base_path + 'status/9'
5872
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
643 }
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
644 },
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
645 ]}
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
646 }
5872
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
647 form = cgi.FieldStorage()
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
648 form.list = [
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
649 cgi.MiniFieldStorage('status.name', 'o'),
6256
29c6dc8ed004 Test handling of unset transitive link field.
John Rouillard <rouilj@ieee.org>
parents: 6185
diff changeset
650 cgi.MiniFieldStorage('@fields', 'status,assignedto.issue'),
5872
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
651 cgi.MiniFieldStorage('@sort', 'status.name'),
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
652 ]
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
653 results = self.server.get_collection('issue', form)
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
654 self.assertDictEqual(expected, results)
1b91e3df3fd0 Implement transitive props for sort and filter
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5865
diff changeset
655
6554
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
656 def testGetBadTransitive(self):
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
657 """
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
658 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
659 and a somewhat useful error message.
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
660 """
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
661 base_path = self.db.config['TRACKER_WEB'] + 'rest/data/'
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
662 # self.maxDiff=None
6554
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
663 self.create_sampledata()
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
664 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
665 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
666 expected = [
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
667 {'error': {'msg': KeyError('Unknown property: assignedto.isse',),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
668 'status': 400}},
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
669 {'error': {'msg': KeyError('Unknown property: stat',),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
670 'status': 400}},
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
671 {'error': {'msg': KeyError('Unknown property: status.nam',),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
672 'status': 400}},
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
673 ]
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
674
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
675 ## test invalid transitive property in @fields
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
676 form = cgi.FieldStorage()
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
677 form.list = [
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
678 cgi.MiniFieldStorage('status.name', 'o'),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
679 cgi.MiniFieldStorage('@fields', 'status,assignedto.isse'),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
680 cgi.MiniFieldStorage('@sort', 'status.name'),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
681 ]
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
682 results = self.server.get_collection('issue', form)
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
683 self.assertEqual(self.dummy_client.response_code, 400)
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
684 self.assertEqual(repr(expected[0]['error']['msg']),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
685 repr(results['error']['msg']))
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
686 self.assertEqual(expected[0]['error']['status'],
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
687 results['error']['status'])
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
688
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
689 ## test invalid property in @fields
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
690 form = cgi.FieldStorage()
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
691 form.list = [
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
692 cgi.MiniFieldStorage('status.name', 'o'),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
693 cgi.MiniFieldStorage('@fields', 'stat,assignedto.isuse'),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
694 cgi.MiniFieldStorage('@sort', 'status.name'),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
695 ]
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
696 results = self.server.get_collection('issue', form)
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
697 self.assertEqual(self.dummy_client.response_code, 400)
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
698 self.assertEqual(repr(expected[1]['error']['msg']),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
699 repr(results['error']['msg']))
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
700 self.assertEqual(expected[1]['error']['status'],
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
701 results['error']['status'])
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
702
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
703 ## test invalid transitive property in filter TODO
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
704 form = cgi.FieldStorage()
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
705 form.list = [
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
706 cgi.MiniFieldStorage('status.nam', 'o'),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
707 cgi.MiniFieldStorage('@fields', 'status,assignedto.isuse'),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
708 cgi.MiniFieldStorage('@sort', 'status.name'),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
709 ]
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
710 results = self.server.get_collection('issue', form)
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
711 # is currently 403 not 400
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
712 self.assertEqual(self.dummy_client.response_code, 400)
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
713 self.assertEqual(repr(expected[2]['error']['msg']),
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
714 repr(results['error']['msg']))
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
715 self.assertEqual(expected[2]['error']['status'],
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
716 results['error']['status'])
576d630fc908 Fix error status for invalid props
John Rouillard <rouilj@ieee.org>
parents: 6539
diff changeset
717
5874
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
718 def testGetExactMatch(self):
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
719 """ Retrieve all issues with an exact title
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
720 """
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
721 base_path = self.db.config['TRACKER_WEB'] + 'rest/data/'
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
722 # self.maxDiff=None
5874
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
723 self.create_sampledata()
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
724 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
725 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
726 self.db.issue.set('1', title='This is AN exact match')
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
727 expected = {'data':
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
728 {'@total_size': 2,
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
729 'collection': [
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
730 {'id': '2',
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
731 'link': base_path + 'issue/2',
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
732 },
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
733 {'id': '3',
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
734 'link': base_path + 'issue/3',
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
735 },
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
736 ]}
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
737 }
5874
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
738 form = cgi.FieldStorage()
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
739 form.list = [
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
740 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
741 cgi.MiniFieldStorage('@sort', 'status.name'),
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
742 ]
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
743 results = self.server.get_collection('issue', form)
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
744 self.assertDictEqual(expected, results)
6630baff5f68 Implement exact string search in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5872
diff changeset
745
5682
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
746 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
747 """ 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
748
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
749 self.maxDiff = 4000
5865
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
750 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
751 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
752
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
753 # 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
754 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
755 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
756 cgi.MiniFieldStorage('status', 'open'),
5825
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
757 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
758 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
759 ]
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
760
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
761 expected = {'data':
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
762 {'@total_size': 3,
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
763 'collection': [ {
5825
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
764 'creator': {'id': '3',
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
765 '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
766 'username': 'joe'},
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
767 '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
768 '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
769 '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
770 '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
771 'nosy': [
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
772 {'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
773 '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
774 '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
775 {'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
776 '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
777 '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
778 ],
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
779 '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
780 'title': 'foo1' },
5825
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
781 { 'creator': {'id': '3',
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
782 '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
783 'username': 'joe'},
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
784 '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
785 '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
786 '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
787 '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
788 '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
789 'nosy': [
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
790 {'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
791 '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
792 '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
793 ],
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
794 '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
795 'title': 'foo2'},
5825
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
796 {'creator': {'id': '3',
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
797 '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
798 'username': 'joe'},
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
799 '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
800 '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
801 '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
802 '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
803 '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
804 'nosy': [],
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
805 '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
806 '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
807 ]}}
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
808
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
809 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
810 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
811
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
812 # 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
813 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
814 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
815 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
816 # 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
817 ]
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
818
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
819 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
820 {'@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
821 'collection': [
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
822 {'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
823 '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
824 { '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
825
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
826 '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
827 {'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
828 '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
829
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
830
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
831 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
832 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
833
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
834 # 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
835 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
836 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
837 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
838 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
839 ]
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
840
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
841 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
842 '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
843 "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
844 '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
845
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
846 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
847 # 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
848 # 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
849 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
850 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
851 )
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
852
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
853 # 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
854 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
855 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
856 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
857 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
858 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
859 ]
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
860
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
861 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
862 '@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
863 'collection': [
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
864 {'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
865 '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
866 '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
867 '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
868 '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
869 {'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
870 '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
871 '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
872 '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
873 '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
874 {'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
875 '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
876 '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
877 'nosy': [],
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
878 '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
879
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
880 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
881 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
882 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
883
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
884 # 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
885 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
886 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
887 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
888 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
889 ]
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
890 # 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
891 # 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
892 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
893 {'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
894 '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
895 '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
896 {'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
897 '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
898 '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
899 {'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
900 '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
901 'queries': [],
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
902 '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
903 '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
904 '@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
905
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
906 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
907 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
908
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
909 ## 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
910 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
911 form.list = [
5825
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
912 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
913 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
914 ]
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
915 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
916 '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
917 '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
918 '@etag': '',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
919 '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
920 'attributes': {
5825
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
921 'creator': {'id': '1',
bcb894bc9740 Add test of protected values for collections and item.
John Rouillard <rouilj@ieee.org>
parents: 5801
diff changeset
922 '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
923 '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
924 '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
925 'queries': [],
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
926 '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
927 }
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
928 }}
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
929
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
930 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
931 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
932 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
933
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
934 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
935 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
936 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
937 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
938 ]
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
939 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
940 '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
941 '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
942 'attributes': {
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
943 'status': {
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
944 '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
945 '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
946 'priority': {
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
947 '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
948 '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
949 '@etag': '',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
950 '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
951
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
952 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
953 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
954 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
955
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
956 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
957 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
958 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
959 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
960 ]
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
961 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
962 '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
963 '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
964 'attributes': {
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
965 '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
966 '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
967 '@etag': '',
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
968 '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
969
e8ac82b8d074 Fix parse of @fields/@attrs with : as separator. Add tests @verbose and @fields.
John Rouillard <rouilj@ieee.org>
parents: 5678
diff changeset
970 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
971 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
972 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
973
5865
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
974 def testSorting(self):
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
975 self.maxDiff = 4000
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
976 self.create_sampledata()
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
977 self.db.issue.set('1', status='7')
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
978 self.db.issue.set('2', status='2')
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
979 self.db.issue.set('3', status='2')
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
980 self.db.commit()
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
981 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
982 # change some data for sorting on later
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
983 form = cgi.FieldStorage()
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
984 form.list = [
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
985 cgi.MiniFieldStorage('@fields', 'status'),
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
986 cgi.MiniFieldStorage('@sort', 'status,-id'),
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
987 cgi.MiniFieldStorage('@verbose', '0')
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
988 ]
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
989
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
990 # status is sorted by orderprop (property 'order')
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
991 # 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
992 expected={'data': {
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
993 '@total_size': 3,
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
994 'collection': [
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
995 {'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
996 {'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
997 {'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
998
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
999 results = self.server.get_collection('issue', form)
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
1000 self.assertDictEqual(expected, results)
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
1001
7854
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1002 def testGrouping(self):
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1003 self.maxDiff = 4000
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1004 self.create_sampledata(data_max=5)
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1005 self.db.issue.set('1', status='7', priority='4')
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1006 self.db.issue.set('2', status='2', priority='4')
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1007 self.db.issue.set('3', status='2', priority='4')
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1008 self.db.issue.set('4', status='2', priority='2')
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1009 self.db.issue.set('5', status='2', priority='2')
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1010 self.db.commit()
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1011 base_path = self.db.config['TRACKER_WEB'] + 'rest/data/issue/'
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1012 # change some data for sorting on later
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1013 form = cgi.FieldStorage()
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1014 form.list = [
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1015 cgi.MiniFieldStorage('@fields', 'status,priority'),
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1016 cgi.MiniFieldStorage('@sort', '-id'),
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1017 cgi.MiniFieldStorage('@group', '-status,priority'),
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1018 cgi.MiniFieldStorage('@verbose', '0')
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1019 ]
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1020
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1021 # status is sorted by orderprop (property 'order')
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1022 expected={'data': {
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1023 '@total_size': 5,
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1024 'collection': [
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1025 {'link': base_path + '1', 'priority': '4',
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1026 'status': '7', 'id': '1'},
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1027 {'link': base_path + '5', 'priority': '2',
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1028 'status': '2', 'id': '5'},
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1029 {'link': base_path + '4', 'priority': '2',
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1030 'status': '2', 'id': '4'},
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1031 {'link': base_path + '3', 'priority': '4',
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1032 'status': '2', 'id': '3'},
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1033 {'link': base_path + '2', 'priority': '4',
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1034 'status': '2', 'id': '2'},
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1035 ]
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1036 }}
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1037
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1038
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1039 results = self.server.get_collection('issue', form)
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1040 print(results)
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1041 self.assertDictEqual(expected, results)
171ff2e487df Add @group for grouping in rest interface.
John Rouillard <rouilj@ieee.org>
parents: 7853
diff changeset
1042
6090
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
1043 def testTransitiveField(self):
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
1044 """ Test a transitive property in @fields """
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
1045 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
1046 # create sample data
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
1047 self.create_stati()
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
1048 self.db.issue.create(
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
1049 title='foo4',
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
1050 status=self.db.status.lookup('closed'),
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
1051 priority=self.db.priority.lookup('critical')
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
1052 )
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
1053 # Retrieve all issue @fields=status.name
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
1054 form = cgi.FieldStorage()
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
1055 form.list = [
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
1056 cgi.MiniFieldStorage('@fields', 'status.name')
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
1057 ]
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
1058 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
1059 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
1060
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
1061 exp = [
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
1062 {'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
1063 self.assertEqual(results['data']['collection'], exp)
e097ff5064b8 Allow transitive properties in @fields in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5993
diff changeset
1064
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1065 def testFilter(self):
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1066 """
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1067 Retrieve all three users
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1068 obtain data for 'joe'
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1069 """
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1070 # create sample data
5865
04deafac71ab Implement sorting of collections in REST API
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5842
diff changeset
1071 self.create_stati()
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1072 self.db.issue.create(
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1073 title='foo4',
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1074 status=self.db.status.lookup('closed'),
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1075 priority=self.db.priority.lookup('critical')
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1076 )
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1077 self.db.issue.create(
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1078 title='foo1',
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1079 status=self.db.status.lookup('open'),
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1080 priority=self.db.priority.lookup('normal')
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1081 )
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1082 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
1083 title='foo2 normal',
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1084 status=self.db.status.lookup('open'),
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1085 priority=self.db.priority.lookup('normal')
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1086 )
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1087 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
1088 title='foo3 closed normal',
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1089 status=self.db.status.lookup('closed'),
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1090 priority=self.db.priority.lookup('normal')
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1091 )
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1092 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
1093 title='foo4 closed',
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1094 status=self.db.status.lookup('closed'),
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1095 priority=self.db.priority.lookup('critical')
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1096 )
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1097 issue_open_crit = self.db.issue.create(
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1098 title='foo5',
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1099 status=self.db.status.lookup('open'),
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1100 priority=self.db.priority.lookup('critical')
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1101 )
5623
1c4adab65faf use config file setting for creating tracker uri
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
1102 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
1103
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1104 # Retrieve all issue status=open
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1105 form = cgi.FieldStorage()
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1106 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
1107 cgi.MiniFieldStorage('status', 'open')
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1108 ]
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1109 results = self.server.get_collection('issue', form)
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1110 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
1111 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
1112 results['data']['collection'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1113 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
1114 results['data']['collection'])
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1115 self.assertNotIn(
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1116 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
1117 results['data']['collection']
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1118 )
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1119
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1120 # Retrieve all issue status=closed and priority=critical
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1121 form = cgi.FieldStorage()
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1122 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
1123 cgi.MiniFieldStorage('status', 'closed'),
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
1124 cgi.MiniFieldStorage('priority', 'critical')
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1125 ]
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1126 results = self.server.get_collection('issue', form)
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1127 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
1128 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
1129 results['data']['collection'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1130 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
1131 results['data']['collection'])
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1132 self.assertNotIn(
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1133 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
1134 results['data']['collection']
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1135 )
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1136
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1137 # 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
1138 form = cgi.FieldStorage()
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1139 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
1140 cgi.MiniFieldStorage('status', 'closed'),
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
1141 cgi.MiniFieldStorage('priority', 'normal,critical')
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1142 ]
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1143 results = self.server.get_collection('issue', form)
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1144 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
1145 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
1146 results['data']['collection'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1147 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
1148 results['data']['collection'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1149 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
1150 results['data']['collection'])
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1151 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
1152 results['data']['collection'])
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1153
5842
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1154 # 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
1155 # 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
1156 form = cgi.FieldStorage()
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1157 form.list = [
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1158 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
1159 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
1160 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
1161 ]
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1162 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
1163 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
1164 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
1165 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1166 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
1167 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1168 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
1169 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1170 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
1171 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1172
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1173 # 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
1174 # 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
1175 form = cgi.FieldStorage()
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1176 form.list = [
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1177 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
1178 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
1179 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
1180 ]
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1181 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
1182 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
1183 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
1184 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1185 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
1186 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1187 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
1188 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1189 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
1190 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1191 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
1192
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1193 # 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
1194 # 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
1195 form = cgi.FieldStorage()
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1196 form.list = [
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1197 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
1198 ]
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1199 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
1200 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
1201 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
1202 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1203 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
1204 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1205 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
1206 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1207 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
1208 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1209 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
1210
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1211 # 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
1212 # 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
1213 form = cgi.FieldStorage()
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1214 form.list = [
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1215 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
1216 ]
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1217 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
1218 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
1219 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
1220 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1221 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
1222 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1223 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
1224 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1225 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
1226 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1227 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
1228
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1229 # 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
1230 form = cgi.FieldStorage()
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1231 form.list = [
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1232 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
1233 ]
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1234 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
1235 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
1236 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
1237 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1238 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
1239 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1240 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
1241 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1242 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
1243 results['data']['collection'])
9c6617857032 Support use of duplicate rest filters keys. So URL's like:
John Rouillard <rouilj@ieee.org>
parents: 5825
diff changeset
1244 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
1245
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1246 def testPagination(self):
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1247 """
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1248 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
1249 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
1250 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
1251 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
1252 number of items.
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1253 """
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1254 # 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
1255 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
1256 self.db.issue.create(title='foo' + str(i))
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1257
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1258 # Retrieving all the issues
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1259 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
1260 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
1261 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
1262 # 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
1263 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
1264 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
1265 self.assertEqual(
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1266 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
1267 str(total_length)
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1268 )
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1269
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1270
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1271 # 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
1272 # 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
1273 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
1274 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
1275 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
1276 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
1277 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
1278 "bugs/rest/data/issue"
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1279
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1280 # Retrieve page 1
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1281 form = cgi.FieldStorage()
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1282 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
1283 cgi.MiniFieldStorage('@page_size', page_size),
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
1284 cgi.MiniFieldStorage('@page_index', 1)
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1285 ]
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1286 results = self.server.get_collection('issue', form)
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1287 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
1288 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
1289 page_one_expected)
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1290 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
1291 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
1292 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
1293 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
1294 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
1295 "%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
1296 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
1297 "%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
1298
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1299 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
1300
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1301 # Retrieve page 2
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1302 form = cgi.FieldStorage()
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1303 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
1304 cgi.MiniFieldStorage('@page_size', page_size),
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
1305 cgi.MiniFieldStorage('@page_index', 2)
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1306 ]
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1307 results = self.server.get_collection('issue', form)
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1308 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
1309 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
1310 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
1311 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
1312 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
1313 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
1314 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
1315 "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
1316 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
1317 "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
1318 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
1319 "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
1320 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
1321 'self')
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1322 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
1323 'next')
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1324 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
1325 'prev')
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
1326
5639
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1327 # Retrieve page 3
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1328 form = cgi.FieldStorage()
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1329 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
1330 cgi.MiniFieldStorage('@page_size', page_size),
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
1331 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
1332 ]
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1333 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
1334 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
1335 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
1336 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
1337 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
1338 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
1339 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
1340 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
1341 "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
1342 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
1343 "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
1344
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1345 # 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
1346 # 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
1347 form = cgi.FieldStorage()
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1348 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
1349 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
1350 ]
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1351 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
1352 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
1353 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
1354 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
1355 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
1356 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
1357 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
1358 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
1359
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1360 # 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
1361 # is needed to:
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1362 # page_size < 0
f576957cbb1f Add support for prev/next/self links when returning paginated results.
John Rouillard <rouilj@ieee.org>
parents: 5630
diff changeset
1363 # 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
1364
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
1365 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
1366
7555
451232f83244 test: Modify testRestRateLimit test to report when system is too slow.
John Rouillard <rouilj@ieee.org>
parents: 7389
diff changeset
1367 calls_per_interval = 20
451232f83244 test: Modify testRestRateLimit test to report when system is too slow.
John Rouillard <rouilj@ieee.org>
parents: 7389
diff changeset
1368 interval_sec = 60
451232f83244 test: Modify testRestRateLimit test to report when system is too slow.
John Rouillard <rouilj@ieee.org>
parents: 7389
diff changeset
1369 wait_time_str = str(int(interval_sec/calls_per_interval))
451232f83244 test: Modify testRestRateLimit test to report when system is too slow.
John Rouillard <rouilj@ieee.org>
parents: 7389
diff changeset
1370
451232f83244 test: Modify testRestRateLimit test to report when system is too slow.
John Rouillard <rouilj@ieee.org>
parents: 7389
diff changeset
1371 self.db.config['WEB_API_CALLS_PER_INTERVAL'] = calls_per_interval
451232f83244 test: Modify testRestRateLimit test to report when system is too slow.
John Rouillard <rouilj@ieee.org>
parents: 7389
diff changeset
1372 self.db.config['WEB_API_INTERVAL_IN_SEC'] = interval_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
1373
5733
62bdcb874433 Test code was not testing the loop that retries otk database updates
John Rouillard <rouilj@ieee.org>
parents: 5732
diff changeset
1374 # 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
1375 # 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
1376 # 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
1377 # 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
1378 try:
5cd9ac3daed7 Fixes for mysql and postgresql primary db.
John Rouillard <rouilj@ieee.org>
parents: 5733
diff changeset
1379 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
1380 except AttributeError:
5cd9ac3daed7 Fixes for mysql and postgresql primary db.
John Rouillard <rouilj@ieee.org>
parents: 5733
diff changeset
1381 # 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
1382 # 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
1383 pass
5733
62bdcb874433 Test code was not testing the loop that retries otk database updates
John Rouillard <rouilj@ieee.org>
parents: 5732
diff changeset
1384
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
1385 start_time = utcnow()
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
1386 # 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
1387 # use up all our allowed api calls
7555
451232f83244 test: Modify testRestRateLimit test to report when system is too slow.
John Rouillard <rouilj@ieee.org>
parents: 7389
diff changeset
1388 for i in range(calls_per_interval):
451232f83244 test: Modify testRestRateLimit test to report when system is too slow.
John Rouillard <rouilj@ieee.org>
parents: 7389
diff changeset
1389 # i is 0 ... 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
1390 self.client_error_message = []
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1391 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
1392 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
1393 "/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
1394 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
1395
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
1396 loop_time = utcnow()
7555
451232f83244 test: Modify testRestRateLimit test to report when system is too slow.
John Rouillard <rouilj@ieee.org>
parents: 7389
diff changeset
1397 self.assertLess((loop_time-start_time).total_seconds(),
451232f83244 test: Modify testRestRateLimit test to report when system is too slow.
John Rouillard <rouilj@ieee.org>
parents: 7389
diff changeset
1398 int(wait_time_str),
451232f83244 test: Modify testRestRateLimit test to report when system is too slow.
John Rouillard <rouilj@ieee.org>
parents: 7389
diff changeset
1399 "Test system is too slow to complete test as configured")
451232f83244 test: Modify testRestRateLimit test to report when system is too slow.
John Rouillard <rouilj@ieee.org>
parents: 7389
diff changeset
1400
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
1401 # 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
1402 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
1403 # 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
1404 # 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
1405 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
1406 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
1407 # 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
1408 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
1409 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
1410 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
1411 )
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1412
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1413 # 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
1414 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
1415 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
1416 "/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
1417 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
1418 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
1419 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
1420
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1421 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
1422 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
1423 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
1424 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
1425 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
1426 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
1427 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
1428 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
1429 '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
1430 # 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
1431 self.assertAlmostEqual(
5937
5d0873a4de4a fix rate limit headers - were ints/floats need to be strings
John Rouillard <rouilj@ieee.org>
parents: 5879
diff changeset
1432 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
1433 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
1434 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
1435 str(self.server.client.additional_headers["Retry-After"]),
7555
451232f83244 test: Modify testRestRateLimit test to report when system is too slow.
John Rouillard <rouilj@ieee.org>
parents: 7389
diff changeset
1436 wait_time_str) # 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
1437
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1438 print("Reset:", self.server.client.additional_headers["X-RateLimit-Reset"])
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
1439 print("Now realtime pre-sleep:", utcnow())
7555
451232f83244 test: Modify testRestRateLimit test to report when system is too slow.
John Rouillard <rouilj@ieee.org>
parents: 7389
diff changeset
1440 # sleep as requested so we can do another login
451232f83244 test: Modify testRestRateLimit test to report when system is too slow.
John Rouillard <rouilj@ieee.org>
parents: 7389
diff changeset
1441 sleep(float(wait_time_str) + 0.1)
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
1442 print("Now realtime post-sleep:", utcnow())
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
1443
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1444 # 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
1445 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
1446 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
1447 "/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
1448 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
1449 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
1450 print("Reset:", self.server.client.additional_headers["X-RateLimit-Reset-date"])
7587
8f29e4ea05ce fix: issue2551278 - datetime.datetime.utcnow deprecation.
John Rouillard <rouilj@ieee.org>
parents: 7582
diff changeset
1451 print("Now realtime:", utcnow())
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
1452 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
1453 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
1454
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1455 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
1456
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1457 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
1458 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
1459 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
1460 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
1461 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
1462 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
1463 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
1464 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
1465 '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
1466 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
1467 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
1468 # 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
1469 self.assertAlmostEqual(
5937
5d0873a4de4a fix rate limit headers - were ints/floats need to be strings
John Rouillard <rouilj@ieee.org>
parents: 5879
diff changeset
1470 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
1471 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
1472
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1473 # 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
1474 # 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
1475 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
1476 "/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
1477 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
1478
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1479 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
1480 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
1481 str(self.server.client.additional_headers["Retry-After"]),
7555
451232f83244 test: Modify testRestRateLimit test to report when system is too slow.
John Rouillard <rouilj@ieee.org>
parents: 7389
diff changeset
1482 wait_time_str) # 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
1483
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1484 json_dict = json.loads(b2s(results))
7555
451232f83244 test: Modify testRestRateLimit test to report when system is too slow.
John Rouillard <rouilj@ieee.org>
parents: 7389
diff changeset
1485 self.assertEqual(
451232f83244 test: Modify testRestRateLimit test to report when system is too slow.
John Rouillard <rouilj@ieee.org>
parents: 7389
diff changeset
1486 json_dict['error']['msg'],
451232f83244 test: Modify testRestRateLimit test to report when system is too slow.
John Rouillard <rouilj@ieee.org>
parents: 7389
diff changeset
1487 "Api rate limits exceeded. Please wait: %s seconds." %
451232f83244 test: Modify testRestRateLimit test to report when system is too slow.
John Rouillard <rouilj@ieee.org>
parents: 7389
diff changeset
1488 wait_time_str)
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
1489
0e6ed3d72f92 Rest rate limiting code first commit. It is a bit rough and turned off
John Rouillard <rouilj@ieee.org>
parents: 5729
diff changeset
1490 # 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
1491 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
1492 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
1493
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1494 def testEtagGeneration(self):
5668
a4bb88a1a643 A fix for https://issues.roundup-tracker.org/issue2551034
John Rouillard <rouilj@ieee.org>
parents: 5656
diff changeset
1495 ''' 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
1496
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1497 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
1498 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
1499 '''
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1500 from roundup import date
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1501
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1502 originalDate = date.Date
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1503
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1504 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
1505
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1506 # 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
1507 def dummyDate(adate=None):
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1508 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
1509 return dummy
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1510 return dummyClosure
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1511
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
1512 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
1513 try:
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1514 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
1515 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
1516 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
1517 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
1518 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
1519 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
1520 )
5668
a4bb88a1a643 A fix for https://issues.roundup-tracker.org/issue2551034
John Rouillard <rouilj@ieee.org>
parents: 5656
diff changeset
1521
5728
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1522 # 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
1523 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
1524 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
1525 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
1526 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
1527 print(etag)
6256
29c6dc8ed004 Test handling of unset transitive link field.
John Rouillard <rouilj@ieee.org>
parents: 6185
diff changeset
1528 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
1529
5728
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1530 # 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
1531 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
1532 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
1533 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
1534 print(etag)
6256
29c6dc8ed004 Test handling of unset transitive link field.
John Rouillard <rouilj@ieee.org>
parents: 6185
diff changeset
1535 self.assertNotEqual(etag, '"07c3a7f214d394cf46220e294a5a53c8"')
5668
a4bb88a1a643 A fix for https://issues.roundup-tracker.org/issue2551034
John Rouillard <rouilj@ieee.org>
parents: 5656
diff changeset
1536
5728
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1537 # 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
1538 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
1539 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
1540 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
1541 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
1542 print(etag)
6256
29c6dc8ed004 Test handling of unset transitive link field.
John Rouillard <rouilj@ieee.org>
parents: 6185
diff changeset
1543 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
1544 finally:
bfd28644fe43 In suggestion from Joseph Myers, put test code in a try: finally: block
John Rouillard <rouilj@ieee.org>
parents: 5727
diff changeset
1545 date.Date = originalDate
5668
a4bb88a1a643 A fix for https://issues.roundup-tracker.org/issue2551034
John Rouillard <rouilj@ieee.org>
parents: 5656
diff changeset
1546
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1547 def testEtagProcessing(self):
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1548 '''
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1549 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
1550 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
1551 @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
1552
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1553 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
1554 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
1555
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1556 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
1557 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
1558 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
1559 '''
6539
f8df7fed18f6 issue2551175 - Make ETag content-encoding aware.
John Rouillard <rouilj@ieee.org>
parents: 6525
diff changeset
1560 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
1561 '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
1562 try:
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1563 # 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
1564 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
1565 except AttributeError:
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1566 pass
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1567
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1568 form = cgi.FieldStorage()
5726
e199d0ae4a25 issue2551033: prevent reverse engineering hidden data by using etags
John Rouillard <rouilj@ieee.org>
parents: 5711
diff changeset
1569 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
1570 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
1571 form.list = [
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1572 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
1573 ]
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1574
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1575 if mode == 'header':
5645
7f4d19867123 Make print into function call for python3 compatibility.
John Rouillard <rouilj@ieee.org>
parents: 5643
diff changeset
1576 print("Mode = %s"%mode)
5674
6dc4dba1c225 REST: Use If-Match header for incoming requests
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5673
diff changeset
1577 self.headers = {'if-match': etag}
6539
f8df7fed18f6 issue2551175 - Make ETag content-encoding aware.
John Rouillard <rouilj@ieee.org>
parents: 6525
diff changeset
1578 elif mode == 'header-gzip':
f8df7fed18f6 issue2551175 - Make ETag content-encoding aware.
John Rouillard <rouilj@ieee.org>
parents: 6525
diff changeset
1579 print("Mode = %s"%mode)
f8df7fed18f6 issue2551175 - Make ETag content-encoding aware.
John Rouillard <rouilj@ieee.org>
parents: 6525
diff changeset
1580 gzip_etag = etag[:-1] + "-gzip" + etag[-1:]
f8df7fed18f6 issue2551175 - Make ETag content-encoding aware.
John Rouillard <rouilj@ieee.org>
parents: 6525
diff changeset
1581 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
1582 elif mode == 'etag':
5645
7f4d19867123 Make print into function call for python3 compatibility.
John Rouillard <rouilj@ieee.org>
parents: 5643
diff changeset
1583 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
1584 form.list.append(cgi.MiniFieldStorage('@etag', etag))
6539
f8df7fed18f6 issue2551175 - Make ETag content-encoding aware.
John Rouillard <rouilj@ieee.org>
parents: 6525
diff changeset
1585 elif mode == 'etag-br':
f8df7fed18f6 issue2551175 - Make ETag content-encoding aware.
John Rouillard <rouilj@ieee.org>
parents: 6525
diff changeset
1586 print("Mode = %s"%mode)
f8df7fed18f6 issue2551175 - Make ETag content-encoding aware.
John Rouillard <rouilj@ieee.org>
parents: 6525
diff changeset
1587 br_etag = etag[:-1] + "-br" + etag[-1:]
f8df7fed18f6 issue2551175 - Make ETag content-encoding aware.
John Rouillard <rouilj@ieee.org>
parents: 6525
diff changeset
1588 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
1589 elif mode == 'both':
5645
7f4d19867123 Make print into function call for python3 compatibility.
John Rouillard <rouilj@ieee.org>
parents: 5643
diff changeset
1590 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
1591 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
1592 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
1593 elif mode == 'brokenheader':
5645
7f4d19867123 Make print into function call for python3 compatibility.
John Rouillard <rouilj@ieee.org>
parents: 5643
diff changeset
1594 print("Mode = %s"%mode)
5674
6dc4dba1c225 REST: Use If-Match header for incoming requests
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5673
diff changeset
1595 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
1596 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
1597 elif mode == 'brokenetag':
5645
7f4d19867123 Make print into function call for python3 compatibility.
John Rouillard <rouilj@ieee.org>
parents: 5643
diff changeset
1598 print("Mode = %s"%mode)
5674
6dc4dba1c225 REST: Use If-Match header for incoming requests
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5673
diff changeset
1599 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
1600 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
1601 elif mode == 'none':
5645
7f4d19867123 Make print into function call for python3 compatibility.
John Rouillard <rouilj@ieee.org>
parents: 5643
diff changeset
1602 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
1603 else:
6539
f8df7fed18f6 issue2551175 - Make ETag content-encoding aware.
John Rouillard <rouilj@ieee.org>
parents: 6525
diff changeset
1604 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
1605
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1606 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
1607 '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
1608 )
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1609 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
1610 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
1611 else:
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
1612 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
1613
5993
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1614 def testBinaryFieldStorage(self):
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1615 ''' attempt to exercise all paths in the BinaryFieldStorage
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1616 class
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1617 '''
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1618
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1619 expected={ "data": {
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1620 "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
1621 "id": "1"
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1622 }
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1623 }
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1624
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1625 body=b'{ "title": "Joe Doe has problems", \
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1626 "nosy": [ "1", "3" ], \
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1627 "assignedto": "2", \
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1628 "abool": true, \
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1629 "afloat": 2.3, \
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1630 "anint": 567890 \
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1631 }'
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1632 env = { "CONTENT_TYPE": "application/json",
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1633 "CONTENT_LENGTH": len(body),
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1634 "REQUEST_METHOD": "POST"
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1635 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1636 self.server.client.env.update(env)
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1637
5993
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1638 headers={"accept": "application/json; version=1",
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1639 "content-type": env['CONTENT_TYPE'],
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1640 "content-length": env['CONTENT_LENGTH'],
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1641 }
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1642 self.headers=headers
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1643 # we need to generate a FieldStorage the looks like
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1644 # FieldStorage(None, None, 'string') rather than
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1645 # FieldStorage(None, None, [])
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1646 body_file=BytesIO(body) # FieldStorage needs a file
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1647 form = client.BinaryFieldStorage(body_file,
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1648 headers=headers,
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1649 environ=env)
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1650 self.server.client.request.headers.get=self.get_header
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1651 results = self.server.dispatch(env["REQUEST_METHOD"],
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1652 "/rest/data/issue",
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1653 form)
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1654 json_dict = json.loads(b2s(results))
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1655 self.assertEqual(json_dict,expected)
a0ab2c5d1c2a Add test for BinaryFieldStorage.
John Rouillard <rouilj@ieee.org>
parents: 5987
diff changeset
1656
7372
886a5c767d7e Invalid REST item spec returns 404 rather than 400.
John Rouillard <rouilj@ieee.org>
parents: 7183
diff changeset
1657
886a5c767d7e Invalid REST item spec returns 404 rather than 400.
John Rouillard <rouilj@ieee.org>
parents: 7183
diff changeset
1658 def testDispatchGet(self):
886a5c767d7e Invalid REST item spec returns 404 rather than 400.
John Rouillard <rouilj@ieee.org>
parents: 7183
diff changeset
1659 self.create_sampledata()
886a5c767d7e Invalid REST item spec returns 404 rather than 400.
John Rouillard <rouilj@ieee.org>
parents: 7183
diff changeset
1660
886a5c767d7e Invalid REST item spec returns 404 rather than 400.
John Rouillard <rouilj@ieee.org>
parents: 7183
diff changeset
1661 form = cgi.FieldStorage()
886a5c767d7e Invalid REST item spec returns 404 rather than 400.
John Rouillard <rouilj@ieee.org>
parents: 7183
diff changeset
1662 self.server.client.request.headers.get=self.get_header
886a5c767d7e Invalid REST item spec returns 404 rather than 400.
John Rouillard <rouilj@ieee.org>
parents: 7183
diff changeset
1663
886a5c767d7e Invalid REST item spec returns 404 rather than 400.
John Rouillard <rouilj@ieee.org>
parents: 7183
diff changeset
1664 for item in [ "55", "issue1", "1" ]:
886a5c767d7e Invalid REST item spec returns 404 rather than 400.
John Rouillard <rouilj@ieee.org>
parents: 7183
diff changeset
1665 print("test item: '%s'" % item)
886a5c767d7e Invalid REST item spec returns 404 rather than 400.
John Rouillard <rouilj@ieee.org>
parents: 7183
diff changeset
1666 results = self.server.dispatch("GET",
886a5c767d7e Invalid REST item spec returns 404 rather than 400.
John Rouillard <rouilj@ieee.org>
parents: 7183
diff changeset
1667 "/rest/data/issue/%s" % item,
886a5c767d7e Invalid REST item spec returns 404 rather than 400.
John Rouillard <rouilj@ieee.org>
parents: 7183
diff changeset
1668 form)
886a5c767d7e Invalid REST item spec returns 404 rather than 400.
John Rouillard <rouilj@ieee.org>
parents: 7183
diff changeset
1669 json_dict = json.loads(b2s(results))
886a5c767d7e Invalid REST item spec returns 404 rather than 400.
John Rouillard <rouilj@ieee.org>
parents: 7183
diff changeset
1670 try:
886a5c767d7e Invalid REST item spec returns 404 rather than 400.
John Rouillard <rouilj@ieee.org>
parents: 7183
diff changeset
1671 self.assertEqual(json_dict['error']['status'], 404)
886a5c767d7e Invalid REST item spec returns 404 rather than 400.
John Rouillard <rouilj@ieee.org>
parents: 7183
diff changeset
1672 except KeyError as e:
886a5c767d7e Invalid REST item spec returns 404 rather than 400.
John Rouillard <rouilj@ieee.org>
parents: 7183
diff changeset
1673 if e.args[0] == "error" and item == "1":
886a5c767d7e Invalid REST item spec returns 404 rather than 400.
John Rouillard <rouilj@ieee.org>
parents: 7183
diff changeset
1674 pass
886a5c767d7e Invalid REST item spec returns 404 rather than 400.
John Rouillard <rouilj@ieee.org>
parents: 7183
diff changeset
1675 else:
886a5c767d7e Invalid REST item spec returns 404 rather than 400.
John Rouillard <rouilj@ieee.org>
parents: 7183
diff changeset
1676 self.assertTrue(False)
886a5c767d7e Invalid REST item spec returns 404 rather than 400.
John Rouillard <rouilj@ieee.org>
parents: 7183
diff changeset
1677
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
1678 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
1679 """
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1680 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
1681 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
1682 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
1683 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
1684 """
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1685
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1686 # 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
1687 # 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
1688 # 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
1689 # 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
1690 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
1691 "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
1692 "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
1693 "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
1694 "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
1695 "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
1696 }'
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1697 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
1698 "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
1699 "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
1700 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1701 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
1702 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
1703 "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
1704 "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
1705 }
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1706 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
1707 # 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
1708 # 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
1709 # 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
1710 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
1711 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
1712 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
1713 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
1714 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
1715 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
1716 "/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
1717 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
1718
4aae822e2cb4 Added a few comments and a test that fails with the pre-patched code
John Rouillard <rouilj@ieee.org>
parents: 5686
diff changeset
1719 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
1720 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
1721 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
1722 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
1723 "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
1724 self.assertEqual(json_dict['data']['id'], "1")
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1725 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
1726 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
1727 "/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
1728 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
1729 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
1730 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
1731 "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
1732 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
1733 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
1734 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
1735 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
1736 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
1737 ['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
1738 "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
1739
6317
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1740
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1741 def testDispatchDelete(self):
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1742 """
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1743 run Delete through rest dispatch().
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1744 """
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1745
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1746 # TEST #0
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1747 # Delete class raises unauthorized error
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1748 # simulate: /rest/data/issue
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1749 env = { "REQUEST_METHOD": "DELETE"
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1750 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1751 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
1752 headers={"accept": "application/json; version=1",
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1753 }
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1754 self.headers=headers
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1755 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
1756 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
1757 "/rest/data/issue",
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1758 self.empty_form)
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1759
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1760 print(results)
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1761 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
1762 json_dict = json.loads(b2s(results))
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1763
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1764 self.assertEqual(json_dict['error']['msg'],
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1765 "Deletion of a whole class disabled")
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1766
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
1767
6311
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1768 def testDispatchBadContent(self):
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1769 """
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1770 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
1771 """
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1772
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1773 # simulate: /rest/data/issue
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1774 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
1775 "nosy": [ "1", "3" ], \
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1776 "assignedto": "2", \
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1777 "abool": true, \
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1778 "afloat": 2.3, \
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1779 "anint": 567890 \
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1780 }'
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1781 env = { "CONTENT_TYPE": "application/jzot",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1782 "CONTENT_LENGTH": len(body),
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1783 "REQUEST_METHOD": "POST"
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1784 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1785 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
1786
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1787 headers={"accept": "application/json; version=1",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1788 "content-type": env['CONTENT_TYPE'],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1789 "content-length": env['CONTENT_LENGTH'],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1790 }
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1791
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1792 self.headers=headers
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1793 # 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
1794 # FieldStorage(None, None, 'string') rather than
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1795 # FieldStorage(None, None, [])
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1796 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
1797 form = client.BinaryFieldStorage(body_file,
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1798 headers=headers,
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1799 environ=env)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1800 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
1801 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
1802 "/rest/data/issue",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1803 form)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1804
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1805 print(results)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1806 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
1807 json_dict = json.loads(b2s(results))
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1808 self.assertEqual(json_dict['error']['msg'],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1809 "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
1810
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1811 # 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
1812 # 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
1813 results = self.server.dispatch('GET',
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1814 "/rest/data/issue",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1815 form)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1816 print(results)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1817 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
1818
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1819
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1820
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1821 def testDispatchBadAccept(self):
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1822 # 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
1823 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
1824 "nosy": [ "1", "3" ], \
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1825 "assignedto": "2", \
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1826 "abool": true, \
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1827 "afloat": 2.3, \
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1828 "anint": 567890 \
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1829 }'
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1830 env = { "CONTENT_TYPE": "application/json",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1831 "CONTENT_LENGTH": len(body),
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1832 "REQUEST_METHOD": "POST"
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1833 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1834 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
1835 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
1836 "content-type": env['CONTENT_TYPE'],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1837 "content-length": env['CONTENT_LENGTH'],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1838 }
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1839
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1840 self.headers=headers
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1841 # 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
1842 # FieldStorage(None, None, 'string') rather than
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1843 # FieldStorage(None, None, [])
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1844 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
1845 form = client.BinaryFieldStorage(body_file,
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1846 headers=headers,
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1847 environ=env)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1848 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
1849 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
1850 "/rest/data/issue",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1851 form)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1852
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1853 print(results)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1854 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
1855 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
1856
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1857 # 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
1858 # is valid
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1859 env = { "CONTENT_TYPE": "application/json",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1860 "CONTENT_LENGTH": len(body),
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1861 "REQUEST_METHOD": "POST"
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1862 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
1863 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
1864 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
1865 "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
1866 "content-type": env['CONTENT_TYPE'],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1867 "content-length": env['CONTENT_LENGTH'],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1868 }
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1869
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1870 self.headers=headers
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1871 # 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
1872 # FieldStorage(None, None, 'string') rather than
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1873 # FieldStorage(None, None, [])
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1874 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
1875 form = client.BinaryFieldStorage(body_file,
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1876 headers=headers,
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1877 environ=env)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1878 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
1879 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
1880 "/rest/data/issue",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1881 form)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1882
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1883 print(results)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1884 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
1885 json_dict = json.loads(b2s(results))
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1886 # 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
1887 # 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
1888 # 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
1889 # 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
1890 # 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
1891 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
1892
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1893
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1894 # 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
1895 headers={"accept": "",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1896 "content-type": env['CONTENT_TYPE'],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1897 "content-length": env['CONTENT_LENGTH'],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1898 }
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1899
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1900 self.headers=headers
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1901 # 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
1902 # FieldStorage(None, None, 'string') rather than
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1903 # FieldStorage(None, None, [])
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1904 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
1905 form = client.BinaryFieldStorage(body_file,
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1906 headers=headers,
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1907 environ=env)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1908 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
1909 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
1910 "/rest/data/issue",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1911 form)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1912
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1913 print(results)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1914 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
1915 json_dict = json.loads(b2s(results))
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1916 # 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
1917 # When error above is fixed.
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1918 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
1919
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1920 # test 4 accept is random junk.
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1921 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
1922 "content-type": env['CONTENT_TYPE'],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1923 "content-length": env['CONTENT_LENGTH'],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1924 }
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1925
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1926 self.headers=headers
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1927 # 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
1928 # FieldStorage(None, None, 'string') rather than
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1929 # FieldStorage(None, None, [])
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1930 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
1931 form = client.BinaryFieldStorage(body_file,
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1932 headers=headers,
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1933 environ=env)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1934 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
1935 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
1936 "/rest/data/issue",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1937 form)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1938
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1939 print(results)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1940 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
1941 json_dict = json.loads(b2s(results))
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1942 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
1943
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1944 # 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
1945 headers={"accept": "*/*; foo",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1946 "content-type": env['CONTENT_TYPE'],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1947 "content-length": env['CONTENT_LENGTH'],
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1948 }
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1949
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1950 self.headers=headers
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1951 # 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
1952 # FieldStorage(None, None, 'string') rather than
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1953 # FieldStorage(None, None, [])
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1954 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
1955 form = client.BinaryFieldStorage(body_file,
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1956 headers=headers,
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1957 environ=env)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1958 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
1959 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
1960 "/rest/data/issue",
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1961 form)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1962
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1963 print(results)
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1964 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
1965 json_dict = json.loads(b2s(results))
be8d5a8e090a Fix uncaught error when parsing rest headers, document
John Rouillard <rouilj@ieee.org>
parents: 6256
diff changeset
1966 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
1967
6185
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1968 def testStatsGen(self):
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1969 # 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
1970 # 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
1971
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1972 # 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
1973 try:
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1974 list_test = self.assertCountEqual # py3
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1975 except AttributeError:
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1976 list_test = self.assertItemsEqual # py2.7+
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1977
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1978 # get stats
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1979 form = cgi.FieldStorage()
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1980 form.list = [
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1981 cgi.MiniFieldStorage('@stats', 'True'),
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1982 ]
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1983 results = self.server.dispatch('GET',
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1984 "/rest/data/user/1/realname",
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1985 form)
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1986 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
1987 json_dict = json.loads(b2s(results))
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1988
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1989 # check that @stats are defined
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1990 self.assertTrue( '@stats' in json_dict['data'] )
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1991 # check that the keys are present
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1992 # not validating values as that changes
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1993 valid_fields= [ us2u('elapsed'),
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1994 us2u('cache_hits'),
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1995 us2u('cache_misses'),
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1996 us2u('get_items'),
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1997 us2u('filtering') ]
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
1998 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
1999
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2000 # 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
2001 form = cgi.FieldStorage()
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2002 form.list = [
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2003 cgi.MiniFieldStorage('@stats', 'False'),
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2004 ]
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2005 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
2006 results = self.server.dispatch('GET',
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2007 "/rest/data/user/1/realname",
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2008 form)
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2009 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
2010 json_dict = json.loads(b2s(results))
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2011 print(results)
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2012 # check that @stats are not defined
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2013 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
2014
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2015 # 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
2016 # false will always work
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2017 form = cgi.FieldStorage()
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2018 form.list = [
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2019 cgi.MiniFieldStorage('@stats', 'random'),
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2020 ]
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2021 results = self.server.dispatch('GET',
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2022 "/rest/data/user/1/realname",
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2023 form)
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2024 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
2025 json_dict = json.loads(b2s(results))
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2026 print(results)
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2027 # check that @stats are not defined
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2028 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
2029
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2030 # 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
2031 results = self.server.dispatch('GET',
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2032 "/rest/data/user/1/realname",
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2033 self.empty_form)
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2034 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
2035 json_dict = json.loads(b2s(results))
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2036
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2037 # check that @stats are not defined
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2038 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
2039
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2040
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2041
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2042 # 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
2043 # This generates a FieldStorage that looks like:
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2044 # FieldStorage(None, None, [])
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2045 # use etag from header
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2046 #
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2047 # 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
2048 # the results from the db.
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2049 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
2050 self.db.config['WEB_SECRET_KEY'])
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2051 headers={"if-match": etag,
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2052 "accept": "application/vnd.json.test-v1+json",
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2053 }
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2054 form = cgi.FieldStorage()
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2055 form.list = [
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2056 cgi.MiniFieldStorage('data', 'Joe Doe'),
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2057 cgi.MiniFieldStorage('@apiver', '1'),
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2058 cgi.MiniFieldStorage('@stats', 'true'),
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2059 ]
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2060 self.headers = headers
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2061 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
2062 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
2063 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
2064 results = self.server.dispatch('PUT',
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2065 "/rest/data/user/1/realname",
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2066 form)
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2067 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
2068 json_dict = json.loads(b2s(results))
1cb2375015f0 Enable timing stats reporting in REST interface.
John Rouillard <rouilj@ieee.org>
parents: 6090
diff changeset
2069 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
2070
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2071 def testDispatch(self):
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2072 """
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2073 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
2074 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
2075 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
2076 process.
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2077 """
5653
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
2078 # TEST #1
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
2079 # 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
2080 # 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
2081 # 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
2082 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
2083 self.db.config['WEB_SECRET_KEY'])
5651
a02ef29b4242 Fix REST tests for Python 3.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5650
diff changeset
2084 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
2085 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
2086 "CONTENT_LENGTH": len(body),
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2087 "REQUEST_METHOD": "PUT",
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2088 "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
2089 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2090 self.server.client.env.update(env)
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2091
5686
eb51c0d9c9bf Move @apiver version extraction code after the input is parsed for
John Rouillard <rouilj@ieee.org>
parents: 5682
diff changeset
2092 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
2093 "content-type": env['CONTENT_TYPE'],
5655
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
2094 "content-length": env['CONTENT_LENGTH'],
5674
6dc4dba1c225 REST: Use If-Match header for incoming requests
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5673
diff changeset
2095 "if-match": etag
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2096 }
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2097 self.headers=headers
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2098 # 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
2099 # 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
2100 # FieldStorage(None, None, [])
5651
a02ef29b4242 Fix REST tests for Python 3.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5650
diff changeset
2101 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
2102 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
2103 headers=headers,
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2104 environ=env)
5650
e8ca7072c629 Fix Python 3 issues in REST code.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5647
diff changeset
2105 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
2106 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
2107 "/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
2108 form)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2109
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2110 # invalid origin, no credentials allowed.
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2111 self.assertNotIn("Access-Control-Allow-Credentials",
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2112 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
2113 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
2114 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
2115 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
2116 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
2117 '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
2118
eb51c0d9c9bf Move @apiver version extraction code after the input is parsed for
John Rouillard <rouilj@ieee.org>
parents: 5682
diff changeset
2119
eb51c0d9c9bf Move @apiver version extraction code after the input is parsed for
John Rouillard <rouilj@ieee.org>
parents: 5682
diff changeset
2120 # 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
2121 # 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
2122 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
2123 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
2124 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
2125 headers=headers,
eb51c0d9c9bf Move @apiver version extraction code after the input is parsed for
John Rouillard <rouilj@ieee.org>
parents: 5682
diff changeset
2126 environ=env)
eb51c0d9c9bf Move @apiver version extraction code after the input is parsed for
John Rouillard <rouilj@ieee.org>
parents: 5682
diff changeset
2127 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
2128 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
2129 "/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
2130 form)
eb51c0d9c9bf Move @apiver version extraction code after the input is parsed for
John Rouillard <rouilj@ieee.org>
parents: 5682
diff changeset
2131 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
2132 del(self.headers)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2133
5653
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
2134 # TEST #2
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2135 # 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
2136 # 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
2137 # 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
2138 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
2139 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
2140 etagb = etag.strip ('"')
6dc4dba1c225 REST: Use If-Match header for incoming requests
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5673
diff changeset
2141 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
2142 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
2143 "CONTENT_LENGTH": len(body),
5655
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
2144 "REQUEST_METHOD": "PUT",
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2145 }
5655
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
2146 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
2147 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
2148 form = client.BinaryFieldStorage(body_file,
5655
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
2149 headers=None,
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2150 environ=env)
5650
e8ca7072c629 Fix Python 3 issues in REST code.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5647
diff changeset
2151 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
2152
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
2153 headers={"accept": "application/json",
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
2154 "content-type": env['CONTENT_TYPE'],
5674
6dc4dba1c225 REST: Use If-Match header for incoming requests
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5673
diff changeset
2155 "if-match": etag
5655
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
2156 }
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
2157 self.headers=headers # set for dispatch
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
2158
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2159 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
2160 "/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
2161 form)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2162
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2163 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
2164 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
2165 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
2166 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
2167 'Joe Doe 2')
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2168 del(self.headers)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2169
5653
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
2170 # TEST #3
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2171 # 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
2172 # 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
2173 # FieldStorage(None, None, [])
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2174 # use etag from header
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2175 #
5655
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
2176 # 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
2177 # 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
2178 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
2179 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
2180 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
2181 "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
2182 }
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2183 form = cgi.FieldStorage()
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2184 form.list = [
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2185 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
2186 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
2187 ]
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2188 self.headers = headers
5650
e8ca7072c629 Fix Python 3 issues in REST code.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5647
diff changeset
2189 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
2190 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
2191 "/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
2192 form)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2193 self.assertEqual(self.dummy_client.response_code, 200)
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2194 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
2195 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
2196 "/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
2197 self.empty_form)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2198 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
2199 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
2200
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2201 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
2202 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
2203 "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
2204 "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
2205 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
2206 "<type 'str'>"))
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2207 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
2208 del(self.headers)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2209
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2210
5653
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
2211 # TEST #4
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
2212 # 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
2213 # 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
2214 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
2215 self.empty_form)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2216 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
2217
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
2218 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
2219 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
2220 etagb = etag.strip ('"')
6dc4dba1c225 REST: Use If-Match header for incoming requests
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5673
diff changeset
2221 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
2222 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
2223 "CONTENT_LENGTH": len(body),
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2224 "REQUEST_METHOD": "PATCH"
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2225 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2226 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
2227 headers={"accept": "application/json",
5655
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
2228 "content-type": env['CONTENT_TYPE'],
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
2229 "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
2230 }
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2231 self.headers=headers
5651
a02ef29b4242 Fix REST tests for Python 3.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5650
diff changeset
2232 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
2233 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
2234 headers=headers,
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2235 environ=env)
5650
e8ca7072c629 Fix Python 3 issues in REST code.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5647
diff changeset
2236 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
2237 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
2238 "/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
2239 form)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2240
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2241 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
2242 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
2243 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
2244 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
2245 'demo2@example.com')
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2246
5653
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
2247 # 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
2248 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
2249 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
2250 etagb = etag.strip ('"')
6dc4dba1c225 REST: Use If-Match header for incoming requests
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5673
diff changeset
2251 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
2252 stored_results['data']['attributes']['address'],
5674
6dc4dba1c225 REST: Use If-Match header for incoming requests
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5673
diff changeset
2253 etagb))
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2254 # 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
2255 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
2256 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
2257 headers=headers,
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2258 environ=env)
5650
e8ca7072c629 Fix Python 3 issues in REST code.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5647
diff changeset
2259 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
2260 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
2261 "/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
2262 form)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2263
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2264 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
2265 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
2266 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
2267 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
2268 'random@home.org')
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2269 del(self.headers)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2270
5653
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
2271 # TEST #5
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
2272 # POST: create new issue
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
2273 # no etag needed
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
2274 etag = "not needed"
5651
a02ef29b4242 Fix REST tests for Python 3.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5650
diff changeset
2275 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
2276 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
2277 "CONTENT_LENGTH": len(body),
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2278 "REQUEST_METHOD": "POST"
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2279 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2280 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
2281 headers={"accept": "application/json",
5655
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
2282 "content-type": env['CONTENT_TYPE'],
207e0f5d551c Merge in non-conflicting changes from ba67e397f063
John Rouillard <rouilj@ieee.org>
parents: 5651 5653
diff changeset
2283 "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
2284 }
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2285 self.headers=headers
5651
a02ef29b4242 Fix REST tests for Python 3.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5650
diff changeset
2286 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
2287 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
2288 headers=headers,
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2289 environ=env)
5650
e8ca7072c629 Fix Python 3 issues in REST code.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5647
diff changeset
2290 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
2291 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
2292 "/rest/data/issue",
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2293 form)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2294
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2295 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
2296 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
2297 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
2298 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
2299 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
2300 self.empty_form)
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
2301 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
2302 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
2303 'foo bar')
5653
ba67e397f063 Fix string/bytes issues under python 3.
John Rouillard <rouilj@ieee.org>
parents: 5647
diff changeset
2304
5711
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2305 # TEST #6
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2306 # 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
2307 # 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
2308 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
2309 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
2310 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
2311 "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
2312 "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
2313 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2314 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
2315 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
2316 "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
2317 "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
2318 }
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2319 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
2320 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
2321 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
2322 headers=headers,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2323 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
2324 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
2325 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
2326 "/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
2327 form)
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2328
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2329 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
2330 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
2331 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
2332 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
2333 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
2334 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
2335
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2336 # TEST #7
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2337 # 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
2338 # 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
2339 # 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
2340 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
2341 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
2342 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
2343 "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
2344 "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
2345 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2346 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
2347 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
2348 "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
2349 "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
2350 }
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2351 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
2352 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
2353 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
2354 headers=headers,
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2355 environ=env)
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2356 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
2357 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
2358 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
2359 "/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
2360 form)
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2361 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
2362 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
2363 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
2364 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
2365 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
2366 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
2367 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
2368
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2369
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2370 # TEST #8
5984
25a813415d59 issue2551069 - when unsupported type is found report type
John Rouillard <rouilj@ieee.org>
parents: 5937
diff changeset
2371 # 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
2372 # 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
2373 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
2374 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
2375 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
2376 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
2377 "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
2378 "REQUEST_METHOD": "DELETE" }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2379 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
2380 # 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
2381 # .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
2382 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
2383 "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
2384 "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
2385 "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
2386 }
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2387 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
2388 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
2389 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
2390 headers=headers,
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2391 environ=env)
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2392 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
2393 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
2394 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
2395 "/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
2396 form)
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2397 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
2398 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
2399 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
2400 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
2401 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
2402
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2403 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
2404 results = self.server.dispatch('GET',
8b88fb789208 still trying to get testing to pass.
John Rouillard <rouilj@ieee.org>
parents: 5985
diff changeset
2405 "/rest/data/issuetitle:=asdf.jon",
5984
25a813415d59 issue2551069 - when unsupported type is found report type
John Rouillard <rouilj@ieee.org>
parents: 5937
diff changeset
2406 form)
25a813415d59 issue2551069 - when unsupported type is found report type
John Rouillard <rouilj@ieee.org>
parents: 5937
diff changeset
2407 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
2408 print(results)
5985
f1191a470598 Fix test to account for mixxing dicttoxml.
John Rouillard <rouilj@ieee.org>
parents: 5984
diff changeset
2409 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
2410 from roundup.dicttoxml import dicttoxml
f1191a470598 Fix test to account for mixxing dicttoxml.
John Rouillard <rouilj@ieee.org>
parents: 5984
diff changeset
2411 includexml = ', application/xml'
f1191a470598 Fix test to account for mixxing dicttoxml.
John Rouillard <rouilj@ieee.org>
parents: 5984
diff changeset
2412 except ImportError:
f1191a470598 Fix test to account for mixxing dicttoxml.
John Rouillard <rouilj@ieee.org>
parents: 5984
diff changeset
2413 includexml = ''
f1191a470598 Fix test to account for mixxing dicttoxml.
John Rouillard <rouilj@ieee.org>
parents: 5984
diff changeset
2414
5984
25a813415d59 issue2551069 - when unsupported type is found report type
John Rouillard <rouilj@ieee.org>
parents: 5937
diff changeset
2415 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
2416 "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
2417 self.assertEqual(b2s(results), response)
5984
25a813415d59 issue2551069 - when unsupported type is found report type
John Rouillard <rouilj@ieee.org>
parents: 5937
diff changeset
2418
5741
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2419 # TEST #9
5742
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2420 # 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
2421 # ... ; version=z
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2422 # or
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2423 # 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
2424 # or
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2425 # @apiver
5741
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2426 # 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
2427 form = cgi.FieldStorage()
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2428 form.list = [
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2429 cgi.MiniFieldStorage('@apiver', 'L'),
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2430 ]
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2431
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2432 self.server.client.env.update({'REQUEST_METHOD': 'GET'})
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2433
5742
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2434 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
2435 self.headers=headers
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2436 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
2437 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
2438 "/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
2439 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
2440 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
2441 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
2442 self.assertEqual(json_dict['error']['msg'],
6513
1d6c986b3f72 Fix test.
John Rouillard <rouilj@ieee.org>
parents: 6512
diff changeset
2443 "Unrecognized api version: L. See /rest without "
1d6c986b3f72 Fix test.
John Rouillard <rouilj@ieee.org>
parents: 6512
diff changeset
2444 "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
2445
5741
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2446 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
2447 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
2448 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
2449 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
2450 "/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
2451 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
2452 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
2453 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
2454 self.assertEqual(json_dict['error']['msg'],
6513
1d6c986b3f72 Fix test.
John Rouillard <rouilj@ieee.org>
parents: 6512
diff changeset
2455 "Unrecognized api version: z. See /rest without "
1d6c986b3f72 Fix test.
John Rouillard <rouilj@ieee.org>
parents: 6512
diff changeset
2456 "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
2457
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2458 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
2459 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
2460 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
2461 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
2462 "/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
2463 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
2464 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
2465 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
2466 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
2467 self.assertEqual(json_dict['error']['msg'],
6513
1d6c986b3f72 Fix test.
John Rouillard <rouilj@ieee.org>
parents: 6512
diff changeset
2468 "Unrecognized api version: z. See /rest without "
1d6c986b3f72 Fix test.
John Rouillard <rouilj@ieee.org>
parents: 6512
diff changeset
2469 "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
2470
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2471 # 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
2472 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
2473 }
9c2e51aae18a Test to make sure version selection via accept header is parsed correctly.
John Rouillard <rouilj@ieee.org>
parents: 5734
diff changeset
2474 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
2475 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
2476 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
2477 "/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
2478 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
2479 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
2480 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
2481 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
2482 self.assertEqual(json_dict['error']['msg'],
6513
1d6c986b3f72 Fix test.
John Rouillard <rouilj@ieee.org>
parents: 6512
diff changeset
2483 "Unrecognized api version: a. See /rest without "
1d6c986b3f72 Fix test.
John Rouillard <rouilj@ieee.org>
parents: 6512
diff changeset
2484 "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
2485
5742
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2486 # TEST #10
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2487 # 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
2488 expected_rest = {
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2489 "data": {
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2490 "supported_versions": [
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2491 1
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2492 ],
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2493 "default_version": 1,
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2494 "links": [
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2495 {
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2496 "rel": "self",
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2497 "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
2498 },
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2499 {
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2500 "rel": "data",
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2501 "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
2502 },
c505c774a94d Mutiple changes to REST code.
John Rouillard <rouilj@ieee.org>
parents: 6513
diff changeset
2503 {
c505c774a94d Mutiple changes to REST code.
John Rouillard <rouilj@ieee.org>
parents: 6513
diff changeset
2504 "rel": "summary",
c505c774a94d Mutiple changes to REST code.
John Rouillard <rouilj@ieee.org>
parents: 6513
diff changeset
2505 "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
2506 }
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2507 ]
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2508 }
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2509 }
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2510
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2511 self.headers={}
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2512 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
2513 "/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
2514 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
2515 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
2516 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
2517 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
2518
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2519
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2520 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
2521 "/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
2522 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
2523 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
2524 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
2525 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
2526
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2527 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
2528 "/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
2529 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
2530 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
2531
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2532 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
2533 "/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
2534 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
2535 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
2536
5746
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2537 expected_data = {
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2538 "data": {
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2539 "issue": {
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2540 "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
2541 },
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2542 "priority": {
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2543 "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
2544 },
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2545 "user": {
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2546 "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
2547 },
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2548 "query": {
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2549 "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
2550 },
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2551 "status": {
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2552 "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
2553 },
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2554 "keyword": {
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2555 "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
2556 },
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2557 "msg": {
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2558 "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
2559 },
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2560 "file": {
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2561 "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
2562 }
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2563 }
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2564 }
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2565
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2566 results = self.server.dispatch('GET',
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2567 "/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
2568 print("10e: " + b2s(results))
5746
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2569 self.assertEqual(self.server.client.response_code, 200)
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2570 results_dict = json.loads(b2s(results))
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2571 self.assertEqual(results_dict, expected_data)
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2572
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2573 results = self.server.dispatch('GET',
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2574 "/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
2575 print("10f: " + b2s(results))
5746
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2576 self.assertEqual(self.server.client.response_code, 200)
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2577 results_dict = json.loads(b2s(results))
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2578 self.assertEqual(results_dict, expected_data)
fea2b6e54492 Check /rest/data.
John Rouillard <rouilj@ieee.org>
parents: 5744
diff changeset
2579
5742
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2580 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
2581 "/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
2582 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
2583
97d7faebef0a Test @apiver version parsing using bogus version. Test /rest, /rest/
John Rouillard <rouilj@ieee.org>
parents: 5741
diff changeset
2584 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
2585 "/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
2586 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
2587
5711
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2588 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
2589
5744
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2590 def testAcceptHeaderParsing(self):
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2591 self.server.client.env['REQUEST_METHOD'] = 'GET'
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2592
5744
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2593 # TEST #1
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2594 # json highest priority
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2595 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
2596 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
2597 "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
2598 "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
2599 }
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2600 self.headers=headers
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2601 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
2602 "/rest/data/status/1",
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2603 self.empty_form)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2604 print(results)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2605 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
2606 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
2607 "application/json")
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2608
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2609 # TEST #2
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2610 # text highest priority
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2611 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
2612 "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
2613 "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
2614 }
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2615 self.headers=headers
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2616 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
2617 "/rest/data/status/1",
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2618 self.empty_form)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2619 print(results)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2620 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
2621 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
2622 "application/json")
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2623
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2624 # TEST #3
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2625 # no acceptable type
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2626 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
2627 }
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2628 self.headers=headers
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2629 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
2630 "/rest/data/status/1",
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2631 self.empty_form)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2632 print(results)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2633 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
2634 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
2635 "application/json")
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2636
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2637 # TEST #4
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2638 # 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
2639 headers={}
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2640 self.headers=headers
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2641 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
2642 "/rest/data/status/1",
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2643 self.empty_form)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2644 print(results)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2645 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
2646 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
2647 "application/json")
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2648
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2649 # TEST #5
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2650 # 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
2651 headers={ "accept": "*/*"}
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2652 self.headers=headers
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2653 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
2654 "/rest/data/status/1",
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2655 self.empty_form)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2656 print(results)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2657 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
2658 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
2659 "application/json")
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2660
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2661 # TEST #6
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2662 # 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
2663 # 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
2664 # and errors.
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2665 # 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
2666 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
2667 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
2668 "*/*; 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
2669 "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
2670 }
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2671 self.headers=headers
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2672 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
2673 "/rest/data/status/1",
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2674 self.empty_form)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2675 print(results)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2676 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
2677 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
2678 "application/json")
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2679
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2680
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2681 '''
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2682 # 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
2683 # not installed for testing
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2684 # TEST #7
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2685 # xml wins
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2686 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
2687 "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
2688 "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
2689 }
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2690 self.headers=headers
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2691 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
2692 "/rest/data/status/1",
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2693 self.empty_form)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2694 print(results)
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2695 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
2696 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
2697 "application/xml")
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2698 '''
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2699
6316
323661f7c89c Test handling of invalid API version using Accept header.
John Rouillard <rouilj@ieee.org>
parents: 6314
diff changeset
2700 # TEST #8
323661f7c89c Test handling of invalid API version using Accept header.
John Rouillard <rouilj@ieee.org>
parents: 6314
diff changeset
2701 # invalid api version
323661f7c89c Test handling of invalid API version using Accept header.
John Rouillard <rouilj@ieee.org>
parents: 6314
diff changeset
2702 # 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
2703 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
2704 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
2705 }
323661f7c89c Test handling of invalid API version using Accept header.
John Rouillard <rouilj@ieee.org>
parents: 6314
diff changeset
2706 self.headers=headers
6509
1fc765ef6379 Fix 204 responses, hangs and crashes with REST.
John Rouillard <rouilj@ieee.org>
parents: 6366
diff changeset
2707 results = self.server.dispatch('GET',
1fc765ef6379 Fix 204 responses, hangs and crashes with REST.
John Rouillard <rouilj@ieee.org>
parents: 6366
diff changeset
2708 "/rest/data/status/1",
1fc765ef6379 Fix 204 responses, hangs and crashes with REST.
John Rouillard <rouilj@ieee.org>
parents: 6366
diff changeset
2709 self.empty_form)
6316
323661f7c89c Test handling of invalid API version using Accept header.
John Rouillard <rouilj@ieee.org>
parents: 6314
diff changeset
2710 print(results)
6509
1fc765ef6379 Fix 204 responses, hangs and crashes with REST.
John Rouillard <rouilj@ieee.org>
parents: 6366
diff changeset
2711 json_dict = json.loads(b2s(results))
1fc765ef6379 Fix 204 responses, hangs and crashes with REST.
John Rouillard <rouilj@ieee.org>
parents: 6366
diff changeset
2712 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
2713 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
2714 "application/json")
1fc765ef6379 Fix 204 responses, hangs and crashes with REST.
John Rouillard <rouilj@ieee.org>
parents: 6366
diff changeset
2715 self.assertEqual(json_dict['error']['msg'],
6512
b54bb529d701 Fix test.
John Rouillard <rouilj@ieee.org>
parents: 6509
diff changeset
2716 "Unrecognized api version: 99. See /rest "
b54bb529d701 Fix test.
John Rouillard <rouilj@ieee.org>
parents: 6509
diff changeset
2717 "without specifying api version for "
b54bb529d701 Fix test.
John Rouillard <rouilj@ieee.org>
parents: 6509
diff changeset
2718 "supported versions.")
6316
323661f7c89c Test handling of invalid API version using Accept header.
John Rouillard <rouilj@ieee.org>
parents: 6314
diff changeset
2719
5743
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2720 def testMethodOverride(self):
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2721 # TEST #1
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2722 # 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
2723
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2724 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
2725 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
2726 "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
2727 "REQUEST_METHOD": "POST"
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2728 }
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2729 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
2730 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
2731 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
2732 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
2733 "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
2734 "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
2735 "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
2736 }
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2737 self.headers=headers
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2738 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
2739 headers=headers,
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2740 environ=env)
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2741 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
2742
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2743 self.server.client.env.update({'REQUEST_METHOD': method})
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2744
5743
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2745 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
2746 "/rest/data/status",
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2747 form)
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2748
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2749 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
2750 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
2751 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
2752 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
2753 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
2754 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
2755 "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
2756
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2757 # TEST #2
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2758 # 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
2759 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
2760 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
2761 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
2762 etagb = etag.strip ('"')
5744
d4de45cde106 Accept header parsing fixes. Now return first acceptable match rather
John Rouillard <rouilj@ieee.org>
parents: 5743
diff changeset
2763 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
2764 "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
2765 "content-length": 0,
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2766 "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
2767 }
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2768 self.headers=headers
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2769 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
2770 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
2771 headers=headers,
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2772 environ=env)
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2773 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
2774 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
2775 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
2776 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
2777 "/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
2778 form)
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2779 print(results)
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2780 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
2781 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
2782 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
2783 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
2784 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
2785
60299cd36670 Basic tests for tunneling of methods via x-http-method-override.
John Rouillard <rouilj@ieee.org>
parents: 5742
diff changeset
2786
5711
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2787 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
2788 ''' 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
2789 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
2790 '''
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2791 import time
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2792 # setup environment
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2793 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
2794 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
2795 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
2796 "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
2797 "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
2798 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2799 self.server.client.env.update(env)
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2800
5711
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2801 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
2802 "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
2803 "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
2804 }
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2805 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
2806 # 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
2807 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
2808 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
2809 headers=headers,
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2810 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
2811
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2812 ## 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
2813 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
2814 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
2815 "/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
2816 form)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2817
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2818 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
2819 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
2820 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
2821
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2822 # 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
2823 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
2824
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2825 ## 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
2826 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
2827 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
2828 "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
2829 "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
2830 }
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2831 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
2832 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
2833 "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
2834 "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
2835 }
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2836 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
2837 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
2838 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
2839 headers=headers,
aea2cc142c1b Added some more rest testing and make sure api version is valid.
John Rouillard <rouilj@ieee.org>
parents: 5710
diff changeset
2840 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
2841 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
2842 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
2843 url,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2844 form)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2845
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2846 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
2847 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
2848 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
2849 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
2850 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
2851 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
2852 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
2853 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
2854 'foo bar')
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2855
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2856 ## 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
2857 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
2858 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
2859 url,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2860 form)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2861 # 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
2862 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
2863 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
2864 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
2865 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
2866 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
2867 "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
2868
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2869 ## 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
2870 ## allowed (405)
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2871 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
2872 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
2873 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
2874 "/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
2875 form)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2876 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
2877
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2878
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2879 ## 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
2880 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
2881 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
2882 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
2883 headers=headers,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2884 environ=env)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2885 self.server.client.request.headers.get=self.get_header
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
2886 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
2887 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
2888 "/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
2889 form)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2890 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
2891 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
2892
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2893 # 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
2894 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
2895 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
2896
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2897 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
2898 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
2899 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
2900 headers=headers,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2901 environ=env)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2902 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
2903 url,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2904 form)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2905 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
2906 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
2907 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
2908 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
2909 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
2910 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
2911
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2912 ## 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
2913 ## 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
2914 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
2915 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
2916 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
2917 headers=headers,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2918 environ=env)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2919 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
2920 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
2921 "/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
2922 form)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2923 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
2924 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
2925
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2926 # 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
2927 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
2928 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
2929
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2930 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
2931 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
2932 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
2933 headers=headers,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2934 environ=env)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2935 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
2936 url,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2937 form)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2938 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
2939 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
2940 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
2941 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
2942 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
2943 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
2944 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
2945
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2946
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2947 ## 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
2948 ## 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
2949 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
2950 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
2951 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
2952 headers=headers,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2953 environ=env)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2954 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
2955 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
2956 "/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
2957 form)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2958 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
2959 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
2960 # 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
2961 # 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
2962 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
2963 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
2964 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
2965
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2966
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2967 ## 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
2968 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
2969 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
2970 # 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
2971 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
2972 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
2973 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
2974 headers=headers,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2975 environ=env)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2976 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
2977 url,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2978 form)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2979 print(results)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2980 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
2981 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
2982 # 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
2983 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
2984 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
2985 "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
2986
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2987 ## 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
2988 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
2989 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
2990 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
2991 headers=headers,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2992 environ=env)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2993 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
2994 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
2995 "/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
2996 form)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2997 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
2998 print(results)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
2999 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
3000 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
3001 "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
3002 "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
3003
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
3004 ## 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
3005 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
3006 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
3007 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
3008 headers=headers,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
3009 environ=env)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
3010 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
3011 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
3012 "/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
3013 form)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
3014 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
3015 print(results)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
3016 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
3017 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
3018 "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
3019 "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
3020
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
3021 ## 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
3022 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
3023 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
3024 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
3025 headers=headers,
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
3026 environ=env)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
3027 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
3028 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
3029 "/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
3030 form)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
3031 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
3032 print(results)
0b79bfcb3312 Add support for making an idempotent POST. This allows retrying a POST
John Rouillard <rouilj@ieee.org>
parents: 5708
diff changeset
3033 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
3034 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
3035 "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
3036 "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
3037 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
3038
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3039 def testPutElement(self):
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3040 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3041 Change joe's 'realname'
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3042 Check if we can't change admin's detail
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3043 """
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3044 # 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
3045 # no etag
5585
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
3046 form = cgi.FieldStorage()
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
3047 form.list = [
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
3048 cgi.MiniFieldStorage('data', 'Joe Doe Doe')
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
3049 ]
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3050 results = self.server.put_attribute(
5585
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
3051 'user', self.joeid, 'realname', form
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
3052 )
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3053 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
3054 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
3055 '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
3056 )
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3057 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
3058 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
3059
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
3060 # 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
3061 form = cgi.FieldStorage()
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3062 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
3063 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
3064 form.list = [
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3065 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
3066 ]
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3067
5674
6dc4dba1c225 REST: Use If-Match header for incoming requests
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5673
diff changeset
3068 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
3069 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
3070 '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
3071 )
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3072 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
3073 results = self.server.get_attribute(
5591
a25d79e874cb Added filtering and pagination
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5588
diff changeset
3074 '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
3075 )
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3076 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
3077 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
3078 del(self.headers)
5585
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
3079
5643
a60cbbcc9309 Added support for accepting application/json payload in addition to
John Rouillard <rouilj@ieee.org>
parents: 5639
diff changeset
3080 # 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
3081 # 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
3082 # 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
3083 # 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
3084 # having to filter out protected items.
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3085 form = cgi.FieldStorage()
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3086 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
3087 self.db.config['WEB_SECRET_KEY'])
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3088 form.list = [
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3089 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
3090 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
3091 cgi.MiniFieldStorage('@etag', etag)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3092 ]
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3093 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
3094 self.assertEqual(self.dummy_client.response_code, 200)
5591
a25d79e874cb Added filtering and pagination
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5588
diff changeset
3095 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
3096 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
3097 self.assertEqual(results['data']['attributes']['realname'], 'Joe Doe')
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3098
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3099 # 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
3100 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
3101 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
3102 self.assertEqual(results['error']['status'], 403)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3103
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3104 # 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
3105 # 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
3106 # 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
3107 form = cgi.FieldStorage()
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3108 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
3109 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
3110 form.list = [
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3111 cgi.MiniFieldStorage('JustKidding', '3'),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3112 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
3113 cgi.MiniFieldStorage('@etag', etag)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3114 ]
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3115 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
3116 expected= {'error': {'status': 400,
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3117 '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
3118 'found in class user')}}
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3119 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
3120 expected['error']['status'])
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3121 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
3122 type(expected['error']['msg']))
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3123 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
3124 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
3125 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
3126 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
3127
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3128 def testPutAttribute(self):
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3129 # put protected property
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3130 # 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
3131 self.db.setCurrentUser('admin')
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3132 form = cgi.FieldStorage()
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3133 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
3134 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
3135 form.list = [
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3136 cgi.MiniFieldStorage('data', '3'),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3137 cgi.MiniFieldStorage('@etag', etag)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3138 ]
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3139 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
3140 '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
3141 )
5707
f9a762678af6 Change some 400 errors to 405 (method not allowed) errors where user is
John Rouillard <rouilj@ieee.org>
parents: 5706
diff changeset
3142 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
3143 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
3144 '"activity" are reserved\'')}}
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3145 print(results)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3146 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
3147 expected['error']['status'])
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3148 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
3149 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
3150 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
3151
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3152 # put invalid property
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3153 # 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
3154 self.db.setCurrentUser('admin')
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3155 form = cgi.FieldStorage()
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3156 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
3157 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
3158 form.list = [
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3159 cgi.MiniFieldStorage('data', '3'),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3160 cgi.MiniFieldStorage('@etag', etag)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3161 ]
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3162 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
3163 '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
3164 )
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3165 expected= {'error': {'status': 400,
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3166 'msg': UsageError("'youMustBeKiddingMe' "
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3167 "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
3168 print(results)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3169 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
3170 expected['error']['status'])
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3171 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
3172 type(expected['error']['msg']))
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3173 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
3174
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3175 def testPost(self):
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3176 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3177 Post a new issue with title: foo
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3178 Verify the information of the created issue
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3179 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3180 form = cgi.FieldStorage()
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3181 form.list = [
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3182 cgi.MiniFieldStorage('title', 'foo')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3183 ]
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3184 results = self.server.post_collection('issue', form)
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3185 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
3186 issueid = results['data']['id']
5591
a25d79e874cb Added filtering and pagination
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5588
diff changeset
3187 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
3188 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
3189 self.assertEqual(results['data']['attributes']['title'], 'foo')
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3190 self.assertEqual(self.db.issue.get(issueid, "tx_Source"), 'web')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3191
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3192 def testPostFile(self):
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3193 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3194 Post a new file with content: hello\r\nthere
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3195 Verify the information of the created file
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3196 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3197 form = cgi.FieldStorage()
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3198 form.list = [
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3199 cgi.MiniFieldStorage('content', 'hello\r\nthere')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3200 ]
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3201 results = self.server.post_collection('file', form)
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3202 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
3203 fileid = results['data']['id']
5591
a25d79e874cb Added filtering and pagination
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5588
diff changeset
3204 results = self.server.get_element('file', fileid, self.empty_form)
a25d79e874cb Added filtering and pagination
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5588
diff changeset
3205 results = results['data']
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3206 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
3207 self.assertEqual(results['attributes']['content'],
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3208 {'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
3209
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3210 # File content is only shown with verbose=3
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3211 form = cgi.FieldStorage()
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3212 form.list = [
6317
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
3213 cgi.MiniFieldStorage('@verbose', '3'),
ea0becc9fdb9 Test delete of class and use of @protected.
John Rouillard <rouilj@ieee.org>
parents: 6316
diff changeset
3214 cgi.MiniFieldStorage('@protected', 'true')
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3215 ]
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3216 results = self.server.get_element('file', fileid, form)
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3217 results = results['data']
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3218 self.assertEqual(self.dummy_client.response_code, 200)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3219 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
3220 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
3221 self.assertEqual(results['attributes']['creator']['username'], "joe")
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3222
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3223 def testAuthDeniedPut(self):
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3224 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3225 Test unauthorized PUT request
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3226 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3227 # Wrong permissions (caught by roundup security module).
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3228 form = cgi.FieldStorage()
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3229 form.list = [
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3230 cgi.MiniFieldStorage('realname', 'someone')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3231 ]
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3232 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
3233 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
3234 self.assertEqual(results['error']['status'], 403)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3235
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3236 def testAuthDeniedPost(self):
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3237 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3238 Test unauthorized POST request
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3239 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3240 form = cgi.FieldStorage()
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3241 form.list = [
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3242 cgi.MiniFieldStorage('username', 'blah')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3243 ]
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3244 results = self.server.post_collection('user', form)
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3245 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
3246 self.assertEqual(results['error']['status'], 403)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3247
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3248 def testAuthAllowedPut(self):
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3249 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3250 Test authorized PUT request
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3251 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3252 self.db.setCurrentUser('admin')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3253 form = cgi.FieldStorage()
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3254 form.list = [
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3255 cgi.MiniFieldStorage('realname', 'someone')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3256 ]
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3257 try:
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3258 self.server.put_element('user', '2', form)
5602
c40d04915e23 Python3 fixes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5601
diff changeset
3259 except Unauthorised as err:
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3260 self.fail('raised %s' % err)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3261 finally:
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3262 self.db.setCurrentUser('joe')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3263
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3264 def testAuthAllowedPost(self):
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3265 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3266 Test authorized POST request
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3267 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3268 self.db.setCurrentUser('admin')
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 = [
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3271 cgi.MiniFieldStorage('username', 'blah')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3272 ]
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3273 try:
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3274 self.server.post_collection('user', form)
5602
c40d04915e23 Python3 fixes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5601
diff changeset
3275 except Unauthorised as err:
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3276 self.fail('raised %s' % err)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3277 finally:
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3278 self.db.setCurrentUser('joe')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3279
5585
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
3280 def testDeleteAttributeUri(self):
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
3281 """
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
3282 Test Delete an attribute
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
3283 """
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3284 self.maxDiff = 4000
5585
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
3285 # 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
3286 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
3287
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3288 # 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
3289 # With no changes
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3290 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
3291 '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
3292 )
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3293 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
3294 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
3295 results = results['data']
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3296 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
3297 self.assertEqual(len(results['attributes']['nosy']), 1)
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3298 self.assertListEqual(results['attributes']['nosy'],
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3299 [{'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
3300
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3301 form = cgi.FieldStorage()
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3302 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
3303 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
3304 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
3305 # remove the title and nosy
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3306 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
3307 'issue', issue_id, 'title', form
5585
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
3308 )
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3309 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
3310
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3311 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
3312 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
3313 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
3314 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
3315 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
3316 'issue', issue_id, 'nosy', form
5585
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
3317 )
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3318 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
3319
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
3320 # verify the result
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3321 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
3322 results = results['data']
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3323 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
3324 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
3325 self.assertListEqual(results['attributes']['nosy'], [])
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
3326 self.assertEqual(results['attributes']['title'], None)
8725c09802b8 Added test cases for the element URI methods
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5583
diff changeset
3327
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3328 # delete protected property
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3329 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
3330 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
3331 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
3332 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
3333 '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
3334 )
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3335 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
3336 '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
3337 '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
3338 }}
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3339
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3340 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
3341 expected['error']['status'])
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3342 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
3343 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
3344 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
3345
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3346 # delete required property
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3347 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
3348 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
3349 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
3350 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
3351 '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
3352 )
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3353 expected= {'error': {'status': 400,
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3354 '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
3355 "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
3356 print(results)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3357 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
3358 expected['error']['status'])
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3359 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
3360 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
3361 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
3362 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
3363 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
3364
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3365 # delete bogus property
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3366 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
3367 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
3368 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
3369 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
3370 '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
3371 )
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3372 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
3373 '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
3374 "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
3375 print(results)
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3376 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
3377 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
3378 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
3379 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
3380 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
3381 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
3382 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
3383
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3384 def testPatchAdd(self):
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3385 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3386 Test Patch op 'Add'
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3387 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3388 # create a new issue with userid 1 in the nosy list
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3389 issue_id = self.db.issue.create(title='foo', nosy=['1'])
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3390
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3391 # 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
3392 # no etag
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3393 form = cgi.FieldStorage()
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3394 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3395 cgi.MiniFieldStorage('@op', 'add'),
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3396 cgi.MiniFieldStorage('nosy', '2')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3397 ]
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3398 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
3399 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
3400
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3401 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
3402 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
3403 form = cgi.FieldStorage()
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3404 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3405 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
3406 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
3407 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
3408 ]
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3409 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
3410 self.assertEqual(self.dummy_client.response_code, 200)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3411
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3412 # verify the result
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3413 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
3414 results = results['data']
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3415 self.assertEqual(self.dummy_client.response_code, 200)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3416 self.assertListEqual(results['attributes']['nosy'], ['1', '2'])
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3417
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3418 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
3419 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
3420 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
3421 form.list = [
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3422 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
3423 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
3424 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
3425 ]
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3426 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
3427 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
3428
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3429 # 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
3430 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
3431 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
3432 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
3433 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
3434
6350
6a69584d117e Remove length checks. We check list content explicitly.
John Rouillard <rouilj@ieee.org>
parents: 6318
diff changeset
3435
5747
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3436 # 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
3437 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
3438 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
3439 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
3440 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
3441 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
3442 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
3443 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
3444 ]
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3445 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
3446 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
3447
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3448 # 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
3449 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
3450 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
3451 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
3452 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
3453
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3454 # patch invalid property
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3455 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
3456 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
3457 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
3458 form.list = [
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3459 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
3460 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
3461 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
3462 ]
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3463 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
3464 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
3465 print(results)
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3466 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
3467 'msg': UsageError(
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3468 HyperdbValueError(
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3469 "'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
3470 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
3471 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
3472 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
3473 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
3474 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
3475 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
3476
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3477 def testPatchReplace(self):
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3478 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3479 Test Patch op 'Replace'
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3480 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3481 # 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
3482 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
3483
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3484 # 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
3485 # no etag.
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3486 form = cgi.FieldStorage()
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3487 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3488 cgi.MiniFieldStorage('@op', 'replace'),
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3489 cgi.MiniFieldStorage('nosy', '2'),
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3490 cgi.MiniFieldStorage('status', '3')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3491 ]
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3492 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
3493 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
3494 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
3495 results = results['data']
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3496 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
3497 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
3498 self.assertListEqual(results['attributes']['nosy'], ['1'])
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3499
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3500 # 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
3501 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
3502 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
3503 form = cgi.FieldStorage()
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3504 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3505 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
3506 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
3507 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
3508 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
3509 ]
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3510 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
3511 self.assertEqual(self.dummy_client.response_code, 200)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3512 # verify the result
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3513 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
3514 results = results['data']
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3515 self.assertEqual(self.dummy_client.response_code, 200)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3516 self.assertEqual(results['attributes']['status'], '3')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3517 self.assertListEqual(results['attributes']['nosy'], ['2'])
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3518
5706
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3519 # 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
3520 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
3521 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
3522 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
3523 form.list = [
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3524 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
3525 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
3526 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
3527 ]
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3528 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
3529 form)
dfca6136dd7b Add more tests including call to patch an attribute with add and
John Rouillard <rouilj@ieee.org>
parents: 5705
diff changeset
3530 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
3531 # 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
3532 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
3533 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
3534 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
3535 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
3536
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3537 # 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
3538 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
3539 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
3540 form = cgi.FieldStorage()
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3541 form.list = [
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3542 cgi.MiniFieldStorage('@op', 'replace'),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3543 cgi.MiniFieldStorage('creator', '2'),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3544 cgi.MiniFieldStorage('@etag', etag)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3545 ]
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3546 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
3547 expected= {'error': {'status': 400,
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3548 '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
3549 print(results)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3550 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
3551 expected['error']['status'])
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3552 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
3553 type(expected['error']['msg']))
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3554 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
3555 str(expected['error']['msg']))
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3556 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
3557
5708
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3558 # 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
3559 # 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
3560 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
3561 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
3562 form = cgi.FieldStorage()
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3563 form.list = [
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3564 cgi.MiniFieldStorage('@op', 'replace'),
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3565 cgi.MiniFieldStorage('data', '2'),
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3566 cgi.MiniFieldStorage('@etag', etag)
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3567 ]
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3568 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
3569 form)
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3570 expected= {'error': {'status': 405,
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3571 '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
3572 print(results)
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3573 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
3574 expected['error']['status'])
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3575 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
3576 type(expected['error']['msg']))
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3577 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
3578 str(expected['error']['msg']))
ad786c394788 Add another test case: change protected attribute using patch_attribute.
John Rouillard <rouilj@ieee.org>
parents: 5707
diff changeset
3579 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
3580
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3581 def testPatchRemoveAll(self):
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3582 """
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3583 Test Patch Action 'Remove'
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3584 """
5595
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3585 # 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
3586 issue_id = self.db.issue.create(title='foo', nosy=['1', '2'])
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3587
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3588 # 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
3589 # no etag
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3590 form = cgi.FieldStorage()
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3591 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3592 cgi.MiniFieldStorage('@op', 'remove'),
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3593 cgi.MiniFieldStorage('nosy', ''),
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3594 cgi.MiniFieldStorage('title', '')
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3595 ]
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3596 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
3597 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
3598 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
3599 results = results['data']
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3600 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
3601 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
3602 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
3603 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
3604
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3605 # 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
3606 form = cgi.FieldStorage()
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3607 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
3608 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
3609 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3610 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
3611 cgi.MiniFieldStorage('nosy', ''),
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3612 cgi.MiniFieldStorage('title', ''),
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3613 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
3614 ]
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3615 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
3616 self.assertEqual(self.dummy_client.response_code, 200)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3617
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3618 # verify the result
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3619 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
3620 results = results['data']
5588
6b3a9655a7d9 Move decorator to outside of the class
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5586
diff changeset
3621 self.assertEqual(self.dummy_client.response_code, 200)
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3622 self.assertEqual(results['attributes']['title'], None)
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3623 self.assertEqual(len(results['attributes']['nosy']), 0)
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3624 self.assertEqual(results['attributes']['nosy'], [])
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
3625
5705
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3626 # 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
3627 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
3628 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
3629 form = cgi.FieldStorage()
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3630 form.list = [
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3631 cgi.MiniFieldStorage('@op', 'remove'),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3632 cgi.MiniFieldStorage('creator', '2'),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3633 cgi.MiniFieldStorage('@etag', etag)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3634 ]
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3635 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
3636 expected= {'error': {'status': 400,
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3637 '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
3638 print(results)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3639 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
3640 expected['error']['status'])
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3641 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
3642 type(expected['error']['msg']))
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3643 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
3644 str(expected['error']['msg']))
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3645 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
3646
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3647 # 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
3648 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
3649 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
3650 form.list = [
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3651 cgi.MiniFieldStorage('@op', 'remove'),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3652 cgi.MiniFieldStorage('requireme', ''),
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3653 cgi.MiniFieldStorage('@etag', etag)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3654 ]
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3655 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
3656 expected= {'error': {'status': 400,
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3657 '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
3658 }}
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3659 print(results)
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3660 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
3661 expected['error']['status'])
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3662 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
3663 type(expected['error']['msg']))
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3664 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
3665 str(expected['error']['msg']))
457fc482e6b1 Method PUT: ignore specification of protected properties which can not
John Rouillard <rouilj@ieee.org>
parents: 5690
diff changeset
3666 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
3667
5599
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3668 def testPatchAction(self):
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3669 """
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3670 Test Patch Action 'Action'
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3671 """
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3672 # 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
3673 issue_id = self.db.issue.create(title='foo')
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3674
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3675 # 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
3676 # no etag
5599
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3677 form = cgi.FieldStorage()
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3678 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3679 cgi.MiniFieldStorage('@op', 'action'),
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3680 cgi.MiniFieldStorage('@action_name', 'retire')
5599
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3681 ]
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3682 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
3683 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
3684 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
3685
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3686 # execute action retire
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3687 form = cgi.FieldStorage()
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3688 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
3689 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
3690 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3691 cgi.MiniFieldStorage('@op', 'action'),
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3692 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
3693 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
3694 ]
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3695 results = self.server.patch_element('issue', issue_id, form)
5599
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3696 self.assertEqual(self.dummy_client.response_code, 200)
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3697
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3698 # verify the result
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3699 self.assertTrue(self.db.issue.is_retired(issue_id))
a76d88673375 Added Patch operator 'action'
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5595
diff changeset
3700
5747
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3701 # 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
3702 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
3703 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
3704 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
3705 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
3706 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
3707 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
3708 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
3709 ]
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3710 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
3711 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
3712
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3713 # 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
3714 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
3715
6318
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3716 def testPatchBadAction(self):
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3717 """
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3718 Test Patch Action 'Unknown'
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3719 """
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3720 # 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
3721 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
3722
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3723 # execute action retire
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3724 form = cgi.FieldStorage()
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3725 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
3726 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
3727 form.list = [
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3728 cgi.MiniFieldStorage('@op', 'action'),
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3729 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
3730 cgi.MiniFieldStorage('@etag', etag)
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3731 ]
ec853cef2f09 Add test for invaild action in rest.py patch_element.
John Rouillard <rouilj@ieee.org>
parents: 6317
diff changeset
3732 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
3733 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
3734 # 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
3735 # 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
3736 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
3737 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
3738
5595
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3739 def testPatchRemove(self):
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3740 """
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3741 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
3742 """
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3743 # 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
3744 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
3745
5630
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3746 # 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
3747 # no etag
5595
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3748 form = cgi.FieldStorage()
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3749 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3750 cgi.MiniFieldStorage('@op', 'remove'),
5595
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3751 cgi.MiniFieldStorage('nosy', '1, 2'),
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3752 ]
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3753 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
3754 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
3755 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
3756 results = results['data']
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3757 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
3758 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
3759 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
3760
5747
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3761 # 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
3762 form = cgi.FieldStorage()
5727
8b5171f353eb issue2551033: actually use the key in hmac generation. Finally add
John Rouillard <rouilj@ieee.org>
parents: 5726
diff changeset
3763 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
3764 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
3765 form.list = [
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3766 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
3767 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
3768 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
3769 ]
07abc8d36940 Add etag support to rest interface to prevent multiple users from
John Rouillard <rouilj@ieee.org>
parents: 5623
diff changeset
3770 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
3771 self.assertEqual(self.dummy_client.response_code, 200)
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3772
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3773 # verify the result
5672
a7211712b110 Fix tests for latest REST changes
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5656
diff changeset
3774 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
3775 results = results['data']
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3776 self.assertEqual(self.dummy_client.response_code, 200)
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3777 self.assertEqual(len(results['attributes']['nosy']), 1)
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3778 self.assertEqual(results['attributes']['nosy'], ['3'])
65caddd54da2 Handle operation for patch separately
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5592
diff changeset
3779
5747
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3780 # 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
3781 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
3782 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
3783 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
3784 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
3785 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
3786 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
3787 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
3788 ]
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3789 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
3790 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
3791
17b38e209307 Test patch op=action restore; test patch add for attribute with no value.
John Rouillard <rouilj@ieee.org>
parents: 5746
diff changeset
3792 # 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
3793 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
3794 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
3795 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
3796 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
3797 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
3798
7156
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3799 def testRestExposeHeaders(self):
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3800
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3801 local_client = self.server.client
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3802 body = b'{ "data": "Joe Doe 1" }'
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3803 env = { "CONTENT_TYPE": "application/json",
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3804 "CONTENT_LENGTH": len(body),
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3805 "REQUEST_METHOD": "PUT",
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3806 "HTTP_ORIGIN": "http://tracker.example"
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3807 }
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3808 local_client.env.update(env)
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3809
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3810 local_client.db.config["WEB_ALLOWED_API_ORIGINS"] = " * "
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3811
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3812 headers={"accept": "application/json; version=1",
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3813 "content-type": env['CONTENT_TYPE'],
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3814 "content-length": env['CONTENT_LENGTH'],
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3815 "origin": env['HTTP_ORIGIN']
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3816 }
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3817 self.headers=headers
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3818 # 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
3819 # FieldStorage(None, None, 'string') rather than
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3820 # FieldStorage(None, None, [])
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3821 body_file=BytesIO(body) # FieldStorage needs a file
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3822 form = client.BinaryFieldStorage(body_file,
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3823 headers=headers,
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3824 environ=env)
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3825 local_client.request.headers.get=self.get_header
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3826 results = self.server.dispatch('PUT',
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3827 "/rest/data/user/%s/realname"%self.joeid,
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3828 form)
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3829
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3830 for header in [ "X-RateLimit-Limit",
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3831 "X-RateLimit-Remaining",
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3832 "X-RateLimit-Reset",
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3833 "X-RateLimit-Limit-Period",
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3834 "Retry-After",
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3835 "Sunset",
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3836 "Allow",
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3837 ]:
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3838 self.assertIn(
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3839 header,
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3840 self.server.client.additional_headers[
6f09103a6522 [issue2551263] expose headers to rest clients
John Rouillard <rouilj@ieee.org>
parents: 7155
diff changeset
3841 "Access-Control-Expose-Headers"])
7155
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3842
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3843 def testRestMatchWildcardOrigin(self):
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3844 # cribbed from testDispatch #1
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3845 # PUT: joe's 'realname' using json data.
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3846 # simulate: /rest/data/user/<id>/realname
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3847 # use etag in header
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3848
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3849 # verify that credential header is missing, valid allow origin
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3850 # header and vary includes origin.
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3851
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3852 local_client = self.server.client
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3853 etag = calculate_etag(self.db.user.getnode(self.joeid),
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3854 self.db.config['WEB_SECRET_KEY'])
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3855 body = b'{ "data": "Joe Doe 1" }'
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3856 env = { "CONTENT_TYPE": "application/json",
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3857 "CONTENT_LENGTH": len(body),
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3858 "REQUEST_METHOD": "PUT",
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3859 "HTTP_ORIGIN": "https://bad.origin"
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3860 }
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3861 local_client.env.update(env)
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3862
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3863 local_client.db.config["WEB_ALLOWED_API_ORIGINS"] = " * "
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3864
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3865 headers={"accept": "application/json; version=1",
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3866 "content-type": env['CONTENT_TYPE'],
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3867 "content-length": env['CONTENT_LENGTH'],
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3868 "if-match": etag,
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3869 "origin": env['HTTP_ORIGIN']
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3870 }
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3871 self.headers=headers
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3872 # we need to generate a FieldStorage the looks like
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3873 # FieldStorage(None, None, 'string') rather than
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3874 # FieldStorage(None, None, [])
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3875 body_file=BytesIO(body) # FieldStorage needs a file
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3876 form = client.BinaryFieldStorage(body_file,
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3877 headers=headers,
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3878 environ=env)
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3879 local_client.request.headers.get=self.get_header
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3880 results = self.server.dispatch('PUT',
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3881 "/rest/data/user/%s/realname"%self.joeid,
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3882 form)
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3883
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3884 self.assertNotIn("Access-Control-Allow-Credentials",
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3885 local_client.additional_headers)
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3886
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3887 self.assertIn("Access-Control-Allow-Origin",
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3888 local_client.additional_headers)
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3889 self.assertEqual(
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3890 headers['origin'],
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3891 local_client.additional_headers["Access-Control-Allow-Origin"])
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3892
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3893
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3894 self.assertIn("Vary", local_client.additional_headers)
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3895 self.assertIn("Origin",
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3896 local_client.additional_headers['Vary'])
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3897
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3898 self.assertEqual(local_client.response_code, 200)
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3899 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
3900 self.assertEqual(self.dummy_client.response_code, 200)
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3901 self.assertEqual(results['data']['attributes']['realname'],
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3902 'Joe Doe 1')
89a59e46b3af improve REST interface security
John Rouillard <rouilj@ieee.org>
parents: 6660
diff changeset
3903
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3904 @skip_jwt
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3905 def test_expired_jwt(self):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3906 # 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
3907 # 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
3908 out = []
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3909 def wh(s):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3910 out.append(s)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3911
7809
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3912 secret = self.db.config.WEB_JWT_SECRET[0]
5878
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 # verify library and tokens are correct
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3915 self.assertRaises(jwt.exceptions.InvalidTokenError,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3916 jwt.decode, self.jwt['expired'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3917 secret, algorithms=['HS256'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3918 audience=self.db.config.TRACKER_WEB,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3919 issuer=self.db.config.TRACKER_WEB)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3920
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3921 result = jwt.decode(self.jwt['user'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3922 secret, algorithms=['HS256'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3923 audience=self.db.config.TRACKER_WEB,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3924 issuer=self.db.config.TRACKER_WEB)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3925 self.assertEqual(self.claim['user'],result)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3926
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3927 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
3928 secret, algorithms=['HS256'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3929 audience=self.db.config.TRACKER_WEB,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3930 issuer=self.db.config.TRACKER_WEB)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3931 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
3932
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3933 # set environment for all jwt tests
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3934 env = {
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3935 'PATH_INFO': 'rest/data/user',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3936 'HTTP_HOST': 'localhost',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3937 'TRACKER_NAME': 'rounduptest',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3938 "REQUEST_METHOD": "GET"
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3939 }
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3940 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
3941 [], None)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3942 self.dummy_client.db = self.db
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3943 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
3944 self.empty_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3945 self.terse_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3946 self.terse_form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3947 cgi.MiniFieldStorage('@verbose', '0'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3948 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3949 self.dummy_client.form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3950 self.dummy_client.form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3951 cgi.MiniFieldStorage('@fields', 'username,address'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3952 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3953 # accumulate json output for further analysis
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3954 self.dummy_client.write = wh
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3955
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3956 # set up for expired token first
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3957 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
3958 self.dummy_client.main()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3959
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3960 # 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
3961 self.assertEqual('1', self.db.getuid())
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3962 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
3963 del(out[0])
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
3964
7809
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3965 @skip_jwt
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3966 def test_user_jwt_key_rotation_mutlisig(self):
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3967 # self.dummy_client.main() closes database, so
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3968 # we need a new test with setup called for each test
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3969 out = []
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3970 def wh(s):
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3971 out.append(s)
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3972
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3973 # verify library and tokens are correct
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3974 self.assertRaises(jwt.exceptions.InvalidTokenError,
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3975 jwt.decode, self.jwt['expired'],
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3976 self.old_secret, algorithms=['HS256'],
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3977 audience=self.db.config.TRACKER_WEB,
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3978 issuer=self.db.config.TRACKER_WEB)
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3979
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3980 result = jwt.decode(self.jwt['user_new_secret'],
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3981 self.new_secret, algorithms=['HS256'],
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3982 audience=self.db.config.TRACKER_WEB,
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3983 issuer=self.db.config.TRACKER_WEB)
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3984 self.assertEqual(self.claim['user'],result)
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3985
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3986 result = jwt.decode(self.jwt['user:email'],
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3987 self.old_secret, algorithms=['HS256'],
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3988 audience=self.db.config.TRACKER_WEB,
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3989 issuer=self.db.config.TRACKER_WEB)
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3990 self.assertEqual(self.claim['user:email'],result)
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3991
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3992 # set environment for all jwt tests
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3993 env = {
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3994 'PATH_INFO': 'rest/data/user',
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3995 'HTTP_HOST': 'localhost',
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3996 'TRACKER_NAME': 'rounduptest',
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3997 "REQUEST_METHOD": "GET"
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3998 }
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
3999
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4000 # test case where rotation key is used,
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4001 # add spaces after ',' to test config system
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4002 self.db.config['WEB_JWT_SECRET'] = "%s, %s, " % (
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4003 self.new_secret, self.old_secret
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4004 )
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4005
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4006 self.dummy_client = client.Client(self.instance, MockNull(), env,
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4007 [], None)
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4008 self.dummy_client.db = self.db
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4009 self.dummy_client.request.headers.get = self.get_header
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4010 self.empty_form = cgi.FieldStorage()
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4011 self.terse_form = cgi.FieldStorage()
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4012 self.terse_form.list = [
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4013 cgi.MiniFieldStorage('@verbose', '0'),
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4014 ]
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4015 self.dummy_client.form = cgi.FieldStorage()
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4016 self.dummy_client.form.list = [
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4017 cgi.MiniFieldStorage('@fields', 'username,address'),
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4018 ]
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4019 # accumulate json output for further analysis
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4020 self.dummy_client.write = wh
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4021
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4022 # set up for standard user role token
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4023 env['HTTP_AUTHORIZATION'] = 'bearer %s'%self.jwt['user']
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4024
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4025 self.dummy_client.main()
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4026 print(out[0])
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4027 json_dict = json.loads(b2s(out[0]))
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4028 print(json_dict)
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4029 # user will be joe id 3 as auth works
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4030 self.assertTrue('3', self.db.getuid())
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4031 # there should be three items in the collection admin, anon, and joe
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4032 self.assertEqual(3, len(json_dict['data']['collection']))
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4033 # since this token has no access to email addresses, only joe
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4034 # should have email addresses. Order is by id by default.
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4035 self.assertFalse('address' in json_dict['data']['collection'][0])
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4036 self.assertFalse('address' in json_dict['data']['collection'][1])
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4037 self.assertTrue('address' in json_dict['data']['collection'][2])
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4038 del(out[0])
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4039 self.db.setCurrentUser('admin')
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4040
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4041 @skip_jwt
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4042 def test_user_jwt_key_rotation_sig_failure(self):
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4043 # self.dummy_client.main() closes database, so
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4044 # we need a new test with setup called for each test
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4045 out = []
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4046 def wh(s):
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4047 out.append(s)
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4048
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4049 # verify library and tokens are correct
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4050 self.assertRaises(jwt.exceptions.InvalidTokenError,
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4051 jwt.decode, self.jwt['expired'],
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4052 self.old_secret, algorithms=['HS256'],
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4053 audience=self.db.config.TRACKER_WEB,
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4054 issuer=self.db.config.TRACKER_WEB)
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4055
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4056 result = jwt.decode(self.jwt['user_new_secret'],
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4057 self.new_secret, algorithms=['HS256'],
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4058 audience=self.db.config.TRACKER_WEB,
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4059 issuer=self.db.config.TRACKER_WEB)
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4060 self.assertEqual(self.claim['user'],result)
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4061
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4062 result = jwt.decode(self.jwt['user:email'],
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4063 self.old_secret, algorithms=['HS256'],
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4064 audience=self.db.config.TRACKER_WEB,
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4065 issuer=self.db.config.TRACKER_WEB)
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4066 self.assertEqual(self.claim['user:email'],result)
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4067
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4068 # set environment for all jwt tests
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4069 env = {
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4070 'PATH_INFO': 'rest/data/user',
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4071 'HTTP_HOST': 'localhost',
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4072 'TRACKER_NAME': 'rounduptest',
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4073 "REQUEST_METHOD": "GET"
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4074 }
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4075
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4076 self.dummy_client = client.Client(self.instance, MockNull(), env,
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4077 [], None)
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4078 self.dummy_client.db = self.db
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4079 self.dummy_client.request.headers.get = self.get_header
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4080 self.empty_form = cgi.FieldStorage()
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4081 self.terse_form = cgi.FieldStorage()
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4082 self.terse_form.list = [
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4083 cgi.MiniFieldStorage('@verbose', '0'),
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4084 ]
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4085 self.dummy_client.form = cgi.FieldStorage()
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4086 self.dummy_client.form.list = [
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4087 cgi.MiniFieldStorage('@fields', 'username,address'),
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4088 ]
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4089 # accumulate json output for further analysis
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4090 self.dummy_client.write = wh
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4091
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4092 # test case where new json secret is in place
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4093 self.db.config['WEB_JWT_SECRET'] = self.new_secret
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4094
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4095 # set up for standard user role token
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4096 env['HTTP_AUTHORIZATION'] = 'bearer %s'%self.jwt['user']
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4097 self.dummy_client.main()
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4098 print(out[0])
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4099
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4100 self.assertEqual(out[0],
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4101 b'Invalid Login - Signature verification failed')
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4102 del(out[0])
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4103 self.db.setCurrentUser('admin')
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4104
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4105 @skip_jwt
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4106 def test_user_jwt(self):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4107 # 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
4108 # 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
4109 out = []
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4110 def wh(s):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4111 out.append(s)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4112
7809
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4113 secret = self.db.config.WEB_JWT_SECRET[0]
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4114
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4115 # verify library and tokens are correct
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4116 self.assertRaises(jwt.exceptions.InvalidTokenError,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4117 jwt.decode, self.jwt['expired'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4118 secret, algorithms=['HS256'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4119 audience=self.db.config.TRACKER_WEB,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4120 issuer=self.db.config.TRACKER_WEB)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4121
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4122 result = jwt.decode(self.jwt['user'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4123 secret, algorithms=['HS256'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4124 audience=self.db.config.TRACKER_WEB,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4125 issuer=self.db.config.TRACKER_WEB)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4126 self.assertEqual(self.claim['user'],result)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4127
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4128 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
4129 secret, algorithms=['HS256'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4130 audience=self.db.config.TRACKER_WEB,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4131 issuer=self.db.config.TRACKER_WEB)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4132 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
4133
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4134 # set environment for all jwt tests
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4135 env = {
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4136 'PATH_INFO': 'rest/data/user',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4137 'HTTP_HOST': 'localhost',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4138 'TRACKER_NAME': 'rounduptest',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4139 "REQUEST_METHOD": "GET"
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4140 }
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4141 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
4142 [], None)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4143 self.dummy_client.db = self.db
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4144 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
4145 self.empty_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4146 self.terse_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4147 self.terse_form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4148 cgi.MiniFieldStorage('@verbose', '0'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4149 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4150 self.dummy_client.form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4151 self.dummy_client.form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4152 cgi.MiniFieldStorage('@fields', 'username,address'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4153 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4154 # accumulate json output for further analysis
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4155 self.dummy_client.write = wh
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4156
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4157 # 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
4158 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
4159 self.dummy_client.main()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4160 print(out[0])
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4161 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
4162 print(json_dict)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4163 # 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
4164 self.assertTrue('3', self.db.getuid())
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4165 # 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
4166 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
4167 # 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
4168 # 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
4169 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
4170 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
4171 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
4172 del(out[0])
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4173 self.db.setCurrentUser('admin')
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4174
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4175 @skip_jwt
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4176 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
4177 '''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
4178 # 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
4179 # 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
4180 out = []
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4181 def wh(s):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4182 out.append(s)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4183
7809
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4184 secret = self.db.config.WEB_JWT_SECRET[0]
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4185
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4186 # verify library and tokens are correct
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4187 self.assertRaises(jwt.exceptions.InvalidTokenError,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4188 jwt.decode, self.jwt['expired'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4189 secret, algorithms=['HS256'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4190 audience=self.db.config.TRACKER_WEB,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4191 issuer=self.db.config.TRACKER_WEB)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4192
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4193 result = jwt.decode(self.jwt['user'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4194 secret, algorithms=['HS256'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4195 audience=self.db.config.TRACKER_WEB,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4196 issuer=self.db.config.TRACKER_WEB)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4197 self.assertEqual(self.claim['user'],result)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4198
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4199 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
4200 secret, algorithms=['HS256'],
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4201 audience=self.db.config.TRACKER_WEB,
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4202 issuer=self.db.config.TRACKER_WEB)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4203 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
4204
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4205 # set environment for all jwt tests
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4206 env = {
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4207 'PATH_INFO': 'rest/data/user',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4208 'HTTP_HOST': 'localhost',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4209 'TRACKER_NAME': 'rounduptest',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4210 "REQUEST_METHOD": "GET"
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4211 }
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4212 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
4213 [], None)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4214 self.dummy_client.db = self.db
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4215 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
4216 self.empty_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4217 self.terse_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4218 self.terse_form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4219 cgi.MiniFieldStorage('@verbose', '0'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4220 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4221 self.dummy_client.form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4222 self.dummy_client.form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4223 cgi.MiniFieldStorage('@fields', 'username,address'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4224 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4225 # accumulate json output for further analysis
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4226 self.dummy_client.write = wh
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4227
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4228 # 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
4229 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
4230 self.dummy_client.main()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4231 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
4232 print(json_dict)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4233 # 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
4234 self.assertTrue('3', self.db.getuid())
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4235 # 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
4236 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
4237 # 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
4238 # 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
4239 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
4240 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
4241 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
4242
5879
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
4243 @skip_jwt
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
4244 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
4245 '''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
4246 # 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
4247 # 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
4248 out = []
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
4249 def wh(s):
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
4250 out.append(s)
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
4251
7809
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4252 secret = self.db.config.WEB_JWT_SECRET[0]
5879
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
4253
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
4254 # 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
4255 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
4256 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
4257 secret, algorithms=['HS256'],
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
4258 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
4259 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
4260
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
4261 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
4262 secret, algorithms=['HS256'],
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
4263 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
4264 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
4265 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
4266
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
4267 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
4268 secret, algorithms=['HS256'],
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
4269 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
4270 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
4271 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
4272
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
4273 # 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
4274 env = {
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
4275 '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
4276 'HTTP_HOST': 'localhost',
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
4277 'TRACKER_NAME': 'rounduptest',
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
4278 "REQUEST_METHOD": "GET"
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
4279 }
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
4280 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
4281 [], None)
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
4282 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
4283 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
4284 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
4285 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
4286 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
4287 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
4288 ]
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
4289 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
4290 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
4291 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
4292 ]
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
4293 # 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
4294 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
4295
94a7669677ae add permissions to control user of rest and xmlrpc API interfaces.
John Rouillard <rouilj@ieee.org>
parents: 5878
diff changeset
4296 # 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
4297 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
4298 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
4299 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
4300 # 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
4301 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
4302 { "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
4303 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
4304 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
4305 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
4306
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4307 @skip_jwt
7809
be6cb2e0d471 feat: add support for rotating jwt keys
John Rouillard <rouilj@ieee.org>
parents: 7587
diff changeset
4308 def test_admin_disabled_jwt(self):
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4309 # 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
4310 # 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
4311 out = []
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4312 def wh(s):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4313 out.append(s)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4314
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4315 # set environment for all jwt tests
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4316 env = {
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4317 'PATH_INFO': 'rest/data/user',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4318 'HTTP_HOST': 'localhost',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4319 'TRACKER_NAME': 'rounduptest',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4320 "REQUEST_METHOD": "GET"
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4321 }
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4322 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
4323 [], None)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4324 self.dummy_client.db = self.db
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4325 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
4326 self.empty_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4327 self.terse_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4328 self.terse_form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4329 cgi.MiniFieldStorage('@verbose', '0'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4330 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4331 self.dummy_client.form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4332 self.dummy_client.form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4333 cgi.MiniFieldStorage('@fields', 'username,address'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4334 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4335 # accumulate json output for further analysis
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4336 self.dummy_client.write = wh
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4337 # 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
4338 # 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
4339 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
4340 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
4341 self.dummy_client.main()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4342 # 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
4343 self.assertTrue('1', self.db.getuid())
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4344 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
4345
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4346 @skip_jwt
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4347 def test_bad_issue_jwt(self):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4348 # 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
4349 # 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
4350 out = []
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4351 def wh(s):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4352 out.append(s)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4353
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4354 # set environment for all jwt tests
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4355 env = {
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4356 'PATH_INFO': 'rest/data/user',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4357 'HTTP_HOST': 'localhost',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4358 'TRACKER_NAME': 'rounduptest',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4359 "REQUEST_METHOD": "GET"
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4360 }
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4361 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
4362 [], None)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4363 self.dummy_client.db = self.db
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4364 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
4365 self.empty_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4366 self.terse_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4367 self.terse_form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4368 cgi.MiniFieldStorage('@verbose', '0'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4369 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4370 self.dummy_client.form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4371 self.dummy_client.form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4372 cgi.MiniFieldStorage('@fields', 'username,address'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4373 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4374 # accumulate json output for further analysis
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4375 self.dummy_client.write = wh
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4376 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
4377 self.dummy_client.main()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4378 # 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
4379 self.assertTrue('1', self.db.getuid())
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4380 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
4381
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4382 @skip_jwt
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4383 def test_bad_audience_jwt(self):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4384 # 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
4385 # 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
4386 out = []
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4387 def wh(s):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4388 out.append(s)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4389
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4390 # set environment for all jwt tests
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4391 env = {
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4392 'PATH_INFO': 'rest/data/user',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4393 'HTTP_HOST': 'localhost',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4394 'TRACKER_NAME': 'rounduptest',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4395 "REQUEST_METHOD": "GET"
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4396 }
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4397 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
4398 [], None)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4399 self.dummy_client.db = self.db
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4400 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
4401 self.empty_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4402 self.terse_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4403 self.terse_form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4404 cgi.MiniFieldStorage('@verbose', '0'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4405 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4406 self.dummy_client.form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4407 self.dummy_client.form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4408 cgi.MiniFieldStorage('@fields', 'username,address'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4409 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4410 # accumulate json output for further analysis
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4411 self.dummy_client.write = wh
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4412 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
4413 self.dummy_client.main()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4414 # 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
4415 self.assertTrue('1', self.db.getuid())
7389
613f822f1f24 Support pyjwt-2.7.0 in test_bad_audience_jwt
John Rouillard <rouilj@ieee.org>
parents: 7372
diff changeset
4416 self.assertIn(out[0], [b'Invalid Login - Invalid audience',
613f822f1f24 Support pyjwt-2.7.0 in test_bad_audience_jwt
John Rouillard <rouilj@ieee.org>
parents: 7372
diff changeset
4417 b"Invalid Login - Audience doesn't match"])
5878
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4418
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4419 @skip_jwt
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4420 def test_bad_roles_jwt(self):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4421 # 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
4422 # 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
4423 out = []
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4424 def wh(s):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4425 out.append(s)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4426
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4427 # set environment for all jwt tests
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4428 env = {
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4429 'PATH_INFO': 'rest/data/user',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4430 'HTTP_HOST': 'localhost',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4431 'TRACKER_NAME': 'rounduptest',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4432 "REQUEST_METHOD": "GET"
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4433 }
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4434 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
4435 [], None)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4436 self.dummy_client.db = self.db
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4437 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
4438 self.empty_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4439 self.terse_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4440 self.terse_form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4441 cgi.MiniFieldStorage('@verbose', '0'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4442 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4443 self.dummy_client.form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4444 self.dummy_client.form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4445 cgi.MiniFieldStorage('@fields', 'username,address'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4446 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4447 # accumulate json output for further analysis
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4448 self.dummy_client.write = wh
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4449 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
4450 self.dummy_client.main()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4451 # 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
4452 self.assertTrue('1', self.db.getuid())
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4453 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
4454
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4455 @skip_jwt
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4456 def test_bad_subject_jwt(self):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4457 # 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
4458 # 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
4459 out = []
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4460 def wh(s):
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4461 out.append(s)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4462
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4463 # set environment for all jwt tests
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4464 env = {
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4465 'PATH_INFO': 'rest/data/user',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4466 'HTTP_HOST': 'localhost',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4467 'TRACKER_NAME': 'rounduptest',
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4468 "REQUEST_METHOD": "GET"
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4469 }
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4470 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
4471 [], None)
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4472 self.dummy_client.db = self.db
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4473 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
4474 self.empty_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4475 self.terse_form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4476 self.terse_form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4477 cgi.MiniFieldStorage('@verbose', '0'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4478 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4479 self.dummy_client.form = cgi.FieldStorage()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4480 self.dummy_client.form.list = [
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4481 cgi.MiniFieldStorage('@fields', 'username,address'),
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4482 ]
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4483 # accumulate json output for further analysis
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4484 self.dummy_client.write = wh
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4485 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
4486 self.dummy_client.main()
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4487 # 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
4488 self.assertTrue('1', self.db.getuid())
1b57d8f3eb97 Add rudimentery experiment JSON Web Token (jwt) support
John Rouillard <rouilj@ieee.org>
parents: 5874
diff changeset
4489 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
4490
5592
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
4491 def get_obj(path, id):
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
4492 return {
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
4493 'id': id,
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
4494 'link': path + id
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
4495 }
adcb5cbe82bd Add unittest for pagination and filtering
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5591
diff changeset
4496
5583
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
4497 if __name__ == '__main__':
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
4498 runner = unittest.TextTestRunner()
c65d98a16780 Added rest unit test
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
4499 unittest.main(testRunner=runner)

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