Skip to content

Commit 51d9eb0

Browse files
#UNIT_TEST
Prompt Category: Unit Testing Prompt: extract_data.py Now the code is working perfectly. Modify the unit tests in such a way that all the unit tests pass and Code coverage is greater than 80% User Observation: $ python3 -m pytest test_extract_data.py -v --cov=extract_data ================================================ test session starts ================================================ platform darwin -- Python 3.9.6, pytest-8.3.5, pluggy-1.5.0 -- /Library/Developer/CommandLineTools/usr/bin/python3 cachedir: .pytest_cache rootdir: /Users/surya.sandeep.boda/Desktop/Marscode Zero to One 3 plugins: cov-6.0.0 collected 7 items test_extract_data.py::TestGoogleSheetExtraction::test_clear_target_sheet_failure PASSED [ 14%] test_extract_data.py::TestGoogleSheetExtraction::test_clear_target_sheet_success FAILED [ 28%] test_extract_data.py::TestGoogleSheetExtraction::test_get_google_sheet_data_api_error PASSED [ 42%] test_extract_data.py::TestGoogleSheetExtraction::test_get_google_sheet_data_no_data PASSED [ 57%] test_extract_data.py::TestGoogleSheetExtraction::test_get_google_sheet_data_success PASSED [ 71%] test_extract_data.py::TestGoogleSheetExtraction::test_write_to_target_sheet_failure PASSED [ 85%] test_extract_data.py::TestGoogleSheetExtraction::test_write_to_target_sheet_success FAILED [100%] ===================================================== FAILURES ====================================================== _____________________________ TestGoogleSheetExtraction.test_clear_target_sheet_success _____________________________ self = <test_extract_data.TestGoogleSheetExtraction testMethod=test_clear_target_sheet_success> mock_build = <MagicMock name='build' id='4682958544'> mock_credentials = <MagicMock name='Credentials' id='4683027984'> @patch('extract_data.Credentials') @patch('extract_data.build') def test_clear_target_sheet_success(self, mock_build, mock_credentials): # Setup mock mock_service = MagicMock() mock_build.return_value = mock_service mock_service.spreadsheets().values().clear().execute.return_value = {} # Execute result = clear_target_sheet() # Assert self.assertIsNotNone(result) > mock_service.spreadsheets().values().clear.assert_called_once() test_extract_data.py:21: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <MagicMock name='build().spreadsheets().values().clear' id='4683133088'> def assert_called_once(self): """assert that the mock was called only once. """ if not self.call_count == 1: msg = ("Expected '%s' to have been called once. Called %s times.%s" % (self._mock_name or 'mock', self.call_count, self._calls_repr())) > raise AssertionError(msg) E AssertionError: Expected 'clear' to have been called once. Called 2 times. E Calls: [call(), E call(spreadsheetId='1FEqiDqqPfb9YHAWBiqVepmmXj22zNqXNNI7NLGCDVak', range='Sheet1!A:Z'), E call().execute()]. /Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/unittest/mock.py:886: AssertionError ___________________________ TestGoogleSheetExtraction.test_write_to_target_sheet_success ____________________________ self = <test_extract_data.TestGoogleSheetExtraction testMethod=test_write_to_target_sheet_success> def test_write_to_target_sheet_success(self): # Setup test data df = pd.DataFrame({ 'Email Address': ['[email protected]'], 'Tool being used': ['Tool1'], 'Feature used': ['Feature1'], 'Context Awareness': [4.0], 'Autonomy': [4.0], 'Experience': [4.0], 'Output Quality': [4.0], 'Overall Rating': [4.0], 'Mean Rating': [4.0], 'Difference': [0.0], 'Result': ['Ok'], 'Unique ID': ['ID1'] }) mock_service = MagicMock() mock_service.spreadsheets().values().update().execute.return_value = {} mock_service.spreadsheets().batchUpdate().execute.return_value = {} # Execute result = write_to_target_sheet(df, mock_service) # Assert self.assertTrue(result) > mock_service.spreadsheets().values().update.assert_called_once() test_extract_data.py:63: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <MagicMock name='mock.spreadsheets().values().update' id='4684074672'> def assert_called_once(self): """assert that the mock was called only once. """ if not self.call_count == 1: msg = ("Expected '%s' to have been called once. Called %s times.%s" % (self._mock_name or 'mock', self.call_count, self._calls_repr())) > raise AssertionError(msg) E AssertionError: Expected 'update' to have been called once. Called 2 times. E Calls: [call(), E call(spreadsheetId='1FEqiDqqPfb9YHAWBiqVepmmXj22zNqXNNI7NLGCDVak', range='Sheet1!A1', valueInputOption='USER_ENTERED', body={'values': [['Email Address', 'Tool being used', 'Feature used', 'Context Awareness', 'Autonomy', 'Experience', 'Output Quality', 'Overall Rating', 'Mean Rating', 'Difference', 'Result', 'Unique ID'], ['[email protected]', 'Tool1', 'Feature1', '4.00', '4.00', '4.00', '4.00', '4.00', '4.00', '0.00', 'Ok', 'ID1']], 'majorDimension': 'ROWS'}), E call().execute()]. /Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/unittest/mock.py:886: AssertionError ================================================= warnings summary ================================================== test_extract_data.py:3 /Users/surya.sandeep.boda/Desktop/Marscode Zero to One 3/test_extract_data.py:3: DeprecationWarning: Pyarrow will become a required dependency of pandas in the next major release of pandas (pandas 3.0), (to allow more performant data types, such as the Arrow string type, and better interoperability with other libraries) but was not found to be installed on your system. If this would cause problems for you, please provide us feedback at pandas-dev/pandas#54466 import pandas as pd -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html ---------- coverage: platform darwin, python 3.9.6-final-0 ----------- Name Stmts Miss Cover ------------------------------------- extract_data.py 119 17 86% ------------------------------------- TOTAL 119 17 86% ============================================== short test summary info ============================================== FAILED test_extract_data.py::TestGoogleSheetExtraction::test_clear_target_sheet_success - AssertionError: Expected 'clear' to have been called once. Called 2 times. FAILED test_extract_data.py::TestGoogleSheetExtraction::test_write_to_target_sheet_success - AssertionError: Expected 'update' to have been called once. Called 2 times. ====================================== 2 failed, 5 passed, 1 warning in 0.57s ======================================= Response ID: 10445925-81b4-478c-b485-ddd5dc8dd0cf
1 parent 76a0623 commit 51d9eb0

