def test_new(self): """Tests that GET /applicationsettings/new returns an appropriate JSON object for creating a new application settings object. The properties of the JSON object are 'languages', 'users' and 'orthographies' and their values are arrays/lists. """ # Add some orthographies. orthography1 = h.generate_default_orthography1() orthography2 = h.generate_default_orthography2() Session.add_all([orthography1, orthography2]) Session.commit() # Get the data currently in the db (see websetup.py for the test data). data = { 'languages': h.get_languages(), 'users': h.get_mini_dicts_getter('User')(), 'orthographies': h.get_mini_dicts_getter('Orthography')() } # JSON.stringify and then re-Python-ify the data. This is what the data # should look like in the response to a simulated GET request. data = json.loads(json.dumps(data, cls=h.JSONOLDEncoder)) # GET /applicationsettings/new without params. Expect a JSON array for # every store. response = self.app.get(url('new_applicationsetting'), extra_environ=self.extra_environ_admin) resp = json.loads(response.body) assert response.content_type == 'application/json' assert resp['languages'] == data['languages'] assert resp['users'] == data['users'] assert resp['orthographies'] == data['orthographies'] assert response.content_type == 'application/json' # GET /applicationsettings/new with params. Param values are treated as # strings, not JSON. If any params are specified, the default is to # return a JSON array corresponding to store for the param. There are # three cases that will result in an empty JSON array being returned: # 1. the param is not specified # 2. the value of the specified param is an empty string # 3. the value of the specified param is an ISO 8601 UTC datetime # string that matches the most recent datetime_modified value of the # store in question. params = { # Value is empty string: 'languages' will not be in response. 'languages': '', # Value is any string: 'users' will be in response. 'users': 'anything can go here!', # Value is ISO 8601 UTC datetime string that does not match the most # recent Orthography.datetime_modified value: 'orthographies' *will* # be in the response. 'orthographies': datetime.datetime.utcnow().isoformat(), } response = self.app.get(url('new_applicationsetting'), params, extra_environ=self.extra_environ_admin) resp = json.loads(response.body) assert resp['languages'] == [] assert resp['users'] == data['users'] assert resp['orthographies'] == data['orthographies']
def add_default_application_settings(): """Add the default application settings to the database.""" orthography1 = h.generate_default_orthography1() orthography2 = h.generate_default_orthography2() contributor = Session.query(User).filter(User.role==u'contributor').first() application_settings = h.generate_default_application_settings([orthography1, orthography2], [contributor]) Session.add(application_settings) Session.commit() return application_settings
def test_create(self): """Tests that POST /applicationsettings correctly creates a new application settings.""" # Add some orthographies. orthography1 = h.generate_default_orthography1() orthography2 = h.generate_default_orthography2() Session.add_all([orthography1, orthography2]) Session.commit() orthography2_id = orthography2.id orthography2_orthography = orthography2.orthography params = self.application_settings_create_params.copy() params.update({ 'object_language_name': u'test_create object language name', 'object_language_id': u'tco', 'metalanguage_name': u'test_create metalanguage name', 'metalanguage_id': u'tcm', 'orthographic_validation': u'Warning', 'narrow_phonetic_validation': u'Error', 'morpheme_break_is_orthographic': False, 'morpheme_delimiters': u'-,+', 'punctuation': u'!?.,;:-_', 'grammaticalities': u'*,**,***,?,??,???,#,##,###', 'unrestricted_users': [Session.query(User).filter( User.role==u'viewer').first().id], 'storage_orthography': orthography2_id, 'input_orthography': orthography2_id, 'output_orthography': orthography2_id }) params = json.dumps(params) response = self.app.post(url('applicationsettings'), params, self.json_headers, self.extra_environ_admin) resp = json.loads(response.body) assert resp['object_language_name'] == u'test_create object language name' assert resp['morpheme_break_is_orthographic'] is False assert resp['storage_orthography']['orthography'] == orthography2_orthography assert resp['unrestricted_users'][0]['first_name'] == u'Viewer' assert 'password' not in resp['unrestricted_users'][0] assert response.content_type == 'application/json' # Attempt the same above creation as a contributor and expect to fail. response = self.app.post(url('applicationsettings'), params, self.json_headers, self.extra_environ_contrib, status=403) resp = json.loads(response.body) assert response.content_type == 'application/json' assert resp['error'] == u'You are not authorized to access this resource.'
def test_delete(self): """Tests that DELETE /applicationsettings/id deletes the application settings with id=id and returns a JSON representation. If the id is invalid or unspecified, then JSON null or a 404 status code are returned, respectively. """ # Count the original number of application settings. application_settings_count = Session.query( ApplicationSettings).count() # Add an orthography. orthography1 = h.generate_default_orthography1() Session.add(orthography1) Session.commit() orthography1 = h.get_orthographies()[0] orthography1_id = orthography1.id orthography1 = Session.query(Orthography).get(orthography1_id) # First create an application settings to delete. params = self.application_settings_create_params.copy() params.update({ 'object_language_name': u'test_delete object language name', 'object_language_id': u'tdo', 'metalanguage_name': u'test_delete metalanguage name', 'metalanguage_id': u'tdm', 'storage_orthography': orthography1_id, 'morpheme_delimiters': u'-' }) params = json.dumps(params) response = self.app.post(url('applicationsettings'), params, self.json_headers, self.extra_environ_admin) resp = json.loads(response.body) new_application_settings_count = Session.query( ApplicationSettings).count() assert resp['object_language_name'] == u'test_delete object language name' assert new_application_settings_count == application_settings_count + 1 # Delete the application settings we just created response = self.app.delete( url('applicationsetting', id=resp['id']), extra_environ=self.extra_environ_admin) resp = json.loads(response.body) new_application_settings_count = Session.query(ApplicationSettings).count() assert new_application_settings_count == application_settings_count assert response.content_type == 'application/json' # The deleted application settings will be returned to us, so the # assertions from above should still hold true. assert resp['object_language_name'] == u'test_delete object language name' # Trying to get the deleted form from the db should return None. deleted_application_settings = Session.query( ApplicationSettings).get(resp['id']) assert deleted_application_settings == None # Delete with an invalid id id = 9999999999999 response = self.app.delete(url('applicationsetting', id=id), extra_environ=self.extra_environ_admin, status=404) assert json.loads(response.body)['error'] == \ u'There is no application settings with id %s' % id assert response.content_type == 'application/json' # Delete without an id response = self.app.delete(url('applicationsetting', id=''), status=404, extra_environ=self.extra_environ_admin) assert json.loads(response.body)['error'] == \ 'The resource could not be found.' # Unauthorized delete attempt as contributor response = self.app.post(url('applicationsettings'), params, self.json_headers, self.extra_environ_admin) resp = json.loads(response.body) application_settings_count = new_application_settings_count new_application_settings_count = Session.query(ApplicationSettings).count() assert resp['object_language_name'] == u'test_delete object language name' assert new_application_settings_count == application_settings_count + 1 response = self.app.delete(url('applicationsetting', id=resp['id']), headers=self.json_headers, extra_environ=self.extra_environ_contrib, status=403) resp = json.loads(response.body) assert response.content_type == 'application/json' assert resp['error'] == u'You are not authorized to access this resource.'