示例#1
0
    def test_get_course_programs_with_valid_user_and_courses(self):
        """ Test that the method 'get_course_programs_for_dashboard' returns
        only matching courses from the xseries programs in the expected format.
        """
        # mock the request call
        with patch('slumber.Resource.get') as mock_get:
            mock_get.return_value = self.programs_api_response

            # first test with user having multiple courses in a single xseries
            programs = get_course_programs_for_dashboard(
                self.user,
                ['edX/DemoX_1/Run_1', 'edX/DemoX_2/Run_2', 'valid/edX/Course']
            )

            self.assertTrue(mock_get.called)
            self.assertEqual(self.expected_output, programs)
            self.assertEqual(sorted(programs.keys()), ['edX/DemoX_1/Run_1', 'edX/DemoX_2/Run_2'])

            # now test with user having multiple courses across two different
            # xseries
            mock_get.reset_mock()
            programs = get_course_programs_for_dashboard(
                self.user,
                ['edX/DemoX_1/Run_1', 'edX/DemoX_2/Run_2', 'edX/Program/Program_Run', 'valid/edX/Course']
            )
            self.expected_output['edX/Program/Program_Run'] = self.edx_prg_run
            self.assertTrue(mock_get.called)
            self.assertEqual(self.expected_output, programs)
            self.assertEqual(
                sorted(programs.keys()),
                ['edX/DemoX_1/Run_1', 'edX/DemoX_2/Run_2', 'edX/Program/Program_Run']
            )
示例#2
0
    def test_get_course_programs_with_valid_user_and_courses(self):
        """ Test that the method 'get_course_programs_for_dashboard' returns
        only matching courses from the xseries programs in the expected format.
        """
        # mock the request call
        with patch('slumber.Resource.get') as mock_get:
            mock_get.return_value = self.programs_api_response

            # first test with user having multiple courses in a single xseries
            programs = get_course_programs_for_dashboard(
                self.user,
                ['edX/DemoX_1/Run_1', 'edX/DemoX_2/Run_2', 'valid/edX/Course'])

            self.assertTrue(mock_get.called)
            self.assertEqual(self.expected_output, programs)
            self.assertEqual(sorted(programs.keys()),
                             ['edX/DemoX_1/Run_1', 'edX/DemoX_2/Run_2'])

            # now test with user having multiple courses across two different
            # xseries
            mock_get.reset_mock()
            programs = get_course_programs_for_dashboard(
                self.user, [
                    'edX/DemoX_1/Run_1', 'edX/DemoX_2/Run_2',
                    'edX/Program/Program_Run', 'valid/edX/Course'
                ])
            self.expected_output['edX/Program/Program_Run'] = self.edx_prg_run
            self.assertTrue(mock_get.called)
            self.assertEqual(self.expected_output, programs)
            self.assertEqual(sorted(programs.keys()), [
                'edX/DemoX_1/Run_1', 'edX/DemoX_2/Run_2',
                'edX/Program/Program_Run'
            ])
示例#3
0
 def test_get_course_programs_with_invalid_response(self, log_exception):
     """ Test that the method 'get_course_programs_for_dashboard' logs
     the exception message if rest api client returns invalid data.
     """
     program = {
         'category': 'xseries',
         'status': 'active',
         'subtitle': 'Dummy program 1 for testing',
         'name': 'First Program',
         'organization': {'display_name': 'Test Organization 1', 'key': 'edX'},
         'course_codes': [
             {
                 'organization': {'display_name': 'Test Organization 1', 'key': 'edX'},
                 'display_name': 'Demo XSeries Program 1',
                 'key': 'TEST_A',
                 'run_modes': [
                     {'sku': '', 'mode_slug': 'ABC_2'},
                 ]
             }
         ],
         'marketing_slug': 'fake-marketing-slug-xseries-1',
     }
     invalid_programs_api_response = {"results": [program]}
     # mock the request call
     with patch('slumber.Resource.get') as mock_get:
         mock_get.return_value = invalid_programs_api_response
         programs = get_course_programs_for_dashboard(self.user, ['edX/DemoX/Run'])
         log_exception.assert_called_with(
             'Unable to parse Programs API response: %r',
             program
         )
         self.assertEqual(programs, {})
