def setUp(self):
     self.user = factories.UserFactory(username='******', id=1)
     self.course_id = 'course-v1:edX+DemoX+DemoCourse'
     self.course_key = 'edX+DemoX'
     self.enterprise_customer = factories.EnterpriseCustomerFactory()
     self.enterprise_customer_user = factories.EnterpriseCustomerUserFactory(
         user_id=self.user.id,
         enterprise_customer=self.enterprise_customer,
     )
     self.data_sharing_consent = factories.DataSharingConsentFactory(
         username=self.user.username,
         course_id=self.course_id,
         enterprise_customer=self.enterprise_customer,
         granted=True,
     )
     self.config = factories.SAPSuccessFactorsEnterpriseCustomerConfigurationFactory(
         enterprise_customer=self.enterprise_customer,
         sapsf_base_url='enterprise.successfactors.com',
         key='key',
         secret='secret',
         active=True,
     )
     self.idp = factories.EnterpriseCustomerIdentityProviderFactory(
         enterprise_customer=self.enterprise_customer
     )
     tpa_client_mock = mock.patch('enterprise.models.ThirdPartyAuthApiClient')
     self.tpa_client = tpa_client_mock.start().return_value
     # Default remote ID
     self.tpa_client.get_remote_id.return_value = 'fake-remote-id'
     self.addCleanup(tpa_client_mock.stop)
     self.exporter = self.config.get_learner_data_exporter('dummy-user')
     assert isinstance(self.exporter, LearnerExporter)
     super(TestLearnerExporter, self).setUp()
 def setUp(self):
     super(TestSapSuccessFactorsContentMetadataTransmitter, self).setUp()
     self.url_base = 'http://test.successfactors.com/'
     self.oauth_api_path = 'learning/oauth-api/rest/v1/token'
     self.completion_status_api_path = 'learning/odatav4/public/admin/ocn/v1/current-user/item/learning-event'
     self.course_api_path = 'learning/odatav4/public/admin/ocn/v1/OcnCourses'
     self.expires_in = 1800
     self.access_token = 'access_token'
     self.expected_token_response_body = {
         'expires_in': self.expires_in,
         'access_token': self.access_token
     }
     enterprise_customer = factories.EnterpriseCustomerFactory(
         name='Starfleet Academy')
     self.enterprise_config = factories.SAPSuccessFactorsEnterpriseCustomerConfigurationFactory(
         enterprise_customer=enterprise_customer,
         key='client_id',
         sapsf_base_url=self.url_base,
         sapsf_company_id='company_id',
         sapsf_user_id='user_id',
         secret='client_secret',
     )
     factories.SAPSuccessFactorsGlobalConfiguration.objects.create(
         completion_status_api_path=self.completion_status_api_path,
         course_api_path=self.course_api_path,
         oauth_api_path=self.oauth_api_path)
    def setUp(self):
        super(TestContentMetadataTransmitter, self).setUp()
        enterprise_customer = factories.EnterpriseCustomerFactory(name='Starfleet Academy')
        # We need some non-abstract configuration for these things to work,
        # so it's okay for it to be any arbitrary channel. We randomly choose SAPSF.
        self.enterprise_config = factories.SAPSuccessFactorsEnterpriseCustomerConfigurationFactory(
            enterprise_customer=enterprise_customer,
            key="client_id",
            sapsf_base_url="http://test.successfactors.com/",
            sapsf_company_id="company_id",
            sapsf_user_id="user_id",
            secret="client_secret",
        )
        self.global_config = factories.SAPSuccessFactorsGlobalConfigurationFactory()

        # Mocks
        create_content_metadata_mock = mock.patch(
            'integrated_channels.integrated_channel.client.IntegratedChannelApiClient.create_content_metadata'
        )
        self.create_content_metadata_mock = create_content_metadata_mock.start()
        self.addCleanup(create_content_metadata_mock.stop)

        update_content_metadata_mock = mock.patch(
            'integrated_channels.integrated_channel.client.IntegratedChannelApiClient.update_content_metadata'
        )
        self.update_content_metadata_mock = update_content_metadata_mock.start()
        self.addCleanup(update_content_metadata_mock.stop)

        delete_content_metadata_mock = mock.patch(
            'integrated_channels.integrated_channel.client.IntegratedChannelApiClient.delete_content_metadata'
        )
        self.delete_content_metadata_mock = delete_content_metadata_mock.start()
        self.addCleanup(delete_content_metadata_mock.stop)
