@@ -172,5 +172,88 @@ def test_read_data(self):
172172 self .assertEqual (result , 'foo' )
173173
174174
175+ def test_readline_data (self ):
176+ # Check that readline will return all the lines from the fake file
177+ mock = mock_open (read_data = 'foo\n bar\n baz\n ' )
178+ with patch ('%s.open' % __name__ , mock , create = True ):
179+ h = open ('bar' )
180+ line1 = h .readline ()
181+ line2 = h .readline ()
182+ line3 = h .readline ()
183+ self .assertEqual (line1 , 'foo\n ' )
184+ self .assertEqual (line2 , 'bar\n ' )
185+ self .assertEqual (line3 , 'baz\n ' )
186+
187+ # Check that we properly emulate a file that doesn't end in a newline
188+ mock = mock_open (read_data = 'foo' )
189+ with patch ('%s.open' % __name__ , mock , create = True ):
190+ h = open ('bar' )
191+ result = h .readline ()
192+ self .assertEqual (result , 'foo' )
193+
194+
195+ def test_readlines_data (self ):
196+ # Test that emulating a file that ends in a newline character works
197+ mock = mock_open (read_data = 'foo\n bar\n baz\n ' )
198+ with patch ('%s.open' % __name__ , mock , create = True ):
199+ h = open ('bar' )
200+ result = h .readlines ()
201+ self .assertEqual (result , ['foo\n ' , 'bar\n ' , 'baz\n ' ])
202+
203+ # Test that files without a final newline will also be correctly
204+ # emulated
205+ mock = mock_open (read_data = 'foo\n bar\n baz' )
206+ with patch ('%s.open' % __name__ , mock , create = True ):
207+ h = open ('bar' )
208+ result = h .readlines ()
209+
210+ self .assertEqual (result , ['foo\n ' , 'bar\n ' , 'baz' ])
211+
212+
213+ def test_mock_open_read_with_argument (self ):
214+ # At one point calling read with an argument was broken
215+ # for mocks returned by mock_open
216+ some_data = 'foo\n bar\n baz'
217+ mock = mock_open (read_data = some_data )
218+ self .assertEqual (mock ().read (10 ), some_data )
219+
220+
221+ def test_interleaved_reads (self ):
222+ # Test that calling read, readline, and readlines pulls data
223+ # sequentially from the data we preload with
224+ mock = mock_open (read_data = 'foo\n bar\n baz\n ' )
225+ with patch ('%s.open' % __name__ , mock , create = True ):
226+ h = open ('bar' )
227+ line1 = h .readline ()
228+ rest = h .readlines ()
229+ self .assertEqual (line1 , 'foo\n ' )
230+ self .assertEqual (rest , ['bar\n ' , 'baz\n ' ])
231+
232+ mock = mock_open (read_data = 'foo\n bar\n baz\n ' )
233+ with patch ('%s.open' % __name__ , mock , create = True ):
234+ h = open ('bar' )
235+ line1 = h .readline ()
236+ rest = h .read ()
237+ self .assertEqual (line1 , 'foo\n ' )
238+ self .assertEqual (rest , 'bar\n baz\n ' )
239+
240+
241+ def test_overriding_return_values (self ):
242+ mock = mock_open (read_data = 'foo' )
243+ handle = mock ()
244+
245+ handle .read .return_value = 'bar'
246+ handle .readline .return_value = 'bar'
247+ handle .readlines .return_value = ['bar' ]
248+
249+ self .assertEqual (handle .read (), 'bar' )
250+ self .assertEqual (handle .readline (), 'bar' )
251+ self .assertEqual (handle .readlines (), ['bar' ])
252+
253+ # call repeatedly to check that a StopIteration is not propagated
254+ self .assertEqual (handle .readline (), 'bar' )
255+ self .assertEqual (handle .readline (), 'bar' )
256+
257+
175258if __name__ == '__main__' :
176259 unittest .main ()
0 commit comments