@@ -169,6 +169,25 @@ def test_fillna_no_op_returns_copy(self, data):
169169 assert result is not data
170170 tm .assert_extension_array_equal (result , data )
171171
172+ def test_fillna_readonly (self , data_missing ):
173+ data = data_missing .copy ()
174+ data ._readonly = True
175+
176+ # by default copy=True, then this works fine
177+ result = data .fillna (data_missing [1 ])
178+ assert result [0 ] == data_missing [1 ]
179+ tm .assert_extension_array_equal (data , data_missing )
180+
181+ # copy=False is generally not honored by Arrow-backed array, always
182+ # returns new data -> same result as above
183+ if data .dtype .storage == "pyarrow" :
184+ result = data .fillna (data_missing [1 ])
185+ assert result [0 ] == data_missing [1 ]
186+ else :
187+ with pytest .raises (ValueError , match = "Cannot modify read-only array" ):
188+ data .fillna (data_missing [1 ], copy = False )
189+ tm .assert_extension_array_equal (data , data_missing )
190+
172191 def _get_expected_exception (
173192 self , op_name : str , obj , other
174193 ) -> type [Exception ] | tuple [type [Exception ], ...] | None :
0 commit comments