示例#4
0
    def test_get_course_programs_with_cache(self, ttl):
        """ Test that the method 'get_course_programs_for_dashboard' with
        cache_ttl greater than 0 saves the programs into cache and does not
        hit the api again until the cached data expires.
        """
        self.create_config(enabled=True,
                           enable_student_dashboard=True,
                           cache_ttl=ttl)
        # Mock the request call
        with patch('slumber.Resource.get') as mock_get:
            mock_get.return_value = self.programs_api_response

            # First test with user having multiple courses in a single xseries
            programs = get_course_programs_for_dashboard(
                self.user,
                ['edX/DemoX_1/Run_1', 'edX/DemoX_2/Run_2', 'valid/edX/Course'])

            self.assertTrue(mock_get.called)
            self.assertEqual(self.expected_output, programs)
            self.assertEqual(sorted(programs.keys()),
                             ['edX/DemoX_1/Run_1', 'edX/DemoX_2/Run_2'])

            # Now test with user having multiple courses across two different
            # xseries
            mock_get.reset_mock()
            programs = get_course_programs_for_dashboard(
                self.user, [
                    'edX/DemoX_1/Run_1', 'edX/DemoX_2/Run_2',
                    'edX/Program/Program_Run', 'valid/edX/Course'
                ])
            self.expected_output['edX/Program/Program_Run'] = self.edx_prg_run
            # If cache_ttl value is 0 than cache will be considered as disabled.
            # And mocked method will be call again
            if ttl == 0:
                self.assertTrue(mock_get.called)
            else:
                self.assertFalse(mock_get.called)
            self.assertEqual(self.expected_output, programs)
            self.assertEqual(sorted(programs.keys()), [
                'edX/DemoX_1/Run_1', 'edX/DemoX_2/Run_2',
                'edX/Program/Program_Run'
            ])
示例#5
0
 def test_get_course_programs_with_empty_response(self):
     """ Test that the method 'get_course_programs_for_dashboard' returns
     empty dict if programs rest api client returns empty response.
     """
     # mock the request call
     with patch('slumber.Resource.get') as mock_get:
         mock_get.return_value = {}
         self.assertEqual(
             get_course_programs_for_dashboard(self.user, ['edX/DemoX/Run']), {}
         )
         self.assertTrue(mock_get.called)
示例#6
0
 def test_get_course_programs_with_non_existing_courses(self):
     """ Test that the method 'get_course_programs_for_dashboard' returns
     only those program courses which exists in the programs api response.
     """
     # mock the request call
     with patch('slumber.Resource.get') as mock_get:
         mock_get.return_value = self.programs_api_response
         self.assertEqual(
             get_course_programs_for_dashboard(self.user, ['invalid/edX/Course']), {}
         )
         self.assertTrue(mock_get.called)
示例#7
0
 def test_get_course_programs_with_empty_response(self):
     """ Test that the method 'get_course_programs_for_dashboard' returns
     empty dict if programs rest api client returns empty response.
     """
     # mock the request call
     with patch('slumber.Resource.get') as mock_get:
         mock_get.return_value = {}
         self.assertEqual(
             get_course_programs_for_dashboard(self.user,
                                               ['edX/DemoX/Run']), {})
         self.assertTrue(mock_get.called)
示例#8
0
 def test_get_course_programs_with_non_existing_courses(self):
     """ Test that the method 'get_course_programs_for_dashboard' returns
     only those program courses which exists in the programs api response.
     """
     # mock the request call
     with patch('slumber.Resource.get') as mock_get:
         mock_get.return_value = self.programs_api_response
         self.assertEqual(
             get_course_programs_for_dashboard(self.user,
                                               ['invalid/edX/Course']), {})
         self.assertTrue(mock_get.called)
示例#9
0
 def test_get_course_programs_with_exception(self):
     """ Test that the method 'get_course_programs_for_dashboard' returns
     empty dictionary in case of exception while accessing programs service.
     """
     # mock the request call
     with patch('slumber.Resource.get') as mock_get:
         # test output in case of any exception
         mock_get.side_effect = Exception('exc')
         programs = get_course_programs_for_dashboard(
             self.user, ['edX/DemoX_1/Run_1', 'valid/edX/Course'])
         self.assertTrue(mock_get.called)
         self.assertEqual(programs, {})
