Example #1
0
    def setUp(self):
        self.factory = TenantRequestFactory(self.tenant)
        self.view = views.ListReports.as_view()
        self.url = '/api/v2/internal/reports/'
        self.user = CustUser.objects.create_user(username='******')
        self.limited_user = CustUser.objects.create_user(username='******')
        self.superuser = CustUser.objects.create_user(username='******',
                                                      is_superuser=True)

        self.report1 = poem_models.Reports.objects.create(
            name='Critical',
            apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i',
            groupname='TENANT',
            description='Critical report')

        self.report2 = poem_models.Reports.objects.create(
            name='ops-monitor',
            apiid='bue2xius-ubt0-62ap-9nbn-ieta0kao8loa',
        )

        group1 = poem_models.GroupOfReports.objects.create(name='TENANT')
        group2 = poem_models.GroupOfReports.objects.create(name='ARGO')
        self.group = poem_models.GroupOfReports.objects.create(name='TEST')

        group1.reports.add(self.report1)

        userprofile = poem_models.UserProfile.objects.create(user=self.user)
        userprofile.groupsofreports.add(group1)
        userprofile.groupsofreports.add(group2)

        poem_models.UserProfile.objects.create(user=self.limited_user)
        poem_models.UserProfile.objects.create(user=self.superuser)
Example #2
0
    def test_automatic_creation(self):
        factory = TenantRequestFactory(self.tenant)
        request = factory.get('/irrelevant')  # Path is not used because we call the view function directly
        request.tenant = Event.objects.get()
        request.user = UserFactory()
        view = EmptyTeamView.as_view()
        response = view(request)

        self.assertEqual(response.status_code, 200)
        profile = UserProfile.objects.get(user=request.user)
        Team.objects.get(members=profile)
Example #3
0
    def setUp(self):
        self.factory = TenantRequestFactory(self.tenant)
        self.view = views.ListAPIKeys.as_view()
        self.url = '/api/v2/internal/apikeys/'
        self.user = CustUser.objects.create_user(username='******',
                                                 is_superuser=True)
        self.regular_user = CustUser.objects.create_user(username='******')
        self.poor_user = CustUser.objects.create_user(username='******')

        group1 = poem_models.GroupOfAggregations.objects.create(name='TEST')
        group2 = poem_models.GroupOfMetrics.objects.create(name='TEST')
        userprofile = poem_models.UserProfile.objects.create(
            user=self.regular_user)
        userprofile.groupsofaggregations.add(group1)
        userprofile.groupsofmetrics.add(group2)

        poem_models.UserProfile.objects.create(user=self.user)
        poem_models.UserProfile.objects.create(user=self.poor_user)

        key1, k1 = MyAPIKey.objects.create_key(name='EGI')
        self.id1 = key1.id
        self.token1 = key1.token
        self.created1 = datetime.datetime.strftime(key1.created,
                                                   '%Y-%m-%d %H:%M:%S')
        key2, k2 = MyAPIKey.objects.create_key(name='EUDAT')
        self.id2 = key2.id
        self.token2 = key2.token
        self.created2 = datetime.datetime.strftime(key2.created,
                                                   '%Y-%m-%d %H:%M:%S')
        key3, k3 = MyAPIKey.objects.create_key(name='DELETABLE')
        self.id3 = key3.id
        self.token3 = key3.token
        self.created3 = datetime.datetime.strftime(key3.created,
                                                   '%Y-%m-%d %H:%M:%S')

        key4, k4 = MyAPIKey.objects.create_key(name='WEB-API')
        self.id4 = key4.id
        self.token4 = key4.token
        self.created4 = datetime.datetime.strftime(key4.created,
                                                   '%Y-%m-%d %H:%M:%S')

        key5, k5 = MyAPIKey.objects.create_key(name='WEB-API-RO')
        self.id5 = key5.id
        self.token5 = key5.token
        self.created5 = datetime.datetime.strftime(key5.created,
                                                   '%Y-%m-%d %H:%M:%S')
Example #4
0
class GetConfigOptionsAPIViewTests(TenantTestCase):
    def setUp(self):
        self.factory = TenantRequestFactory(self.tenant)
        self.view = views.GetConfigOptions.as_view()
        self.url = '/api/v2/internal/config_options/'
        self.user = CustUser.objects.create(username='******')

    @patch('Poem.api.internal_views.app.saml_login_string',
           return_value='Log in using B2ACCESS')
    @patch('Poem.api.internal_views.app.tenant_from_request',
           return_value='tenant')
    def test_get_config_options(self, *args):
        with self.settings(
                WEBAPI_METRIC='https://metric.profile.com',
                WEBAPI_AGGREGATION='https://aggregations.com',
                WEBAPI_THRESHOLDS='https://thresholds.com',
                WEBAPI_OPERATIONS='https://operations.com',
                WEBAPI_REPORTS='https://reports.com',
                WEBAPI_REPORTSTAGS='https://reports-tags.com',
                WEBAPI_REPORTSTOPOLOGYGROUPS='https://topology-groups.com',
                WEBAPI_REPORTSTOPOLOGYENDPOINTS='https://endpoints.com',
                LINKS_TERMS_PRIVACY={
                    'tenant': {
                        'terms': 'https://terms.of.use.com',
                        'privacy': 'https://privacy.policies.com'
                    }
                }
        ):
            request = self.factory.get(self.url)
            response = self.view(request)
            self.assertEqual(
                response.data,
                {
                    'result': {
                        'saml_login_string': 'Log in using B2ACCESS',
                        'webapimetric': 'https://metric.profile.com',
                        'webapiaggregation': 'https://aggregations.com',
                        'webapithresholds': 'https://thresholds.com',
                        'webapioperations': 'https://operations.com',
                        'version': pkg_resources.get_distribution(
                            'poem'
                        ).version,
                        'webapireports': {
                            'main': 'https://reports.com',
                            'tags': 'https://reports-tags.com',
                            'topologygroups': 'https://topology-groups.com',
                            'topologyendpoints': 'https://endpoints.com'
                        },
                        'tenant_name': 'tenant',
                        'terms_privacy_links': {
                            'terms': 'https://terms.of.use.com',
                            'privacy': 'https://privacy.policies.com'
                        }
                    }
                }
            )
Example #5
0
    def setUp(self):
        self.factory = TenantRequestFactory(self.tenant)
        self.view = views.ListGroupsForUser.as_view()
        self.url = '/api/v2/internal/groups/'
        self.user = CustUser.objects.create_user(username='******')
        self.superuser = CustUser.objects.create_user(
            username='******', is_superuser=True
        )

        poem_models.GroupOfMetrics.objects.create(name='metricgroup1')
        gm1 = poem_models.GroupOfMetrics.objects.create(name='metricgroup2')

        poem_models.GroupOfMetricProfiles.objects.create(
            name='metricprofilegroup1'
        )
        gmp1 = poem_models.GroupOfMetricProfiles.objects.create(
            name='metricprofilegroup2'
        )

        poem_models.GroupOfAggregations.objects.create(name='aggrgroup1')
        ga1 = poem_models.GroupOfAggregations.objects.create(name='aggrgroup2')

        poem_models.GroupOfThresholdsProfiles.objects.create(
            name='thresholdsgroup1'
        )
        gtp1 = poem_models.GroupOfThresholdsProfiles.objects.create(
            name='thresholdsgroup2'
        )

        poem_models.GroupOfReports.objects.create(name='reportsgroup1')
        gr = poem_models.GroupOfReports.objects.create(name='reportsgroup2')

        userprofile = poem_models.UserProfile.objects.create(user=self.user)
        userprofile.groupsofmetrics.add(gm1)
        userprofile.groupsofmetricprofiles.add(gmp1)
        userprofile.groupsofaggregations.add(ga1)
        userprofile.groupsofthresholdsprofiles.add(gtp1)
        userprofile.groupsofreports.add(gr)
Example #6
0
    def setUp(self) -> None:
        self.factory = TenantRequestFactory(self.tenant)
        self.view = views.ListTenants.as_view()
        self.url = '/api/v2/internal/tenants/'
        self.user = CustUser.objects.create_user(username='******')
        # get_tenant_domain_model().objects.create(
        #     domain='test.domain.url', tenant=self.tenant, is_primary=True
        # )

        with schema_context(get_public_schema_name()):
            self.tenant1 = Tenant(name='TEST1', schema_name='test1')
            self.tenant1.auto_create_schema = False

            self.tenant2 = Tenant(name='TEST2', schema_name='test2')
            self.tenant2.auto_create_schema = False

            self.tenant3 = Tenant(
                name='all',
                schema_name=get_public_schema_name(),
            )
            self.tenant3.auto_create_schema = False

            self.tenant1.save()
            self.tenant2.save()
            self.tenant3.save()
            get_tenant_domain_model().objects.create(domain='test1.domain.url',
                                                     tenant=self.tenant1,
                                                     is_primary=True)
            get_tenant_domain_model().objects.create(domain='test2.domain.url',
                                                     tenant=self.tenant2,
                                                     is_primary=True)
            get_tenant_domain_model().objects.create(domain='domain.url',
                                                     tenant=self.tenant3,
                                                     is_primary=True)
            self.supertenant_superuser = CustUser.objects.create_user(
                username='******', is_superuser=True)
            self.supertenant_user = CustUser.objects.create_user(
                username='******')
