import json from django.urls import reverse from rest_framework import status from rest_framework.test import APIClient from openslides import ( __license__ as license, __url__ as url, __version__ as version, ) from openslides.core.config import ConfigVariable, config from openslides.core.models import Projector from openslides.topics.models import Topic from openslides.utils.rest_api import ValidationError from openslides.utils.test import TestCase class ProjectorAPI(TestCase): """ Tests requests from the anonymous user. """ def test_slide_on_default_projector(self): self.client.login(username='admin', password='admin') topic = Topic.objects.create(title='title_que1olaish5Wei7que6i', text='text_aishah8Eh7eQuie5ooji') default_projector = Projector.objects.get(pk=1) default_projector.config = { 'aae4a07b26534cfb9af4232f361dce73': {'name': 'topics/topic', 'id': topic.id}} default_projector.save() response = self.client.get(reverse('projector-detail', args=['1'])) content = json.loads(response.content.decode()) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(content['elements'], { 'aae4a07b26534cfb9af4232f361dce73': {'id': topic.id, 'uuid': 'aae4a07b26534cfb9af4232f361dce73', 'name': 'topics/topic', 'agenda_item_id': topic.agenda_item_id}}) def test_invalid_slide_on_default_projector(self): self.client.login(username='admin', password='admin') default_projector = Projector.objects.get(pk=1) default_projector.config = { 'fc6ef43b624043068c8e6e7a86c5a1b0': {'name': 'invalid_slide'}} default_projector.save() response = self.client.get(reverse('projector-detail', args=['1'])) content = json.loads(response.content.decode()) del content['projectiondefaults'] self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(content, { 'id': 1, 'elements': { 'fc6ef43b624043068c8e6e7a86c5a1b0': {'name': 'invalid_slide', 'uuid': 'fc6ef43b624043068c8e6e7a86c5a1b0', 'error': 'Projector element does not exist.'}}, 'scale': 0, 'scroll': 0, 'name': 'Default projector', 'blank': False, 'width': 1220, 'height': 915}) class VersionView(TestCase): """ Tests the version info view. """ def test_get(self): self.client.login(username='admin', password='admin') response = self.client.get(reverse('core_version')) self.assertEqual(json.loads(response.content.decode()), { 'openslides_version': version, 'openslides_license': license, 'openslides_url': url, 'plugins': [ {'verbose_name': 'OpenSlides Test Plugin', 'description': 'This is a test plugin for OpenSlides.', 'version': 'unknown', 'license': 'MIT', 'url': ''}]}) class ConfigViewSet(TestCase): """ Tests requests to deal with config variables. """ def setUp(self): # Save the old value of the config object and add the test values # TODO: Can be changed to setUpClass when Django 1.8 is no longer supported self._config_values = config.config_variables.copy() config.key_to_id = None config.update_config_variables(set_simple_config_view_integration_config_test()) config.save_default_values() def tearDown(self): # Reset the config variables config.config_variables = self._config_values super().tearDown() def test_update(self): self.client = APIClient() self.client.login(username='admin', password='admin') response = self.client.put( reverse('config-detail', args=['test_var_Xeiizi7ooH8Thuk5aida']), {'value': 'test_value_Phohx3oopeichaiTheiw'}) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(config['test_var_Xeiizi7ooH8Thuk5aida'], 'test_value_Phohx3oopeichaiTheiw') def test_update_wrong_datatype(self): self.client = APIClient() self.client.login(username='admin', password='admin') response = self.client.put( reverse('config-detail', args=['test_var_ohhii4iavoh5Phoh5ahg']), {'value': 'test_value_string'}) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) self.assertEqual(response.data, {'detail': "Wrong datatype. Expected , got ."}) def test_update_wrong_datatype_that_can_be_converted(self): """ Try to send a string that can be converted to an integer to an integer field. """ self.client = APIClient() self.client.login(username='admin', password='admin') response = self.client.put( reverse('config-detail', args=['test_var_ohhii4iavoh5Phoh5ahg']), {'value': '12345'}) self.assertEqual(response.status_code, 200) def test_update_good_choice(self): self.client = APIClient() self.client.login(username='admin', password='admin') response = self.client.put( reverse('config-detail', args=['test_var_wei0Rei9ahzooSohK1ph']), {'value': 'key_2_yahb2ain1aeZ1lea1Pei'}) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(config['test_var_wei0Rei9ahzooSohK1ph'], 'key_2_yahb2ain1aeZ1lea1Pei') def test_update_bad_choice(self): self.client = APIClient() self.client.login(username='admin', password='admin') response = self.client.put( reverse('config-detail', args=['test_var_wei0Rei9ahzooSohK1ph']), {'value': 'test_value_bad_string'}) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) self.assertEqual(response.data, {'detail': 'Invalid input. Choice does not match.'}) def test_update_validator_ok(self): self.client = APIClient() self.client.login(username='admin', password='admin') response = self.client.put( reverse('config-detail', args=['test_var_Hi7Oje8Oith7goopeeng']), {'value': 'valid_string'}) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(config['test_var_Hi7Oje8Oith7goopeeng'], 'valid_string') def test_update_validator_invalid(self): self.client = APIClient() self.client.login(username='admin', password='admin') response = self.client.put( reverse('config-detail', args=['test_var_Hi7Oje8Oith7goopeeng']), {'value': 'invalid_string'}) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) self.assertEqual(response.data, {'detail': 'Invalid input.'}) def test_update_only_with_key(self): self.client = APIClient() self.client.login(username='admin', password='admin') response = self.client.put( reverse('config-detail', args=['test_var_Xeiizi7ooH8Thuk5aida'])) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) self.assertEqual(response.data, {'detail': 'Invalid input. Config value is missing.'}) def validator_for_testing(value): """ Validator for testing. """ if value == 'invalid_string': raise ValidationError({'detail': 'Invalid input.'}) def set_simple_config_view_integration_config_test(): """ Sets a simple config view with some config variables but without grouping. """ yield ConfigVariable( name='test_var_aeW3Quahkah1phahCheo', default_value=None, label='test_label_aeNahsheu8phahk8taYo') yield ConfigVariable( name='test_var_Xeiizi7ooH8Thuk5aida', default_value='') yield ConfigVariable( name='test_var_ohhii4iavoh5Phoh5ahg', default_value=0, input_type='integer') yield ConfigVariable( name='test_var_wei0Rei9ahzooSohK1ph', default_value='key_1_Queit2juchoocos2Vugh', input_type='choice', choices=( {'value': 'key_1_Queit2juchoocos2Vugh', 'display_name': 'label_1_Queit2juchoocos2Vugh'}, {'value': 'key_2_yahb2ain1aeZ1lea1Pei', 'display_name': 'label_2_yahb2ain1aeZ1lea1Pei'})) yield ConfigVariable( name='test_var_Hi7Oje8Oith7goopeeng', default_value='', validators=(validator_for_testing,)) yield ConfigVariable( name='test_var_pud2zah2teeNaiP7IoNa', default_value=None, label='test_label_xaing7eefaePheePhei6', hidden=True)