Esempio n. 1
0
class ConfigServiceCreateConfigTest(unittest.TestCase):
    def setUp(self):
        super().setUp()
        test_utils.setup()

        authorizer = Authorizer([], ['admin_user', 'admin_non_editor'], [],
                                ['admin_user'], EmptyGroupProvider())
        self.admin_user = User('admin_user', {})
        self.config_service = ConfigService(authorizer, test_utils.temp_folder)

    def tearDown(self):
        super().tearDown()
        test_utils.cleanup()

    def test_create_simple_config(self):
        config = _prepare_script_config_object(
            'conf1', description='My wonderful test config')
        self.config_service.create_config(self.admin_user, config, None)

        _validate_config(self, 'conf1.json', config)

    def test_non_admin_access(self):
        config = _prepare_script_config_object(
            'conf1', description='My wonderful test config')

        self.assertRaises(AdminAccessRequiredException,
                          self.config_service.create_config,
                          User('my_user', {}), config, None)

    def test_blank_name(self):
        config = _prepare_script_config_object(
            '  ', description='My wonderful test config')

        self.assertRaises(InvalidConfigException,
                          self.config_service.create_config, self.admin_user,
                          config, None)

    def test_strip_name(self):
        config = _prepare_script_config_object(
            ' conf1 ', description='My wonderful test config')

        self.config_service.create_config(self.admin_user, config, None)
        config['name'] = 'conf1'
        _validate_config(self, 'conf1.json', config)

    def test_blank_script_path(self):
        config = _prepare_script_config_object(
            'Conf X',
            description='My wonderful test config',
            script=script_path('   '))

        self.assertRaises(InvalidConfigException,
                          self.config_service.create_config, self.admin_user,
                          config, None)

    def test_strip_script_path(self):
        config = _prepare_script_config_object(
            'Conf X',
            description='My wonderful test config',
            script=script_path('  my_script.sh\t \t'))

        self.config_service.create_config(self.admin_user, config, None)

        config['script_path'] = 'my_script.sh'
        _validate_config(self, 'Conf_X.json', config)

    def test_name_already_exists(self):
        _create_script_config_file('confX', name='confX')
        config = _prepare_script_config_object(
            'confX', description='My wonderful test config')

        self.assertRaisesRegex(
            InvalidConfigException,
            'Another config with the same name already exists',
            self.config_service.create_config, self.admin_user, config, None)

    def test_filename_already_exists(self):
        existing_path = _create_script_config_file('confX', name='conf-Y')
        existing_config = file_utils.read_file(existing_path)

        config = _prepare_script_config_object(
            'confX', description='My wonderful test config')

        self.config_service.create_config(self.admin_user, config, None)
        _validate_config(self, 'confX_0.json', config)
        self.assertEqual(existing_config, file_utils.read_file(existing_path))

    def test_insert_sorted_values(self):
        config = _prepare_script_config_object('Conf X',
                                               requires_terminal=False,
                                               parameters=[{
                                                   'name': 'param1'
                                               }],
                                               description='Some description',
                                               include='included',
                                               allowed_users=[],
                                               script=script_path('cd ~'))

        self.config_service.create_config(self.admin_user, config, None)
        _validate_config(
            self, 'Conf_X.json',
            OrderedDict([('name', 'Conf X'), ('script_path', 'cd ~'),
                         ('description', 'Some description'),
                         ('allowed_users', []), ('include', 'included'),
                         ('requires_terminal', False),
                         ('parameters', [{
                             'name': 'param1'
                         }])]))

    def test_create_config_with_admin_users(self):
        config = _prepare_script_config_object(
            'conf1',
            description='My wonderful test config',
            admin_users=['another_user'])
        self.config_service.create_config(self.admin_user, config, None)

        _validate_config(self, 'conf1.json', config)

    def test_new_code(self):
        config = _prepare_script_config_object('Conf X',
                                               script=new_code(
                                                   'abcdef',
                                                   'anything/my name.sh'))
        self.config_service.create_config(self.admin_user, config, None)

        script_path = _default_script_path('my_name')
        self.assertEqual(config['script_path'], script_path)
        _validate_config(self, 'Conf_X.json', config)
        _validate_code(self, script_path, 'abcdef')
        self.assertTrue(is_executable(script_path))

    def test_upload_code(self):
        config = _prepare_script_config_object(
            'Conf X', script=upload_script('anything'))

        self.config_service.create_config(
            self.admin_user, config,
            HTTPFile(filename='my name.sh', body=b'xyz'))

        script_path = _default_script_path('my name')
        _validate_config(self, 'Conf_X.json', config)
        _validate_code(self, script_path, b'xyz')
        self.assertTrue(is_executable(script_path))

    @parameterized.expand([
        (None, 'filename', 'abc', 'admin_user', InvalidConfigException,
         'script option is required'),
        ('new_path', ' ', 'abc', 'admin_user', InvalidConfigException,
         'script.path option is required'),
        ('new_code', ' ', 'abc', 'admin_user', InvalidConfigException,
         'script.path option is required'),
        ('upload_script', ' ', 'abc', 'admin_user', InvalidConfigException,
         'script.path option is required'),
        ('new_code', 'Conf X.sh', 'abc', 'admin_non_editor',
         InvalidAccessException, 'not allowed to edit code'),
        ('upload_script', 'Conf X.sh', 'abc', 'admin_non_editor',
         InvalidAccessException, 'not allowed to edit code'),
        ('new_code', 'Conf X.sh', None, 'admin_user', InvalidConfigException,
         'script.code should be specified'),
        ('upload_script', 'Conf X.sh', None, 'admin_user',
         InvalidConfigException, 'Uploaded script should be specified'),
        ('some_mode', 'Conf X.sh', None, 'admin_user', InvalidConfigException,
         'Unsupported mode'),
    ])
    def test_script_update_exceptions(self, mode, filename, content, username,
                                      expected_exception, expected_message):
        body = None
        if mode == 'new_code':
            script = {'mode': 'new_code', 'code': content, 'path': filename}
        elif mode == 'upload_script':
            script = {'mode': 'upload_script', 'path': filename}
            body = HTTPFile(filename='whatever',
                            body=content.encode('utf8')) if content else None
        elif mode == 'new_path':
            script = script_path(filename)
        elif mode is None:
            script = None
        else:
            script = {'mode': mode, 'path': filename}

        config = _prepare_script_config_object('Conf X', script=script)
        self.assertRaisesRegex(expected_exception, expected_message,
                               self.config_service.create_config,
                               User(username, {}), config, body)