Example #7
0
class GetIsTenantSchemaAPIViewTests(TenantTestCase):
    def setUp(self):
        self.factory = TenantRequestFactory(self.tenant)
        self.view = views.GetIsTenantSchema.as_view()
        self.url = '/api/v2/internal/istenantschema/'

    def test_get_tenant_schema(self):
        request = self.factory.get(self.url)
        response = self.view(request)
        self.assertEqual(
            response.data,
            {'isTenantSchema': True}
        )

    @patch('Poem.api.internal_views.app.connection')
    def test_get_schema_name_if_public_schema(self, args):
        args.schema_name = get_public_schema_name()
        request = self.factory.get(self.url)
        response = self.view(request)
        self.assertEqual(
            response.data,
            {'isTenantSchema': False}
        )
Example #8
0
    def setUp(self):
        self.factory = TenantRequestFactory(self.tenant)
        self.view = views.IsSessionActive.as_view()
        self.url = '/api/v2/internal/sessionactive/'
        self.user = CustUser.objects.create(username='******')

        self.userprofile = poem_models.UserProfile.objects.create(
            user=self.user,
            subject='subject',
            displayname='First_User',
            egiid='blablabla'
        )
        MyAPIKey.objects.create(
            id=1,
            name='WEB-API',
            prefix='foo',
            token='mocked_token_rw'
        )
        MyAPIKey.objects.create(
            id=2,
            name='WEB-API-RO',
            token='mocked_token_ro',
            prefix='bar'
        )