示例#10
0
    def test_get_course_programs_with_cache(self, ttl):
        """ Test that the method 'get_course_programs_for_dashboard' with
        cache_ttl greater than 0 saves the programs into cache and does not
        hit the api again until the cached data expires.
        """
        self.create_config(enabled=True, enable_student_dashboard=True, cache_ttl=ttl)
        # Mock the request call
        with patch('slumber.Resource.get') as mock_get:
            mock_get.return_value = self.programs_api_response

            # First test with user having multiple courses in a single xseries
            programs = get_course_programs_for_dashboard(
                self.user,
                ['edX/DemoX_1/Run_1', 'edX/DemoX_2/Run_2', 'valid/edX/Course']
            )

            self.assertTrue(mock_get.called)
            self.assertEqual(self.expected_output, programs)
            self.assertEqual(sorted(programs.keys()), ['edX/DemoX_1/Run_1', 'edX/DemoX_2/Run_2'])

            # Now test with user having multiple courses across two different
            # xseries
            mock_get.reset_mock()
            programs = get_course_programs_for_dashboard(
                self.user,
                ['edX/DemoX_1/Run_1', 'edX/DemoX_2/Run_2', 'edX/Program/Program_Run', 'valid/edX/Course']
            )
            self.expected_output['edX/Program/Program_Run'] = self.edx_prg_run
            # If cache_ttl value is 0 than cache will be considered as disabled.
            # And mocked method will be call again
            if ttl == 0:
                self.assertTrue(mock_get.called)
            else:
                self.assertFalse(mock_get.called)
            self.assertEqual(self.expected_output, programs)
            self.assertEqual(
                sorted(programs.keys()),
                ['edX/DemoX_1/Run_1', 'edX/DemoX_2/Run_2', 'edX/Program/Program_Run']
            )
示例#11
0
 def test_get_course_programs_with_exception(self):
     """ Test that the method 'get_course_programs_for_dashboard' returns
     empty dictionary in case of exception while accessing programs service.
     """
     # mock the request call
     with patch('slumber.Resource.get') as mock_get:
         # test output in case of any exception
         mock_get.side_effect = Exception('exc')
         programs = get_course_programs_for_dashboard(
             self.user,
             ['edX/DemoX_1/Run_1', 'valid/edX/Course']
         )
         self.assertTrue(mock_get.called)
         self.assertEqual(programs, {})
示例#12
0
 def test_get_course_programs_with_api_client_exception(self):
     """ Test that the method 'get_course_programs_for_dashboard' returns
     empty dictionary in case of an exception coming from patching slumber
     based client 'programs_api_client'.
     """
     # mock the request call
     with patch('edx_rest_api_client.client.EdxRestApiClient.__init__'
                ) as mock_init:
         # test output in case of any exception
         mock_init.side_effect = Exception('exc')
         programs = get_course_programs_for_dashboard(
             self.user, ['edX/DemoX_1/Run_1', 'valid/edX/Course'])
         self.assertTrue(mock_init.called)
         self.assertEqual(programs, {})
示例#13
0
 def test_get_course_programs_with_api_client_exception(self):
     """ Test that the method 'get_course_programs_for_dashboard' returns
     empty dictionary in case of an exception coming from patching slumber
     based client 'programs_api_client'.
     """
     # mock the request call
     with patch('edx_rest_api_client.client.EdxRestApiClient.__init__') as mock_init:
         # test output in case of any exception
         mock_init.side_effect = Exception('exc')
         programs = get_course_programs_for_dashboard(
             self.user,
             ['edX/DemoX_1/Run_1', 'valid/edX/Course']
         )
         self.assertTrue(mock_init.called)
         self.assertEqual(programs, {})
