def test_deptree_filters_blocked(self): # dep tree's blocked_specs and dependencies attributes filter # blueprints the user can't see. sharing_policy = SpecificationSharingPolicy.PUBLIC_OR_PROPRIETARY owner = self.factory.makePerson() product = self.factory.makeProduct( owner=owner, specification_sharing_policy=sharing_policy) root = self.factory.makeBlueprint(product=product) proprietary_blocked = self.factory.makeBlueprint( product=product, information_type=InformationType.PROPRIETARY) public_blocked = self.factory.makeBlueprint(product=product) proprietary_blocked.createDependency(root) public_blocked.createDependency(root) # Anonymous can see only the public with anonymous_logged_in(): view = create_view(root, name="+deptree") self.assertEqual([public_blocked], view.all_blocked) self.assertEqual([public_blocked], view.blocked_specs) # The owner can see everything. with person_logged_in(owner): view = create_view(root, name="+deptree") self.assertEqual([proprietary_blocked, public_blocked], view.all_blocked) self.assertEqual([proprietary_blocked, public_blocked], view.blocked_specs) # A random person cannot see the propriety dep. with person_logged_in(self.factory.makePerson()): view = create_view(root, name="+deptree") self.assertEqual([public_blocked], view.all_blocked) self.assertEqual([public_blocked], view.blocked_specs)
def test_deptree_filters_blocked(self): # dep tree's blocked_specs and dependencies attributes filter # blueprints the user can't see. sharing_policy = SpecificationSharingPolicy.PUBLIC_OR_PROPRIETARY owner = self.factory.makePerson() product = self.factory.makeProduct( owner=owner, specification_sharing_policy=sharing_policy) root = self.factory.makeBlueprint(product=product) proprietary_blocked = self.factory.makeBlueprint( product=product, information_type=InformationType.PROPRIETARY) public_blocked = self.factory.makeBlueprint(product=product) proprietary_blocked.createDependency(root) public_blocked.createDependency(root) # Anonymous can see only the public with anonymous_logged_in(): view = create_view(root, name="+deptree") self.assertEqual([public_blocked], view.all_blocked) self.assertEqual([public_blocked], view.blocked_specs) # The owner can see everything. with person_logged_in(owner): view = create_view(root, name="+deptree") self.assertEqual( [proprietary_blocked, public_blocked], view.all_blocked) self.assertEqual( [proprietary_blocked, public_blocked], view.blocked_specs) # A random person cannot see the propriety dep. with person_logged_in(self.factory.makePerson()): view = create_view(root, name="+deptree") self.assertEqual([public_blocked], view.all_blocked) self.assertEqual([public_blocked], view.blocked_specs)
def test_global_css(self): person = self.factory.makePerson() view = create_view(person, name="+index") formatter = ObjectFormatterAPI(view) self.assertEqual('public', formatter.global_css()) view = create_view(person, name="+archivesubscriptions") formatter = ObjectFormatterAPI(view) self.assertEqual('private', formatter.global_css())
def test_global_css(self): person = self.factory.makePerson() view = create_view(person, name="+index") formatter = ObjectFormatterAPI(view) self.assertEqual('public', formatter.global_css()) view = create_view(person, name="+archivesubscriptions") formatter = ObjectFormatterAPI(view) self.assertEqual( 'private', formatter.global_css())
def _test_templates_for_configuration(self, target, context=None): if context is None: context = target naked_target = removeSecurityProxy(target) test_configurations = [ ServiceUsage.UNKNOWN, ServiceUsage.EXTERNAL, ServiceUsage.NOT_APPLICABLE, ServiceUsage.LAUNCHPAD, ] correct_templates = [ HasSpecificationsView.not_launchpad_template.filename, HasSpecificationsView.not_launchpad_template.filename, HasSpecificationsView.not_launchpad_template.filename, HasSpecificationsView.default_template.filename, ] used_templates = list() for config in test_configurations: naked_target.blueprints_usage = config view = create_view(context, '+specs', layer=BlueprintsLayer, principal=self.user) used_templates.append(view.template.filename) self.assertEqual(correct_templates, used_templates)
def test_non_batch_template(self): # The correct template is used for non batch requests. product = self.factory.makeProduct() form = {'search': 'Search'} view = create_view(product, '+bugs', form=form) self.assertEqual( 'buglisting-default.pt', os.path.basename(view.template.filename))
def test_TeamIndexMenu_owner(self): login_person(self.team.teamowner) view = create_view(self.team, '+index') menu = TeamIndexMenu(view) self.assertEqual( ['edit', 'delete', 'add_my_teams'], [link.name for link in menu.iterlinks() if link.enabled])
def test_TeamIndexMenu_registry_experts(self): login_celebrity('registry_experts') view = create_view(self.team, '+index') menu = TeamIndexMenu(view) self.assertEqual( ['administer', 'delete', 'join', 'add_my_teams'], [link.name for link in menu.iterlinks() if link.enabled])
def test_data_subscription_lp_admin(self): # For a subscription, answercontact_data_js has can_edit # set to true for a Launchpad admin. question = self.factory.makeQuestion() member = self.factory.makePerson() contact = self.factory.makePerson( name='user', displayname='Contact Name') contact.addLanguage(getUtility(ILanguageSet)['en']) with person_logged_in(member): question.target.addAnswerContact(contact, contact) view = create_view(question.target, '+portlet-answercontacts-details') api_request = IWebServiceClientRequest(view.request) expected_result = { 'subscriber': { 'name': 'user', 'display_name': 'Contact Name', 'is_team': False, 'can_edit': True, 'web_link': canonical_url(contact), 'self_link': absoluteURL(contact, api_request) } } # Login as admin admin = getUtility(IPersonSet).find(ADMIN_EMAIL).any() with person_logged_in(admin): self.assertEqual( dumps([expected_result]), view.answercontact_data_js)
def test_data_target_owner_answercontact_looks(self): # Answercontact_data_js has can_edit set to true for target owner. distro = self.factory.makeDistribution() question = self.factory.makeQuestion(target=distro) contact = self.factory.makePerson( name='user', displayname='Contact Name') contact.addLanguage(getUtility(ILanguageSet)['en']) with person_logged_in(contact): question.target.addAnswerContact(contact, contact) view = create_view(question.target, '+portlet-answercontacts-details') api_request = IWebServiceClientRequest(view.request) expected_result = { 'subscriber': { 'name': 'user', 'display_name': 'Contact Name', 'is_team': False, 'can_edit': True, 'web_link': canonical_url(contact), 'self_link': absoluteURL(contact, api_request) } } with person_logged_in(distro.owner): self.assertEqual( dumps([expected_result]), view.answercontact_data_js)
def test_data_team_subscription_member_looks(self): # For a team subscription, answercontact_data_js has can_edit # set to true for team member. question = self.factory.makeQuestion() member = self.factory.makePerson() teamowner = self.factory.makePerson( name="team-owner", displayname="Team Owner") contact = self.factory.makeTeam( name='team', displayname='Team Name', owner=teamowner, members=[member]) contact.addLanguage(getUtility(ILanguageSet)['en']) with person_logged_in(contact.teamowner): question.target.addAnswerContact(contact, contact.teamowner) view = create_view(question.target, '+portlet-answercontacts-details') api_request = IWebServiceClientRequest(view.request) expected_result = { 'subscriber': { 'name': 'team', 'display_name': 'Team Name', 'is_team': True, 'can_edit': True, 'web_link': canonical_url(contact), 'self_link': absoluteURL(contact, api_request) } } with person_logged_in(contact.teamowner): self.assertEqual( dumps([expected_result]), view.answercontact_data_js)
def test_rosetta_expert_can_configure_translations(self): product = self.factory.makeProduct() with celebrity_logged_in('rosetta_experts'): view = create_view(product, '+translations', layer=TranslationsLayer) self.assertEqual(True, view.can_configure_translations())
def submitForcedEmptySuggestion(self): """Submit an empty suggestion for `self.current_translation`.""" empty_translation = u'' msgset_id = 'msgset_' + str(self.current_translation.potmsgset.id) msgset_id_lang = msgset_id + '_' + self.pofile.language.code widget_id_base = msgset_id_lang + '_translation_0_' form = { 'lock_timestamp': datetime.now(pytz.utc).isoformat(), 'alt': None, msgset_id: None, widget_id_base + 'radiobutton': widget_id_base + 'new', widget_id_base + 'new': empty_translation, 'submit_translations': 'Save & Continue', msgset_id_lang + '_needsreview': 'force_suggestion', } url = canonical_url(self.current_translation) + '/+translate' view = create_view(self.current_translation, '+translate', form=form, server_url=url) view.request.method = 'POST' view.initialize()
def test_no_tags(self): self.factory.makeBug(target=self.target_product) view = create_view( self.project, name="+bugtarget-portlet-tags-content", layer=BugsLayer) self.assertEqual([], [tag['tag'] for tag in view.tags_cloud_data])
def test_batched_page_title(self): # The view provides a page_title and label. view = create_view(self.root, name='+feature-changelog') self.assertEqual( view.label, view.page_title) self.assertEqual( 'Feature flag changelog', view.page_title)
def test_pagetitle_vhost(self): project = self.factory.makeProduct(name='fnord') view = create_view(project, name='+bugs', rootsite='bugs', current_request=True, server_url='https://bugs.launchpad.dev/') view.request.traversed_objects = [project, view] formatter = ObjectFormatterAPI(view) self.assertEqual('Bugs : Fnord', formatter.pagetitle())
def test_non_batch_template(self): # The correct template is used for non batch requests. product = self.factory.makeProduct() form = {'search': 'Search'} view = create_view(product, '+bugs', form=form) self.assertEqual('buglisting-default.pt', os.path.basename(view.template.filename))
def test_data_subscription_lp_admin(self): # For a subscription, subscriber_data_js has can_edit # set to true for a Launchpad admin. question = self._makeQuestionWithNoSubscribers() member = self.factory.makePerson() subscriber = self.factory.makePerson(name='user', displayname='Subscriber Name') with person_logged_in(member): question.subscribe(subscriber, subscriber) view = create_view(question, '+portlet-subscribers-details') api_request = IWebServiceClientRequest(view.request) expected_result = { 'subscriber': { 'name': 'user', 'display_name': 'Subscriber Name', 'is_team': False, 'can_edit': True, 'web_link': canonical_url(subscriber), 'self_link': absoluteURL(subscriber, api_request) }, 'subscription_level': "Direct", } # Login as admin admin = getUtility(IPersonSet).find(ADMIN_EMAIL).any() with person_logged_in(admin): self.assertEqual(dumps([expected_result]), view.subscriber_data_js)
def test_does_not_redirect(self): # +subscriptions on the bugs facet does not redirect. with person_logged_in(self.subscriber): view = create_view( self.product, name='+subscriptions', rootsite='bugs') view.initialize() self.assertFalse(view._isRedirected())
def test_bugs_answers_usage_none(self): # The dict values are all False. view = create_view(self.dsp, '+index') self.assertFalse(view.bugs_answers_usage['uses_bugs']) self.assertFalse(view.bugs_answers_usage['uses_answers']) self.assertFalse(view.bugs_answers_usage['uses_both']) self.assertFalse(view.bugs_answers_usage['uses_either'])
def makeView(self, name, **kwargs): view = create_view(self.webhook, name, principal=self.owner, **kwargs) # To test the breadcrumbs we need a correct traversal stack. view.request.traversed_objects = (self.getTraversalStack(self.target) + [self.webhook, view]) view.initialize() return view
def test_data_person_answercontact(self): # answercontact_data_js returns JSON string of a list # containing all contact information needed for # subscribers_list.js loading. question = self.factory.makeQuestion() contact = self.factory.makePerson( name='user', displayname='Contact Name') contact.addLanguage(getUtility(ILanguageSet)['en']) with person_logged_in(contact): question.target.addAnswerContact(contact, contact) view = create_view(question.target, '+portlet-answercontacts-details') api_request = IWebServiceClientRequest(view.request) expected_result = { 'subscriber': { 'name': 'user', 'display_name': 'Contact Name', 'is_team': False, 'can_edit': False, 'web_link': canonical_url(contact), 'self_link': absoluteURL(contact, api_request) } } self.assertEqual( dumps([expected_result]), view.answercontact_data_js)
def test_page_batched_changes(self): self.makeFeatureFlagChanges() member = login_celebrity('admin') view = create_view( self.root, name='+feature-changelog', principal=member) tag = find_tag_by_id(view.render(), 'changes') self.assertTrue('table', tag.name)
def _test_templates_for_configuration(self, target, context=None): if context is None: context = target naked_target = removeSecurityProxy(target) test_configurations = [ ServiceUsage.UNKNOWN, ServiceUsage.EXTERNAL, ServiceUsage.NOT_APPLICABLE, ServiceUsage.LAUNCHPAD, ] correct_templates = [ HasSpecificationsView.not_launchpad_template.filename, HasSpecificationsView.not_launchpad_template.filename, HasSpecificationsView.not_launchpad_template.filename, HasSpecificationsView.default_template.filename, ] used_templates = list() for config in test_configurations: naked_target.blueprints_usage = config view = create_view( context, '+specs', layer=BlueprintsLayer, principal=self.user) used_templates.append(view.template.filename) self.assertEqual(correct_templates, used_templates)
def test_data_team_subscription(self): # For a team subscription, subscriber_data_js has is_team set # to true. question = self._makeQuestionWithNoSubscribers() teamowner = self.factory.makePerson( name="team-owner", displayname="Team Owner") subscriber = self.factory.makeTeam( name='team', displayname='Team Name', owner=teamowner) with person_logged_in(subscriber.teamowner): question.subscribe(subscriber, subscriber.teamowner) view = create_view(question, '+portlet-subscribers-details') api_request = IWebServiceClientRequest(view.request) expected_result = { 'subscriber': { 'name': 'team', 'display_name': 'Team Name', 'is_team': True, 'can_edit': False, 'web_link': canonical_url(subscriber), 'self_link': absoluteURL(subscriber, api_request) }, 'subscription_level': "Direct", } self.assertEqual( dumps([expected_result]), view.subscriber_data_js)
def test_person(self): context = self.factory.makePerson(name='pistachio') self.assertTrue(IHasSpecifications.providedBy(context)) view = create_view( context, '+specs', layer=BlueprintsLayer, principal=self.user) self.assertFalse( '<div id="involvement" class="portlet involvement">' in view())
def test_data_subscription_lp_admin(self): # For a subscription, subscriber_data_js has can_edit # set to true for a Launchpad admin. question = self._makeQuestionWithNoSubscribers() member = self.factory.makePerson() subscriber = self.factory.makePerson( name='user', displayname='Subscriber Name') with person_logged_in(member): question.subscribe(subscriber, subscriber) view = create_view(question, '+portlet-subscribers-details') api_request = IWebServiceClientRequest(view.request) expected_result = { 'subscriber': { 'name': 'user', 'display_name': 'Subscriber Name', 'is_team': False, 'can_edit': True, 'web_link': canonical_url(subscriber), 'self_link': absoluteURL(subscriber, api_request) }, 'subscription_level': "Direct", } # Login as admin admin = getUtility(IPersonSet).find(ADMIN_EMAIL).any() with person_logged_in(admin): self.assertEqual( dumps([expected_result]), view.subscriber_data_js)
def test_data_person_subscription(self): # subscriber_data_js returns JSON string of a list # containing all subscriber information needed for # subscribers_list.js subscribers loading. question = self._makeQuestionWithNoSubscribers() subscriber = self.factory.makePerson( name='user', displayname='Subscriber Name') with person_logged_in(subscriber): question.subscribe(subscriber, subscriber) view = create_view(question, '+portlet-subscribers-details') api_request = IWebServiceClientRequest(view.request) expected_result = { 'subscriber': { 'name': 'user', 'display_name': 'Subscriber Name', 'is_team': False, 'can_edit': False, 'web_link': canonical_url(subscriber), 'self_link': absoluteURL(subscriber, api_request) }, 'subscription_level': "Direct", } self.assertEqual( dumps([expected_result]), view.subscriber_data_js)
def test_data_team_subscription(self): # For a team subscription, subscriber_data_js has is_team set # to true. question = self._makeQuestionWithNoSubscribers() teamowner = self.factory.makePerson(name="team-owner", displayname="Team Owner") subscriber = self.factory.makeTeam(name='team', displayname='Team Name', owner=teamowner) with person_logged_in(subscriber.teamowner): question.subscribe(subscriber, subscriber.teamowner) view = create_view(question, '+portlet-subscribers-details') api_request = IWebServiceClientRequest(view.request) expected_result = { 'subscriber': { 'name': 'team', 'display_name': 'Team Name', 'is_team': True, 'can_edit': False, 'web_link': canonical_url(subscriber), 'self_link': absoluteURL(subscriber, api_request) }, 'subscription_level': "Direct", } self.assertEqual(dumps([expected_result]), view.subscriber_data_js)
def test_tags(self): self.factory.makeBug(target=self.target_product, tags=['foo']) view = create_view(self.project, name="+bugtarget-portlet-tags-content", layer=BugsLayer) self.assertEqual([u'foo'], [tag['tag'] for tag in view.tags_cloud_data])
def test_redirects(self): # +subscriptions on anything but the bugs facet redirects. with person_logged_in(self.subscriber): view = create_view( self.product, name='+subscriptions', rootsite='code') view.initialize() self.assertTrue(view._isRedirected())
def test_pagetitle_lower_level_default_view(self): project = self.factory.makeProduct(name='fnord') view = create_view( project.development_focus, name='+index', current_request=True) view.request.traversed_objects = [ project, project.development_focus, view] formatter = ObjectFormatterAPI(view) self.assertEqual('Series trunk : Fnord', formatter.pagetitle())
def test_launchpad_owl(self): app = getUtility(ILaunchpadApplication) view = create_view(app, name='rdf-spec') owl = view.publishTraverse(view.request, 'launchpad.owl') entity = 'ENTITY launchpad "https://launchpad.net/rdf-spec/launchpad#' self.assertTrue(entity in owl()) self.assertEqual('application/rdf+xml', owl.request.response.getHeader('content-type'))
def verify_view(self, context, name): view = create_view( context, '+register-a-blueprint-button') self.assertEqual( 'http://blueprints.launchpad.dev/%s/+addspec' % name, view.target_url) self.assertTrue( '<div id="involvement" class="portlet involvement">' in view())
def test_public_archive(self): # Public teams have public archives. team = self.makeTeamWithMailingList() view = create_view( team, name='+portlet-mailinglist', server_url='http://launchpad.dev', path_info='/~%s' % team.name) link = find_tag_by_id(view(), 'mailing-list-archive') self.assertEqual('View public archive', extract_text(link))
def verify_involvment(self, context): self.assertTrue(IHasSpecifications.providedBy(context)) view = create_view(context, '+specs', layer=BlueprintsLayer, principal=self.user) self.assertTrue( '<div id="involvement" class="portlet involvement">' in view())
def test_registration_not_done(self): # The registration done property on the product index view # tells you if all the configuration work is done, based on # usage enums. # At least one usage enum is unknown, so registration done is false. self.assertEqual(self.product.codehosting_usage, ServiceUsage.UNKNOWN) view = create_view(self.product, '+get-involved') self.assertFalse(view.registration_done) set_service_usage(self.product.name, codehosting_usage="EXTERNAL", bug_tracking_usage="LAUNCHPAD", answers_usage="EXTERNAL", translations_usage="NOT_APPLICABLE") view = create_view(self.product, '+get-involved') self.assertTrue(view.registration_done)
def test_batch_template(self): # The correct template is used for batch requests. product = self.factory.makeProduct() form = {'search': 'Search'} view = create_view( product, '+bugs', form=form, query_string='batch_request=True') self.assertEqual( view.bugtask_table_template.filename, view.template.filename)
def test_subscribe_control_renders(self): login_person(self.user) view = create_view(self.b_team, name='+index', principal=self.user, server_url='http://launchpad.dev', path_info='/~%s' % self.b_team.name) content = view.render() link_tag = find_tag_by_id(content, "link-list-subscribe") self.assertNotEqual(None, link_tag)
def test_page_batched_changes(self): self.makeFeatureFlagChanges() member = login_celebrity('admin') view = create_view(self.root, name='+feature-changelog', principal=member) tag = find_tag_by_id(view.render(), 'changes') self.assertTrue('table', tag.name)
def test_has_watermark_true(self): # A view cand define has_watermark as True. class NoWatermarkView(TestView): has_watermark = True self.registerBrowserViewAdapter(NoWatermarkView, ITest, '+test') view = create_view(TestObject(), name='+test') has_watermark = test_tales('view/macro:has-watermark', view=view) self.assertIs(True, has_watermark)
def test_bugs_answers_usage_answers(self): # The dict values are True for answers and either. with celebrity_logged_in('admin'): self.dsp.distribution.answers_usage = ServiceUsage.LAUNCHPAD view = create_view(self.dsp, '+index') self.assertFalse(view.bugs_answers_usage['uses_bugs']) self.assertTrue(view.bugs_answers_usage['uses_answers']) self.assertFalse(view.bugs_answers_usage['uses_both']) self.assertIs(True, view.bugs_answers_usage['uses_either'])
def test_launchpad_owl(self): app = getUtility(ILaunchpadApplication) view = create_view(app, name='rdf-spec') owl = view.publishTraverse(view.request, 'launchpad.owl') entity = 'ENTITY launchpad "https://launchpad.net/rdf-spec/launchpad#' self.assertTrue(entity in owl()) self.assertEqual( 'application/rdf+xml', owl.request.response.getHeader('content-type'))
def test_batched_changes(self): # The view provides a batched iterator of changes. self.makeFeatureFlagChanges() view = create_view(self.root, name='+feature-changelog') batch = view.changes self.assertEqual('change', batch._singular_heading) self.assertEqual('changes', batch._plural_heading) self.assertEqual(10, batch.default_size) self.assertEqual(None, batch.currentBatch().nextBatch().nextBatch())
def test_content_type(self): question = self.factory.makeQuestion() # It works even for anonymous users, so no log-in is needed. view = create_view(question, '+portlet-subscribers-details') view.render() self.assertEqual(view.request.response.getHeader('content-type'), 'application/json')
def test_simple_poll_template(self): poll = self.factory.makePoll(self.team, 'name', 'title', 'proposition', poll_type=PollAlgorithm.SIMPLE) view = create_view(poll, name='+vote') self.assertEqual('poll-vote-simple.pt', os.path.basename(view.template.filename))
def test_condorcet_poll_template(self): poll = self.factory.makePoll(self.team, 'name', 'title', 'proposition', poll_type=PollAlgorithm.CONDORCET) view = create_view(poll, name='+vote') self.assertEqual('poll-vote-condorcet.pt', os.path.basename(view.template.filename))