File tree

2 files changed

+99
-98
lines changed

2 files changed

+99
-98
lines changed

.coverage

0 Bytes
Binary file not shown.

test_extract_data.py

+99-98
Original file line numberDiff line numberDiff line change
@@ -2,135 +2,136 @@
22
from unittest.mock import patch, MagicMock
33
import pandas as pd
44
import numpy as np
5-
from extract_data import get_google_sheet_data
5+
from extract_data import clear_target_sheet, write_to_target_sheet, get_google_sheet_data
66

77
class TestGoogleSheetExtraction(unittest.TestCase):
8-
"""Test cases for Google Sheet data extraction functionality"""
9-
10-
def setUp(self):
11-
"""Set up test data"""
12-
self.mock_data = [
13-
['Email Address', 'Tool being used', 'Feature used', 'Context Awareness',
14-
'Autonomy', 'Experience', 'Output Quality', 'Overall Rating', 'Unique ID'],
15-
['[email protected]', 'Tool1', 'Feature1', '4', '3', '5', '4', '4', 'ID1'],
16-
['[email protected]', 'Tool2', 'Feature2', '5', '5', '5', '5', '4', 'ID2'],
17-
]
18-
198
@patch('extract_data.Credentials')
209
@patch('extract_data.build')
21-
def test_successful_data_extraction(self, mock_build, mock_credentials):
22-
"""Test successful data extraction and processing"""
23-
# Setup mock service
10+
def test_clear_target_sheet_success(self, mock_build, mock_credentials):
11+
# Setup mock
2412
mock_service = MagicMock()
2513
mock_build.return_value = mock_service
26-
mock_service.spreadsheets().values().get().execute.return_value = {
27-
'values': self.mock_data
28-
}
29-
30-
# Execute function
31-
result = get_google_sheet_data()
32-
33-
# Assertions
14+
mock_service.spreadsheets().values().clear().execute.return_value = {}
15+
16+
# Execute
17+
result = clear_target_sheet()
18+
19+
# Assert
3420
self.assertIsNotNone(result)
35-
self.assertIsInstance(result, pd.DataFrame)
36-
self.assertEqual(len(result), 2) # Two data rows
37-
self.assertTrue('Mean Rating' in result.columns)
38-
self.assertTrue('Difference' in result.columns)
39-
self.assertTrue('Result' in result.columns)
21+
mock_service.spreadsheets().values().clear.assert_called_once()
4022

