diff --git a/endpoints/api/trigger.py b/endpoints/api/trigger.py index 3ccd2d696..fcd854e37 100644 --- a/endpoints/api/trigger.py +++ b/endpoints/api/trigger.py @@ -11,7 +11,7 @@ from endpoints.api import (RepositoryParamResource, nickname, resource, require_ validate_json_request, api, Unauthorized, NotFound, InvalidRequest) from endpoints.api.build import build_status_view, trigger_view, RepositoryBuildStatus from endpoints.common import start_build -from endpoints.trigger import (BuildTrigger as BuildTriggerTypes, TriggerDeactivationException, +from endpoints.trigger import (BuildTrigger as BuildTriggerBase, TriggerDeactivationException, TriggerActivationException, EmptyRepositoryException) from data import model from auth.permissions import UserAdminPermission @@ -63,7 +63,7 @@ class BuildTrigger(RepositoryParamResource): except model.InvalidBuildTriggerException: raise NotFound() - handler = BuildTriggerTypes.get_trigger_for_service(trigger.service.name) + handler = BuildTriggerBase.get_trigger_for_service(trigger.service.name) config_dict = json.loads(trigger.config) if handler.is_active(config_dict): try: @@ -103,7 +103,7 @@ class BuildTriggerSubdirs(RepositoryParamResource): except model.InvalidBuildTriggerException: raise NotFound() - handler = BuildTriggerTypes.get_trigger_for_service(trigger.service.name) + handler = BuildTriggerBase.get_trigger_for_service(trigger.service.name) user_permission = UserAdminPermission(trigger.connected_user.username) if user_permission.can(): new_config_dict = request.get_json() @@ -146,7 +146,7 @@ class BuildTriggerActivate(RepositoryParamResource): except model.InvalidBuildTriggerException: raise NotFound() - handler = BuildTriggerTypes.get_trigger_for_service(trigger.service.name) + handler = BuildTriggerBase.get_trigger_for_service(trigger.service.name) existing_config_dict = json.loads(trigger.config) if handler.is_active(existing_config_dict): raise InvalidRequest('Trigger config is not sufficient for activation.') @@ -204,7 +204,7 @@ class ActivateBuildTrigger(RepositoryParamResource): except model.InvalidBuildTriggerException: raise NotFound() - handler = BuildTriggerTypes.get_trigger_for_service(trigger.service.name) + handler = BuildTriggerBase.get_trigger_for_service(trigger.service.name) existing_config_dict = json.loads(trigger.config) if not handler.is_active(existing_config_dict): raise InvalidRequest('Trigger is not active.') @@ -257,10 +257,10 @@ class BuildTriggerSources(RepositoryParamResource): user_permission = UserAdminPermission(trigger.connected_user.username) if user_permission.can(): - trigger_handler = BuildTriggerTypes.get_trigger_for_service(trigger.service.name) + trigger_handler = BuildTriggerBase.get_trigger_for_service(trigger.service.name) return { 'sources': trigger_handler.list_build_sources(trigger.auth_token) } else: - raise Unauthorized() \ No newline at end of file + raise Unauthorized() diff --git a/endpoints/common.py b/endpoints/common.py index c4fcf85e2..c9b0686cc 100644 --- a/endpoints/common.py +++ b/endpoints/common.py @@ -74,7 +74,7 @@ def common_login(db_user): @app.errorhandler(model.DataModelException) def handle_dme(ex): logger.exception(ex) - return make_response(ex.message, 400) + return make_response(json.dumps({'message': ex.message}), 400) def generate_csrf_token(): diff --git a/test/test_api_usage.py b/test/test_api_usage.py index dd85a74da..bb86e4682 100644 --- a/test/test_api_usage.py +++ b/test/test_api_usage.py @@ -3,7 +3,7 @@ import json as py_json from endpoints.api import api_bp, api from endpoints.webhooks import webhooks -from endpoints.trigger import BuildTrigger +from endpoints.trigger import BuildTrigger as BuildTriggerBase from app import app from initdb import setup_database_for_testing, finished_database_for_testing from data import model, database @@ -62,9 +62,9 @@ class ApiTestCase(unittest.TestCase): finished_database_for_testing(self) self.ctx.__exit__(True, None, None) - def getJsonResponse(self, resource_name, params={}): + def getJsonResponse(self, resource_name, params={}, expected_code=200): rv = self.app.get(api.url_for(resource_name, **params)) - self.assertEquals(200, rv.status_code) + self.assertEquals(expected_code, rv.status_code) data = rv.data parsed = py_json.loads(data) return parsed @@ -121,11 +121,7 @@ class ApiTestCase(unittest.TestCase): class TestDiscovery(ApiTestCase): def test_discovery(self): json = self.getJsonResponse(DiscoveryResource) - found = set([]) - for method_info in json['endpoints']: - found.add(method_info['name']) - - assert 'discovery' in found + assert 'apis' in json class TestPlans(ApiTestCase): @@ -140,8 +136,7 @@ class TestPlans(ApiTestCase): class TestLoggedInUser(ApiTestCase): def test_guest(self): - json = self.getJsonResponse(User) - assert json['anonymous'] == True + self.getJsonResponse(User, expected_code=401) def test_user(self): self.login(READ_ACCESS_USER) @@ -169,7 +164,8 @@ class TestConvertToOrganization(ApiTestCase): self.login(READ_ACCESS_USER) json = self.postJsonResponse(ConvertToOrganization, data={'adminUser': READ_ACCESS_USER, - 'adminPassword': 'password'}, + 'adminPassword': 'password', + 'plan': 'free'}, expected_code=400) self.assertEqual('The admin user is not valid', json['message']) @@ -178,7 +174,8 @@ class TestConvertToOrganization(ApiTestCase): self.login(READ_ACCESS_USER) json = self.postJsonResponse(ConvertToOrganization, data={'adminUser': 'unknownuser', - 'adminPassword': 'password'}, + 'adminPassword': 'password', + 'plan': 'free'}, expected_code=400) self.assertEqual('The admin user credentials are not valid', @@ -188,7 +185,8 @@ class TestConvertToOrganization(ApiTestCase): self.login(READ_ACCESS_USER) json = self.postJsonResponse(ConvertToOrganization, data={'adminUser': ADMIN_ACCESS_USER, - 'adminPassword': 'invalidpass'}, + 'adminPassword': 'invalidpass', + 'plan': 'free'}, expected_code=400) self.assertEqual('The admin user credentials are not valid', @@ -249,7 +247,7 @@ class TestCreateNewUser(ApiTestCase): data = self.postResponse(User, data=NEW_USER_DETAILS, expected_code=201) - self.assertEquals('Created', data) + self.assertEquals('"Created"', data) class TestSignout(ApiTestCase): @@ -261,8 +259,8 @@ class TestSignout(ApiTestCase): self.postResponse(Signout) - json = self.getJsonResponse(User) - assert json['anonymous'] == True + # Make sure we're now signed out. + self.getJsonResponse(User, expected_code=401) class TestGetMatchingEntities(ApiTestCase): @@ -294,7 +292,7 @@ class TestCreateOrganization(ApiTestCase): self.login(ADMIN_ACCESS_USER) json = self.postJsonResponse(OrganizationList, - data=dict(name=ADMIN_ACCESS_USER), + data=dict(name=ADMIN_ACCESS_USER, email='testorg@example.com'), expected_code=400) self.assertEquals('A user or organization with this name already exists', @@ -304,9 +302,9 @@ class TestCreateOrganization(ApiTestCase): self.login(ADMIN_ACCESS_USER) json = self.postJsonResponse(OrganizationList, - data=dict(name=ORGANIZATION), + data=dict(name=ORGANIZATION, email='testorg@example.com'), expected_code=400) - + self.assertEquals('A user or organization with this name already exists', json['message']) @@ -315,10 +313,10 @@ class TestCreateOrganization(ApiTestCase): data = self.postResponse(OrganizationList, data=dict(name='neworg', - email='test@example.com'), + email='testorg@example.com'), expected_code=201) - self.assertEquals('Created', data) + self.assertEquals('"Created"', data) # Ensure the org was created. organization = model.get_organization('neworg') @@ -411,12 +409,11 @@ class TestCreateOrganizationPrototypes(ApiTestCase): def test_missingdelegate(self): self.login(ADMIN_ACCESS_USER) - json = self.postJsonResponse(PermissionPrototypeList, - params=dict(orgname=ORGANIZATION), - data=dict(role='read'), - expected_code=400) + self.postJsonResponse(PermissionPrototypeList, + params=dict(orgname=ORGANIZATION), + data=dict(role='read'), + expected_code=400) - self.assertEquals('Missing delegate user or team', json['message']) def test_createprototype(self): self.login(ADMIN_ACCESS_USER) @@ -533,11 +530,11 @@ class TestUpdateOrganizationTeam(ApiTestCase): def test_updateexisting(self): self.login(ADMIN_ACCESS_USER) - data = self.postJsonResponse(OrganizationTeam, - params=dict(orgname=ORGANIZATION, - teamname='readers'), - data=dict(description='My cool team', - role='creator')) + data = self.putJsonResponse(OrganizationTeam, + params=dict(orgname=ORGANIZATION, + teamname='readers'), + data=dict(description='My cool team', + role='creator')) self.assertEquals('My cool team', data['description']) self.assertEquals('creator', data['role']) @@ -545,10 +542,10 @@ class TestUpdateOrganizationTeam(ApiTestCase): def test_attemptchangeroleonowners(self): self.login(ADMIN_ACCESS_USER) - self.postResponse(OrganizationTeam, - params=dict(orgname=ORGANIZATION, teamname='owners'), - data=dict(role = 'creator'), - expected_code=400) + self.putJsonResponse(OrganizationTeam, + params=dict(orgname=ORGANIZATION, teamname='owners'), + data=dict(role = 'creator'), + expected_code=400) def test_createnewteam(self): self.login(ADMIN_ACCESS_USER) @@ -557,8 +554,7 @@ class TestUpdateOrganizationTeam(ApiTestCase): params=dict(orgname=ORGANIZATION, teamname='newteam'), data=dict(description='My cool team', - role='member'), - expected_code=201) + role='member')) self.assertEquals('My cool team', data['description']) self.assertEquals('member', data['role']) @@ -611,9 +607,9 @@ class TestUpdateOrganizationTeamMember(ApiTestCase): def test_addmember(self): self.login(ADMIN_ACCESS_USER) - self.postJsonResponse(TeamMember, - params=dict(orgname=ORGANIZATION, teamname='readers', - membername=NO_ACCESS_USER)) + self.putJsonResponse(TeamMember, + params=dict(orgname=ORGANIZATION, teamname='readers', + membername=NO_ACCESS_USER)) # Verify the user was added to the team. @@ -647,7 +643,8 @@ class TestCreateRepo(ApiTestCase): json = self.postJsonResponse(RepositoryList, data=dict(repository='simple', - visibility='public'), + visibility='public', + description=''), expected_code=400) self.assertEquals('Repository already exists', json['message']) @@ -659,7 +656,8 @@ class TestCreateRepo(ApiTestCase): json = self.postJsonResponse(RepositoryList, data=dict(repository='newrepo', visibility='public', - description='')) + description=''), + expected_code=201) self.assertEquals(ADMIN_ACCESS_USER, json['namespace']) @@ -673,7 +671,8 @@ class TestCreateRepo(ApiTestCase): data=dict(namespace=ORGANIZATION, repository='newrepo', visibility='private', - description='')) + description=''), + expected_code=201) self.assertEquals(ORGANIZATION, json['namespace']) self.assertEquals('newrepo', json['name']) @@ -884,12 +883,6 @@ class TestRepoBuilds(ApiTestCase): self.assertEquals(status_json, build) - # Check the archive URL. - archive_json = self.getJsonResponse('api.get_repo_build_archive_url', - params=dict(repository=ADMIN_ACCESS_USER + '/building', build_uuid=build['id'])) - - assert archive_json['url'] - # Check the logs. logs_json = self.getJsonResponse(RepositoryBuildLogs, params=dict(repository=ADMIN_ACCESS_USER + '/building', build_uuid=build['id'])) @@ -926,7 +919,8 @@ class TestWebhooks(ApiTestCase): # Add a webhook. json = self.postJsonResponse(WebhookList, params=dict(repository=ADMIN_ACCESS_USER + '/simple'), - data=dict(url='http://example.com')) + data=dict(url='http://example.com'), + expected_code=201) self.assertEquals('http://example.com', json['parameters']['url']) wid = json['public_id'] @@ -1371,7 +1365,7 @@ class TestLogs(ApiTestCase): self.assertEquals(READ_ACCESS_USER, log['performer']['name']) -class FakeBuildTrigger(BuildTrigger): +class FakeBuildTrigger(BuildTriggerBase): @classmethod def service_name(cls): return 'fakeservice'