示例#14
0
 def test_get_course_programs_with_invalid_response(self, log_exception):
     """ Test that the method 'get_course_programs_for_dashboard' logs
     the exception message if rest api client returns invalid data.
     """
     program = {
         'category':
         'xseries',
         'status':
         'active',
         'subtitle':
         'Dummy program 1 for testing',
         'name':
         'First Program',
         'organization': {
             'display_name': 'Test Organization 1',
             'key': 'edX'
         },
         'course_codes': [{
             'organization': {
                 'display_name': 'Test Organization 1',
                 'key': 'edX'
             },
             'display_name': 'Demo XSeries Program 1',
             'key': 'TEST_A',
             'run_modes': [
                 {
                     'sku': '',
                     'mode_slug': 'ABC_2'
                 },
             ]
         }],
         'marketing_slug':
         'fake-marketing-slug-xseries-1',
     }
     invalid_programs_api_response = {"results": [program]}
     # mock the request call
     with patch('slumber.Resource.get') as mock_get:
         mock_get.return_value = invalid_programs_api_response
         programs = get_course_programs_for_dashboard(
             self.user, ['edX/DemoX/Run'])
         log_exception.assert_called_with(
             'Unable to parse Programs API response: %r', program)
         self.assertEqual(programs, {})
示例#15
0
    def test_get_course_programs_with_valid_user_and_courses(self):
        """ Test that the method 'get_course_programs_for_dashboard' returns
        only matching courses from the xseries programs in the expected format.
        """
        # mock the request call
        with patch('slumber.Resource.get') as mock_get:
            mock_get.return_value = self.programs_api_response

            # first test with user having multiple courses in a single xseries
            programs = get_course_programs_for_dashboard(
                self.user,
                ['edX/DemoX_1/Run_1', 'edX/DemoX_2/Run_2', 'valid/edX/Course'])
            expected_output = {
                'edX/DemoX_1/Run_1': {
                    'category':
                    'xseries',
                    'status':
                    'active',
                    'subtitle':
                    'Dummy program 1 for testing',
                    'name':
                    'First Program',
                    'course_codes': [{
                        'organization': {
                            'display_name': 'Test Organization 1',
                            'key': 'edX'
                        },
                        'display_name':
                        'Demo XSeries Program 1',
                        'key':
                        'TEST_A',
                        'run_modes': [
                            {
                                'sku': '',
                                'mode_slug': 'ABC_1',
                                'course_key': 'edX/DemoX_1/Run_1'
                            },
                            {
                                'sku': '',
                                'mode_slug': 'ABC_2',
                                'course_key': 'edX/DemoX_2/Run_2'
                            },
                        ]
                    }],
                    'organization': {
                        'display_name': 'Test Organization 1',
                        'key': 'edX'
                    },
                    'marketing_slug':
                    'fake-marketing-slug-xseries-1',
                },
                'edX/DemoX_2/Run_2': {
                    'category':
                    'xseries',
                    'status':
                    'active',
                    'subtitle':
                    'Dummy program 1 for testing',
                    'name':
                    'First Program',
                    'course_codes': [{
                        'organization': {
                            'display_name': 'Test Organization 1',
                            'key': 'edX'
                        },
                        'display_name':
                        'Demo XSeries Program 1',
                        'key':
                        'TEST_A',
                        'run_modes': [
                            {
                                'sku': '',
                                'mode_slug': 'ABC_1',
                                'course_key': 'edX/DemoX_1/Run_1'
                            },
                            {
                                'sku': '',
                                'mode_slug': 'ABC_2',
                                'course_key': 'edX/DemoX_2/Run_2'
                            },
                        ]
                    }],
                    'organization': {
                        'display_name': 'Test Organization 1',
                        'key': 'edX'
                    },
                    'marketing_slug':
                    'fake-marketing-slug-xseries-1',
                },
            }
            self.assertTrue(mock_get.called)
            self.assertEqual(expected_output, programs)
            self.assertEqual(sorted(programs.keys()),
                             ['edX/DemoX_1/Run_1', 'edX/DemoX_2/Run_2'])

            # now test with user having multiple courses across two different
            # xseries
            mock_get.reset_mock()
            programs = get_course_programs_for_dashboard(
                self.user, [
                    'edX/DemoX_1/Run_1', 'edX/DemoX_2/Run_2',
                    'edX/Program/Program_Run', 'valid/edX/Course'
                ])
            expected_output['edX/Program/Program_Run'] = {
                'category':
                'xseries',
                'status':
                'active',
                'subtitle':
                'Dummy program 2 for testing',
                'name':
                'Second Program',
                'course_codes': [{
                    'organization': {
                        'display_name': 'Test Organization 2',
                        'key': 'edX'
                    },
                    'display_name':
                    'Demo XSeries Program 2',
                    'key':
                    'TEST_B',
                    'run_modes': [
                        {
                            'sku': '',
                            'mode_slug': 'XYZ_1',
                            'course_key': 'edX/Program/Program_Run'
                        },
                    ]
                }],
                'organization': {
                    'display_name': 'Test Organization 2',
                    'key': 'edX'
                },
                'marketing_slug':
                'fake-marketing-slug-xseries-2',
            }
            self.assertTrue(mock_get.called)
            self.assertEqual(expected_output, programs)
            self.assertEqual(sorted(programs.keys()), [
                'edX/DemoX_1/Run_1', 'edX/DemoX_2/Run_2',
                'edX/Program/Program_Run'
            ])