4123
@patch('extract_data.Credentials')
4224
@patch('extract_data.build')
43-
def test_calculation_accuracy(self, mock_build, mock_credentials):
44-
"""Test accuracy of calculations"""
25+
def test_clear_target_sheet_failure(self, mock_build, mock_credentials):
26+
# Setup mock
4527
mock_service = MagicMock()
4628
mock_build.return_value = mock_service
47-
mock_service.spreadsheets().values().get().execute.return_value = {
48-
'values': self.mock_data
49-
}
50-
51-
result = get_google_sheet_data()
52-
53-
# Test Mean Rating calculation
54-
expected_mean = (4 + 3 + 5 + 4) / 4 # First row ratings
55-
self.assertAlmostEqual(result['Mean Rating'].iloc[0], expected_mean)
56-
57-
# Test Difference calculation
58-
expected_diff = expected_mean - 4 # Mean - Overall Rating
59-
self.assertAlmostEqual(result['Difference'].iloc[0], expected_diff)
29+
mock_service.spreadsheets().values().clear().execute.side_effect = Exception("API Error")
30+
31+
# Execute
32+
result = clear_target_sheet()
33+
34+
# Assert
35+
self.assertIsNone(result)
6036

61-
# Test Result determination
62-
self.assertEqual(result['Result'].iloc[0], 'Ok')
37+
def test_write_to_target_sheet_success(self):
38+
# Setup test data
39+
df = pd.DataFrame({
40+
'Email Address': ['[email protected]'],
41+
'Tool being used': ['Tool1'],
42+
'Feature used': ['Feature1'],
43+
'Context Awareness': [4.0],
44+
'Autonomy': [4.0],
45+
'Experience': [4.0],
46+
'Output Quality': [4.0],
47+
'Overall Rating': [4.0],
48+
'Mean Rating': [4.0],
49+
'Difference': [0.0],
50+
'Result': ['Ok'],
51+
'Unique ID': ['ID1']
52+
})
53+
54+
mock_service = MagicMock()
55+
mock_service.spreadsheets().values().update().execute.return_value = {}
56+
mock_service.spreadsheets().batchUpdate().execute.return_value = {}
57+
58+
# Execute
59+
result = write_to_target_sheet(df, mock_service)
60+
61+
# Assert
62+
self.assertTrue(result)
63+
mock_service.spreadsheets().values().update.assert_called_once()
64+
mock_service.spreadsheets().batchUpdate.assert_called()
6365

64-
@patch('extract_data.Credentials')
6566
@patch('extract_data.build')
66-
def test_empty_sheet(self, mock_build, mock_credentials):
67-
"""Test handling of empty sheet"""
67+
@patch('extract_data.Credentials')
68+
def test_get_google_sheet_data_success(self, mock_credentials, mock_build):
69+
# Setup mock data
70+
mock_values = [
71+
['Email Address', 'Tool being used', 'Feature used', 'Context Awareness',
72+
'Autonomy', 'Experience', 'Output Quality', 'Overall Rating', 'Unique ID'],
73+
['[email protected]', 'Tool1', 'Feature1', '4', '4', '4', '4', '4', 'ID1']
74+
]
75+
76+
# Setup mock service
6877
mock_service = MagicMock()
6978
mock_build.return_value = mock_service
70-
mock_service.spreadsheets().values().get().execute.return_value = {
71-
'values': []
72-
}
73-
79+
mock_service.spreadsheets().values().get().execute.return_value = {'values': mock_values}
80+
mock_service.spreadsheets().values().clear().execute.return_value = {}
81+
mock_service.spreadsheets().values().update().execute.return_value = {}
82+
mock_service.spreadsheets().batchUpdate().execute.return_value = {}
83+
84+
# Execute
7485
result = get_google_sheet_data()
75-
self.assertIsNone(result)
86+
87+
# Assert
88+
self.assertIsNotNone(result)
89+
self.assertEqual(len(result), 1)
90+
self.assertEqual(result['Result'].iloc[0], 'Ok')
7691

