@@ -75,3 +75,116 @@ def test_recent_issues_limit(self, mock_select_related, mock_issue):
7575 mock_select_related .assert_called_once ()
7676 mock_queryset .order_by .assert_called_once_with ("-created_at" )
7777 assert result == [mock_issue ]
78+
79+ @patch ("apps.github.api.internal.queries.issue.Subquery" )
80+ @patch ("apps.github.models.issue.Issue.objects.select_related" )
81+ def test_recent_issues_distinct (self , mock_select_related , mock_subquery , mock_issue ):
82+ """Test distinct filtering with Subquery for issues."""
83+ mock_queryset = MagicMock ()
84+ mock_queryset .order_by .return_value = mock_queryset
85+ mock_queryset .filter .return_value = mock_queryset
86+ mock_queryset .__getitem__ .return_value = [mock_issue ]
87+ mock_select_related .return_value = mock_queryset
88+
89+ mock_subquery_instance = MagicMock ()
90+ mock_subquery .return_value = mock_subquery_instance
91+
92+ result = IssueQuery ().recent_issues (distinct = True )
93+
94+ assert result == [mock_issue ]
95+ mock_subquery .assert_called_once ()
96+ mock_queryset .filter .assert_called ()
97+
98+ @patch ("apps.github.models.issue.Issue.objects.select_related" )
99+ def test_recent_issues_combined_filters (self , mock_select_related , mock_issue ):
100+ mock_queryset = MagicMock ()
101+ mock_queryset .order_by .return_value .filter .return_value .filter .return_value = [mock_issue ]
102+ mock_select_related .return_value = mock_queryset
103+
104+ result = IssueQuery ().recent_issues (login = "alice" , organization = "owasp" )
105+
106+ mock_select_related .assert_called_once ()
107+ mock_queryset .order_by .assert_called_once ()
108+ assert result == [mock_issue ]
109+
110+ @patch ("apps.github.api.internal.queries.issue.OuterRef" )
111+ @patch ("apps.github.api.internal.queries.issue.Subquery" )
112+ @patch ("apps.github.models.issue.Issue.objects.select_related" )
113+ def test_recent_issues_distinct_with_organization (
114+ self , mock_select_related , mock_subquery , mock_outer_ref , mock_issue
115+ ):
116+ """Test distinct filtering with organization filter."""
117+ mock_queryset = MagicMock ()
118+ mock_queryset .order_by .return_value = mock_queryset
119+ mock_queryset .filter .return_value = mock_queryset
120+ mock_queryset .__getitem__ .return_value = [mock_issue ]
121+ mock_select_related .return_value = mock_queryset
122+
123+ mock_subquery_instance = Mock ()
124+ mock_subquery .return_value = mock_subquery_instance
125+ mock_outer_ref_instance = Mock ()
126+ mock_outer_ref .return_value = mock_outer_ref_instance
127+
128+ result = IssueQuery ().recent_issues (distinct = True , organization = "owasp" )
129+
130+ assert result == [mock_issue ]
131+ mock_subquery .assert_called_once ()
132+ mock_outer_ref .assert_called_once_with ("author_id" )
133+
134+ @patch ("apps.github.api.internal.queries.issue.OuterRef" )
135+ @patch ("apps.github.api.internal.queries.issue.Subquery" )
136+ @patch ("apps.github.models.issue.Issue.objects.select_related" )
137+ def test_recent_issues_distinct_with_all_filters (
138+ self , mock_select_related , mock_subquery , mock_outer_ref , mock_issue
139+ ):
140+ """Test distinct filtering with all filters."""
141+ mock_queryset = MagicMock ()
142+ mock_queryset .order_by .return_value = mock_queryset
143+ mock_queryset .filter .return_value = mock_queryset
144+ mock_queryset .__getitem__ .return_value = [mock_issue ]
145+ mock_select_related .return_value = mock_queryset
146+
147+ mock_subquery_instance = Mock ()
148+ mock_subquery .return_value = mock_subquery_instance
149+ mock_outer_ref_instance = Mock ()
150+ mock_outer_ref .return_value = mock_outer_ref_instance
151+
152+ result = IssueQuery ().recent_issues (
153+ distinct = True , login = "alice" , organization = "owasp" , limit = 3
154+ )
155+
156+ assert result == [mock_issue ]
157+ mock_subquery .assert_called_once ()
158+ mock_outer_ref .assert_called_once_with ("author_id" )
159+ # Verify both login and organization filters were applied
160+ assert mock_queryset .filter .call_count >= 3 # login, organization, distinct
161+
162+ @patch ("apps.github.models.issue.Issue.objects.select_related" )
163+ def test_recent_issues_organization_only (self , mock_select_related , mock_issue ):
164+ """Test filtering issues by organization only."""
165+ mock_queryset = MagicMock ()
166+ mock_queryset .order_by .return_value = mock_queryset
167+ mock_queryset .filter .return_value = mock_queryset
168+ mock_queryset .__getitem__ .return_value = [mock_issue ]
169+ mock_select_related .return_value = mock_queryset
170+
171+ result = IssueQuery ().recent_issues (organization = "owasp" )
172+
173+ assert result == [mock_issue ]
174+ assert len (mock_queryset .filter .call_args_list ) >= 1
175+
176+ @patch ("apps.github.models.issue.Issue.objects.select_related" )
177+ def test_recent_issues_multiple_filters (self , mock_select_related , mock_issue ):
178+ """Test issues with multiple filters applied."""
179+ mock_queryset = MagicMock ()
180+ mock_queryset .order_by .return_value = mock_queryset
181+ mock_queryset .filter .return_value = mock_queryset
182+ mock_queryset .__getitem__ .return_value = [mock_issue ]
183+ mock_select_related .return_value = mock_queryset
184+
185+ result = IssueQuery ().recent_issues (organization = "owasp" , limit = 10 )
186+
187+ assert result == [mock_issue ]
188+ # Verify organization filter was applied
189+ assert len (mock_queryset .filter .call_args_list ) >= 1
190+ mock_queryset .__getitem__ .assert_called_with (slice (None , 10 ))
0 commit comments