class TestOmitTargetedParameter(TestCaseWithFactory): """Test all values for the omit_targeted search parameter.""" layer = DatabaseFunctionalLayer def setUp(self): super(TestOmitTargetedParameter, self).setUp() self.owner = self.factory.makePerson() with person_logged_in(self.owner): self.distro = self.factory.makeDistribution(name='mebuntu') self.release = self.factory.makeDistroSeries(name='inkanyamba', distribution=self.distro) self.bug = self.factory.makeBugTask(target=self.release) self.webservice = LaunchpadWebServiceCaller('launchpad-library', 'salgado-change-anything') def test_omit_targeted_old_default_true(self): response = self.webservice.named_get('/mebuntu/inkanyamba', 'searchTasks', api_version='1.0').jsonBody() self.assertEqual(response['total_size'], 0) def test_omit_targeted_new_default_false(self): response = self.webservice.named_get('/mebuntu/inkanyamba', 'searchTasks', api_version='devel').jsonBody() self.assertEqual(response['total_size'], 1)
class TestBuildersCollection(TestCaseWithFactory): layer = DatabaseFunctionalLayer def setUp(self): super(TestBuildersCollection, self).setUp() self.webservice = LaunchpadWebServiceCaller() def test_getBuildQueueSizes(self): logout() results = self.webservice.named_get( '/builders', 'getBuildQueueSizes', api_version='devel') self.assertEquals( ['nonvirt', 'virt'], sorted(results.jsonBody().keys())) def test_getBuildersForQueue(self): g1 = self.factory.makeProcessor('g1') quantum = self.factory.makeProcessor('quantum') self.factory.makeBuilder( processor=quantum, name='quantum_builder1') self.factory.makeBuilder( processor=quantum, name='quantum_builder2') self.factory.makeBuilder( processor=quantum, name='quantum_builder3', virtualized=False) self.factory.makeBuilder( processor=g1, name='g1_builder', virtualized=False) logout() results = self.webservice.named_get( '/builders', 'getBuildersForQueue', processor=api_url(quantum), virtualized=True, api_version='devel').jsonBody() self.assertEquals( ['quantum_builder1', 'quantum_builder2'], sorted(builder['name'] for builder in results['entries']))
class ProcessorSetWebServiceTests(TestCaseWithFactory): layer = DatabaseFunctionalLayer def setUp(self): super(ProcessorSetWebServiceTests, self).setUp() self.webservice = LaunchpadWebServiceCaller() def test_getByName(self): self.factory.makeProcessor(name='transmeta') logout() processor = self.webservice.named_get('/+processors', 'getByName', name='transmeta', api_version='devel').jsonBody() self.assertEqual('transmeta', processor['name']) def test_default_collection(self): # Make it easy to filter out sample data store = IStore(Processor) store.execute("UPDATE Processor SET name = 'sample_data_' || name") self.factory.makeProcessor(name='q1') self.factory.makeProcessor(name='i686') self.factory.makeProcessor(name='g4') logout() collection = self.webservice.get('/+processors?ws.size=10', api_version='devel').jsonBody() self.assertEqual( ['g4', 'i686', 'q1'], sorted(processor['name'] for processor in collection['entries'] if not processor['name'].startswith('sample_data_')))
class TestGetBugData(TestCaseWithFactory): """Tests for the /bugs getBugData operation.""" layer = DatabaseFunctionalLayer def setUp(self): super(TestGetBugData, self).setUp() self.owner = self.factory.makePerson() with person_logged_in(self.owner): self.product = self.factory.makeProduct() self.bug = self.factory.makeBug( target=self.product, information_type=InformationType.PRIVATESECURITY) self.webservice = LaunchpadWebServiceCaller('launchpad-library', 'salgado-change-anything') def search(self, api_version, **kwargs): return self.webservice.named_get('/bugs', 'getBugData', api_version=api_version, **kwargs).jsonBody() def test_search_returns_results(self): # A matching search returns results. response = self.search("devel", bug_id=self.bug.id) self.assertEqual(self.bug.id, response[0]['id']) def test_search_returns_no_results(self): # A non-matching search returns no results. response = self.search("devel", bug_id=0) self.assertEqual(len(response), 0)
class ProcessorSetWebServiceTests(TestCaseWithFactory): layer = DatabaseFunctionalLayer def setUp(self): super(ProcessorSetWebServiceTests, self).setUp() self.webservice = LaunchpadWebServiceCaller() def test_getByName(self): self.factory.makeProcessor(name='transmeta') logout() processor = self.webservice.named_get( '/+processors', 'getByName', name='transmeta', api_version='devel').jsonBody() self.assertEquals('transmeta', processor['name']) def test_default_collection(self): # Make it easy to filter out sample data store = IStore(Processor) store.execute("UPDATE Processor SET name = 'sample_data_' || name") self.factory.makeProcessor(name='q1') self.factory.makeProcessor(name='i686') self.factory.makeProcessor(name='g4') logout() collection = self.webservice.get( '/+processors?ws.size=10', api_version='devel').jsonBody() self.assertEquals( ['g4', 'i686', 'q1'], sorted( processor['name'] for processor in collection['entries'] if not processor['name'].startswith('sample_data_')))
class TestBuildersCollection(TestCaseWithFactory): layer = DatabaseFunctionalLayer def setUp(self): super(TestBuildersCollection, self).setUp() self.webservice = LaunchpadWebServiceCaller() def test_getBuildQueueSizes(self): logout() results = self.webservice.named_get('/builders', 'getBuildQueueSizes', api_version='devel') self.assertEquals(['nonvirt', 'virt'], sorted(results.jsonBody().keys())) def test_getBuildersForQueue(self): g1 = self.factory.makeProcessor('g1') quantum = self.factory.makeProcessor('quantum') self.factory.makeBuilder(processor=quantum, name='quantum_builder1') self.factory.makeBuilder(processor=quantum, name='quantum_builder2') self.factory.makeBuilder(processor=quantum, name='quantum_builder3', virtualized=False) self.factory.makeBuilder(processor=g1, name='g1_builder', virtualized=False) logout() results = self.webservice.named_get('/builders', 'getBuildersForQueue', processor=api_url(quantum), virtualized=True, api_version='devel').jsonBody() self.assertEquals(['quantum_builder1', 'quantum_builder2'], sorted(builder['name'] for builder in results['entries']))
def test_global_search_by_tag(self): project1 = self.factory.makeProduct() project2 = self.factory.makeProduct() bug1 = self.factory.makeBug(target=project1, tags=["foo"]) self.factory.makeBug(target=project1, tags=["bar"]) bug3 = self.factory.makeBug(target=project2, tags=["foo"]) self.factory.makeBug(target=project2, tags=["baz"]) webservice = LaunchpadWebServiceCaller("launchpad-library", "salgado-change-anything") response = webservice.named_get("/bugs", "searchTasks", api_version="devel", tags="foo").jsonBody() self.assertEqual(2, response["total_size"]) self.assertContentEqual([bug1.id, bug3.id], [ int(entry["bug_link"].split("/")[-1]) for entry in response["entries"] ])
def test_canBeUnsubscribedByUser(self): # Test canBeUnsubscribedByUser() API. webservice = LaunchpadWebServiceCaller('launchpad-library', 'salgado-change-anything', domain='api.launchpad.dev:8085') with person_logged_in(ANONYMOUS): db_spec = self.factory.makeSpecification() db_person = self.factory.makePerson() launchpad = self.factory.makeLaunchpadService() spec = ws_object(launchpad, db_spec) person = ws_object(launchpad, db_person) subscription = spec.subscribe(person=person, essential=True) transaction.commit() result = webservice.named_get(subscription['self_link'], 'canBeUnsubscribedByUser').jsonBody() self.assertTrue(result)
def test_canBeUnsubscribedByUser(self): # Test canBeUnsubscribedByUser() API. webservice = LaunchpadWebServiceCaller( 'launchpad-library', 'salgado-change-anything', domain='api.launchpad.dev:8085') with person_logged_in(ANONYMOUS): db_spec = self.factory.makeSpecification() db_person = self.factory.makePerson() launchpad = self.factory.makeLaunchpadService() spec = ws_object(launchpad, db_spec) person = ws_object(launchpad, db_person) subscription = spec.subscribe(person=person, essential=True) transaction.commit() result = webservice.named_get( subscription['self_link'], 'canBeUnsubscribedByUser').jsonBody() self.assertTrue(result)
class TestProductSearchTasks(TestCaseWithFactory): """Tests for the information_type, linked_blueprints and order_by parameters.""" layer = DatabaseFunctionalLayer def setUp(self): super(TestProductSearchTasks, self).setUp() self.owner = self.factory.makePerson() with person_logged_in(self.owner): self.product = self.factory.makeProduct() self.product_name = self.product.name self.bug = self.factory.makeBug( target=self.product, information_type=InformationType.PRIVATESECURITY) self.webservice = LaunchpadWebServiceCaller('launchpad-library', 'salgado-change-anything') def search(self, api_version, **kwargs): return self.webservice.named_get('/%s' % self.product_name, 'searchTasks', api_version=api_version, **kwargs).jsonBody() def test_linked_blueprints_in_devel(self): # Searching for linked Blueprints works in the devel API. self.search("devel", linked_blueprints="Show all bugs") def test_linked_blueprints_in_devel_2(self): # The linked_blueprints is considered. An error is returned if its # value is not a member of BugBlueprintSearch. self.assertRaises(ValueError, self.search, "devel", linked_blueprints="Teabags!") def test_linked_blueprints_not_in_1_0(self): # Searching for linked Blueprints does not work in the 1.0 API. No # validation is performed for the linked_blueprints parameter, and # thus no error is returned when we pass rubbish. self.search("1.0", linked_blueprints="Teabags!") def test_linked_blueprints_not_in_beta(self): # Searching for linked Blueprints does not work in the beta API. No # validation is performed for the linked_blueprints parameter, and # thus no error is returned when we pass rubbish. self.search("beta", linked_blueprints="Teabags!") def test_search_returns_results(self): # A matching search returns results. response = self.search("devel", information_type="Private Security") self.assertEqual(response['total_size'], 1) def test_search_returns_no_results(self): # A non-matching search returns no results. response = self.search("devel", information_type="Private") self.assertEqual(response['total_size'], 0) def test_search_with_wrong_orderby(self): # Calling searchTasks() with a wrong order_by is a Bad Request. response = self.webservice.named_get('/%s' % self.product_name, 'searchTasks', api_version='devel', order_by='date_created') self.assertEqual(400, response.status) self.assertRaisesWithContent(ValueError, "Unrecognized order_by: u'date_created'", response.jsonBody) def test_search_incomplete_status_results(self): # The Incomplete status matches Incomplete with response and # Incomplete without response bug tasks. with person_logged_in(self.owner): self.factory.makeBug( target=self.product, status=BugTaskStatusSearch.INCOMPLETE_WITH_RESPONSE) self.factory.makeBug( target=self.product, status=BugTaskStatusSearch.INCOMPLETE_WITHOUT_RESPONSE) response = self.search("devel", status="Incomplete") self.assertEqual(response['total_size'], 2)
class TestBuildersCollection(TestCaseWithFactory): layer = DatabaseFunctionalLayer def setUp(self): super(TestBuildersCollection, self).setUp() self.webservice = LaunchpadWebServiceCaller() def test_list(self): names = ['bob', 'frog'] for i in range(3): builder = self.factory.makeBuilder() self.factory.makeBinaryPackageBuild().queueBuild().markAsBuilding( builder) names.append(builder.name) logout() with RequestTimelineCollector() as recorder: builders = self.webservice.get('/builders', api_version='devel').jsonBody() self.assertContentEqual(names, [b['name'] for b in builders['entries']]) self.assertThat(recorder, HasQueryCount(Equals(19))) def test_list_with_private_builds(self): # Inaccessible private builds aren't linked in builders' # current_build fields. with admin_logged_in(): rbpb = self.factory.makeBinaryPackageBuild( archive=self.factory.makeArchive(private=True)) rbpb.queueBuild().markAsBuilding( self.factory.makeBuilder(name='restricted')) bpb = self.factory.makeBinaryPackageBuild( archive=self.factory.makeArchive(private=False)) bpb.queueBuild().markAsBuilding( self.factory.makeBuilder(name='public')) bpb_url = canonical_url(bpb, path_only_if_possible=True) logout() builders = self.webservice.get('/builders', api_version='devel').jsonBody() current_builds = dict( (b['name'], b['current_build_link']) for b in builders['entries']) self.assertEqual('tag:launchpad.net:2008:redacted', current_builds['restricted']) self.assertEqual('http://api.launchpad.dev/devel' + bpb_url, current_builds['public']) def test_getBuildQueueSizes(self): logout() results = self.webservice.named_get('/builders', 'getBuildQueueSizes', api_version='devel') self.assertEqual(['nonvirt', 'virt'], sorted(results.jsonBody().keys())) def test_getBuildersForQueue(self): g1 = self.factory.makeProcessor('g1') quantum = self.factory.makeProcessor('quantum') self.factory.makeBuilder(processors=[quantum], name='quantum_builder1') self.factory.makeBuilder(processors=[quantum], name='quantum_builder2') self.factory.makeBuilder(processors=[quantum], name='quantum_builder3', virtualized=False) self.factory.makeBuilder(processors=[g1], name='g1_builder', virtualized=False) logout() results = self.webservice.named_get('/builders', 'getBuildersForQueue', processor=api_url(quantum), virtualized=True, api_version='devel').jsonBody() self.assertEqual(['quantum_builder1', 'quantum_builder2'], sorted(builder['name'] for builder in results['entries'])) def test_new(self): person = self.factory.makePerson() badmins = getUtility(IPersonSet).getByName('launchpad-buildd-admins') webservice = webservice_for_person( person, permission=OAuthPermission.WRITE_PRIVATE) args = dict(name='foo', processors=['/+processors/386'], title='foobar', url='http://foo.buildd:8221/', virtualized=False, api_version='devel') response = webservice.named_post('/builders', 'new', **args) self.assertEqual(401, response.status) with admin_logged_in(): badmins.addMember(person, badmins) response = webservice.named_post('/builders', 'new', **args) self.assertEqual(201, response.status) self.assertEqual('foobar', webservice.get('/builders/foo').jsonBody()['title'])
class TestBuilderEntry(TestCaseWithFactory): layer = DatabaseFunctionalLayer def setUp(self): super(TestBuilderEntry, self).setUp() self.webservice = LaunchpadWebServiceCaller() def test_security(self): # Attributes can only be set by buildd admins. builder = self.factory.makeBuilder() user = self.factory.makePerson() user_webservice = webservice_for_person( user, permission=OAuthPermission.WRITE_PUBLIC) patch = dumps({'clean_status': 'Cleaning'}) logout() # A normal user is unauthorized. response = user_webservice.patch(api_url(builder), 'application/json', patch, api_version='devel') self.assertEqual(401, response.status) # But a buildd admin can set the attribute. with admin_logged_in(): buildd_admins = getUtility(IPersonSet).getByName( 'launchpad-buildd-admins') buildd_admins.addMember(user, buildd_admins.teamowner) response = user_webservice.patch(api_url(builder), 'application/json', patch, api_version='devel') self.assertEqual(209, response.status) self.assertEqual('Cleaning', response.jsonBody()['clean_status']) def test_exports_processor(self): processor = self.factory.makeProcessor('s1') builder = self.factory.makeBuilder(processors=[processor]) logout() entry = self.webservice.get(api_url(builder), api_version='devel').jsonBody() self.assertEndsWith(entry['processor_link'], '/+processors/s1') def test_getBuildRecords(self): builder = self.factory.makeBuilder() build = self.factory.makeBinaryPackageBuild(builder=builder) build_title = build.title logout() results = self.webservice.named_get(api_url(builder), 'getBuildRecords', pocket='Release', api_version='devel').jsonBody() self.assertEqual([build_title], [entry['title'] for entry in results['entries']]) results = self.webservice.named_get(api_url(builder), 'getBuildRecords', pocket='Proposed', api_version='devel').jsonBody() self.assertEqual(0, len(results['entries']))