class AddLogosToOrganizationTest(TestCase):
    def setUp(self):
        super().setUp()
        self.partner = PartnerFactory(short_code="testx")
        self.organization = OrganizationFactory(partner=self.partner,
                                                name="testx")
        self.logo = mock.MagicMock(spec=File, name="logo")
        self.logo.name = "logo"
        self.certificate_logo = mock.MagicMock(spec=File,
                                               name="certificate_logo")
        self.certificate_logo.name = "certificate_logo"
        self.banner_image = mock.MagicMock(spec=File, name="banner_image")
        self.banner_image.name = "banner image"

    def test_partner_not_found(self):
        with pytest.raises(Exception):
            call_command(Command())

    def test_image_paths_not_found(self):
        with pytest.raises(Exception):
            call_command(
                Command(),
                partner="testx",
            )

    @pytest.mark.django_db
    def test_two_organizations_with_same_partner_returns_correct_org(self):
        new_org = OrganizationFactory(partner=self.partner, name="notx")
        assert len(Organization.objects.all()) > 1
        self.organization.logo_image = None
        new_org.logo_image = None
        with mock.patch(
                "course_discovery.apps.course_metadata.management.commands.add_logos_to_organization.Command._open_assets",
                return_value={
                    "logo": self.logo,
                    "certificate_logo": self.certificate_logo,
                    "banner_image": self.banner_image,
                },
        ):
            call_command(
                Command(),
                partner="testx",
                logo="/",
                certificate_logo="/",
                banner_image="/",
            )
            self.organization.refresh_from_db()
            assert "/media/organization/logos/" in self.organization.logo_image.path
Esempio n. 2
0
class TestMigrateCommentsToSalesforce(TestCase):
    LOGGER_PATH = 'course_discovery.apps.course_metadata.management.commands.migrate_comments_to_salesforce.logger'

    def setUp(self):
        super(TestMigrateCommentsToSalesforce, self).setUp()
        self.partner = PartnerFactory()
        self.user_1 = UserFactory()
        self.org_1 = OrganizationFactory(partner=self.partner)
        self.course_1 = CourseFactory(
            partner=self.partner,
            authoring_organizations=[self.org_1],
            key=self.org_1.key + '+101x',
            title='Old Title',
        )
        self.course_run_1 = CourseRunFactory(
            key='course-v1:{key}+1T2019'.format(
                key=self.course_1.key,
            ),
            course=self.course_1,
        )

        self.publisher_course_1 = PublisherCourseFactory(number='101x', title='New Title')
        self.publisher_course_1.organizations.add(self.org_1)  # pylint: disable=no-member
        self.publisher_course_run_1 = PublisherCourseRunFactory(
            course=self.publisher_course_1,
            lms_course_id='course-v1:{org}+{number}+1T2019'.format(
                org=self.org_1.key, number=self.publisher_course_1.number
            ),
        )

    def tearDown(self):
        super(TestMigrateCommentsToSalesforce, self).tearDown()
        # Zero out the instances that are created during testing
        SalesforceUtil.instances = {}

    @mock.patch(LOGGER_PATH)
    def test_handle_no_orgs(self, mock_logger):
        config = MigrateCommentsToSalesforceFactory()
        config.orgs.all().delete()

        with self.assertRaises(CommandError):
            Command().handle()
        mock_logger.error.assert_called_with(
            'No organizations were defined. Please add organizations to the MigrateCommentsToSalesforce model.'
        )

    @mock.patch(LOGGER_PATH)
    def test_handle_no_partner(self, mock_logger):
        config = MigrateCommentsToSalesforceFactory()
        config.orgs.add(self.org_1)
        with self.assertRaises(CommandError):
            Command().handle()
        mock_logger.error.assert_called_with(
            'No partner was defined. Please add a partner to the MigrateCommentsToSalesforce model.'
        )

    @mock.patch(LOGGER_PATH)
    def test_handle_no_salesforce_configuration(self, mock_logger):
        config = MigrateCommentsToSalesforceFactory(partner=self.partner)
        config.orgs.add(self.org_1)
        with self.assertRaises(CommandError):
            Command().handle()
        mock_logger.error.assert_called_with(
            'Salesforce configuration for {} does not exist'.format(self.partner.name)
        )

    @mock.patch('course_discovery.apps.course_metadata.salesforce.Salesforce')
    def test_handle_without_publisher_course_run(self, mock_salesforce):
        config = MigrateCommentsToSalesforceFactory(partner=self.partner)
        config.orgs.add(self.org_1)
        SalesforceConfigurationFactory(partner=self.partner)

        self.publisher_course_run_1.delete()

        # Set return values for all of the Salesforce methods that get called
        mock_salesforce().Publisher_Organization__c.create.return_value = {'id': 'SomePubOrgId'}
        mock_salesforce().Course__c.create.return_value = {'id': 'SomeCourseId'}
        mock_salesforce().Case.create.return_value = {'id': 'SomeCaseId'}
        mock_salesforce().Course_Run__c.create.return_value = {'id': 'SomeCourseRunId'}

        with mock.patch(self.LOGGER_PATH) as mock_logger:
            Command().handle()
            calls = [
                mock.call('No PublisherCourseRun found for {}.'.format(self.course_run_1.key)),
                mock.call('No PublisherCourses found for {}'.format(self.course_1.key))
            ]
            mock_logger.warning.assert_has_calls(calls, any_order=True)

    @mock.patch('course_discovery.apps.course_metadata.salesforce.Salesforce')
    def test_handle_with_comments(self, mock_salesforce):
        config = MigrateCommentsToSalesforceFactory(partner=self.partner)
        config.orgs.add(self.org_1)
        SalesforceConfigurationFactory(partner=self.partner)
        course_comment = CommentFactory(
            user=self.user_1,
            content_type_id=ContentType.objects.get_for_model(PublisherCourse),
            object_pk=self.publisher_course_1.id,
        )
        course_comment.content_type_id = ContentType.objects.get_for_model(PublisherCourse)
        course_comment.object_pk = self.publisher_course_1.id
        course_comment.save()

        course_run_comment = CommentFactory(
            user=self.user_1,
            content_type_id=ContentType.objects.get_for_model(PublisherCourseRun),
            object_pk=self.publisher_course_run_1.id,
        )
        course_run_comment.content_type_id = ContentType.objects.get_for_model(PublisherCourseRun)
        course_run_comment.object_pk = self.publisher_course_run_1.id
        course_run_comment.save()

        # Set return values for all of the Salesforce methods that get called
        mock_salesforce().Publisher_Organization__c.create.return_value = {'id': 'SomePubOrgId'}
        mock_salesforce().Course__c.create.return_value = {'id': 'SomeCourseId'}
        mock_salesforce().Case.create.return_value = {'id': 'SomeCaseId'}
        mock_salesforce().Course_Run__c.create.return_value = {'id': 'SomeCourseRunId'}

        with mock.patch(self.LOGGER_PATH) as mock_logger:
            Command().handle()
            self.org_1.refresh_from_db()
            self.course_1.refresh_from_db()
            self.course_run_1.refresh_from_db()

            self.assertEqual(self.org_1.salesforce_id, 'SomePubOrgId')
            self.assertEqual(self.course_1.salesforce_id, 'SomeCourseId')
            self.assertEqual(self.course_1.salesforce_case_id, 'SomeCaseId')
            self.assertEqual(self.course_run_1.salesforce_id, 'SomeCourseRunId')

            mock_logger.info.assert_called_with('Inserted 2 comments for {}'.format(self.course_1.title))