Mercurial > hg > toolbox
comparison test/test_json.txt @ 0:b0942f44413f
import from git://github.com/mozilla/toolbox.git
| author | Jeff Hammel <k0scist@gmail.com> |
|---|---|
| date | Sun, 11 May 2014 09:15:35 -0700 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:b0942f44413f |
|---|---|
| 1 Test toolbox JSON handling | |
| 2 ========================== | |
| 3 | |
| 4 Ensure we have no projects:: | |
| 5 | |
| 6 >>> app.get('/') | |
| 7 [] | |
| 8 | |
| 9 Also no authors:: | |
| 10 | |
| 11 >>> app.get('/author') | |
| 12 {} | |
| 13 | |
| 14 Make a project:: | |
| 15 | |
| 16 >>> project = {'name': 'foo', 'description': 'foo description', 'url': 'http://example.com'} | |
| 17 >>> response = app.new(**project) | |
| 18 >>> response.status | |
| 19 303 | |
| 20 >>> newproject = app.get('/')[0] | |
| 21 >>> modified = newproject.pop('modified') | |
| 22 >>> project == newproject | |
| 23 True | |
| 24 | |
| 25 Get the project by name:: | |
| 26 | |
| 27 >>> foo = app.get('/foo') | |
| 28 >>> modified == foo.pop('modified') | |
| 29 True | |
| 30 >>> foo == project | |
| 31 True | |
| 32 | |
| 33 Add some fields to it:: | |
| 34 | |
| 35 >>> fields = {'author': 'jhammel'} | |
| 36 >>> url = '/' + project['name'] | |
| 37 >>> response = app.post(url, params=fields) | |
| 38 >>> app.get('/')[0]['author'] | |
| 39 [u'jhammel'] | |
| 40 >>> app.get('/author') | |
| 41 {u'jhammel': [u'foo']} | |
| 42 >>> fields = {'author': 'turing'} | |
| 43 >>> response = app.post(url, params=fields) | |
| 44 >>> sorted(app.get(url)['author']) | |
| 45 [u'jhammel', u'turing'] | |
| 46 >>> sorted(app.get('/')[0]['author']) | |
| 47 [u'jhammel', u'turing'] | |
| 48 | |
| 49 Now let's search for the project!:: | |
| 50 | |
| 51 >>> authors = app.get('/author') | |
| 52 >>> len(authors) | |
| 53 2 | |
| 54 >>> authors['jhammel'] | |
| 55 [u'foo'] | |
| 56 >>> authors['turing'] | |
| 57 [u'foo'] | |
| 58 | |
| 59 Let's search for it a different way:: | |
| 60 | |
| 61 >>> project = app.get('/')[0] | |
| 62 >>> projects = app.get('/', params={'author': 'jhammel'}) | |
| 63 >>> newproject = projects[0] | |
| 64 >>> newproject == project | |
| 65 True | |
| 66 | |
| 67 Just to show that the search is doing something:: | |
| 68 | |
| 69 >>> app.get('/', params={'author': 'sauron'}) | |
| 70 [] | |
| 71 | |
| 72 Now lets add another project:: | |
| 73 | |
| 74 >>> project2 = {'name': 'bar', 'description': 'a bar downtown', 'url': 'http://www.example.com'} | |
| 75 >>> response = app.new(**project2) | |
| 76 >>> projects = app.get('/') | |
| 77 >>> len(projects) | |
| 78 2 | |
| 79 >>> projects[0]['name'] | |
| 80 u'bar' | |
| 81 >>> projects[1]['name'] | |
| 82 u'foo' | |
| 83 >>> jhammels_projects = app.get('/', params={'author': 'jhammel'}) | |
| 84 >>> len(jhammels_projects) | |
| 85 1 | |
| 86 >>> jhammels_projects[0]['name'] | |
| 87 u'foo' | |
| 88 | |
| 89 Test search:: | |
| 90 | |
| 91 >>> projects = app.get('/', params={'q': 'jhammel'}) | |
| 92 >>> len(projects) | |
| 93 1 | |
| 94 >>> projects[0]['name'] | |
| 95 u'foo' | |
| 96 >>> projects = app.get('/', params={'q': 'downtown'}) | |
| 97 >>> len(projects) | |
| 98 1 | |
| 99 >>> projects[0]['name'] | |
| 100 u'bar' | |
| 101 | |
| 102 Add some metadata. Make sure we see it:: | |
| 103 | |
| 104 >>> url = '/bar' | |
| 105 >>> response = app.post(url, {'author': 'turing'}) | |
| 106 >>> len(app.get()) | |
| 107 2 | |
| 108 >>> len(app.get('/', params={'author': 'jhammel'})) | |
| 109 1 | |
| 110 >>> len(app.get('/', params={'q': 'jhammel'})) | |
| 111 1 | |
| 112 >>> len(app.get('/', params={'author': 'turing'})) | |
| 113 2 | |
| 114 >>> len(app.get('/', params={'q': 'turing'})) | |
| 115 2 | |
| 116 >>> projects = app.get('/', params={'author': 'turing', 'q': 'downtown'}) | |
| 117 >>> len(projects) | |
| 118 1 | |
| 119 >>> projects[0]['name'] | |
| 120 u'bar' | |
| 121 | |
| 122 Add a third project, just for variety:: | |
| 123 | |
| 124 >>> response = app.new(name='fleem', description='fleem in a building downtown', url='http://example.net') | |
| 125 >>> projects = app.get('/') | |
| 126 >>> len(projects) | |
| 127 3 | |
| 128 >>> sorted([i['name'] for i in app.get('/', params=dict(q='downtown'))]) | |
| 129 [u'bar', u'fleem'] | |
| 130 >>> [i['name'] for i in app.get('/', params=dict(q='building'))] | |
| 131 [u'fleem'] | |
| 132 | |
| 133 Delete some metadata:: | |
| 134 | |
| 135 >>> response = app.post('/bar', params={'action': 'delete', 'author': 'turing'}) | |
| 136 >>> projects = app.get('/', params={'author': 'turing'}) | |
| 137 >>> len(projects) | |
| 138 1 | |
| 139 >>> projects[0]['name'] | |
| 140 u'foo' | |
| 141 >>> projects = app.get('/', params={'q': 'turing'}) | |
| 142 >>> len(projects) | |
| 143 1 | |
| 144 >>> projects[0]['name'] | |
| 145 u'foo' | |
| 146 | |
| 147 Delete a project:: | |
| 148 | |
| 149 >>> response = app.post('/delete', params={'project': 'foo'}) | |
| 150 >>> len(app.get('/')) | |
| 151 2 | |
| 152 >>> len(app.get('/', params={'author': 'jhammel'})) | |
| 153 0 | |
| 154 >>> results = app.get('/', params={'q': 'jhammel'}) | |
| 155 >>> len(results) | |
| 156 0 | |
| 157 | |
| 158 You're back to two basic projects without much metadata. Let's give them some!:: | |
| 159 | |
| 160 >>> projects = app.get('/') | |
| 161 >>> [sorted(project.keys()) for project in projects] | |
| 162 [[u'description', u'modified', u'name', u'url'], [u'description', u'modified', u'name', u'url']] | |
| 163 >>> bar_modified_last = projects[0]['modified'] | |
| 164 >>> fleem_modified_earlier = projects[1]['modified'] | |
| 165 >>> bar_modified_last > fleem_modified_earlier | |
| 166 True | |
| 167 >>> [project['name'] for project in projects] | |
| 168 [u'bar', u'fleem'] | |
| 169 >>> description = 'You could be swining on a star' | |
| 170 >>> response = app.post('/bar', params=dict(description=description)) | |
| 171 >>> projects = app.get('/', params={'q': 'star'}) | |
| 172 >>> len(projects) | |
| 173 1 | |
| 174 >>> projects[0]['description'] == description | |
| 175 True | |
| 176 >>> response = app.post('/bar', params={'type': 'song', 'usage': 'music', 'author': 'Sinatra'}) | |
| 177 >>> songs = app.get('/', params={'type': 'song'}) | |
| 178 >>> len(songs) | |
| 179 1 | |
| 180 >>> songs[0]['name'] == 'bar' | |
| 181 True | |
| 182 >>> songs = app.get('/', params={'q': 'song'}) | |
| 183 >>> len(songs) | |
| 184 1 | |
| 185 >>> songs[0]['name'] == 'bar' | |
| 186 True | |
| 187 >>> response = app.post('/fleem', params={'type': 'song', 'description': 'Cotton Eye Joe', 'author': 'Rednex'}) | |
| 188 >>> songs = app.get('/', params={'type': 'song'}) | |
| 189 >>> len(songs) | |
| 190 2 | |
| 191 >>> songs = app.get('/', params={'q': 'song'}) | |
| 192 >>> len(songs) | |
| 193 2 | |
| 194 >>> songs = app.get('/', params={'type': 'song', 'q': 'star'}) | |
| 195 >>> len(songs) | |
| 196 1 | |
| 197 >>> songs[0]['name'] | |
| 198 u'bar' | |
| 199 >>> songs = app.get('/', params={'type': 'song', 'author': 'Sinatra'}) | |
| 200 >>> len(songs) | |
| 201 1 | |
| 202 >>> songs[0]['name'] | |
| 203 u'bar' | |
| 204 | |
| 205 Now try renaming a tool:: | |
| 206 >>> [i['name'] for i in app.get('/')] | |
| 207 [u'fleem', u'bar'] | |
| 208 >>> response = app.post('/bar', params={'name': 'star'}) | |
| 209 >>> songs = app.get('/') | |
| 210 >>> len(songs) | |
| 211 2 | |
| 212 >>> projects = app.get('/', params={'q': 'star'}) | |
| 213 >>> len(projects) | |
| 214 1 | |
| 215 >>> star = projects[0] | |
| 216 >>> star['name'] | |
| 217 u'star' | |
| 218 >>> star['type'] | |
| 219 [u'song'] | |
| 220 | |
| 221 You should not be allowed to rename a tool if another tool has the | |
| 222 same name:: | |
| 223 | |
| 224 >>> sorted([i['name'] for i in app.get('/')]) | |
| 225 [u'fleem', u'star'] | |
| 226 >>> response = app.post('/star', params={'name': 'fleem'}, status=403) # Forbidden | |
| 227 >>> sorted([i['name'] for i in app.get('/')]) | |
| 228 [u'fleem', u'star'] | |
| 229 | |
| 230 You should not be allowed to have multiple identical item in the same | |
| 231 field:: | |
| 232 | |
| 233 >>> app.get('/star')['author'] | |
| 234 [u'Sinatra'] | |
| 235 >>> response = app.post('/star', params={'action': 'replace', 'author': 'Sinatra,Sinatra'}) | |
| 236 >>> app.get('/star')['author'] | |
| 237 [u'Sinatra'] | |
| 238 | |
| 239 You can rename an entire set of fields:: | |
| 240 | |
| 241 >>> [project['type'] for project in app.get('/')] | |
| 242 [[u'song'], [u'song']] | |
| 243 >>> response = app.post('/type', params={'song': 'number one hit'}) | |
| 244 >>> [project['type'] for project in app.get('/')] | |
| 245 [[u'number one hit'], [u'number one hit']] | |
| 246 | |
| 247 Fields in the request should be comma-separated and stripped of whitespace:: | |
| 248 | |
| 249 >>> project = {'name': 'A New Project', 'description': 'new description', 'url': 'http://example.com'} | |
| 250 >>> project_url = '/' + urlescape(project['name']) | |
| 251 >>> response = app.new(**project) | |
| 252 >>> fields = {'type': 'song, project, something special'} | |
| 253 >>> response = app.post(project_url, params=fields) | |
| 254 >>> sorted(app.get(project_url)['type']) | |
| 255 [u'project', u'something special', u'song'] | |
| 256 | |
| 257 You won't be able to have multiple identical field values or empty values:: | |
| 258 | |
| 259 >>> response = app.post(project_url, params=dict(author=' john, , , fielding, the third,,')) | |
| 260 >>> sorted(app.get(project_url)['author']) | |
| 261 [u'fielding', u'john', u'the third'] | |
| 262 | |
| 263 You should not be able to rename a project:: | |
| 264 | |
| 265 >>> sorted([project['name'] for project in app.get('/')]) | |
| 266 [u'A New Project', u'fleem', u'star'] | |
| 267 >>> response = app.post('/star', params=dict(name=''), status=403) | |
| 268 >>> response.status | |
| 269 403 | |
| 270 >>> response = app.post('/fleem', params=dict(name=' '), status=403) | |
| 271 >>> response.status | |
| 272 403 | |
| 273 >>> sorted([project['name'] for project in app.get('/')]) | |
| 274 [u'A New Project', u'fleem', u'star'] |