Esempio n. 4
0
 def setUp(self):
     self.user = factories.UserFactory(username='******')
     self.enterprise_customer = factories.EnterpriseCustomerFactory(
         catalog=1,
         name='Veridian Dynamics',
     )
     self.degreed = factories.DegreedEnterpriseCustomerConfigurationFactory(
         enterprise_customer=self.enterprise_customer,
         key='key',
         secret='secret',
         degreed_company_id='Degreed Company',
         degreed_base_url='https://www.degreed.com/',
     )
     self.sapsf = factories.SAPSuccessFactorsEnterpriseCustomerConfigurationFactory(
         enterprise_customer=self.enterprise_customer,
         sapsf_base_url='http://enterprise.successfactors.com/',
         key='key',
         secret='secret',
         active=True,
     )
     self.sapsf_global_configuration = factories.SAPSuccessFactorsGlobalConfigurationFactory(
     )
     self.catalog_api_config_mock = self._make_patch(
         self._make_catalog_api_location("CatalogIntegration"))
     super(TestTransmitCourseMetadataManagementCommand, self).setUp()
Esempio n. 5
0
 def setUp(self):
     self.api_user = factories.UserFactory(username='******', id=1)
     self.user1 = factories.UserFactory(id=2, email='*****@*****.**')
     self.user2 = factories.UserFactory(id=3, email='*****@*****.**')
     self.course_id = COURSE_ID
     self.enterprise_customer = factories.EnterpriseCustomerFactory(
         name='Spaghetti Enterprise')
     self.identity_provider = FakerFactory.create().slug()  # pylint: disable=no-member
     factories.EnterpriseCustomerIdentityProviderFactory(
         provider_id=self.identity_provider,
         enterprise_customer=self.enterprise_customer,
     )
     self.enterprise_customer_user1 = factories.EnterpriseCustomerUserFactory(
         user_id=self.user1.id,
         enterprise_customer=self.enterprise_customer,
     )
     self.enterprise_customer_user2 = factories.EnterpriseCustomerUserFactory(
         user_id=self.user2.id,
         enterprise_customer=self.enterprise_customer,
     )
     self.enrollment = factories.EnterpriseCourseEnrollmentFactory(
         id=2,
         enterprise_customer_user=self.enterprise_customer_user1,
         course_id=self.course_id,
     )
     self.enrollment = factories.EnterpriseCourseEnrollmentFactory(
         id=3,
         enterprise_customer_user=self.enterprise_customer_user2,
         course_id=self.course_id,
     )
     self.consent1 = factories.DataSharingConsentFactory(
         username=self.user1.username,
         course_id=self.course_id,
         enterprise_customer=self.enterprise_customer,
     )
     self.consent2 = factories.DataSharingConsentFactory(
         username=self.user2.username,
         course_id=self.course_id,
         enterprise_customer=self.enterprise_customer,
     )
     self.degreed = factories.DegreedEnterpriseCustomerConfigurationFactory(
         enterprise_customer=self.enterprise_customer,
         key='key',
         secret='secret',
         degreed_company_id='Degreed Company',
         active=True,
         degreed_base_url='https://www.degreed.com/',
     )
     self.degreed_global_configuration = factories.DegreedGlobalConfigurationFactory(
         oauth_api_path='oauth/token', )
     self.sapsf = factories.SAPSuccessFactorsEnterpriseCustomerConfigurationFactory(
         enterprise_customer=self.enterprise_customer,
         sapsf_base_url='http://enterprise.successfactors.com/',
         key='key',
         secret='secret',
         active=True,
     )
     self.sapsf_global_configuration = factories.SAPSuccessFactorsGlobalConfigurationFactory(
     )
     super(TestTransmitLearnerData, self).setUp()
    def setUp(self):
        self.enterprise_customer = factories.EnterpriseCustomerFactory()
        self.config = factories.SAPSuccessFactorsEnterpriseCustomerConfigurationFactory(
            enterprise_customer=self.enterprise_customer)

        # Mocks
        jwt_builder = mock.patch('enterprise.api_client.lms.JwtBuilder',
                                 mock.Mock())
        self.jwt_builder = jwt_builder.start()
        self.addCleanup(jwt_builder.stop)
        super(TestSapSuccessFactorsContentMetadataExporter, self).setUp()
Esempio n. 7
0
    def setUp(self):
        self.enterprise_customer = factories.EnterpriseCustomerFactory()
        self.config = factories.SAPSuccessFactorsEnterpriseCustomerConfigurationFactory(
            enterprise_customer=self.enterprise_customer)

        # Mocks
        self.mock_ent_courses_api_with_pagination(
            enterprise_uuid=str(self.enterprise_customer.uuid),
            course_run_ids=['course-v1:edX+DemoX+Demo_Course_1'])
        jwt_builder = mock.patch('enterprise.api_client.lms.JwtBuilder',
                                 mock.Mock())
        self.jwt_builder = jwt_builder.start()
        self.addCleanup(jwt_builder.stop)
        super(TestSapSuccessFactorsContentMetadataExporter, self).setUp()