示例#16
0
    def test_get_course_programs_with_valid_user_and_courses(self):
        """ Test that the method 'get_course_programs_for_dashboard' returns
        only matching courses from the xseries programs in the expected format.
        """
        # mock the request call
        with patch('slumber.Resource.get') as mock_get:
            mock_get.return_value = self.programs_api_response

            # first test with user having multiple courses in a single xseries
            programs = get_course_programs_for_dashboard(
                self.user,
                ['edX/DemoX_1/Run_1', 'edX/DemoX_2/Run_2', 'valid/edX/Course']
            )
            expected_output = {
                'edX/DemoX_1/Run_1': {
                    'category': 'xseries',
                    'status': 'active',
                    'course_codes': [
                        {
                            'organization': {'display_name': 'Test Organization 1', 'key': 'edX'},
                            'marketing_slug': 'fake-marketing-slug-xseries-1',
                            'display_name': 'Demo XSeries Program 1',
                            'key': 'TEST_A',
                            'run_modes': [
                                {'sku': '', 'mode_slug': 'ABC_1', 'course_key': 'edX/DemoX_1/Run_1'},
                                {'sku': '', 'mode_slug': 'ABC_2', 'course_key': 'edX/DemoX_2/Run_2'},
                            ]
                        }
                    ],
                    'subtitle': 'Dummy program 1 for testing',
                    'name': 'First Program'
                },
                'edX/DemoX_2/Run_2': {
                    'category': 'xseries',
                    'status': 'active',
                    'course_codes': [
                        {
                            'organization': {'display_name': 'Test Organization 1', 'key': 'edX'},
                            'marketing_slug': 'fake-marketing-slug-xseries-1',
                            'display_name': 'Demo XSeries Program 1',
                            'key': 'TEST_A',
                            'run_modes': [
                                {'sku': '', 'mode_slug': 'ABC_1', 'course_key': 'edX/DemoX_1/Run_1'},
                                {'sku': '', 'mode_slug': 'ABC_2', 'course_key': 'edX/DemoX_2/Run_2'},
                            ]
                        }
                    ],
                    'subtitle': 'Dummy program 1 for testing',
                    'name': 'First Program'
                },
            }
            self.assertTrue(mock_get.called)
            self.assertEqual(expected_output, programs)
            self.assertEqual(sorted(programs.keys()), ['edX/DemoX_1/Run_1', 'edX/DemoX_2/Run_2'])

            # now test with user having multiple courses across two different
            # xseries
            mock_get.reset_mock()
            programs = get_course_programs_for_dashboard(
                self.user,
                ['edX/DemoX_1/Run_1', 'edX/DemoX_2/Run_2', 'edX/Program/Program_Run', 'valid/edX/Course']
            )
            expected_output['edX/Program/Program_Run'] = {
                'category': 'xseries',
                'status': 'active',
                'course_codes': [
                    {
                        'organization': {'display_name': 'Test Organization 2', 'key': 'edX'},
                        'marketing_slug': 'fake-marketing-slug-xseries-2',
                        'display_name': 'Demo XSeries Program 2',
                        'key': 'TEST_B',
                        'run_modes': [
                            {'sku': '', 'mode_slug': 'XYZ_1', 'course_key': 'edX/Program/Program_Run'},
                        ]
                    }
                ],
                'subtitle': 'Dummy program 2 for testing',
                'name': 'Second Program'
            }
            self.assertTrue(mock_get.called)
            self.assertEqual(expected_output, programs)
            self.assertEqual(
                sorted(programs.keys()),
                ['edX/DemoX_1/Run_1', 'edX/DemoX_2/Run_2', 'edX/Program/Program_Run']
            )