From d59b584d8806b3206c2fcb46d8469f4325626b55 Mon Sep 17 00:00:00 2001
From: Darragh Bailey <dbailey@hpe.com>
Date: Mon, 19 Jun 2017 18:50:27 +0100
Subject: [PATCH] Return a separate copy for each call to decorator

Similar to decorating a class, should create a separate mock copy
otherwise it acts as a caching decorator and any mock responses added
on each call will be present for subsequent calls.

Change-Id: Iabd70aa457ceb4dbc147d7cbaeec913148cb3b56
---
 requests_mock/mocker.py            |  9 +++++----
 requests_mock/tests/test_mocker.py | 15 +++++++++++++++
 2 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/requests_mock/mocker.py b/requests_mock/mocker.py
index 80a367f..bf207aa 100644
--- a/requests_mock/mocker.py
+++ b/requests_mock/mocker.py
@@ -61,8 +61,8 @@ class MockerCore(object):
     """
 
     def __init__(self, **kwargs):
-        case_sensitive = kwargs.pop('case_sensitive', self.case_sensitive)
-        self._adapter = adapter.Adapter(case_sensitive=case_sensitive)
+        self.case_sensitive = kwargs.pop('case_sensitive', self.case_sensitive)
+        self._adapter = adapter.Adapter(case_sensitive=self.case_sensitive)
 
         self._real_http = kwargs.pop('real_http', False)
         self._last_send = None
@@ -198,7 +198,8 @@ class Mocker(MockerCore):
         """
         m = Mocker(
             kw=self._kw,
-            real_http=self._real_http
+            real_http=self._real_http,
+            case_sensitive=self.case_sensitive
         )
         return m
 
@@ -209,7 +210,7 @@ class Mocker(MockerCore):
         """
         @functools.wraps(func)
         def inner(*args, **kwargs):
-            with self as m:
+            with self.copy() as m:
                 if self._kw:
                     kwargs[self._kw] = m
                 else:
diff --git a/requests_mock/tests/test_mocker.py b/requests_mock/tests/test_mocker.py
index 94a37f4..16694bd 100644
--- a/requests_mock/tests/test_mocker.py
+++ b/requests_mock/tests/test_mocker.py
@@ -92,6 +92,21 @@ class MockerTests(base.TestCase):
         inner()
         self.assertMockStopped()
 
+    def test_with_decorator_called_multiple_times(self):
+
+        @requests_mock.Mocker()
+        def inner(arg1, m):
+            self._do_test(m)
+            self.assertEquals(
+                len(m.request_history), 1,
+                "Failed to provide clean mock on subsequent calls"
+            )
+
+        inner('a')
+        # if we call the same decorated method again should get
+        # a new request mock
+        inner('b')
+
     def test_with_class_decorator(self):
         outer = self