Example #9
0
class ListReportsAPIViewTests(TenantTestCase):
    def setUp(self):
        self.factory = TenantRequestFactory(self.tenant)
        self.view = views.ListReports.as_view()
        self.url = '/api/v2/internal/reports/'
        self.user = CustUser.objects.create_user(username='******')
        self.limited_user = CustUser.objects.create_user(username='******')
        self.superuser = CustUser.objects.create_user(username='******',
                                                      is_superuser=True)

        self.report1 = poem_models.Reports.objects.create(
            name='Critical',
            apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i',
            groupname='TENANT',
            description='Critical report')

        self.report2 = poem_models.Reports.objects.create(
            name='ops-monitor',
            apiid='bue2xius-ubt0-62ap-9nbn-ieta0kao8loa',
        )

        group1 = poem_models.GroupOfReports.objects.create(name='TENANT')
        group2 = poem_models.GroupOfReports.objects.create(name='ARGO')
        self.group = poem_models.GroupOfReports.objects.create(name='TEST')

        group1.reports.add(self.report1)

        userprofile = poem_models.UserProfile.objects.create(user=self.user)
        userprofile.groupsofreports.add(group1)
        userprofile.groupsofreports.add(group2)

        poem_models.UserProfile.objects.create(user=self.limited_user)
        poem_models.UserProfile.objects.create(user=self.superuser)

    @patch('Poem.api.internal_views.reports.sync_webapi')
    def test_get_all_reports_superuser(self, func):
        func.side_effect = mocked_func
        request = self.factory.get(self.url)
        force_authenticate(request, user=self.superuser)
        response = self.view(request)
        self.assertEqual(response.data, [
            OrderedDict([('name', 'Critical'),
                         ('description', 'Critical report'),
                         ('apiid', 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i'),
                         ('groupname', 'TENANT')]),
            OrderedDict([('name', 'ops-monitor'), ('description', ''),
                         ('apiid', 'bue2xius-ubt0-62ap-9nbn-ieta0kao8loa'),
                         ('groupname', '')])
        ])

    @patch('Poem.api.internal_views.reports.sync_webapi')
    def test_get_all_reports_regular_user(self, func):
        func.side_effect = mocked_func
        request = self.factory.get(self.url)
        force_authenticate(request, user=self.user)
        response = self.view(request)
        self.assertEqual(response.data, [
            OrderedDict([('name', 'Critical'),
                         ('description', 'Critical report'),
                         ('apiid', 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i'),
                         ('groupname', 'TENANT')]),
            OrderedDict([('name', 'ops-monitor'), ('description', ''),
                         ('apiid', 'bue2xius-ubt0-62ap-9nbn-ieta0kao8loa'),
                         ('groupname', '')])
        ])

    @patch('Poem.api.internal_views.reports.sync_webapi')
    def test_get_all_reports_limited_user(self, func):
        func.side_effect = mocked_func
        request = self.factory.get(self.url)
        force_authenticate(request, user=self.limited_user)
        response = self.view(request)
        self.assertEqual(response.data, [
            OrderedDict([('name', 'Critical'),
                         ('description', 'Critical report'),
                         ('apiid', 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i'),
                         ('groupname', 'TENANT')]),
            OrderedDict([('name', 'ops-monitor'), ('description', ''),
                         ('apiid', 'bue2xius-ubt0-62ap-9nbn-ieta0kao8loa'),
                         ('groupname', '')])
        ])

    @patch('Poem.api.internal_views.reports.sync_webapi')
    def test_get_report_by_name_superuser(self, func):
        func.side_effect = mocked_func
        request = self.factory.get(self.url + 'Critical')
        force_authenticate(request, user=self.superuser)
        response = self.view(request, 'Critical')
        self.assertEqual(
            response.data,
            OrderedDict([('name', 'Critical'),
                         ('description', 'Critical report'),
                         ('apiid', 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i'),
                         ('groupname', 'TENANT')]))

    @patch('Poem.api.internal_views.reports.sync_webapi')
    def test_get_report_by_name_regular_user(self, func):
        func.side_effect = mocked_func
        request = self.factory.get(self.url + 'Critical')
        force_authenticate(request, user=self.user)
        response = self.view(request, 'Critical')
        self.assertEqual(
            response.data,
            OrderedDict([('name', 'Critical'),
                         ('description', 'Critical report'),
                         ('apiid', 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i'),
                         ('groupname', 'TENANT')]))

    @patch('Poem.api.internal_views.reports.sync_webapi')
    def test_get_report_by_name_limited_user(self, func):
        func.side_effect = mocked_func
        request = self.factory.get(self.url + 'Critical')
        force_authenticate(request, user=self.limited_user)
        response = self.view(request, 'Critical')
        self.assertEqual(
            response.data,
            OrderedDict([('name', 'Critical'),
                         ('description', 'Critical report'),
                         ('apiid', 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i'),
                         ('groupname', 'TENANT')]))

    @patch('Poem.api.internal_views.reports.sync_webapi')
    def test_get_report_if_wrong_name_superuser(self, func):
        func.side_effect = mocked_func
        request = self.factory.get(self.url + 'nonexisting')
        force_authenticate(request, user=self.superuser)
        response = self.view(request, 'nonexisting')
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)

    @patch('Poem.api.internal_views.reports.sync_webapi')
    def test_get_report_if_wrong_name_regular_user(self, func):
        func.side_effect = mocked_func
        request = self.factory.get(self.url + 'nonexisting')
        force_authenticate(request, user=self.user)
        response = self.view(request, 'nonexisting')
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)

    @patch('Poem.api.internal_views.reports.sync_webapi')
    def test_get_report_if_wrong_name_limited_user(self, func):
        func.side_effect = mocked_func
        request = self.factory.get(self.url + 'nonexisting')
        force_authenticate(request, user=self.limited_user)
        response = self.view(request, 'nonexisting')
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)

    def test_post_report_superuser(self):
        data = {
            'apiid': 'yoohoo6t-1fwt-nf98-uem6-uc1zie9ahk8u',
            'name': 'sla',
            'groupname': 'ARGO',
            'description': 'Some description.'
        }
        request = self.factory.post(self.url, data, format='json')
        force_authenticate(request, user=self.superuser)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.assertEqual(poem_models.Reports.objects.all().count(), 3)
        report = poem_models.Reports.objects.get(name='sla')
        self.assertEqual(report.name, 'sla')
        self.assertEqual(report.apiid, 'yoohoo6t-1fwt-nf98-uem6-uc1zie9ahk8u')
        self.assertEqual(report.description, 'Some description.')
        self.assertEqual(report.groupname, 'ARGO')
        group = poem_models.GroupOfReports.objects.get(name='ARGO')
        self.assertEqual(group.reports.all().count(), 1)
        self.assertTrue(
            group.reports.filter(
                apiid='yoohoo6t-1fwt-nf98-uem6-uc1zie9ahk8u').exists())

    def test_post_report_regular_user(self):
        data = {
            'apiid': 'yoohoo6t-1fwt-nf98-uem6-uc1zie9ahk8u',
            'name': 'sla',
            'groupname': 'ARGO',
            'description': 'Some description.'
        }
        request = self.factory.post(self.url, data, format='json')
        force_authenticate(request, user=self.user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.assertEqual(poem_models.Reports.objects.all().count(), 3)
        report = poem_models.Reports.objects.get(name='sla')
        self.assertEqual(report.name, 'sla')
        self.assertEqual(report.apiid, 'yoohoo6t-1fwt-nf98-uem6-uc1zie9ahk8u')
        self.assertEqual(report.description, 'Some description.')
        self.assertEqual(report.groupname, 'ARGO')
        group = poem_models.GroupOfReports.objects.get(name='ARGO')
        self.assertEqual(group.reports.all().count(), 1)
        self.assertTrue(
            group.reports.filter(
                apiid='yoohoo6t-1fwt-nf98-uem6-uc1zie9ahk8u').exists())

    def test_post_report_regular_user_wrong_group(self):
        data = {
            'apiid': 'yoohoo6t-1fwt-nf98-uem6-uc1zie9ahk8u',
            'name': 'sla',
            'groupname': 'TEST',
            'description': 'Some description.'
        }
        request = self.factory.post(self.url, data, format='json')
        force_authenticate(request, user=self.user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(
            response.data['detail'],
            'You do not have permission to assign reports to the given group.')
        self.assertEqual(poem_models.Reports.objects.all().count(), 2)
        self.assertRaises(poem_models.Reports.DoesNotExist,
                          poem_models.Reports.objects.get,
                          name='sla')
        group = poem_models.GroupOfReports.objects.get(name='TEST')
        self.assertEqual(group.reports.all().count(), 0)

    def test_post_report_limited_user(self):
        data = {
            'apiid': 'yoohoo6t-1fwt-nf98-uem6-uc1zie9ahk8u',
            'name': 'sla',
            'groupname': 'ARGO',
            'description': 'Some description.'
        }
        request = self.factory.post(self.url, data, format='json')
        force_authenticate(request, user=self.limited_user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(response.data['detail'],
                         'You do not have permission to add reports.')
        self.assertRaises(poem_models.Reports.DoesNotExist,
                          poem_models.Reports.objects.get,
                          name='sla')
        self.assertEqual(poem_models.Reports.objects.all().count(), 2)
        group = poem_models.GroupOfReports.objects.get(name='ARGO')
        self.assertEqual(group.reports.all().count(), 0)

    def test_post_report_nonexisting_group_superuser(self):
        data = {
            'apiid': 'yoohoo6t-1fwt-nf98-uem6-uc1zie9ahk8u',
            'name': 'sla',
            'groupname': 'nonexisting',
            'description': 'Some description.'
        }
        request = self.factory.post(self.url, data, format='json')
        force_authenticate(request, user=self.superuser)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
        self.assertEqual(response.data['detail'],
                         'Group of reports not found.')
        self.assertEqual(poem_models.Reports.objects.all().count(), 2)
        self.assertRaises(poem_models.Reports.DoesNotExist,
                          poem_models.Reports.objects.get,
                          name='sla')

    def test_post_report_nonexisting_group_regular_user(self):
        data = {
            'apiid': 'yoohoo6t-1fwt-nf98-uem6-uc1zie9ahk8u',
            'name': 'sla',
            'groupname': 'nonexisting',
            'description': 'Some description.'
        }
        request = self.factory.post(self.url, data, format='json')
        force_authenticate(request, user=self.user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
        self.assertEqual(response.data['detail'],
                         'Group of reports not found.')
        self.assertEqual(poem_models.Reports.objects.all().count(), 2)
        self.assertRaises(poem_models.Reports.DoesNotExist,
                          poem_models.Reports.objects.get,
                          name='sla')

    def test_post_report_nonexisting_group_limited_user(self):
        data = {
            'apiid': 'yoohoo6t-1fwt-nf98-uem6-uc1zie9ahk8u',
            'name': 'sla',
            'groupname': 'nonexisting',
            'description': 'Some description.'
        }
        request = self.factory.post(self.url, data, format='json')
        force_authenticate(request, user=self.limited_user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(response.data['detail'],
                         'You do not have permission to add reports.')
        self.assertEqual(poem_models.Reports.objects.all().count(), 2)
        self.assertRaises(poem_models.Reports.DoesNotExist,
                          poem_models.Reports.objects.get,
                          name='sla')

    def test_post_report_without_description_superuser(self):
        data = {
            'apiid': 'yoohoo6t-1fwt-nf98-uem6-uc1zie9ahk8u',
            'name': 'sla',
            'groupname': 'ARGO',
            'description': ''
        }
        request = self.factory.post(self.url, data, format='json')
        force_authenticate(request, user=self.superuser)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.assertEqual(poem_models.Reports.objects.all().count(), 3)
        report = poem_models.Reports.objects.get(name='sla')
        self.assertEqual(report.apiid, 'yoohoo6t-1fwt-nf98-uem6-uc1zie9ahk8u')
        self.assertEqual(report.description, '')
        self.assertEqual(report.groupname, 'ARGO')
        group = poem_models.GroupOfReports.objects.get(name='ARGO')
        self.assertEqual(group.reports.all().count(), 1)
        self.assertTrue(
            group.reports.filter(
                apiid='yoohoo6t-1fwt-nf98-uem6-uc1zie9ahk8u').exists())

    def test_post_report_without_description_regular_user(self):
        data = {
            'apiid': 'yoohoo6t-1fwt-nf98-uem6-uc1zie9ahk8u',
            'name': 'sla',
            'groupname': 'ARGO',
            'description': ''
        }
        request = self.factory.post(self.url, data, format='json')
        force_authenticate(request, user=self.user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.assertEqual(poem_models.Reports.objects.all().count(), 3)
        report = poem_models.Reports.objects.get(name='sla')
        self.assertEqual(report.apiid, 'yoohoo6t-1fwt-nf98-uem6-uc1zie9ahk8u')
        self.assertEqual(report.description, '')
        self.assertEqual(report.groupname, 'ARGO')
        group = poem_models.GroupOfReports.objects.get(name='ARGO')
        self.assertEqual(group.reports.all().count(), 1)
        self.assertTrue(
            group.reports.filter(
                apiid='yoohoo6t-1fwt-nf98-uem6-uc1zie9ahk8u').exists())

    def test_post_report_without_description_regular_user_wrong_group(self):
        data = {
            'apiid': 'yoohoo6t-1fwt-nf98-uem6-uc1zie9ahk8u',
            'name': 'sla',
            'groupname': 'TEST',
            'description': ''
        }
        request = self.factory.post(self.url, data, format='json')
        force_authenticate(request, user=self.user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(
            response.data['detail'],
            'You do not have permission to assign reports to the given group.')
        self.assertEqual(poem_models.Reports.objects.all().count(), 2)
        self.assertRaises(poem_models.Reports.DoesNotExist,
                          poem_models.Reports.objects.get,
                          name='sla')
        group = poem_models.GroupOfReports.objects.get(name='ARGO')
        self.assertEqual(group.reports.all().count(), 0)

    def test_post_report_without_description_limited_user(self):
        data = {
            'apiid': 'yoohoo6t-1fwt-nf98-uem6-uc1zie9ahk8u',
            'name': 'sla',
            'groupname': 'ARGO',
            'description': ''
        }
        request = self.factory.post(self.url, data, format='json')
        force_authenticate(request, user=self.limited_user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(response.data['detail'],
                         'You do not have permission to add reports.')
        self.assertEqual(poem_models.Reports.objects.all().count(), 2)
        self.assertRaises(poem_models.Reports.DoesNotExist,
                          poem_models.Reports.objects.get,
                          name='sla')
        group = poem_models.GroupOfReports.objects.get(name='ARGO')
        self.assertEqual(group.reports.all().count(), 0)

    def test_post_report_invalid_data_superuser(self):
        data = {'name': 'sla'}
        request = self.factory.post(self.url, data, format='json')
        force_authenticate(request, user=self.superuser)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertEqual(response.data['detail'],
                         'apiid: This field is required.')
        self.assertEqual(poem_models.Reports.objects.all().count(), 2)

    def test_post_report_invalid_data_regular_user(self):
        data = {'name': 'sla'}
        request = self.factory.post(self.url, data, format='json')
        force_authenticate(request, user=self.user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertEqual(response.data['detail'],
                         'apiid: This field is required.')
        self.assertEqual(poem_models.Reports.objects.all().count(), 2)

    def test_post_report_invalid_data_limited_user(self):
        data = {'name': 'sla'}
        request = self.factory.post(self.url, data, format='json')
        force_authenticate(request, user=self.limited_user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(response.data['detail'],
                         'You do not have permission to add reports.')
        self.assertEqual(poem_models.Reports.objects.all().count(), 2)

    def test_put_report_superuser(self):
        data = {
            'name': 'CriticalTest',
            'apiid': 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i',
            'groupname': 'ARGO',
            'description': 'Testing critical report.'
        }
        content, content_type = encode_data(data)
        request = self.factory.put(self.url,
                                   content,
                                   content_type=content_type)
        force_authenticate(request, user=self.superuser)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        report = poem_models.Reports.objects.get(
            apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i')
        self.assertEqual(report.name, 'CriticalTest')
        self.assertEqual(report.groupname, 'ARGO')
        self.assertEqual(report.description, 'Testing critical report.')
        group1 = poem_models.GroupOfReports.objects.get(name='TENANT')
        group2 = poem_models.GroupOfReports.objects.get(name='ARGO')
        self.assertEqual(group1.reports.all().count(), 0)
        self.assertEqual(group2.reports.all().count(), 1)
        self.assertTrue(
            group2.reports.filter(
                apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i').exists())

    def test_put_report_regular_user(self):
        data = {
            'name': 'CriticalTest',
            'apiid': 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i',
            'groupname': 'ARGO',
            'description': 'Testing critical report.'
        }
        content, content_type = encode_data(data)
        request = self.factory.put(self.url,
                                   content,
                                   content_type=content_type)
        force_authenticate(request, user=self.user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        report = poem_models.Reports.objects.get(
            apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i')
        self.assertEqual(report.name, 'CriticalTest')
        self.assertEqual(report.groupname, 'ARGO')
        self.assertEqual(report.description, 'Testing critical report.')
        group1 = poem_models.GroupOfReports.objects.get(name='TENANT')
        group2 = poem_models.GroupOfReports.objects.get(name='ARGO')
        self.assertEqual(group1.reports.all().count(), 0)
        self.assertEqual(group2.reports.all().count(), 1)
        self.assertTrue(
            group2.reports.filter(
                apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i').exists())

    def test_put_report_regular_user_wrong_group(self):
        data = {
            'name': 'CriticalTest',
            'apiid': 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i',
            'groupname': 'TEST',
            'description': 'Testing critical report.'
        }
        content, content_type = encode_data(data)
        request = self.factory.put(self.url,
                                   content,
                                   content_type=content_type)
        force_authenticate(request, user=self.user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(
            response.data['detail'],
            'You do not have permission to assign reports to the given group.')
        report = poem_models.Reports.objects.get(
            apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i')
        self.assertEqual(report.name, 'Critical')
        self.assertEqual(report.groupname, 'TENANT')
        self.assertEqual(report.description, 'Critical report')
        group1 = poem_models.GroupOfReports.objects.get(name='TENANT')
        group2 = poem_models.GroupOfReports.objects.get(name='ARGO')
        self.assertEqual(group1.reports.all().count(), 1)
        self.assertEqual(group2.reports.all().count(), 0)
        self.assertTrue(
            group1.reports.filter(
                apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i').exists())

    def test_put_report_regular_user_wrong_initial_group(self):
        report3 = poem_models.Reports.objects.create(
            name='ops-monitor-critical',
            apiid='juashu3i-533c-z9zi-lm6s-lei0ahlocei5',
            groupname='TEST')
        self.group.reports.add(report3)
        data = {
            'name': 'CriticalTest',
            'apiid': 'juashu3i-533c-z9zi-lm6s-lei0ahlocei5',
            'groupname': 'ARGO',
            'description': 'Testing critical report.'
        }
        content, content_type = encode_data(data)
        request = self.factory.put(self.url,
                                   content,
                                   content_type=content_type)
        force_authenticate(request, user=self.user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(
            response.data['detail'],
            'You do not have permission to change reports in this group.')
        report = poem_models.Reports.objects.get(
            apiid='juashu3i-533c-z9zi-lm6s-lei0ahlocei5')
        self.assertEqual(report.name, 'ops-monitor-critical')
        self.assertEqual(report.groupname, 'TEST')
        self.assertEqual(report.description, '')
        group1 = poem_models.GroupOfReports.objects.get(name='TEST')
        group2 = poem_models.GroupOfReports.objects.get(name='ARGO')
        self.assertEqual(group1.reports.all().count(), 1)
        self.assertEqual(group2.reports.all().count(), 0)
        self.assertTrue(
            group1.reports.filter(
                apiid='juashu3i-533c-z9zi-lm6s-lei0ahlocei5').exists())

    def test_put_report_limited_user(self):
        data = {
            'name': 'CriticalTest',
            'apiid': 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i',
            'groupname': 'ARGO',
            'description': 'Testing critical report.'
        }
        content, content_type = encode_data(data)
        request = self.factory.put(self.url,
                                   content,
                                   content_type=content_type)
        force_authenticate(request, user=self.limited_user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(response.data['detail'],
                         'You do not have permission to change reports.')
        report = poem_models.Reports.objects.get(
            apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i')
        self.assertEqual(report.name, 'Critical')
        self.assertEqual(report.groupname, 'TENANT')
        self.assertEqual(report.description, 'Critical report')
        group1 = poem_models.GroupOfReports.objects.get(name='TENANT')
        group2 = poem_models.GroupOfReports.objects.get(name='ARGO')
        self.assertEqual(group1.reports.all().count(), 1)
        self.assertEqual(group2.reports.all().count(), 0)
        self.assertTrue(
            group1.reports.filter(
                apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i').exists())

    def test_put_report_nonexisting_group_superuser(self):
        data = {
            'name': 'CriticalTest',
            'apiid': 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i',
            'groupname': 'nonexisting',
            'description': 'Testing critical report.'
        }
        content, content_type = encode_data(data)
        request = self.factory.put(self.url,
                                   content,
                                   content_type=content_type)
        force_authenticate(request, user=self.superuser)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
        self.assertEqual(response.data['detail'],
                         'Given group of reports does not exist.')
        report = poem_models.Reports.objects.get(
            apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i')
        self.assertEqual(report.name, 'Critical')
        self.assertEqual(report.groupname, 'TENANT')
        self.assertEqual(report.description, 'Critical report')
        group = poem_models.GroupOfReports.objects.get(name='TENANT')
        self.assertEqual(group.reports.all().count(), 1)
        self.assertTrue(
            group.reports.filter(
                apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i').exists())

    def test_put_report_nonexisting_group_regular_user(self):
        data = {
            'name': 'CriticalTest',
            'apiid': 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i',
            'groupname': 'nonexisting',
            'description': 'Testing critical report.'
        }
        content, content_type = encode_data(data)
        request = self.factory.put(self.url,
                                   content,
                                   content_type=content_type)
        force_authenticate(request, user=self.user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
        self.assertEqual(response.data['detail'],
                         'Given group of reports does not exist.')
        report = poem_models.Reports.objects.get(
            apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i')
        self.assertEqual(report.name, 'Critical')
        self.assertEqual(report.groupname, 'TENANT')
        self.assertEqual(report.description, 'Critical report')
        group = poem_models.GroupOfReports.objects.get(name='TENANT')
        self.assertEqual(group.reports.all().count(), 1)
        self.assertTrue(
            group.reports.filter(
                apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i').exists())

    def test_put_report_nonexisting_group_limited_user(self):
        data = {
            'name': 'CriticalTest',
            'apiid': 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i',
            'groupname': 'nonexisting',
            'description': 'Testing critical report.'
        }
        content, content_type = encode_data(data)
        request = self.factory.put(self.url,
                                   content,
                                   content_type=content_type)
        force_authenticate(request, user=self.limited_user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(response.data['detail'],
                         'You do not have permission to change reports.')
        report = poem_models.Reports.objects.get(
            apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i')
        self.assertEqual(report.name, 'Critical')
        self.assertEqual(report.groupname, 'TENANT')
        self.assertEqual(report.description, 'Critical report')
        group = poem_models.GroupOfReports.objects.get(name='TENANT')
        self.assertEqual(group.reports.all().count(), 1)
        self.assertTrue(
            group.reports.filter(
                apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i').exists())

    def test_put_report_without_description_superuser(self):
        data = {
            'name': 'Critical',
            'apiid': 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i',
            'groupname': 'ARGO',
            'description': ''
        }
        content, content_type = encode_data(data)
        request = self.factory.put(self.url,
                                   content,
                                   content_type=content_type)
        force_authenticate(request, user=self.superuser)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        report = poem_models.Reports.objects.get(
            apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i')
        self.assertEqual(report.name, 'Critical')
        self.assertEqual(report.groupname, 'ARGO')
        self.assertEqual(report.description, '')
        group1 = poem_models.GroupOfReports.objects.get(name='TENANT')
        group2 = poem_models.GroupOfReports.objects.get(name='ARGO')
        self.assertEqual(group1.reports.all().count(), 0)
        self.assertEqual(group2.reports.all().count(), 1)
        self.assertTrue(
            group2.reports.filter(
                apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i').exists())

    def test_put_report_without_description_regular_user(self):
        data = {
            'name': 'Critical',
            'apiid': 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i',
            'groupname': 'ARGO',
            'description': ''
        }
        content, content_type = encode_data(data)
        request = self.factory.put(self.url,
                                   content,
                                   content_type=content_type)
        force_authenticate(request, user=self.user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        report = poem_models.Reports.objects.get(
            apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i')
        self.assertEqual(report.name, 'Critical')
        self.assertEqual(report.groupname, 'ARGO')
        self.assertEqual(report.description, '')
        group1 = poem_models.GroupOfReports.objects.get(name='TENANT')
        group2 = poem_models.GroupOfReports.objects.get(name='ARGO')
        self.assertEqual(group1.reports.all().count(), 0)
        self.assertEqual(group2.reports.all().count(), 1)
        self.assertTrue(
            group2.reports.filter(
                apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i').exists())

    def test_put_report_without_description_regular_user_wrong_group(self):
        data = {
            'name': 'Critical',
            'apiid': 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i',
            'groupname': 'TEST',
            'description': ''
        }
        content, content_type = encode_data(data)
        request = self.factory.put(self.url,
                                   content,
                                   content_type=content_type)
        force_authenticate(request, user=self.user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(
            response.data['detail'],
            'You do not have permission to assign reports to the given group.')
        report = poem_models.Reports.objects.get(
            apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i')
        self.assertEqual(report.name, 'Critical')
        self.assertEqual(report.groupname, 'TENANT')
        self.assertEqual(report.description, 'Critical report')
        group1 = poem_models.GroupOfReports.objects.get(name='TENANT')
        group2 = poem_models.GroupOfReports.objects.get(name='TEST')
        self.assertEqual(group1.reports.all().count(), 1)
        self.assertEqual(group2.reports.all().count(), 0)
        self.assertTrue(
            group1.reports.filter(
                apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i').exists())

    def test_put_report_without_description_limited_user(self):
        data = {
            'name': 'Critical',
            'apiid': 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i',
            'groupname': 'ARGO',
            'description': ''
        }
        content, content_type = encode_data(data)
        request = self.factory.put(self.url,
                                   content,
                                   content_type=content_type)
        force_authenticate(request, user=self.limited_user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(response.data['detail'],
                         'You do not have permission to change reports.')
        report = poem_models.Reports.objects.get(
            apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i')
        self.assertEqual(report.name, 'Critical')
        self.assertEqual(report.groupname, 'TENANT')
        self.assertEqual(report.description, 'Critical report')
        group1 = poem_models.GroupOfReports.objects.get(name='TENANT')
        group2 = poem_models.GroupOfReports.objects.get(name='ARGO')
        self.assertEqual(group1.reports.all().count(), 1)
        self.assertEqual(group2.reports.all().count(), 0)
        self.assertTrue(
            group1.reports.filter(
                apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i').exists())

    def test_put_report_without_apiid_superuser(self):
        data = {
            'name': 'Critical',
            'apiid': '',
            'groupname': 'ARGO',
            'description': 'Testing critical report.'
        }
        content, content_type = encode_data(data)
        request = self.factory.put(self.url,
                                   content,
                                   content_type=content_type)
        force_authenticate(request, user=self.superuser)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertEqual(response.data['detail'], 'Apiid field undefined!')

    def test_put_report_without_apiid_regular_user(self):
        data = {
            'name': 'Critical',
            'apiid': '',
            'groupname': 'ARGO',
            'description': 'Testing critical report.'
        }
        content, content_type = encode_data(data)
        request = self.factory.put(self.url,
                                   content,
                                   content_type=content_type)
        force_authenticate(request, user=self.user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertEqual(response.data['detail'], 'Apiid field undefined!')

    def test_put_report_without_apiid_regular_user_wrong_group(self):
        data = {
            'name': 'Critical',
            'apiid': '',
            'groupname': 'TEST',
            'description': 'Testing critical report.'
        }
        content, content_type = encode_data(data)
        request = self.factory.put(self.url,
                                   content,
                                   content_type=content_type)
        force_authenticate(request, user=self.user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertEqual(response.data['detail'], 'Apiid field undefined!')

    def test_put_report_without_apiid_limited_user(self):
        data = {
            'name': 'Critical',
            'apiid': '',
            'groupname': 'TEST',
            'description': 'Testing critical report.'
        }
        content, content_type = encode_data(data)
        request = self.factory.put(self.url,
                                   content,
                                   content_type=content_type)
        force_authenticate(request, user=self.limited_user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(response.data['detail'],
                         'You do not have permission to change reports.')

    def test_put_report_with_missing_key_in_request_data_superuser(self):
        data = {
            'name': 'Critical',
            'apiid': 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i',
            'description': 'Testing critical report.'
        }
        content, content_type = encode_data(data)
        request = self.factory.put(self.url,
                                   content,
                                   content_type=content_type)
        force_authenticate(request, user=self.superuser)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertEqual(response.data['detail'],
                         'Missing data key: groupname')
        report = poem_models.Reports.objects.get(
            apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i')
        self.assertEqual(report.name, 'Critical')
        self.assertEqual(report.groupname, 'TENANT')
        self.assertEqual(report.description, 'Critical report')
        group = poem_models.GroupOfReports.objects.get(name='TENANT')
        self.assertEqual(group.reports.all().count(), 1)
        self.assertTrue(
            group.reports.filter(
                apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i').exists())

    def test_put_report_with_missing_key_in_request_data_regular_user(self):
        data = {
            'name': 'Critical',
            'apiid': 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i',
            'description': 'Testing critical report.'
        }
        content, content_type = encode_data(data)
        request = self.factory.put(self.url,
                                   content,
                                   content_type=content_type)
        force_authenticate(request, user=self.user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertEqual(response.data['detail'],
                         'Missing data key: groupname')
        report = poem_models.Reports.objects.get(
            apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i')
        self.assertEqual(report.name, 'Critical')
        self.assertEqual(report.groupname, 'TENANT')
        self.assertEqual(report.description, 'Critical report')
        group = poem_models.GroupOfReports.objects.get(name='TENANT')
        self.assertEqual(group.reports.all().count(), 1)
        self.assertTrue(
            group.reports.filter(
                apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i').exists())

    def test_put_report_with_missing_key_in_request_data_limited_user(self):
        data = {
            'name': 'Critical',
            'apiid': 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i',
            'description': 'Testing critical report.'
        }
        content, content_type = encode_data(data)
        request = self.factory.put(self.url,
                                   content,
                                   content_type=content_type)
        force_authenticate(request, user=self.limited_user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(response.data['detail'],
                         'You do not have permission to change reports.')
        report = poem_models.Reports.objects.get(
            apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i')
        self.assertEqual(report.name, 'Critical')
        self.assertEqual(report.groupname, 'TENANT')
        self.assertEqual(report.description, 'Critical report')
        group = poem_models.GroupOfReports.objects.get(name='TENANT')
        self.assertEqual(group.reports.all().count(), 1)
        self.assertTrue(
            group.reports.filter(
                apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i').exists())

    def test_delete_report_superuser(self):
        request = self.factory.delete(self.url +
                                      'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i')
        force_authenticate(request, user=self.superuser)
        response = self.view(request, 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i')
        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
        self.assertEqual(poem_models.Reports.objects.all().count(), 1)
        self.assertRaises(poem_models.Reports.DoesNotExist,
                          poem_models.Reports.objects.get,
                          apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i')

    def test_delete_report_regular_user(self):
        request = self.factory.delete(self.url +
                                      'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i')
        force_authenticate(request, user=self.user)
        response = self.view(request, 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i')
        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
        self.assertEqual(poem_models.Reports.objects.all().count(), 1)
        self.assertRaises(poem_models.Reports.DoesNotExist,
                          poem_models.Reports.objects.get,
                          apiid='yee9chel-5o4u-l4j4-410b-eipi3ohrah5i')

    def test_delete_report_regular_user_wrong_group(self):
        request = self.factory.delete(self.url +
                                      'bue2xius-ubt0-62ap-9nbn-ieta0kao8loa')
        force_authenticate(request, user=self.user)
        response = self.view(request, 'bue2xius-ubt0-62ap-9nbn-ieta0kao8loa')
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(
            response.data['detail'],
            'You do not have permission to delete reports assigned to this '
            'group.')
        self.assertEqual(poem_models.Reports.objects.all().count(), 2)

    def test_delete_report_limited_user(self):
        request = self.factory.delete(self.url +
                                      'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i')
        force_authenticate(request, user=self.limited_user)
        response = self.view(request, 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i')
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(response.data['detail'],
                         'You do not have permission to delete reports.')
        self.assertEqual(poem_models.Reports.objects.all().count(), 2)

    def test_delete_report_with_wrong_apiid_superuser(self):
        request = self.factory.delete(self.url + 'wrong_id')
        force_authenticate(request, user=self.superuser)
        response = self.view(request, 'wrong_id')
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
        self.assertEqual(response.data['detail'], 'Report not found')
        self.assertEqual(poem_models.Reports.objects.all().count(), 2)

    def test_delete_report_with_wrong_apiid_regular_user(self):
        request = self.factory.delete(self.url + 'wrong_id')
        force_authenticate(request, user=self.user)
        response = self.view(request, 'wrong_id')
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
        self.assertEqual(response.data['detail'], 'Report not found')
        self.assertEqual(poem_models.Reports.objects.all().count(), 2)

    def test_delete_report_with_wrong_apiid_limited_user(self):
        request = self.factory.delete(self.url + 'wrong_id')
        force_authenticate(request, user=self.limited_user)
        response = self.view(request, 'wrong_id')
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(response.data['detail'],
                         'You do not have permission to delete reports.')
        self.assertEqual(poem_models.Reports.objects.all().count(), 2)

    def test_delete_report_without_specifying_apiid_superuser(self):
        request = self.factory.delete(self.url)
        force_authenticate(request, user=self.superuser)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertEqual(response.data['detail'], 'Report not specified!')
        self.assertEqual(poem_models.Reports.objects.all().count(), 2)

    def test_delete_report_without_specifying_apiid_regular_user(self):
        request = self.factory.delete(self.url)
        force_authenticate(request, user=self.user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertEqual(response.data['detail'], 'Report not specified!')
        self.assertEqual(poem_models.Reports.objects.all().count(), 2)

    def test_delete_report_without_specifying_apiid_limited_user(self):
        request = self.factory.delete(self.url)
        force_authenticate(request, user=self.limited_user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(response.data['detail'],
                         'You do not have permission to delete reports.')
        self.assertEqual(poem_models.Reports.objects.all().count(), 2)
Example #10
0
 def setUp(self):
     self.factory = TenantRequestFactory(self.tenant)
     self.view = views.GetIsTenantSchema.as_view()
     self.url = '/api/v2/internal/istenantschema/'
Example #11
0
class GetSessionDetailsAPIViewTests(TenantTestCase):
    def setUp(self):
        self.factory = TenantRequestFactory(self.tenant)
        self.view = views.IsSessionActive.as_view()
        self.url = '/api/v2/internal/sessionactive/'
        self.user = CustUser.objects.create(username='******')

        self.userprofile = poem_models.UserProfile.objects.create(
            user=self.user,
            subject='subject',
            displayname='First_User',
            egiid='blablabla'
        )
        MyAPIKey.objects.create(
            id=1,
            name='WEB-API',
            prefix='foo',
            token='mocked_token_rw'
        )
        MyAPIKey.objects.create(
            id=2,
            name='WEB-API-RO',
            token='mocked_token_ro',
            prefix='bar'
        )

    def test_unauth(self):
        request = self.factory.get(self.url + 'true')
        response = self.view(request)
        self.assertEqual(response.status_code, 403)

    def test_auth_crud(self):
        gm = poem_models.GroupOfMetrics.objects.create(
            name='GROUP-metrics'
        )
        ga = poem_models.GroupOfAggregations.objects.create(
            name='GROUP-aggregations'
        )
        gmp = poem_models.GroupOfMetricProfiles.objects.create(
            name='GROUP-metricprofiles'
        )
        gtp = poem_models.GroupOfThresholdsProfiles.objects.create(
            name='GROUP-thresholds'
        )
        gr = poem_models.GroupOfReports.objects.create(name='GROUP-reports')

        self.userprofile.groupsofmetrics.add(gm)
        self.userprofile.groupsofaggregations.add(ga)
        self.userprofile.groupsofmetricprofiles.add(gmp)
        self.userprofile.groupsofthresholdsprofiles.add(gtp)
        self.userprofile.groupsofreports.add(gr)

        request = self.factory.get(self.url + 'true')
        force_authenticate(request, user=self.user)
        response = self.view(request, 'true')
        self.assertEqual(response.status_code, 200)
        self.assertTrue(response.data['active'])
        self.assertFalse(response.data['userdetails']['is_superuser'])
        self.assertEqual(response.data['userdetails']['username'], 'testuser')
        self.assertEqual(response.data['userdetails']['groups'], OrderedDict([
            ('aggregations', ['GROUP-aggregations']),
            ('metricprofiles', ['GROUP-metricprofiles']),
            ('metrics', ['GROUP-metrics']),
            ('reports', ['GROUP-reports']),
            ('thresholdsprofiles', ['GROUP-thresholds'])]
        ))
        self.assertEqual(
            response.data['userdetails']['token'], 'mocked_token_rw'
        )

    def test_auth_readonly(self):
        request = self.factory.get(self.url + 'true')
        force_authenticate(request, user=self.user)
        response = self.view(request, 'true')
        self.assertEqual(
            response.data['userdetails']['token'], 'mocked_token_ro'
        )
Example #12
0
 def setUp(self):
     self.factory = TenantRequestFactory(self.tenant)
     self.view = views.GetConfigOptions.as_view()
     self.url = '/api/v2/internal/config_options/'
     self.user = CustUser.objects.create(username='******')
Example #13
0
class ListGroupsForUserAPIViewTests(TenantTestCase):
    def setUp(self):
        self.factory = TenantRequestFactory(self.tenant)
        self.view = views.ListGroupsForUser.as_view()
        self.url = '/api/v2/internal/groups/'
        self.user = CustUser.objects.create_user(username='******')
        self.superuser = CustUser.objects.create_user(
            username='******', is_superuser=True
        )

        poem_models.GroupOfMetrics.objects.create(name='metricgroup1')
        gm1 = poem_models.GroupOfMetrics.objects.create(name='metricgroup2')

        poem_models.GroupOfMetricProfiles.objects.create(
            name='metricprofilegroup1'
        )
        gmp1 = poem_models.GroupOfMetricProfiles.objects.create(
            name='metricprofilegroup2'
        )

        poem_models.GroupOfAggregations.objects.create(name='aggrgroup1')
        ga1 = poem_models.GroupOfAggregations.objects.create(name='aggrgroup2')

        poem_models.GroupOfThresholdsProfiles.objects.create(
            name='thresholdsgroup1'
        )
        gtp1 = poem_models.GroupOfThresholdsProfiles.objects.create(
            name='thresholdsgroup2'
        )

        poem_models.GroupOfReports.objects.create(name='reportsgroup1')
        gr = poem_models.GroupOfReports.objects.create(name='reportsgroup2')

        userprofile = poem_models.UserProfile.objects.create(user=self.user)
        userprofile.groupsofmetrics.add(gm1)
        userprofile.groupsofmetricprofiles.add(gmp1)
        userprofile.groupsofaggregations.add(ga1)
        userprofile.groupsofthresholdsprofiles.add(gtp1)
        userprofile.groupsofreports.add(gr)

    def test_list_all_groups(self):
        request = self.factory.get(self.url)
        force_authenticate(request, user=self.superuser)
        response = self.view(request)
        self.assertEqual(
            response.data,
            {
                'result': {
                    'aggregations': ['aggrgroup1', 'aggrgroup2'],
                    'metrics': ['metricgroup1', 'metricgroup2'],
                    'metricprofiles': ['metricprofilegroup1',
                                       'metricprofilegroup2'],
                    'reports': ['reportsgroup1', 'reportsgroup2'],
                    'thresholdsprofiles': ['thresholdsgroup1',
                                           'thresholdsgroup2']
                }
            }
        )

    def test_list_groups_for_user_that_is_not_superuser(self):
        request = self.factory.get(self.url)
        force_authenticate(request, user=self.user)
        response = self.view(request)
        self.assertEqual(
            response.data,
            {
                'result': {
                    'aggregations': ['aggrgroup2'],
                    'metrics': ['metricgroup2'],
                    'metricprofiles': ['metricprofilegroup2'],
                    'reports': ['reportsgroup2'],
                    'thresholdsprofiles': ['thresholdsgroup2']
                }
            }
        )

    def test_get_aggregation_groups_for_superuser(self):
        request = self.factory.get(self.url + 'aggregations')
        force_authenticate(request, user=self.superuser)
        response = self.view(request, 'aggregations')
        self.assertEqual(
            response.data,
            ['aggrgroup1', 'aggrgroup2']
        )

    def test_get_metric_groups_for_superuser(self):
        request = self.factory.get(self.url + 'metrics')
        force_authenticate(request, user=self.superuser)
        response = self.view(request, 'metrics')
        self.assertEqual(
            response.data,
            ['metricgroup1', 'metricgroup2']
        )

    def test_get_metric_profile_groups_for_superuser(self):
        request = self.factory.get(self.url + 'metricprofiles')
        force_authenticate(request, user=self.superuser)
        response = self.view(request, 'metricprofiles')
        self.assertEqual(
            response.data,
            ['metricprofilegroup1', 'metricprofilegroup2']
        )

    def test_get_thresholds_profiles_groups_for_superuser(self):
        request = self.factory.get(self.url + 'thresholdsprofiles')
        force_authenticate(request, user=self.superuser)
        response = self.view(request, 'thresholdsprofiles')
        self.assertEqual(
            response.data,
            ['thresholdsgroup1', 'thresholdsgroup2']
        )

    def test_get_aggregation_groups_for_basic_user(self):
        request = self.factory.get(self.url + 'aggregations')
        force_authenticate(request, user=self.user)
        response = self.view(request, 'aggregations')
        self.assertEqual(
            response.data,
            ['aggrgroup2']
        )

    def test_get_metric_groups_for_basic_user(self):
        request = self.factory.get(self.url + 'metrics')
        force_authenticate(request, user=self.user)
        response = self.view(request, 'metrics')
        self.assertEqual(
            response.data,
            ['metricgroup2']
        )

    def test_get_metric_profile_groups_for_basic_user(self):
        request = self.factory.get(self.url + 'metricprofiles')
        force_authenticate(request, user=self.user)
        response = self.view(request, 'metricprofiles')
        self.assertEqual(
            response.data,
            ['metricprofilegroup2']
        )

    def test_get_thresholds_profiles_groups_for_basic_user(self):
        request = self.factory.get(self.url + 'thresholdsprofiles')
        force_authenticate(request, user=self.user)
        response = self.view(request, 'thresholdsprofiles')
        self.assertEqual(
            response.data,
            ['thresholdsgroup2']
        )
Example #14
0
class ListTenantsTests(TenantTestCase):
    def setUp(self) -> None:
        self.factory = TenantRequestFactory(self.tenant)
        self.view = views.ListTenants.as_view()
        self.url = '/api/v2/internal/tenants/'
        self.user = CustUser.objects.create_user(username='******')
        # get_tenant_domain_model().objects.create(
        #     domain='test.domain.url', tenant=self.tenant, is_primary=True
        # )

        with schema_context(get_public_schema_name()):
            self.tenant1 = Tenant(name='TEST1', schema_name='test1')
            self.tenant1.auto_create_schema = False

            self.tenant2 = Tenant(name='TEST2', schema_name='test2')
            self.tenant2.auto_create_schema = False

            self.tenant3 = Tenant(
                name='all',
                schema_name=get_public_schema_name(),
            )
            self.tenant3.auto_create_schema = False

            self.tenant1.save()
            self.tenant2.save()
            self.tenant3.save()
            get_tenant_domain_model().objects.create(domain='test1.domain.url',
                                                     tenant=self.tenant1,
                                                     is_primary=True)
            get_tenant_domain_model().objects.create(domain='test2.domain.url',
                                                     tenant=self.tenant2,
                                                     is_primary=True)
            get_tenant_domain_model().objects.create(domain='domain.url',
                                                     tenant=self.tenant3,
                                                     is_primary=True)
            self.supertenant_superuser = CustUser.objects.create_user(
                username='******', is_superuser=True)
            self.supertenant_user = CustUser.objects.create_user(
                username='******')

    def test_get_tenants_no_auth(self):
        request = self.factory.get(self.url)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)

    @patch('Poem.api.internal_views.tenants.get_tenant_resources')
    def test_get_all_tenants(self, mock_resources):
        mock_resources.side_effect = mock_tenant_resources
        request = self.factory.get(self.url)
        force_authenticate(request, user=self.user)
        response = self.view(request)
        self.assertEqual(mock_resources.call_count, 4)
        self.assertEqual(response.data, [{
            'name':
            self.tenant.name,
            'schema_name':
            self.tenant.schema_name,
            'domain_url':
            'tenant.test.com',
            'created_on':
            datetime.date.strftime(self.tenant.created_on, '%Y-%m-%d'),
            'nr_metrics':
            24,
            'nr_probes':
            15
        }, {
            'name':
            'SuperPOEM Tenant',
            'schema_name':
            get_public_schema_name(),
            'domain_url':
            'domain.url',
            'created_on':
            datetime.date.strftime(self.tenant3.created_on, '%Y-%m-%d'),
            'nr_metrics':
            354,
            'nr_probes':
            111
        }, {
            'name':
            'TEST1',
            'domain_url':
            'test1.domain.url',
            'schema_name':
            'test1',
            'created_on':
            datetime.date.strftime(self.tenant1.created_on, '%Y-%m-%d'),
            'nr_metrics':
            30,
            'nr_probes':
            10
        }, {
            'name':
            'TEST2',
            'domain_url':
            'test2.domain.url',
            'schema_name':
            'test2',
            'created_on':
            datetime.date.strftime(self.tenant2.created_on, '%Y-%m-%d'),
            'nr_metrics':
            50,
            'nr_probes':
            30
        }])

    @patch('Poem.api.internal_views.tenants.get_tenant_resources')
    def test_get_tenant_by_name(self, mock_resources):
        mock_resources.return_value = {'metrics': 24, 'probes': 15}
        request = self.factory.get(self.url + 'TEST1')
        force_authenticate(request, user=self.user)
        response = self.view(request, 'TEST1')
        self.assertEqual(
            response.data, {
                'name':
                'TEST1',
                'domain_url':
                'test1.domain.url',
                'schema_name':
                'test1',
                'created_on':
                datetime.date.strftime(self.tenant1.created_on, '%Y-%m-%d'),
                'nr_metrics':
                24,
                'nr_probes':
                15
            })
        mock_resources.assert_called_once_with('test1')

    @patch('Poem.api.internal_views.tenants.get_tenant_resources')
    def test_get_public_schema_tenant_by_name(self, mock_resources):
        mock_resources.return_value = {'metric_templates': 354, 'probes': 112}
        request = self.factory.get(self.url + 'SuperPOEM_Tenant')
        force_authenticate(request, user=self.user)
        response = self.view(request, 'SuperPOEM_Tenant')
        self.assertEqual(
            response.data, {
                'name':
                'SuperPOEM Tenant',
                'domain_url':
                'domain.url',
                'schema_name':
                get_public_schema_name(),
                'created_on':
                datetime.date.strftime(self.tenant1.created_on, '%Y-%m-%d'),
                'nr_metrics':
                354,
                'nr_probes':
                112
            })
        mock_resources.assert_called_once_with(get_public_schema_name())

    @patch('Poem.api.internal_views.tenants.get_tenant_resources')
    def test_get_tenant_by_nonexisting_name(self, mock_resources):
        request = self.factory.get(self.url + 'nonexisting')
        force_authenticate(request, user=self.user)
        response = self.view(request, 'nonexisting')
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
        self.assertEqual(response.data['detail'], 'Tenant not found.')
        self.assertFalse(mock_resources.called)

    def test_delete_tenant(self):
        self.assertEqual(Tenant.objects.all().count(), 4)
        request = self.factory.delete(self.url + 'TEST1')
        request.tenant = self.tenant3
        connection.set_schema_to_public()
        force_authenticate(request, user=self.supertenant_superuser)
        response = self.view(request, 'TEST1')
        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
        self.assertEqual(Tenant.objects.all().count(), 3)
        self.assertRaises(Tenant.DoesNotExist,
                          Tenant.objects.get,
                          name='TEST1')

    def test_delete_tenant_when_not_public_schema(self):
        self.assertEqual(Tenant.objects.all().count(), 4)
        request = self.factory.delete(self.url + 'TEST1')
        request.tenant = self.tenant
        force_authenticate(request, user=self.user)
        response = self.view(request, 'TEST1')
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
        self.assertEqual(response.data['detail'],
                         'Cannot delete tenant outside public schema.')
        self.assertEqual(Tenant.objects.all().count(), 4)

    def test_delete_tenant_when_not_superuser(self):
        self.assertEqual(Tenant.objects.all().count(), 4)
        request = self.factory.delete(self.url + 'TEST1')
        request.tenant = self.tenant3
        force_authenticate(request, user=self.supertenant_user)
        response = self.view(request, 'TEST1')
        self.assertEqual(Tenant.objects.all().count(), 4)
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(response.data['detail'],
                         'You do not have permission to delete tenants.')

    def test_delete_tenant_without_name(self):
        self.assertEqual(Tenant.objects.all().count(), 4)
        request = self.factory.delete(self.url)
        request.tenant = self.tenant3
        force_authenticate(request, user=self.supertenant_superuser)
        response = self.view(request)
        self.assertEqual(Tenant.objects.all().count(), 4)
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertEqual(response.data['detail'],
                         'Tenant name should be specified.')

    def test_delete_nonexisting_tenant(self):
        self.assertEqual(Tenant.objects.all().count(), 4)
        request = self.factory.delete(self.url + 'nonexisting')
        request.tenant = self.tenant3
        force_authenticate(request, user=self.supertenant_superuser)
        response = self.view(request, 'nonexisting')
        self.assertEqual(Tenant.objects.all().count(), 4)
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
        self.assertEqual(response.data['detail'], 'Tenant not found.')
Example #15
0
class ListAPIKeysAPIViewTests(TenantTestCase):
    def setUp(self):
        self.factory = TenantRequestFactory(self.tenant)
        self.view = views.ListAPIKeys.as_view()
        self.url = '/api/v2/internal/apikeys/'
        self.user = CustUser.objects.create_user(username='******',
                                                 is_superuser=True)
        self.regular_user = CustUser.objects.create_user(username='******')
        self.poor_user = CustUser.objects.create_user(username='******')

        group1 = poem_models.GroupOfAggregations.objects.create(name='TEST')
        group2 = poem_models.GroupOfMetrics.objects.create(name='TEST')
        userprofile = poem_models.UserProfile.objects.create(
            user=self.regular_user)
        userprofile.groupsofaggregations.add(group1)
        userprofile.groupsofmetrics.add(group2)

        poem_models.UserProfile.objects.create(user=self.user)
        poem_models.UserProfile.objects.create(user=self.poor_user)

        key1, k1 = MyAPIKey.objects.create_key(name='EGI')
        self.id1 = key1.id
        self.token1 = key1.token
        self.created1 = datetime.datetime.strftime(key1.created,
                                                   '%Y-%m-%d %H:%M:%S')
        key2, k2 = MyAPIKey.objects.create_key(name='EUDAT')
        self.id2 = key2.id
        self.token2 = key2.token
        self.created2 = datetime.datetime.strftime(key2.created,
                                                   '%Y-%m-%d %H:%M:%S')
        key3, k3 = MyAPIKey.objects.create_key(name='DELETABLE')
        self.id3 = key3.id
        self.token3 = key3.token
        self.created3 = datetime.datetime.strftime(key3.created,
                                                   '%Y-%m-%d %H:%M:%S')

        key4, k4 = MyAPIKey.objects.create_key(name='WEB-API')
        self.id4 = key4.id
        self.token4 = key4.token
        self.created4 = datetime.datetime.strftime(key4.created,
                                                   '%Y-%m-%d %H:%M:%S')

        key5, k5 = MyAPIKey.objects.create_key(name='WEB-API-RO')
        self.id5 = key5.id
        self.token5 = key5.token
        self.created5 = datetime.datetime.strftime(key5.created,
                                                   '%Y-%m-%d %H:%M:%S')

    def test_permission_denied_in_case_no_authorization(self):
        request = self.factory.get(self.url)
        request.tenant = self.tenant
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)

    def test_get_list_of_apikeys(self):
        request = self.factory.get(self.url)
        request.tenant = self.tenant
        force_authenticate(request, user=self.user)
        response = self.view(request)
        self.assertEqual(response.data, [{
            'id': self.id3,
            'name': 'DELETABLE',
            'created': self.created3,
            'revoked': False
        }, {
            'id': self.id1,
            'name': 'EGI',
            'created': self.created1,
            'revoked': False
        }, {
            'id': self.id2,
            'name': 'EUDAT',
            'created': self.created2,
            'revoked': False
        }, {
            'id': self.id4,
            'name': 'WEB-API',
            'created': self.created4,
            'revoked': False
        }, {
            'id': self.id5,
            'name': 'WEB-API-RO',
            'created': self.created5,
            'revoked': False
        }])

    def test_get_list_of_apikeys_regular_user_with_some_permissions(self):
        request = self.factory.get(self.url)
        request.tenant = self.tenant
        force_authenticate(request, user=self.regular_user)
        response = self.view(request)
        self.assertEqual(response.data, [{
            'id': self.id4,
            'name': 'WEB-API',
            'created': self.created4,
            'revoked': False
        }, {
            'id': self.id5,
            'name': 'WEB-API-RO',
            'created': self.created5,
            'revoked': False
        }])

    def test_get_list_of_apikeys_regular_user_with_no_permissions(self):
        request = self.factory.get(self.url)
        request.tenant = self.tenant
        force_authenticate(request, user=self.poor_user)
        response = self.view(request)
        self.assertEqual(response.data, [{
            'id': self.id4,
            'name': 'WEB-API',
            'created': self.created4,
            'revoked': False
        }, {
            'id': self.id5,
            'name': 'WEB-API-RO',
            'created': self.created5,
            'revoked': False
        }])

    def test_get_apikey_for_given_name(self):
        request = self.factory.get(self.url + 'EGI')
        request.tenant = self.tenant
        force_authenticate(request, user=self.user)
        response = self.view(request, 'EGI')
        self.assertEqual(
            response.data, {
                'id': self.id1,
                'name': 'EGI',
                'token': self.token1,
                'created': self.created1,
                'revoked': False
            })

    def test_get_apikey_for_given_name_regular_user(self):
        request = self.factory.get(self.url + 'EGI')
        request.tenant = self.tenant
        force_authenticate(request, user=self.regular_user)
        response = self.view(request, 'EGI')
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(
            response.data['detail'],
            'You do not have permission for fetching this API key.')

    def test_get_apikey_for_given_name_regular_user_without_permissions(self):
        request = self.factory.get(self.url + 'EGI')
        request.tenant = self.tenant
        force_authenticate(request, user=self.poor_user)
        response = self.view(request, 'EGI')
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(
            response.data['detail'],
            'You do not have permission for fetching this API key.')

    def test_get_apikey_for_webapi_name_regular_user(self):
        request = self.factory.get(self.url + 'WEB-API')
        request.tenant = self.tenant
        force_authenticate(request, user=self.regular_user)
        response = self.view(request, 'WEB-API')
        self.assertEqual(
            response.data, {
                'id': self.id4,
                'name': 'WEB-API',
                'token': self.token4,
                'created': self.created4,
                'revoked': False
            })

    def test_get_apikey_for_webapi_name_regular_user_without_permissions(self):
        request = self.factory.get(self.url + 'WEB-API')
        request.tenant = self.tenant
        force_authenticate(request, user=self.poor_user)
        response = self.view(request, 'WEB-API')
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(
            response.data['detail'],
            'You do not have permission for fetching this API key.')

    def test_get_apikey_for_webapi_ro_name_regular_user_without_perms(self):
        request = self.factory.get(self.url + 'WEB-API-RO')
        request.tenant = self.tenant
        force_authenticate(request, user=self.poor_user)
        response = self.view(request, 'WEB-API-RO')
        self.assertEqual(
            response.data, {
                'id': self.id5,
                'name': 'WEB-API-RO',
                'token': self.token5,
                'created': self.created5,
                'revoked': False
            })

    def test_put_apikey(self):
        data = {'id': self.id1, 'name': 'EGI2', 'revoked': False}
        content, content_type = encode_data(data)
        request = self.factory.put(self.url,
                                   content,
                                   content_type=content_type)
        force_authenticate(request, user=self.user)
        response = self.view(request)
        changed_entry = MyAPIKey.objects.get(id=self.id1)
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.assertEqual('EGI2', changed_entry.name)

    def test_put_apikey_regular_user(self):
        data = {'id': self.id1, 'name': 'EGI2', 'revoked': False}
        content, content_type = encode_data(data)
        request = self.factory.put(self.url,
                                   content,
                                   content_type=content_type)
        force_authenticate(request, user=self.regular_user)
        response = self.view(request)
        changed_entry = MyAPIKey.objects.get(id=self.id1)
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(response.data['detail'],
                         'You do not have permission to change API keys.')
        self.assertEqual(changed_entry.name, 'EGI')
        self.assertFalse(changed_entry.revoked)

    def test_put_apikey_without_changing_name(self):
        data = {'id': self.id1, 'name': 'EGI', 'revoked': True}
        content, content_type = encode_data(data)
        request = self.factory.put(self.url,
                                   content,
                                   content_type=content_type)
        force_authenticate(request, user=self.user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        key = MyAPIKey.objects.get(id=self.id1)
        self.assertEqual(key.name, 'EGI')
        self.assertTrue(key.revoked)

    def test_put_apikey_without_changing_name_regular_user(self):
        data = {'id': self.id1, 'name': 'EGI', 'revoked': True}
        content, content_type = encode_data(data)
        request = self.factory.put(self.url,
                                   content,
                                   content_type=content_type)
        force_authenticate(request, user=self.regular_user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(response.data['detail'],
                         'You do not have permission to change API keys.')
        key = MyAPIKey.objects.get(id=self.id1)
        self.assertEqual(key.name, 'EGI')
        self.assertFalse(key.revoked)

    def test_put_apikey_with_name_that_already_exists(self):
        data = {'id': self.id1, 'name': 'EUDAT', 'revoked': False}
        content, content_type = encode_data(data)
        request = self.factory.put(self.url,
                                   content,
                                   content_type=content_type)
        force_authenticate(request, user=self.user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertEqual(response.data['detail'],
                         'API key with this name already exists')

    def test_put_apikey_with_name_that_already_exists_regular_user(self):
        data = {'id': self.id1, 'name': 'EUDAT', 'revoked': False}
        content, content_type = encode_data(data)
        request = self.factory.put(self.url,
                                   content,
                                   content_type=content_type)
        force_authenticate(request, user=self.regular_user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(response.data['detail'],
                         'You do not have permission to change API keys.')

    def test_post_apikey(self):
        data = {'name': 'test', 'revoked': False}
        request = self.factory.post(self.url, data, format='json')
        force_authenticate(request, user=self.user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.assertEqual(len(MyAPIKey.objects.all()), 6)

    def test_post_apikey_regular_user(self):
        data = {'name': 'test', 'revoked': False}
        request = self.factory.post(self.url, data, format='json')
        force_authenticate(request, user=self.regular_user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(response.data['detail'],
                         'You do not have permission to add API keys.')
        self.assertEqual(len(MyAPIKey.objects.all()), 5)

    def test_post_apikey_name_already_exists(self):
        data = {'name': 'EUDAT', 'revoked': False}
        request = self.factory.post(self.url, data, format='json')
        force_authenticate(request, user=self.user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertEqual(response.data['detail'],
                         'API key with this name already exists')
        self.assertEqual(len(MyAPIKey.objects.all()), 5)

    def test_post_apikey_name_already_exists_regular_user(self):
        data = {'name': 'EUDAT', 'revoked': False}
        request = self.factory.post(self.url, data, format='json')
        force_authenticate(request, user=self.regular_user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(response.data['detail'],
                         'You do not have permission to add API keys.')
        self.assertEqual(len(MyAPIKey.objects.all()), 5)

    def test_delete_apikey(self):
        request = self.factory.delete(self.url + 'DELETABLE')
        force_authenticate(request, user=self.user)
        response = self.view(request, 'DELETABLE')
        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
        keys = MyAPIKey.objects.all().values_list('name', flat=True)
        self.assertEqual(len(keys), 4)
        self.assertFalse('DELETABLE' in keys)

    def test_delete_apikey_regular_user(self):
        request = self.factory.delete(self.url + 'DELETABLE')
        force_authenticate(request, user=self.regular_user)
        response = self.view(request, 'DELETABLE')
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(response.data['detail'],
                         'You do not have permission to delete API keys.')
        keys = MyAPIKey.objects.all().values_list('name', flat=True)
        self.assertEqual(len(keys), 5)
        self.assertTrue('DELETABLE' in keys)

    def test_delete_nonexisting_apikey(self):
        request = self.factory.delete(self.url + 'nonexisting')
        force_authenticate(request, user=self.user)
        response = self.view(request, 'nonexisting')
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
        self.assertEqual(response.data['detail'], 'API key not found')
        keys = MyAPIKey.objects.all().values_list('name', flat=True)
        self.assertEqual(len(keys), 5)

    def test_delete_nonexisting_apikey_regular_user(self):
        request = self.factory.delete(self.url + 'nonexisting')
        force_authenticate(request, user=self.regular_user)
        response = self.view(request, 'nonexisting')
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(response.data['detail'],
                         'You do not have permission to delete API keys.')
        keys = MyAPIKey.objects.all().values_list('name', flat=True)
        self.assertEqual(len(keys), 5)

    def test_delete_no_apikey_name(self):
        request = self.factory.delete(self.url)
        force_authenticate(request, user=self.user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
        self.assertEqual(response.data['detail'],
                         'API key name must be defined')

    def test_delete_no_apikey_name_regular_user(self):
        request = self.factory.delete(self.url)
        force_authenticate(request, user=self.regular_user)
        response = self.view(request)
        self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
        self.assertEqual(response.data['detail'],
                         'You do not have permission to delete API keys.')