class ConfigServiceCreateConfigTest(unittest.TestCase):
    def setUp(self):
        super().setUp()
        test_utils.setup()

        authorizer = Authorizer([], ['admin_user'], EmptyGroupProvider())
        self.admin_user = User('admin_user', {})
        self.config_service = ConfigService(authorizer, test_utils.temp_folder)

    def tearDown(self):
        super().tearDown()
        test_utils.cleanup()

    def test_create_simple_config(self):
        config = _prepare_script_config_object(
            'conf1', description='My wonderful test config')
        self.config_service.create_config(self.admin_user, config)

        _validate_config(self, 'conf1.json', config)

    def test_non_admin_access(self):
        config = _prepare_script_config_object(
            'conf1', description='My wonderful test config')

        self.assertRaises(AdminAccessRequiredException,
                          self.config_service.create_config,
                          User('my_user', {}), config)

    def test_blank_name(self):
        config = _prepare_script_config_object(
            '  ', description='My wonderful test config')

        self.assertRaises(InvalidConfigException,
                          self.config_service.create_config, self.admin_user,
                          config)

    def test_strip_name(self):
        config = _prepare_script_config_object(
            ' conf1 ', description='My wonderful test config')

        self.config_service.create_config(self.admin_user, config)
        config['name'] = 'conf1'
        _validate_config(self, 'conf1.json', config)

    def test_blank_script_path(self):
        config = _prepare_script_config_object(
            'Conf X', description='My wonderful test config')
        config['script_path'] = '   '

        self.assertRaises(InvalidConfigException,
                          self.config_service.create_config, self.admin_user,
                          config)

    def test_strip_script_path(self):
        config = _prepare_script_config_object(
            'Conf X', description='My wonderful test config')
        config['script_path'] = '  my_script.sh\t \t'

        self.config_service.create_config(self.admin_user, config)
        config['script_path'] = 'my_script.sh'
        _validate_config(self, 'Conf_X.json', config)

    def test_name_already_exists(self):
        _create_script_config_file('confX', name='confX')
        config = _prepare_script_config_object(
            'confX', description='My wonderful test config')

        self.assertRaisesRegex(
            InvalidConfigException,
            'Another config with the same name already exists',
            self.config_service.create_config, self.admin_user, config)

    def test_filename_already_exists(self):
        existing_path = _create_script_config_file('confX', name='conf-Y')
        existing_config = file_utils.read_file(existing_path)

        config = _prepare_script_config_object(
            'confX', description='My wonderful test config')

        self.config_service.create_config(self.admin_user, config)
        _validate_config(self, 'confX_0.json', config)
        self.assertEqual(existing_config, file_utils.read_file(existing_path))

    def test_insert_sorted_values(self):
        config = _prepare_script_config_object('Conf X',
                                               requires_terminal=False,
                                               parameters=[{
                                                   'name': 'param1'
                                               }],
                                               description='Some description',
                                               include='included',
                                               allowed_users=[],
                                               script_path='cd ~')

        self.config_service.create_config(self.admin_user, config)
        _validate_config(
            self, 'Conf_X.json',
            OrderedDict([('name', 'Conf X'), ('script_path', 'cd ~'),
                         ('description', 'Some description'),
                         ('allowed_users', []), ('include', 'included'),
                         ('requires_terminal', False),
                         ('parameters', [{
                             'name': 'param1'
                         }])]))