2323from garf_core import report
2424
2525
26+ @pytest .fixture
27+ def empty_report ():
28+ return report .GarfReport ()
29+
30+
2631@pytest .fixture
2732def single_element_report ():
2833 return report .GarfReport (results = [[1 ]], column_names = ['campaign_id' ])
@@ -45,6 +50,9 @@ def multi_column_report():
4550
4651class TestGarfReport :
4752 class TestGarfReportIteration :
53+ def test_empty_report_returns_empty_list (self , empty_report ):
54+ assert list (empty_report ) == []
55+
4856 def test_single_element_report_returns_garf_row (
4957 self , single_element_report
5058 ):
@@ -118,6 +126,9 @@ def test_hasattr_return_false_for_missing_value(self, multi_column_report):
118126 ]
119127
120128 class TestGarfReportMisc :
129+ def test_empty_report_length (self , empty_report ):
130+ assert len (empty_report ) == 0
131+
121132 def test_get_report_length (self , multi_column_report ):
122133 assert len (multi_column_report ) == len (multi_column_report .results )
123134
@@ -126,7 +137,14 @@ def test_report_bool(self, single_element_report):
126137 single_element_report .results = []
127138 assert not single_element_report
128139
140+ def test_empty_report_bool_return_false (self , empty_report ):
141+ assert not empty_report
142+
129143 class TestGarfReportAddition :
144+ def test_add_two_empty_reports (self , empty_report ):
145+ added_report = empty_report + empty_report
146+ assert len (added_report ) == 0
147+
130148 def test_add_two_reports (self , multi_column_report ):
131149 added_report = multi_column_report + multi_column_report
132150 assert len (added_report ) == len (multi_column_report .results ) * 2
@@ -150,6 +168,15 @@ def test_add_reports_with_different_columns_raises_exception(
150168 multi_column_report + single_element_report
151169
152170 class TestGarfReportSlicing :
171+ def test_slicing_empty_garf_report_returns_empty_list (
172+ self ,
173+ empty_report ,
174+ ):
175+ with pytest .raises (
176+ report .GarfReportError , match = 'Cannot get element from an empty report'
177+ ):
178+ empty_report [0 :2 ]
179+
153180 def test_slicing_multi_column_garf_report_returns_garf_report (
154181 self ,
155182 multi_column_report ,
@@ -177,6 +204,16 @@ def test_indexing_multi_column_garf_report_by_multi_index_returns_garf_report(
177204 results = [[1 , 2 ], [2 , 3 ]], column_names = ['campaign_id' , 'ad_group_id' ]
178205 )
179206
207+ def test_indexing_empty_garf_report_by_one_column_returns_garf_report (
208+ self ,
209+ empty_report ,
210+ ):
211+ with pytest .raises (
212+ report .GarfReportError ,
213+ match = "Cannot get 'campaign_id' from an empty report" ,
214+ ):
215+ empty_report ['campaign_id' ]
216+
180217 def test_indexing_multi_column_garf_report_by_one_column_returns_garf_report (
181218 self ,
182219 multi_column_report ,
@@ -193,11 +230,14 @@ def test_indexing_multi_column_garf_report_by_several_columns_returns_garf_repor
193230 new_report = multi_column_report [['campaign_id' , 'ad_group_id' ]]
194231 assert new_report == multi_column_report
195232
196- def test_indexing_multi_column_garf_report_by_non_existing_column_raises_exception (
233+ def test_indexing_multi_column_garf_report_by_non_existing_column_raises_garf_report_error (
197234 self ,
198235 multi_column_report ,
199236 ):
200- with pytest .raises (report .GarfReportError ):
237+ with pytest .raises (
238+ report .GarfReportError ,
239+ match = "Columns 'ad_group' cannot be found in the report" ,
240+ ):
201241 multi_column_report [['campaign_id' , 'ad_group' ]]
202242
203243 def test_slicing_single_column_garf_report_returns_report (
@@ -551,18 +591,39 @@ def test_from_json_with_non_dict_elements_in_list_raises_type_error(self):
551591 ):
552592 report .GarfReport .from_json (json_str )
553593
594+ def test_convert_empty_report_to_pandas_returns_empty_dataframe (
595+ self , empty_report
596+ ):
597+ expected = pd .DataFrame ()
598+ assert empty_report .to_pandas ().equals (expected )
599+
554600 def test_convert_report_to_pandas (self , multi_column_report ):
555601 expected = pd .DataFrame (
556602 data = [[1 , 2 ], [2 , 3 ], [3 , 4 ]], columns = ['campaign_id' , 'ad_group_id' ]
557603 )
558604 assert multi_column_report .to_pandas ().equals (expected )
559605
606+ def test_convert_empty_report_to_polars_returns_empty_dataframe (
607+ self , empty_report
608+ ):
609+ expected = pl .DataFrame ()
610+ assert empty_report .to_polars ().equals (expected )
611+
560612 def test_convert_report_to_polars (self , multi_column_report ):
561613 expected = pl .DataFrame (
562614 data = [[1 , 2 ], [2 , 3 ], [3 , 4 ]], schema = ['campaign_id' , 'ad_group_id' ]
563615 )
564616 assert multi_column_report .to_polars ().equals (expected )
565617
618+ def test_get_value_empty_report_raises_garf_report_error (
619+ self ,
620+ empty_report ,
621+ ):
622+ with pytest .raises (
623+ report .GarfReportError , match = 'Cannot get value from an empty report'
624+ ):
625+ empty_report .get_value ()
626+
566627 def test_get_value_single_element_report_returns_correct_value (
567628 self ,
568629 single_element_report ,
@@ -593,6 +654,9 @@ def test_get_value_raises_exception_when_row_index_out_of_bound(
593654 single_element_report .get_value (row_index = 1 )
594655
595656 class TestGarfReportEquality :
657+ def test_empty_reports_are_equal (self ):
658+ assert report .GarfReport () == report .GarfReport ()
659+
596660 def test_report_with_different_columns_not_equal (
597661 self , single_element_report , multi_column_report
598662 ):
0 commit comments