class RecordTransportFullTestCase(unittest.TestCase):

    def setUp(self):
        self.name = os.tmpnam()
        self.t = RecordTransport([{}], recfile=self.name,
                                 connection_class=DummyConnection)
        self.args = ('GET', '/myindex', None, None)

    def test_record_works_normally_if_no_file(self):
        self.t.recfile = None
        self.t.perform_request(*self.args)
        calls = self.t.get_connection().calls
        assert len(calls) == 1
        assert calls[0][0] == self.args

    def test_record_works_normally_if_exception_raised_in_logging(self):
        self.t.format_request = mock.Mock()
        self.t.format_request.side_effect = Exception('BOOM!')
        self.t.perform_request(*self.args)
        calls = self.t.get_connection().calls
        assert len(calls) == 1
        assert calls[0][0] == self.args

    def test_request_is_logged(self):
        self.t.perform_request(*self.args)
        calls = self.t.get_connection().calls
        assert len(calls) == 1
        assert calls[0][0] == self.args
        with open(self.name, 'r') as rfile:
            contents = rfile.read()
        assert len(contents), 'Empty replay log contents'
        for item in self.args:
            if item:
                assert item in contents, '%s not found in replay log' % item
 def setUp(self):
     with mock.patch('__builtin__.open') as mopen:
         mopen.return_value = os.tmpfile()
         self.t = RecordTransport([{}], recfile='dummy',
                                  connection_class=DummyConnection)
class RecordTransportTestCase(unittest.TestCase):

    def setUp(self):
        with mock.patch('__builtin__.open') as mopen:
            mopen.return_value = os.tmpfile()
            self.t = RecordTransport([{}], recfile='dummy',
                                     connection_class=DummyConnection)

    def test_patched(self):
        assert self.t.recfile.name == '<tmpfile>'

    def test_format_request(self):
        rv = self.t.format_request('GET', '/my/url', {'x': 1},
                                   '{"key": "value"}')
        lines = rv.split('\n')
        for line in lines:
            assert line.startswith(IN) or not line
        assert len(lines) == 3
        assert '#> GET /my/url x=1' == lines[0]
        assert '#> {"key": "value"}' == lines[1]
        assert '' == lines[2]  # ensure all ends with a newline

    def test_format_request_with_empty_params_and_body(self):
        rv = self.t.format_request('GET', '/my/url', None, None)
        lines = rv.split('\n')
        for line in lines:
            assert line.startswith(IN) or not line
        assert len(lines) == 3
        assert '#> GET /my/url -' == lines[0]
        assert '#> -' == lines[1]
        assert '' == lines[2]  # ensure all ends with a newline

    def test_format_response(self):
        rv = self.t.format_response(200, '{"key": "value"}')
        lines = rv.split('\n')
        for line in lines:
            assert line.startswith(OUT) or not line
        assert len(lines) == 3
        assert '#< 200' == lines[0]
        assert '#< {"key": "value"}' == lines[1]
        assert '' == lines[2]  # ensure all ends with a newline

    def test_recfile_as_path(self):
        with mock.patch('__builtin__.open') as mopen:
            self.t.prepare_output_file('/path')
            mopen.assert_called_once_with('/path', 'w')

    def test_recfile_as_file_obj(self):
        file_obj = os.tmpfile()
        with mock.patch('__builtin__.open') as mopen:
            rv = self.t.prepare_output_file(file_obj)
            assert not mopen.called
            assert rv == file_obj

    def test_perform_request_all_markers_in(self):
        self.t.format_request = mock.create_autospec(self.t.format_request)
        self.t.format_request.return_value = '#> GET /url -\n#> -\n'
        self.t.format_response = mock.create_autospec(self.t.format_response)
        self.t.format_response.return_value = '#< 200\n#< {"key": "value"}'
        self.t.perform_request('GET', '/url')
        self.t.recfile.seek(0)
        contents = self.t.recfile.read()
        assert IN in contents
        assert OUT in contents
        assert END in contents
 def setUp(self):
     self.name = os.tmpnam()
     self.t = RecordTransport([{}], recfile=self.name,
                              connection_class=DummyConnection)
     self.args = ('GET', '/myindex', None, None)