2
2
from unittest .mock import patch , MagicMock
3
3
import pandas as pd
4
4
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
6
6
7
7
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
-
19
8
@patch ('extract_data.Credentials' )
20
9
@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
24
12
mock_service = MagicMock ()
25
13
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
34
20
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 ()
40
22
41
23
@patch ('extract_data.Credentials' )
42
24
@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
45
27
mock_service = MagicMock ()
46
28
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 )
60
36
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 ()
63
65
64
- @patch ('extract_data.Credentials' )
65
66
@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
68
77
mock_service = MagicMock ()
69
78
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
74
85
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' )
76
91
77
- @patch ('extract_data.Credentials' )
78
92
@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
-
84
- ]
93
+ @patch ('extract_data.Credentials' )
94
+ def test_get_google_sheet_data_no_data (self , mock_credentials , mock_build ):
95
+ # Setup mock service
85
96
mock_service = MagicMock ()
86
97
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
91
101
result = get_google_sheet_data ()
102
+
103
+ # Assert
92
104
self .assertIsNone (result )
93
105
94
- @patch ('extract_data.Credentials' )
95
106
@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
106
110
mock_service = MagicMock ()
107
111
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
112
115
result = get_google_sheet_data ()
113
116
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
+ })
116
126
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" )
120
129
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 )
134
135
135
136
if __name__ == '__main__' :
136
- unittest .main (verbosity = 2 )
137
+ unittest .main ()
0 commit comments