1616
1717
1818class DummyProcessor(csv_processor.CSVProcessor):
19+ """
20+ Fixture class the inherits from CSVProcessor.
21+ """
1922 max_file_size = 20
2023 columns = ['foo', 'bar']
2124 required_columns = ['foo', 'bar']
@@ -48,16 +51,44 @@ class DummyChecksumProcessor(csv_processor.ChecksumMixin, DummyProcessor):
4851
4952class DummyDeferrableProcessor(csv_processor.DeferrableMixin, DummyProcessor):
5053 size_to_defer = 1
54+ test_set = set()
55+
56+ def get_unique_path(self):
57+ return 'test'
58+
59+
60+ USERNAME_FROM_SUBCLASS = 'user_specified_by_client'
61+
62+
63+ class DummyDeferrableProcessorSavingUser(csv_processor.DeferrableMixin, DummyProcessor):
64+ """
65+ Fixture that inherits from DeferrableMixin and overrides a save() method,
66+ which calls the parent save() method with a non-null ``operating_user`` kwarg.
67+ """
68+ size_to_defer = 1
69+
70+ def save(self, operation_name=None, operating_user=None):
71+ user = get_user_model().objects.get(username=USERNAME_FROM_SUBCLASS)
72+ return super(DummyDeferrableProcessorSavingUser, self).save(
73+ operation_name=operation_name,
74+ operating_user=user,
75+ )
5176
5277 def get_unique_path(self):
5378 return 'test'
5479
5580
5681@ddt.ddt
5782class CSVTestCase(TestCase):
58- def setUp(self):
59- super(CSVTestCase, self).setUp()
60- self.dummy_csv = 'foo,bar\r\n1,1\r\n2,2\r\n'
83+ """
84+ Test class for CSVProcessor and DeferrableMixin classes.
85+ """
86+ @classmethod
87+ def setUpTestData(cls):
88+ super(CSVTestCase, cls).setUpTestData()
89+ cls.dummy_csv = 'foo,bar\r\n1,1\r\n2,2\r\n'
90+ cls.user = get_user_model().objects.create_user(username='testuser', password='12345')
91+ cls.user_from_subclass = get_user_model().objects.create(username=USERNAME_FROM_SUBCLASS, password='12345')
6192
6293 def tearDown(self):
6394 super(CSVTestCase, self).tearDown()
@@ -66,7 +97,7 @@ def tearDown(self):
6697 def test_write(self):
6798 buf = io.StringIO()
6899 processor = DummyProcessor(dummy_arg=True)
69- assert processor.dummy_arg is True
100+ assert processor.dummy_arg is True # pylint: disable=no-member
70101 processor.write_file(buf)
71102 data = buf.getvalue()
72103 assert data == self.dummy_csv
@@ -158,14 +189,20 @@ def test_defer_too_small(self):
158189 assert operation is not None
159190
160191 @mock.patch('super_csv.mixins.get_current_user')
161- def test_user(self, patch_get_user):
162- user = get_user_model().objects.create_user(username='testuser', password='12345')
163- buf = ContentFile(self.dummy_csv)
192+ def test_operating_user_is_recorded_from_request(self, patch_get_user):
164193 processor = DummyDeferrableProcessor()
165- patch_get_user.side_effect = (user, None, None)
166- processor.user_id = user.id
167- processor.process_file(buf)
194+ patch_get_user.return_value = self.user
195+ processor.process_file(ContentFile(self.dummy_csv))
196+ csv_operations = models.CSVOperation.objects.all()
197+ assert len(csv_operations) == 3
198+ for csv_operation in csv_operations:
199+ assert csv_operation.user == self.user
200+
201+ @mock.patch('super_csv.mixins.get_current_user', return_value=None)
202+ def test_operating_user_is_recorded_by_subclass(self, patch_get_user): # pylint: disable=unused-argument
203+ processor = DummyDeferrableProcessorSavingUser()
204+ processor.process_file(ContentFile(self.dummy_csv))
168205 csv_operations = models.CSVOperation.objects.all()
169206 assert len(csv_operations) == 3
170207 for csv_operation in csv_operations:
171- assert csv_operation.user == user
208+ assert csv_operation.user == self.user_from_subclass
0 commit comments