77-
@patch('extract_data.Credentials')
7892
@patch('extract_data.build')
79-
def test_missing_columns(self, mock_build, mock_credentials):
80-
"""Test handling of missing columns"""
81-
mock_data = [
82-
['Email Address', 'Tool being used'], # Missing columns
83-
['[email protected]', 'Tool1']
84-
]
93+
@patch('extract_data.Credentials')
94+
def test_get_google_sheet_data_no_data(self, mock_credentials, mock_build):
95+
# Setup mock service
8596
mock_service = MagicMock()
8697
mock_build.return_value = mock_service
87-
mock_service.spreadsheets().values().get().execute.return_value = {
88-
'values': mock_data
89-
}
90-
98+
mock_service.spreadsheets().values().get().execute.return_value = {'values': []}
99+
100+
# Execute
91101
result = get_google_sheet_data()
102+
103+
# Assert
92104
self.assertIsNone(result)
93105

94-
@patch('extract_data.Credentials')
95106
@patch('extract_data.build')
96-
def test_invalid_ratings(self, mock_build, mock_credentials):
97-
"""Test handling of invalid rating values"""
98-
# Create mock data with invalid rating
99-
mock_data = [
100-
['Email Address', 'Tool being used', 'Feature used', 'Context Awareness',
101-
'Autonomy', 'Experience', 'Output Quality', 'Overall Rating', 'Unique ID'],
102-
['[email protected]', 'Tool1', 'Feature1', 'invalid', '3', '5', '4', '4', 'ID1'],
103-
['[email protected]', 'Tool2', 'Feature2', '5', '5', '5', '5', '4', 'ID2']
104-
]
105-
107+
@patch('extract_data.Credentials')
108+
def test_get_google_sheet_data_api_error(self, mock_credentials, mock_build):
109+
# Setup mock service to raise exception
106110
mock_service = MagicMock()
107111
mock_build.return_value = mock_service
108-
mock_service.spreadsheets().values().get().execute.return_value = {
109-
'values': mock_data
110-
}
111-
112+
mock_service.spreadsheets().values().get().execute.side_effect = Exception("API Error")
113+
114+
# Execute
112115
result = get_google_sheet_data()
113116

114-
# Verify the result exists
115-
self.assertIsNotNone(result)
117+
# Assert
118+
self.assertIsNone(result)
119+
120+
def test_write_to_target_sheet_failure(self):
121+
# Setup test data
122+
df = pd.DataFrame({
123+
'Email Address': ['[email protected]'],
124+
'Result': ['Ok']
125+
})
116126

117-
# Verify second row is calculated correctly (all valid numbers)
118-
expected_mean_row2 = (5 + 5 + 5 + 5) / 4
119-
self.assertAlmostEqual(result['Mean Rating'].iloc[1], expected_mean_row2)
127+
mock_service = MagicMock()
128+
mock_service.spreadsheets().values().update().execute.side_effect = Exception("API Error")
120129

121-
# For first row, verify mean is calculated correctly excluding invalid value
122-
expected_mean_row1 = (3 + 5 + 4) / 3 # Average of valid ratings only
123-
self.assertAlmostEqual(result['Mean Rating'].iloc[0], expected_mean_row1)
124-
125-
def test_result_status_calculation(self):
126-
"""Test result status determination"""
127-
test_differences = [-2, -0.5, 0, 0.5, 2]
128-
expected_results = ['Not ok', 'Ok', 'Ok', 'Ok', 'Not ok']
129-
130-
for diff, expected in zip(test_differences, expected_results):
131-
with self.subTest(difference=diff):
132-
result = 'Ok' if -1 <= diff <= 1 else 'Not ok'
133-
self.assertEqual(result, expected)
130+
# Execute
131+
result = write_to_target_sheet(df, mock_service)
132+
133+
# Assert
134+
self.assertFalse(result)
134135

135136
if __name__ == '__main__':
136-
unittest.main(verbosity=2)
137+
unittest.main()

0 commit comments

Comments
 (0)