Esempio n. 8
0
    def setUp(self):
        super().setUp()
        self.set_jwt_cookie(self.client,
                            [(ENTERPRISE_ADMIN_ROLE, ENTERPRISE_ID)])
        self.client.force_authenticate(user=self.user)

        self.enterprise_customer = factories.EnterpriseCustomerFactory(
            uuid=ENTERPRISE_ID)
        self.enterprise_customer_user = factories.EnterpriseCustomerUserFactory(
            enterprise_customer=self.enterprise_customer,
            user_id=self.user.id,
        )

        self.sap_config = factories.SAPSuccessFactorsEnterpriseCustomerConfigurationFactory(
            enterprise_customer=self.enterprise_customer)
Esempio n. 9
0
    def setUp(self):
        super().setUp()
        self.global_config = factories.SAPSuccessFactorsGlobalConfigurationFactory(
        )
        self.enterprise_customer = factories.EnterpriseCustomerFactory()
        self.enterprise_customer_user = factories.EnterpriseCustomerUserFactory(
            enterprise_customer=self.enterprise_customer)
        self.enterprise_course_enrollment = factories.EnterpriseCourseEnrollmentFactory(
            id=5, enterprise_customer_user=self.enterprise_customer_user)
        self.enterprise_config = factories.SAPSuccessFactorsEnterpriseCustomerConfigurationFactory(
            enterprise_customer=self.enterprise_customer,
            key="client_id",
            sapsf_base_url="http://test.successfactors.com/",
            sapsf_company_id="company_id",
            sapsf_user_id="user_id",
            secret="client_secret")
        self.payloads = [
            SapSuccessFactorsLearnerDataTransmissionAudit(
                enterprise_course_enrollment_id=self.
                enterprise_course_enrollment.id,
                sapsf_user_id='sap_user',
                course_id='course-v1:edX+DemoX+DemoCourse',
                course_completed=True,
                completed_timestamp=1486855998,
                instructor_name='Professor Professorson',
                grade='Passing even more',
                error_message='',
            )
        ]
        self.exporter = lambda payloads=self.payloads: mock.MagicMock(
            export=mock.MagicMock(return_value=iter(payloads)))

        # Mocks
        get_oauth_access_token_mock = mock.patch(
            'integrated_channels.sap_success_factors.client.SAPSuccessFactorsAPIClient.get_oauth_access_token'
        )
        self.get_oauth_access_token_mock = get_oauth_access_token_mock.start()
        self.get_oauth_access_token_mock.return_value = "token", datetime.datetime.utcnow(
        )
        self.addCleanup(get_oauth_access_token_mock.stop)

        create_course_completion_mock = mock.patch(
            'integrated_channels.sap_success_factors.client.SAPSuccessFactorsAPIClient.create_course_completion'
        )
        self.create_course_completion_mock = create_course_completion_mock.start(
        )
        self.addCleanup(create_course_completion_mock.stop)
    def setUp(self):
        super().setUp()

        enterprise_customer = factories.EnterpriseCustomerFactory(name='Starfleet Academy')

        # We need some non-abstract configuration for these things to work,
        # so it's okay for it to be any arbitrary channel. We randomly choose SAPSF.
        self.enterprise_config = factories.SAPSuccessFactorsEnterpriseCustomerConfigurationFactory(
            enterprise_customer=enterprise_customer,
            key="client_id",
            sapsf_base_url="http://test.successfactors.com/",
            sapsf_company_id="company_id",
            sapsf_user_id="user_id",
            secret="client_secret",
        )

        self.learner_transmitter = LearnerTransmitter(self.enterprise_config)
