Skip to content

Commit 2212538

Browse files
authored
Merge pull request #570 from github/copilot/fix-567
2 parents 65f43f4 + 80d8649 commit 2212538

File tree

2 files changed

+33
-7
lines changed

2 files changed

+33
-7
lines changed

test_time_in_draft.py

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from datetime import datetime, timedelta
55
from unittest.mock import MagicMock
66

7+
import github3
78
import pytz
89
from time_in_draft import get_stats_time_in_draft, measure_time_in_draft
910

@@ -18,13 +19,14 @@ def setUp(self):
1819
Setup common test data and mocks.
1920
"""
2021
self.issue = MagicMock()
22+
self.issue.issue = MagicMock(spec=github3.issues.Issue)
2123
self.issue.issue.state = "open"
2224

2325
def test_time_in_draft_with_ready_for_review(self):
2426
"""
2527
Test measure_time_in_draft with one draft and review interval.
2628
"""
27-
self.issue.events.return_value = [
29+
self.issue.issue.events.return_value = [
2830
MagicMock(
2931
event="converted_to_draft",
3032
created_at=datetime(2021, 1, 1, tzinfo=pytz.utc),
@@ -42,7 +44,7 @@ def test_time_in_draft_without_ready_for_review(self):
4244
"""
4345
Test measure_time_in_draft when ready_for_review_at is not provided and issue is still open.
4446
"""
45-
self.issue.events.return_value = [
47+
self.issue.issue.events.return_value = [
4648
MagicMock(
4749
event="converted_to_draft",
4850
created_at=datetime(2021, 1, 1, tzinfo=pytz.utc),
@@ -59,7 +61,7 @@ def test_time_in_draft_multiple_intervals(self):
5961
"""
6062
Test measure_time_in_draft with multiple draft intervals.
6163
"""
62-
self.issue.events.return_value = [
64+
self.issue.issue.events.return_value = [
6365
MagicMock(
6466
event="converted_to_draft",
6567
created_at=datetime(2021, 1, 1, tzinfo=pytz.utc),
@@ -85,7 +87,7 @@ def test_time_in_draft_ongoing_draft(self):
8587
"""
8688
Test measure_time_in_draft with an ongoing draft interval.
8789
"""
88-
self.issue.events.return_value = [
90+
self.issue.issue.events.return_value = [
8991
MagicMock(
9092
event="converted_to_draft",
9193
created_at=datetime(2021, 1, 1, tzinfo=pytz.utc),
@@ -103,7 +105,7 @@ def test_time_in_draft_no_draft_events(self):
103105
"""
104106
Test measure_time_in_draft with no draft-related events.
105107
"""
106-
self.issue.events.return_value = []
108+
self.issue.issue.events.return_value = []
107109
result = measure_time_in_draft(self.issue)
108110
self.assertIsNone(
109111
result, "The result should be None when there are no draft events."
@@ -113,7 +115,7 @@ def test_time_in_draft_without_ready_for_review_and_closed(self):
113115
"""
114116
Test measure_time_in_draft for a closed issue with an ongoing draft and ready_for_review_at is not provided.
115117
"""
116-
self.issue.events.return_value = [
118+
self.issue.issue.events.return_value = [
117119
MagicMock(
118120
event="converted_to_draft",
119121
created_at=datetime(2021, 1, 1, tzinfo=pytz.utc),
@@ -126,6 +128,30 @@ def test_time_in_draft_without_ready_for_review_and_closed(self):
126128
"The result should be None for a closed issue with an ongoing draft.",
127129
)
128130

131+
def test_time_in_draft_with_attribute_error_scenario(self):
132+
"""
133+
Test measure_time_in_draft to ensure it doesn't raise AttributeError when called
134+
with issue structure similar to what get_per_issue_metrics passes.
135+
This test reproduces the original bug scenario.
136+
"""
137+
# This simulates the actual issue structure passed from get_per_issue_metrics
138+
issue_search_result = MagicMock()
139+
issue_search_result.issue = MagicMock(spec=github3.issues.Issue)
140+
issue_search_result.issue.state = "open"
141+
issue_search_result.issue.events.return_value = [
142+
MagicMock(
143+
event="converted_to_draft",
144+
created_at=datetime(2021, 1, 1, tzinfo=pytz.utc),
145+
),
146+
]
147+
148+
# This should NOT raise AttributeError: events
149+
with unittest.mock.patch("time_in_draft.datetime") as mock_datetime:
150+
mock_datetime.now.return_value = datetime(2021, 1, 4, tzinfo=pytz.utc)
151+
result = measure_time_in_draft(issue_search_result)
152+
expected = timedelta(days=3)
153+
self.assertEqual(result, expected, "The time in draft should be 3 days.")
154+
129155

130156
class TestGetStatsTimeInDraft(unittest.TestCase):
131157
"""

time_in_draft.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def measure_time_in_draft(
2222
returns:
2323
Union[timedelta, None]: Total time the pull request has spent in draft state.
2424
"""
25-
events = issue.events()
25+
events = issue.issue.events()
2626
draft_start = None
2727
total_draft_time = timedelta(0)
2828

0 commit comments

Comments
 (0)