def test_teams_for_distro_with_no_bug_super(self): self._setup_teams(self.user) context = self.factory.makeDistribution(owner=self.user, members=self.bug_super_team) expose_user_administered_teams_to_js(self.request, self.user, context, absoluteURL=fake_absoluteURL) # The team information should have been added to the request. self.assertThat(self.request.objects, Contains('administratedTeams')) team_info = self.request.objects['administratedTeams'] # Since the distro has no bug supervisor set, all administered teams # are returned. expected_number_teams = 3 self.assertThat(len(team_info), Equals(expected_number_teams)) # The items info consist of a dictionary with link and title keys. for i in range(expected_number_teams): self.assertThat( team_info[i], KeysEqual('has_preferredemail', 'link', 'title', 'url')) # The link is the unique display name of the team. self.assertThat( team_info[0]['title'], Equals(u'Bug Supervisor Sub Team (bug-supervisor-sub-team)')) self.assertThat(team_info[1]['title'], Equals(u'Bug Supervisor Team (bug-supervisor-team)')) self.assertThat(team_info[2]['title'], Equals(u'Unrelated Team (unrelated-team)')) # The link is the API link to the team. self.assertThat(team_info[0]['link'], Equals(u'http://example.com/bug-supervisor-sub-team'))
def test_teams_for_distro_with_bug_super(self): self._setup_teams(self.user) context = self.factory.makeDistribution( owner=self.user, members=self.bug_super_team) with person_logged_in(self.user): context.bug_supervisor = self.bug_super_team expose_user_administered_teams_to_js(self.request, self.user, context, absoluteURL=fake_absoluteURL) # The team information should have been added to the request. self.assertThat(self.request.objects, Contains('administratedTeams')) team_info = self._sort(self.request.objects['administratedTeams']) # Since the distro only returns teams that are members of the bug # supervisor team, we only expect two. expected_number_teams = 2 self.assertThat(len(team_info), Equals(expected_number_teams)) # The items info consist of a dictionary with link and title keys. for i in range(expected_number_teams): self.assertThat( team_info[i], KeysEqual('has_preferredemail', 'link', 'title', 'url')) # The link is the title of the team. self.assertThat( team_info[0]['title'], Equals(u'\u201cBug Supervisor Sub Team\u201d team')) self.assertThat( team_info[1]['title'], Equals(u'\u201cBug Supervisor Team\u201d team')) # The link is the API link to the team. self.assertThat(team_info[0]['link'], Equals(u'http://example.com/\u201cBugSupervisorSubTeam\u201dteam'))
def test_expose_user_administered_teams_to_js__uses_cached_teams(self): # The function expose_user_administered_teams_to_js uses a # cached list of administrated teams. context = self.factory.makeProduct(owner=self.user) self._setup_teams(self.user) # The first call requires one query to retrieve the administrated # teams. with StormStatementRecorder() as recorder: expose_user_administered_teams_to_js(self.request, self.user, context, absoluteURL=fake_absoluteURL) statements_for_admininstrated_teams = [ statement for statement in recorder.statements if 'TeamMembership' in statement ] self.assertEqual(1, len(statements_for_admininstrated_teams)) # Calling the function a second time does not require an # SQL call to retrieve the administrated teams. with StormStatementRecorder() as recorder: expose_user_administered_teams_to_js(self.request, self.user, context, absoluteURL=fake_absoluteURL) statements_for_admininstrated_teams = [ statement for statement in recorder.statements if 'TeamMembership' in statement ] self.assertEqual(0, len(statements_for_admininstrated_teams))
def test_teams_for_distro_with_no_bug_super(self): self._setup_teams(self.user) context = self.factory.makeDistribution( owner=self.user, members=self.bug_super_team) expose_user_administered_teams_to_js(self.request, self.user, context, absoluteURL=fake_absoluteURL) # The team information should have been added to the request. self.assertThat(self.request.objects, Contains('administratedTeams')) team_info = self._sort(self.request.objects['administratedTeams']) # Since the distro has no bug supervisor set, all administered teams # are returned. expected_number_teams = 3 self.assertThat(len(team_info), Equals(expected_number_teams)) # The items info consist of a dictionary with link and title keys. for i in range(expected_number_teams): self.assertThat( team_info[i], KeysEqual('has_preferredemail', 'link', 'title', 'url')) # The link is the title of the team. self.assertThat( team_info[0]['title'], Equals(u'\u201cBug Supervisor Sub Team\u201d team')) self.assertThat( team_info[1]['title'], Equals(u'\u201cBug Supervisor Team\u201d team')) self.assertThat( team_info[2]['title'], Equals(u'\u201cUnrelated Team\u201d team')) # The link is the API link to the team. self.assertThat(team_info[0]['link'], Equals(u'http://example.com/\u201cBugSupervisorSubTeam\u201dteam'))
def test_expose_user_administered_teams_to_js__uses_cached_teams(self): # The function expose_user_administered_teams_to_js uses a # cached list of administrated teams. context = self.factory.makeProduct(owner=self.user) self._setup_teams(self.user) # The first call requires one query to retrieve the administrated # teams. with StormStatementRecorder() as recorder: expose_user_administered_teams_to_js( self.request, self.user, context, absoluteURL=fake_absoluteURL) statements_for_admininstrated_teams = [ statement for statement in recorder.statements if statement.startswith("SELECT *")] self.assertEqual(1, len(statements_for_admininstrated_teams)) # Calling the function a second time does not require an # SQL call to retrieve the administrated teams. with StormStatementRecorder() as recorder: expose_user_administered_teams_to_js( self.request, self.user, context, absoluteURL=fake_absoluteURL) statements_for_admininstrated_teams = [ statement for statement in recorder.statements if statement.startswith("SELECT *")] self.assertEqual(0, len(statements_for_admininstrated_teams))
def test_query_count(self): # The function issues a constant number of queries regardless of # team count. login_person(self.user) context = self.factory.makeProduct(owner=self.user) self._setup_teams(self.user) IStore(Person).invalidate() clear_cache() with StormStatementRecorder() as recorder: expose_user_administered_teams_to_js( self.request, self.user, context, absoluteURL=fake_absoluteURL) self.assertThat(recorder, HasQueryCount(Equals(4))) # Create some new public teams owned by the user, and a private # team administered by the user. for i in range(3): self.factory.makeTeam(owner=self.user) pt = self.factory.makeTeam( visibility=PersonVisibility.PRIVATE, members=[self.user]) with person_logged_in(pt.teamowner): pt.addMember( self.user, pt.teamowner, status=TeamMembershipStatus.ADMIN) IStore(Person).invalidate() clear_cache() del IJSONRequestCache(self.request).objects['administratedTeams'] with StormStatementRecorder() as recorder: expose_user_administered_teams_to_js( self.request, self.user, context, absoluteURL=fake_absoluteURL) self.assertThat(recorder, HasQueryCount(Equals(4)))
def test_teams_for_non_distro(self): # The expose_user_administered_teams_to_js function loads some data # about the teams the requesting user administers into the response to # be made available to JavaScript. context = self.factory.makeProduct(owner=self.user) self._setup_teams(self.user) expose_user_administered_teams_to_js(self.request, self.user, context, absoluteURL=fake_absoluteURL) # The team information should have been added to the request. self.assertThat(self.request.objects, Contains('administratedTeams')) team_info = self._sort(self.request.objects['administratedTeams']) # Since there are three teams, there should be three items in the # list of team info. expected_number_teams = 3 self.assertThat(len(team_info), Equals(expected_number_teams)) # The items info consist of a dictionary with link and title keys. for i in range(expected_number_teams): self.assertThat( team_info[i], KeysEqual('has_preferredemail', 'link', 'title', 'url')) # The link is the title of the team. self.assertThat( team_info[0]['title'], Equals(u'\u201cBug Supervisor Sub Team\u201d team')) self.assertThat( team_info[1]['title'], Equals(u'\u201cBug Supervisor Team\u201d team')) self.assertThat( team_info[2]['title'], Equals(u'\u201cUnrelated Team\u201d team')) # The link is the API link to the team. self.assertThat(team_info[0]['link'], Equals(u'http://example.com/\u201cBugSupervisorSubTeam\u201dteam'))
def test_teams_owned_but_not_joined_are_not_included(self): context = self.factory.makeProduct(owner=self.user) team = self.factory.makeTeam( name='bug-supervisor-team', owner=self.user) with person_logged_in(self.user): self.user.leave(team) expose_user_administered_teams_to_js(self.request, self.user, context, absoluteURL=fake_absoluteURL) team_info = self.request.objects['administratedTeams'] self.assertEquals(len(team_info), 0)
def test_teams_preferredemail(self): # The function includes information about whether the team has a # preferred email. This gives us information in JavaScript that tells # us whether the subscription can be muted for a particular member of # the team. (If the team has a preferredemail, muting is not # possible). context = self.factory.makeProduct(owner=self.user) self.factory.makeTeam(name='team-1', owner=self.user) team2 = self.factory.makeTeam(name='team-2', owner=self.user) self.factory.makeEmail('*****@*****.**', team2, email_status=EmailAddressStatus.PREFERRED) expose_user_administered_teams_to_js(self.request, self.user, context, absoluteURL=fake_absoluteURL) team_info = self.request.objects['administratedTeams'] self.assertThat(team_info[0]['title'], Equals(u'Team 1 (team-1)')) self.assertThat(team_info[0]['has_preferredemail'], Equals(False)) self.assertThat(team_info[1]['title'], Equals(u'Team 2 (team-2)')) self.assertThat(team_info[1]['has_preferredemail'], Equals(True))
def test_teams_preferredemail(self): # The function includes information about whether the team has a # preferred email. This gives us information in JavaScript that tells # us whether the subscription can be muted for a particular member of # the team. (If the team has a preferredemail, muting is not # possible). context = self.factory.makeProduct(owner=self.user) self.factory.makeTeam(name='team-1', owner=self.user) team2 = self.factory.makeTeam(name='team-2', owner=self.user) self.factory.makeEmail('*****@*****.**', team2, email_status=EmailAddressStatus.PREFERRED) expose_user_administered_teams_to_js(self.request, self.user, context, absoluteURL=fake_absoluteURL) team_info = self._sort(self.request.objects['administratedTeams']) self.assertThat( team_info[0]['title'], Equals(u'\u201cTeam 1\u201d team')) self.assertThat(team_info[0]['has_preferredemail'], Equals(False)) self.assertThat( team_info[1]['title'], Equals(u'\u201cTeam 2\u201d team')) self.assertThat(team_info[1]['has_preferredemail'], Equals(True))