diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/test_json.txt	Sun May 11 09:15:35 2014 -0700
@@ -0,0 +1,274 @@
+Test toolbox JSON handling
+==========================
+
+Ensure we have no projects::
+
+    >>> app.get('/')
+    []
+
+Also no authors::
+
+    >>> app.get('/author')
+    {}
+
+Make a project::
+
+    >>> project = {'name': 'foo', 'description': 'foo description', 'url': 'http://example.com'}
+    >>> response = app.new(**project)
+    >>> response.status
+    303
+    >>> newproject = app.get('/')[0]
+    >>> modified = newproject.pop('modified')
+    >>> project == newproject
+    True
+
+Get the project by name::
+
+    >>> foo = app.get('/foo')
+    >>> modified == foo.pop('modified')
+    True
+    >>> foo == project
+    True
+
+Add some fields to it::
+
+    >>> fields = {'author': 'jhammel'}
+    >>> url = '/' + project['name']
+    >>> response = app.post(url, params=fields)
+    >>> app.get('/')[0]['author']
+    [u'jhammel']
+    >>> app.get('/author')
+    {u'jhammel': [u'foo']}
+    >>> fields = {'author': 'turing'}
+    >>> response = app.post(url, params=fields)
+    >>> sorted(app.get(url)['author'])
+    [u'jhammel', u'turing']
+    >>> sorted(app.get('/')[0]['author'])
+    [u'jhammel', u'turing']
+
+Now let's search for the project!::
+
+    >>> authors = app.get('/author')
+    >>> len(authors)
+    2
+    >>> authors['jhammel']
+    [u'foo']
+    >>> authors['turing']
+    [u'foo']
+
+Let's search for it a different way::
+
+    >>> project = app.get('/')[0]
+    >>> projects = app.get('/', params={'author': 'jhammel'})
+    >>> newproject = projects[0]
+    >>> newproject == project
+    True
+
+Just to show that the search is doing something::
+
+    >>> app.get('/', params={'author': 'sauron'})
+    []
+
+Now lets add another project::
+    
+    >>> project2 = {'name': 'bar', 'description': 'a bar downtown', 'url': 'http://www.example.com'}
+    >>> response = app.new(**project2)
+    >>> projects = app.get('/')
+    >>> len(projects)
+    2
+    >>> projects[0]['name']
+    u'bar'
+    >>> projects[1]['name']
+    u'foo'
+    >>> jhammels_projects = app.get('/', params={'author': 'jhammel'})
+    >>> len(jhammels_projects)
+    1
+    >>> jhammels_projects[0]['name']
+    u'foo'
+    
+Test search::
+
+    >>> projects = app.get('/', params={'q': 'jhammel'})
+    >>> len(projects)
+    1
+    >>> projects[0]['name']
+    u'foo'
+    >>> projects = app.get('/', params={'q': 'downtown'})
+    >>> len(projects)
+    1
+    >>> projects[0]['name']
+    u'bar'
+
+Add some metadata. Make sure we see it::
+
+    >>> url = '/bar'
+    >>> response = app.post(url, {'author': 'turing'})
+    >>> len(app.get())
+    2
+    >>> len(app.get('/', params={'author': 'jhammel'}))
+    1
+    >>> len(app.get('/', params={'q': 'jhammel'}))
+    1
+    >>> len(app.get('/', params={'author': 'turing'}))
+    2
+    >>> len(app.get('/', params={'q': 'turing'}))
+    2
+    >>> projects = app.get('/', params={'author': 'turing', 'q': 'downtown'})
+    >>> len(projects)
+    1
+    >>> projects[0]['name'] 
+    u'bar'
+
+Add a third project, just for variety::
+
+    >>> response = app.new(name='fleem', description='fleem in a building downtown', url='http://example.net')
+    >>> projects = app.get('/')
+    >>> len(projects)
+    3
+    >>> sorted([i['name'] for i in app.get('/', params=dict(q='downtown'))])
+    [u'bar', u'fleem']
+    >>> [i['name'] for i in app.get('/', params=dict(q='building'))]
+    [u'fleem']
+    
+Delete some metadata::
+
+    >>> response = app.post('/bar', params={'action': 'delete', 'author': 'turing'})
+    >>> projects = app.get('/', params={'author': 'turing'})
+    >>> len(projects)
+    1
+    >>> projects[0]['name']
+    u'foo'
+    >>> projects = app.get('/', params={'q': 'turing'})
+    >>> len(projects)
+    1
+    >>> projects[0]['name']
+    u'foo'
+
+Delete a project::
+
+    >>> response = app.post('/delete', params={'project': 'foo'})
+    >>> len(app.get('/'))
+    2
+    >>> len(app.get('/', params={'author': 'jhammel'}))
+    0
+    >>> results = app.get('/', params={'q': 'jhammel'})
+    >>> len(results)
+    0
+
+You're back to two basic projects without much metadata.  Let's give them some!::
+
+   >>> projects = app.get('/')
+   >>> [sorted(project.keys()) for project in projects]
+   [[u'description', u'modified', u'name', u'url'], [u'description', u'modified', u'name', u'url']]
+   >>> bar_modified_last = projects[0]['modified'] 
+   >>> fleem_modified_earlier = projects[1]['modified']
+   >>> bar_modified_last > fleem_modified_earlier
+   True
+   >>> [project['name'] for project in projects]
+   [u'bar', u'fleem']
+   >>> description = 'You could be swining on a star'
+   >>> response = app.post('/bar', params=dict(description=description))
+   >>> projects = app.get('/', params={'q': 'star'})
+   >>> len(projects)
+   1
+   >>> projects[0]['description'] == description
+   True
+   >>> response = app.post('/bar', params={'type': 'song', 'usage': 'music', 'author': 'Sinatra'})
+   >>> songs = app.get('/', params={'type': 'song'})
+   >>> len(songs)
+   1
+   >>> songs[0]['name'] == 'bar'
+   True
+   >>> songs = app.get('/', params={'q': 'song'})
+   >>> len(songs)
+   1
+   >>> songs[0]['name'] == 'bar'
+   True
+   >>> response = app.post('/fleem', params={'type': 'song', 'description': 'Cotton Eye Joe', 'author': 'Rednex'})
+   >>> songs = app.get('/', params={'type': 'song'})
+   >>> len(songs)
+   2
+   >>> songs = app.get('/', params={'q': 'song'})
+   >>> len(songs)
+   2
+   >>> songs = app.get('/', params={'type': 'song', 'q': 'star'})
+   >>> len(songs)
+   1
+   >>> songs[0]['name']
+   u'bar'
+   >>> songs = app.get('/', params={'type': 'song', 'author': 'Sinatra'})
+   >>> len(songs)
+   1
+   >>> songs[0]['name']
+   u'bar'
+
+Now try renaming a tool::
+   >>> [i['name'] for i in app.get('/')]
+   [u'fleem', u'bar']
+   >>> response = app.post('/bar', params={'name': 'star'})
+   >>> songs = app.get('/')
+   >>> len(songs)
+   2
+   >>> projects = app.get('/', params={'q': 'star'})
+   >>> len(projects)
+   1
+   >>> star = projects[0]
+   >>> star['name']
+   u'star'
+   >>> star['type']
+   [u'song']
+
+You should not be allowed to rename a tool if another tool has the
+same name::
+
+   >>> sorted([i['name'] for i in app.get('/')])
+   [u'fleem', u'star']
+   >>> response = app.post('/star', params={'name': 'fleem'}, status=403) # Forbidden
+   >>> sorted([i['name'] for i in app.get('/')])
+   [u'fleem', u'star']
+
+You should not be allowed to have multiple identical item in the same
+field::
+
+   >>> app.get('/star')['author']
+   [u'Sinatra']
+   >>> response = app.post('/star', params={'action': 'replace', 'author': 'Sinatra,Sinatra'})
+   >>> app.get('/star')['author']
+   [u'Sinatra']
+
+You can rename an entire set of fields::
+
+   >>> [project['type'] for project in app.get('/')]
+   [[u'song'], [u'song']]
+   >>> response = app.post('/type', params={'song': 'number one hit'})
+   >>> [project['type'] for project in app.get('/')]
+   [[u'number one hit'], [u'number one hit']]
+
+Fields in the request should be comma-separated and stripped of whitespace::
+
+    >>> project = {'name': 'A New Project', 'description': 'new description', 'url': 'http://example.com'}
+    >>> project_url = '/' + urlescape(project['name'])
+    >>> response = app.new(**project)
+    >>> fields = {'type': 'song, project, something special'}
+    >>> response = app.post(project_url, params=fields)
+    >>> sorted(app.get(project_url)['type'])
+    [u'project', u'something special', u'song']
+    
+You won't be able to have multiple identical field values or empty values::
+
+    >>> response = app.post(project_url, params=dict(author=' john, , , fielding, the third,,'))
+    >>> sorted(app.get(project_url)['author'])
+    [u'fielding', u'john', u'the third']
+
+You should not be able to rename a project::
+
+    >>> sorted([project['name'] for project in app.get('/')])
+    [u'A New Project', u'fleem', u'star']
+    >>> response = app.post('/star', params=dict(name=''), status=403)
+    >>> response.status
+    403
+    >>> response = app.post('/fleem', params=dict(name='       '), status=403)
+    >>> response.status
+    403
+    >>> sorted([project['name'] for project in app.get('/')])
+    [u'A New Project', u'fleem', u'star']