diff --git a/tests/test_issue_59_gitea_plugin.py b/tests/test_issue_59_gitea_plugin.py index 826a7855..ba5f30c3 100644 --- a/tests/test_issue_59_gitea_plugin.py +++ b/tests/test_issue_59_gitea_plugin.py @@ -129,13 +129,11 @@ class TestGiteaPluginListIssues(AsyncTestCase): """Test that list_issues handles repository errors gracefully.""" mock_repo = Mock() mock_repo_class.return_value = mock_repo - mock_repo.get_issues = AsyncMock(side_effect=Exception("API Error")) - plugin = GiteaPlugin(self.config) + plugin._list_issues_async = self.create_async_mock(side_effect=Exception("API Error")) - with patch('asyncio.run', side_effect=Exception("API Error")): - with pytest.raises(Exception): - plugin.list_issues() + with pytest.raises(Exception): + plugin.list_issues() class TestGiteaPluginGetIssue(AsyncTestCase): @@ -151,55 +149,48 @@ class TestGiteaPluginGetIssue(AsyncTestCase): """Test getting a specific issue by ID.""" mock_repo = Mock() mock_repo_class.return_value = mock_repo - mock_repo.get_issue = AsyncMock() - mock_issue = Mock(spec=Issue) mock_issue.number = 59 - mock_repo.get_issue.return_value = mock_issue plugin = GiteaPlugin(self.config) + plugin._get_issue_async = self.create_async_mock(return_value=mock_issue) - with patch('asyncio.run') as mock_run: - mock_run.return_value = mock_issue - issue = plugin.get_issue('59') + issue = plugin.get_issue('59') - assert issue == mock_issue + assert issue == mock_issue @patch('markitect.issues.plugins.gitea.GiteaIssueRepository') def test_get_issue_converts_string_id_to_int(self, mock_repo_class): """Test that get_issue properly converts string IDs to integers.""" mock_repo = Mock() mock_repo_class.return_value = mock_repo - mock_repo.get_issue = AsyncMock() - + mock_result = Mock() plugin = GiteaPlugin(self.config) + plugin._get_issue_async = self.create_async_mock(return_value=mock_result) - with patch('asyncio.run') as mock_run: - mock_run.return_value = Mock() - plugin.get_issue('59') + result = plugin.get_issue('59') - # Verify repository was called with integer - # This will be verified in the actual async call + # Verify the conversion worked and result is returned + assert result == mock_result @patch('markitect.issues.plugins.gitea.GiteaIssueRepository') def test_get_nonexistent_issue_raises_error(self, mock_repo_class): """Test that getting non-existent issue raises appropriate error.""" mock_repo = Mock() mock_repo_class.return_value = mock_repo - mock_repo.get_issue = AsyncMock(side_effect=Exception("Issue not found")) - plugin = GiteaPlugin(self.config) + plugin._get_issue_async = self.create_async_mock(side_effect=Exception("Issue not found")) - with patch('asyncio.run', side_effect=Exception("Issue not found")): - with pytest.raises(Exception): - plugin.get_issue('999999') + with pytest.raises(Exception): + plugin.get_issue('999999') -class TestGiteaPluginCreateIssue: +class TestGiteaPluginCreateIssue(AsyncTestCase): """Test suite for creating issues through Gitea plugin.""" def setup_method(self): """Set up test fixtures.""" + super().setup_method() self.config = {'url': 'http://test.com', 'repo': 'test/repo'} @patch('markitect.issues.plugins.gitea.GiteaIssueRepository') @@ -207,55 +198,51 @@ class TestGiteaPluginCreateIssue: """Test creating an issue with title and body.""" mock_repo = Mock() mock_repo_class.return_value = mock_repo - mock_repo.create_issue = AsyncMock() mock_created_issue = Mock(spec=Issue) mock_created_issue.number = 60 - mock_repo.create_issue.return_value = mock_created_issue plugin = GiteaPlugin(self.config) + plugin._create_issue_async = self.create_async_mock(return_value=mock_created_issue) - with patch('asyncio.run') as mock_run: - mock_run.return_value = mock_created_issue - issue = plugin.create_issue('Test Title', 'Test Body') + issue = plugin.create_issue('Test Title', 'Test Body') - assert issue == mock_created_issue + assert issue == mock_created_issue @patch('markitect.issues.plugins.gitea.GiteaIssueRepository') def test_create_issue_with_additional_kwargs(self, mock_repo_class): """Test creating an issue with additional keyword arguments.""" mock_repo = Mock() mock_repo_class.return_value = mock_repo - mock_repo.create_issue = AsyncMock() + mock_result = Mock() plugin = GiteaPlugin(self.config) + plugin._create_issue_async = self.create_async_mock(return_value=mock_result) - with patch('asyncio.run') as mock_run: - mock_run.return_value = Mock() - plugin.create_issue('Title', 'Body', labels=['bug', 'priority:high']) + result = plugin.create_issue('Title', 'Body', labels=['bug', 'priority:high']) - # Additional kwargs should be passed through to repository - mock_run.assert_called_once() + # Verify the method was called and returned expected result + assert result == mock_result @patch('markitect.issues.plugins.gitea.GiteaIssueRepository') def test_create_issue_handles_validation_errors(self, mock_repo_class): """Test that create_issue handles validation errors appropriately.""" mock_repo = Mock() mock_repo_class.return_value = mock_repo - mock_repo.create_issue = AsyncMock(side_effect=ValueError("Invalid title")) plugin = GiteaPlugin(self.config) + plugin._create_issue_async = self.create_async_mock(side_effect=ValueError("Invalid title")) - with patch('asyncio.run', side_effect=ValueError("Invalid title")): - with pytest.raises(ValueError): - plugin.create_issue('', 'Body') # Empty title + with pytest.raises(ValueError): + plugin.create_issue('', 'Body') # Empty title -class TestGiteaPluginUpdateIssue: +class TestGiteaPluginUpdateIssue(AsyncTestCase): """Test suite for updating issues through Gitea plugin.""" def setup_method(self): """Set up test fixtures.""" + super().setup_method() self.config = {'url': 'http://test.com', 'repo': 'test/repo'} @patch('markitect.issues.plugins.gitea.GiteaIssueRepository') @@ -263,55 +250,48 @@ class TestGiteaPluginUpdateIssue: """Test updating an issue's title.""" mock_repo = Mock() mock_repo_class.return_value = mock_repo - mock_repo.update_issue = AsyncMock() - mock_updated_issue = Mock(spec=Issue) - mock_repo.update_issue.return_value = mock_updated_issue plugin = GiteaPlugin(self.config) + plugin._update_issue_async = self.create_async_mock(return_value=mock_updated_issue) - with patch('asyncio.run') as mock_run: - mock_run.return_value = mock_updated_issue - issue = plugin.update_issue('59', title='New Title') + issue = plugin.update_issue('59', title='New Title') - assert issue == mock_updated_issue + assert issue == mock_updated_issue @patch('markitect.issues.plugins.gitea.GiteaIssueRepository') def test_update_issue_body(self, mock_repo_class): """Test updating an issue's body.""" mock_repo = Mock() mock_repo_class.return_value = mock_repo - mock_repo.update_issue = AsyncMock() - + mock_result = Mock() plugin = GiteaPlugin(self.config) + plugin._update_issue_async = self.create_async_mock(return_value=mock_result) - with patch('asyncio.run') as mock_run: - mock_run.return_value = Mock() - plugin.update_issue('59', body='New body content') + result = plugin.update_issue('59', body='New body content') - mock_run.assert_called_once() + assert result == mock_result @patch('markitect.issues.plugins.gitea.GiteaIssueRepository') def test_update_issue_multiple_fields(self, mock_repo_class): """Test updating multiple issue fields simultaneously.""" mock_repo = Mock() mock_repo_class.return_value = mock_repo - mock_repo.update_issue = AsyncMock() - + mock_result = Mock() plugin = GiteaPlugin(self.config) + plugin._update_issue_async = self.create_async_mock(return_value=mock_result) - with patch('asyncio.run') as mock_run: - mock_run.return_value = Mock() - plugin.update_issue('59', title='New Title', body='New Body', state='closed') + result = plugin.update_issue('59', title='New Title', body='New Body', state='closed') - mock_run.assert_called_once() + assert result == mock_result -class TestGiteaPluginCommentOperations: +class TestGiteaPluginCommentOperations(AsyncTestCase): """Test suite for comment operations through Gitea plugin.""" def setup_method(self): """Set up test fixtures.""" + super().setup_method() self.config = {'url': 'http://test.com', 'repo': 'test/repo'} @patch('markitect.issues.plugins.gitea.GiteaIssueRepository') @@ -344,11 +324,12 @@ class TestGiteaPluginCommentOperations: plugin.add_comment('', 'Valid comment') -class TestGiteaPluginCloseIssue: +class TestGiteaPluginCloseIssue(AsyncTestCase): """Test suite for closing issues through Gitea plugin.""" def setup_method(self): """Set up test fixtures.""" + super().setup_method() self.config = {'url': 'http://test.com', 'repo': 'test/repo'} @patch('markitect.issues.plugins.gitea.GiteaIssueRepository') @@ -356,53 +337,47 @@ class TestGiteaPluginCloseIssue: """Test that closing an issue updates its state to closed.""" mock_repo = Mock() mock_repo_class.return_value = mock_repo - mock_repo.update_issue = AsyncMock() - mock_closed_issue = Mock(spec=Issue) mock_closed_issue.state = "closed" - mock_repo.update_issue.return_value = mock_closed_issue plugin = GiteaPlugin(self.config) + plugin._close_issue_async = self.create_async_mock(return_value=mock_closed_issue) - with patch('asyncio.run') as mock_run: - mock_run.return_value = mock_closed_issue - issue = plugin.close_issue('59') + issue = plugin.close_issue('59') - assert issue == mock_closed_issue + assert issue == mock_closed_issue @patch('markitect.issues.plugins.gitea.GiteaIssueRepository') def test_close_already_closed_issue_succeeds(self, mock_repo_class): """Test that closing an already closed issue succeeds gracefully.""" mock_repo = Mock() mock_repo_class.return_value = mock_repo - mock_repo.update_issue = AsyncMock() - + mock_result = Mock() plugin = GiteaPlugin(self.config) + plugin._close_issue_async = self.create_async_mock(return_value=mock_result) - with patch('asyncio.run') as mock_run: - mock_run.return_value = Mock() - # Should not raise an error - plugin.close_issue('59') + # Should not raise an error + result = plugin.close_issue('59') + assert result == mock_result @patch('markitect.issues.plugins.gitea.GiteaIssueRepository') def test_close_nonexistent_issue_raises_error(self, mock_repo_class): """Test that closing non-existent issue raises appropriate error.""" mock_repo = Mock() mock_repo_class.return_value = mock_repo - mock_repo.update_issue = AsyncMock(side_effect=Exception("Issue not found")) - plugin = GiteaPlugin(self.config) + plugin._close_issue_async = self.create_async_mock(side_effect=Exception("Issue not found")) - with patch('asyncio.run', side_effect=Exception("Issue not found")): - with pytest.raises(Exception): - plugin.close_issue('999999') + with pytest.raises(Exception): + plugin.close_issue('999999') -class TestGiteaPluginErrorHandling: +class TestGiteaPluginErrorHandling(AsyncTestCase): """Test suite for error handling in Gitea plugin.""" def setup_method(self): """Set up test fixtures.""" + super().setup_method() self.config = {'url': 'http://test.com', 'repo': 'test/repo'} @patch('markitect.issues.plugins.gitea.GiteaIssueRepository') @@ -410,26 +385,22 @@ class TestGiteaPluginErrorHandling: """Test that network errors are handled gracefully.""" mock_repo = Mock() mock_repo_class.return_value = mock_repo - mock_repo.get_issues = AsyncMock(side_effect=ConnectionError("Network error")) - plugin = GiteaPlugin(self.config) + plugin._list_issues_async = self.create_async_mock(side_effect=ConnectionError("Network error")) - with patch('asyncio.run', side_effect=ConnectionError("Network error")): - with pytest.raises(ConnectionError): - plugin.list_issues() + with pytest.raises(ConnectionError): + plugin.list_issues() @patch('markitect.issues.plugins.gitea.GiteaIssueRepository') def test_authentication_errors_provide_helpful_messages(self, mock_repo_class): """Test that authentication errors provide helpful error messages.""" mock_repo = Mock() mock_repo_class.return_value = mock_repo - mock_repo.get_issues = AsyncMock(side_effect=PermissionError("Authentication failed")) - plugin = GiteaPlugin(self.config) + plugin._list_issues_async = self.create_async_mock(side_effect=PermissionError("Authentication failed")) - with patch('asyncio.run', side_effect=PermissionError("Authentication failed")): - with pytest.raises(PermissionError): - plugin.list_issues() + with pytest.raises(PermissionError): + plugin.list_issues() def test_invalid_configuration_raises_appropriate_error(self): """Test that invalid configuration raises appropriate errors."""