Esempio n. 11
0
    def test_transmit_content_metadata_task_with_error(
        self,
        sapsf_update_content_metadata_mock,
        sapsf_get_oauth_access_token_mock,
        degreed_create_content_metadata_mock,
    ):  # pylint: disable=invalid-name
        """
        Verify the data transmission task for integrated channels with error.

        Test that the management command `transmit_content_metadata` transmits
        courses metadata related to other integrated channels even if an
        integrated channel fails to transmit due to some error.
        """
        sapsf_get_oauth_access_token_mock.return_value = "token", datetime.utcnow(
        )
        sapsf_update_content_metadata_mock.return_value = 200, '{}'
        degreed_create_content_metadata_mock.return_value = 200, '{}'

        # Mock first integrated channel with failure
        enterprise_uuid_for_failure = str(self.enterprise_customer.uuid)
        self.mock_ent_courses_api_with_error(
            enterprise_uuid=enterprise_uuid_for_failure)

        # Now create a new integrated channel with a new enterprise and mock
        # enterprise courses API to send failure response
        course_run_id_for_success = 'course-v1:edX+DemoX+Demo_Course_1'
        dummy_enterprise_customer = factories.EnterpriseCustomerFactory(
            catalog=1,
            name='Dummy Enterprise',
        )
        dummy_degreed = factories.DegreedEnterpriseCustomerConfigurationFactory(
            enterprise_customer=dummy_enterprise_customer,
            key='key',
            secret='secret',
            degreed_company_id='Degreed Company',
            degreed_base_url='https://www.degreed.com/',
            active=True,
        )
        dummy_sapsf = factories.SAPSuccessFactorsEnterpriseCustomerConfigurationFactory(
            enterprise_customer=dummy_enterprise_customer,
            sapsf_base_url='http://enterprise.successfactors.com/',
            key='key',
            secret='secret',
            active=True,
        )

        enterprise_uuid_for_success = str(dummy_enterprise_customer.uuid)
        self.mock_ent_courses_api_with_pagination(
            enterprise_uuid=enterprise_uuid_for_success,
            course_run_ids=[course_run_id_for_success])

        # Verify that first integrated channel logs failure but the second
        # integrated channel still successfully transmits courseware data.
        expected_messages = [
            # SAPSF
            'Transmitting content metadata to integrated channel using configuration: '
            '[<SAPSuccessFactorsEnterpriseCustomerConfiguration for Enterprise Veridian Dynamics>]',
            'Transmission of content metadata failed for user [C-3PO] and for integrated channel with '
            'code [SAP] and id [1].',
            'Content metadata transmission task for integrated channel configuration [{}] took [0.0] seconds'
            .format(self.sapsf),
            'Transmitting content metadata to integrated channel using configuration: '
            '[<SAPSuccessFactorsEnterpriseCustomerConfiguration for Enterprise Dummy Enterprise>]',
            'Retrieved content metadata for enterprise [{}]'.format(
                dummy_enterprise_customer.name),
            'Exporting content metadata item with plugin configuration '
            '[<SAPSuccessFactorsEnterpriseCustomerConfiguration for Enterprise Dummy Enterprise>]',
            'Preparing to transmit creation of [1] content metadata items with plugin configuration '
            '[<SAPSuccessFactorsEnterpriseCustomerConfiguration for Enterprise Dummy Enterprise>]',
            'Preparing to transmit update of [0] content metadata items with plugin configuration '
            '[<SAPSuccessFactorsEnterpriseCustomerConfiguration for Enterprise Dummy Enterprise>]',
            'Preparing to transmit deletion of [0] content metadata items with plugin configuration '
            '[<SAPSuccessFactorsEnterpriseCustomerConfiguration for Enterprise Dummy Enterprise>]',
            'Content metadata transmission task for integrated channel configuration [{}] took [0.0] seconds'
            .format(dummy_sapsf),

            # Degreed
            'Transmitting content metadata to integrated channel using configuration: '
            '[<DegreedEnterpriseCustomerConfiguration for Enterprise Veridian Dynamics>]',
            'Transmission of content metadata failed for user [C-3PO] and for integrated channel with '
            'code [DEGREED] and id [1].',
            'Content metadata transmission task for integrated channel configuration [{}] took [0.0] seconds'
            .format(self.degreed),
            'Transmitting content metadata to integrated channel using configuration: '
            '[<DegreedEnterpriseCustomerConfiguration for Enterprise Dummy Enterprise>]',
            'Retrieved content metadata for enterprise [{}]'.format(
                dummy_enterprise_customer.name),
            'Exporting content metadata item with plugin configuration '
            '[<DegreedEnterpriseCustomerConfiguration for Enterprise Dummy Enterprise>]',
            'Preparing to transmit creation of [1] content metadata items with plugin configuration '
            '[<DegreedEnterpriseCustomerConfiguration for Enterprise Dummy Enterprise>]',
            'Preparing to transmit update of [0] content metadata items with plugin configuration '
            '[<DegreedEnterpriseCustomerConfiguration for Enterprise Dummy Enterprise>]',
            'Preparing to transmit deletion of [0] content metadata items with plugin configuration '
            '[<DegreedEnterpriseCustomerConfiguration for Enterprise Dummy Enterprise>]',
            'Content metadata transmission task for integrated channel configuration [{}] took [0.0] seconds'
            .format(dummy_degreed)
        ]

        with LogCapture(level=logging.INFO) as log_capture:
            call_command('transmit_content_metadata', '--catalog_user',
                         'C-3PO')
            for index, message in enumerate(expected_messages):
                assert message in log_capture.records[index].getMessage()