def setUp(self):
     super(FileUploadManagerTests, self).setUp()
     block = MockBlock(1)
     self.manager = FileUploadManager(block)
     self.team_id = 'team_0_id'
     team_block = MockBlock(2, team_id=self.team_id)
     self.team_manager = FileUploadManager(team_block)
    def test_shared_file_descriptors_have_download_urls(self):
        self.team_manager.append_uploads(
            upload_dict('name1', 'desc1', 100),
            upload_dict('name2', 'desc2', 200),
        )

        # create a new block with a different student_id but on the same team
        other_users_block = MockBlock(number=2, team_id=self.team_id)
        other_users_block.student_id = MockBlock.STUDENT_ID + '317'

        with mock.patch(
                'openassessment.fileupload.backends.django_storage.default_storage'
        ) as mock_default_storage:
            mock_default_storage.exists.return_value = True
            other_users_file_manager = FileUploadManager(other_users_block)

            actual_descriptors = other_users_file_manager.team_file_descriptor_tuples(
            )
            self.assertEqual(2, len(actual_descriptors))
            for descriptor in actual_descriptors:
                self.assertEqual(mock_default_storage.url.return_value,
                                 descriptor.download_url)

            actual_file_uploads = other_users_file_manager.get_team_uploads()
            self.assertEqual(2, len(actual_file_uploads))
            for index, upload in enumerate(actual_file_uploads):
                self.assertEqual(index, upload.index)
class FileUploadManagerTests(TestCase):
    def setUp(self):
        super(FileUploadManagerTests, self).setUp()
        block = MockBlock(1)
        self.manager = FileUploadManager(block)
        self.team_id = 'team_0_id'
        team_block = MockBlock(2, team_id=self.team_id)
        self.team_manager = FileUploadManager(team_block)

    def assert_file_upload(self, file_upload, expected_name, expected_desc,
                           expected_size):
        self.assertEqual(file_upload.name, expected_name)
        self.assertEqual(file_upload.description, expected_desc)
        self.assertEqual(file_upload.size, expected_size)

    @override_settings(ORA2_FILEUPLOAD_BACKEND='django')
    def test_get_append_delete(self):
        files = self.manager.get_uploads()
        self.assertEqual(files, [])

        self.manager.append_uploads(
            upload_dict('name1', 'desc1', 100),
            upload_dict('name2', 'desc2', 200),
            upload_dict('name3', 'desc3', 300),
        )
        files = self.manager.get_uploads()
        self.assertEqual(3, len(files))
        self.assert_file_upload(files[0], 'name1', 'desc1', 100)
        self.assert_file_upload(files[1], 'name2', 'desc2', 200)
        self.assert_file_upload(files[2], 'name3', 'desc3', 300)

        self.manager.append_uploads(upload_dict('name4', 'desc4', 400))
        files = self.manager.get_uploads()
        self.assertEqual(4, len(files))
        self.assert_file_upload(files[3], 'name4', 'desc4', 400)

        self.manager.delete_upload(2)
        files = self.manager.get_uploads()
        self.assertEqual(3, len(files))
        self.assert_file_upload(files[0], 'name1', 'desc1', 100)
        self.assert_file_upload(files[1], 'name2', 'desc2', 200)
        self.assert_file_upload(files[2], 'name4', 'desc4', 400)

        self.assertEqual([], self._get_shared_uploads(self.manager))

    def _get_shared_uploads(self, manager):
        return list(
            SharedFileUpload.objects.filter(
                team_id=self.team_id,
                course_id=manager.block.course_id,
            ).all())

    @override_settings(ORA2_FILEUPLOAD_BACKEND='django')
    def test_shared(self):
        files = self.team_manager.get_uploads()
        self.assertEqual(files, [])
        self.assertEqual(self._get_shared_uploads(self.team_manager), [])

        self.team_manager.append_uploads(
            upload_dict('name1', 'desc1', 100),
            upload_dict('name2', 'desc2', 200),
            upload_dict('name3', 'desc3', 300),
        )
        files = self.team_manager.get_uploads()
        self.assertEqual(3, len(files))
        self.assert_file_upload(files[0], 'name1', 'desc1', 100)
        self.assert_file_upload(files[1], 'name2', 'desc2', 200)
        self.assert_file_upload(files[2], 'name3', 'desc3', 300)
        shared_uploads = self._get_shared_uploads(self.team_manager)
        self.assertEqual(3, len(shared_uploads))
        self.assert_file_upload(shared_uploads[0], 'name1', 'desc1', 100)
        self.assert_file_upload(shared_uploads[1], 'name2', 'desc2', 200)
        self.assert_file_upload(shared_uploads[2], 'name3', 'desc3', 300)
        for shared_upload in shared_uploads:
            self.assertEquals(shared_upload.owner_id,
                              self.team_manager.block.student_id)

        self.team_manager.append_uploads(upload_dict('name4', 'desc4', 400))
        files = self.team_manager.get_uploads()
        self.assertEqual(4, len(files))
        self.assert_file_upload(files[3], 'name4', 'desc4', 400)
        shared_uploads = self._get_shared_uploads(self.team_manager)
        self.assert_file_upload(shared_uploads[3], 'name4', 'desc4', 400)
        self.assertEqual(4, len(shared_uploads))
        for shared_upload in shared_uploads:
            self.assertEquals(shared_upload.owner_id,
                              self.team_manager.block.student_id)

        self.team_manager.delete_upload(2)
        files = self.team_manager.get_uploads()
        self.assertEqual(3, len(files))
        self.assert_file_upload(files[0], 'name1', 'desc1', 100)
        self.assert_file_upload(files[1], 'name2', 'desc2', 200)
        self.assert_file_upload(files[2], 'name4', 'desc4', 400)
        shared_uploads = self._get_shared_uploads(self.team_manager)
        self.assertEqual(3, len(shared_uploads))

        shared_upload_names = sorted(
            [upload.name for upload in shared_uploads])
        self.assertEqual(['name1', 'name2', 'name4'], shared_upload_names)

    @override_settings(
        ORA2_FILEUPLOAD_BACKEND='django',
        MEDIA_ROOT='/tmp',
    )
    def test_shared_file_descriptors_have_download_urls(self):
        self.team_manager.append_uploads(
            upload_dict('name1', 'desc1', 100),
            upload_dict('name2', 'desc2', 200),
        )

        # create a new block with a different student_id but on the same team
        other_users_block = MockBlock(number=2, team_id=self.team_id)
        other_users_block.student_id = MockBlock.STUDENT_ID + '317'

        with mock.patch(
                'openassessment.fileupload.backends.django_storage.default_storage'
        ) as mock_default_storage:
            mock_default_storage.exists.return_value = True
            other_users_file_manager = FileUploadManager(other_users_block)

            actual_descriptors = other_users_file_manager.team_file_descriptor_tuples(
            )
            self.assertEqual(2, len(actual_descriptors))
            for descriptor in actual_descriptors:
                self.assertEqual(mock_default_storage.url.return_value,
                                 descriptor.download_url)

            actual_file_uploads = other_users_file_manager.get_team_uploads()
            self.assertEqual(2, len(actual_file_uploads))
            for index, upload in enumerate(actual_file_uploads):
                self.assertEqual(index, upload.index)

    def test_integrity_error(self):
        self.team_manager.append_uploads(upload_dict('name1', 'desc1', 100), )
        uploaded_file = self.team_manager.get_uploads()[0]

        with self.assertRaises(IntegrityError):
            self.team_manager.create_shared_upload(uploaded_file)