Ejemplo n.º 1
0
 def create_relations(self):
     self.relation1 = CIRelation(
         parent=self.ci1,
         child=self.ci2,
         type=CI_RELATION_TYPES.CONTAINS,
     )
     self.relation1.save()
     self.relation2 = CIRelation(
         parent=self.ci2,
         child=self.ci3,
         type=CI_RELATION_TYPES.HASROLE,
     )
     self.relation2.save()
Ejemplo n.º 2
0
 def create_relations(self):
     self.relation1 = CIRelation(
         parent=self.ci1,
         child=self.ci2,
         type=CI_RELATION_TYPES.CONTAINS,
     )
     self.relation1.save()
     self.relation2 = CIRelation(
         parent=self.ci2,
         child=self.ci3,
         type=CI_RELATION_TYPES.HASROLE,
     )
     self.relation2.save()
Ejemplo n.º 3
0
 def setUp(self):
     self.client = login_as_su()
     self.service = CI(name='allegro.pl',
                       type=CIType.objects.get(id=CI_TYPES.SERVICE))
     self.service.save()
     self.db_service = CI.objects.get(id=self.service.id)
     self.venture = CI(name='allegro_prod',
                       type=CIType.objects.get(id=CI_TYPES.VENTURE))
     self.venture.save()
     self.ci_venture = CI.objects.get(id=self.venture.id)
     self.relation = CIRelation(
         parent=self.ci_venture,
         child=self.db_service,
         type=CI_RELATION_TYPES.CONTAINS,
     )
     self.relation.save()
Ejemplo n.º 4
0
 def setUp(self):
     self.client = login_as_su()
     self.service = CI(
         name='allegro.pl',
         type=CIType.objects.get(id=CI_TYPES.SERVICE)
     )
     self.service.save()
     self.db_service = CI.objects.get(id=self.service.id)
     self.venture = CI(
         name='allegro_prod',
         type=CIType.objects.get(id=CI_TYPES.VENTURE)
     )
     self.venture.save()
     self.ci_venture = CI.objects.get(id=self.venture.id)
     self.relation = CIRelation(
         parent=self.ci_venture,
         child=self.db_service,
         type=CI_RELATION_TYPES.CONTAINS,
     )
     self.relation.save()
Ejemplo n.º 5
0
class ReportsServicesTest(TestCase):
    fixtures = [
        '0_types.yaml',
        '1_attributes.yaml',
        '2_layers.yaml',
        '3_prefixes.yaml'
    ]

    def setUp(self):
        self.client = login_as_su()
        self.service = CI(
            name='allegro.pl',
            type=CIType.objects.get(id=CI_TYPES.SERVICE)
        )
        self.service.save()
        self.db_service = CI.objects.get(id=self.service.id)
        self.venture = CI(
            name='allegro_prod',
            type=CIType.objects.get(id=CI_TYPES.VENTURE)
        )
        self.venture.save()
        self.ci_venture = CI.objects.get(id=self.venture.id)
        self.relation = CIRelation(
            parent=self.ci_venture,
            child=self.db_service,
            type=CI_RELATION_TYPES.CONTAINS,
        )
        self.relation.save()

    def test_user_login(self):
        self.assertTrue(self.client)

    def test_reports_devices(self):
        self.assertEqual(self.service.name, 'allegro.pl')
        self.assertEqual(self.db_service.name, self.service.name)

    def test_reports_venture(self):
        self.assertEqual(self.venture.name, 'allegro_prod')
        self.assertEqual(self.ci_venture.name, self.venture.name)

    def test_reports_relation(self):
        self.assertEqual(self.relation.child.type_id, CI_TYPES.SERVICE)
        self.assertEqual(self.relation.parent.type_id, CI_TYPES.VENTURE)
        self.assertNotEqual(self.relation.child.type_id, CI_TYPES.VENTURE)

    def test_reports_views(self):
        url = '/ui/reports/services/'
        report = self.client.get(url, follow=True)
        self.assertEqual(report.status_code, 200)
        invalid_relation = report.context['invalid_relation']
        services_without_venture = report.context['services_without_venture']
        self.assertEqual(invalid_relation[0].name, 'allegro.pl')
        self.assertEqual(len(invalid_relation), 1)
        self.assertEqual(len(services_without_venture), 0)
        # local service for tests
        service = CI(name='ceneo.pl', type=CIType.objects.get(
            id=CI_TYPES.SERVICE)
        )
        service.save()
        # local venture for tests
        venture = CI(name='allegro_prod', type=CIType.objects.get(
            id=CI_TYPES.VENTURE)
        )
        venture.save()
        reload_report = self.client.get(url, follow=True)
        re_invalid_relation = reload_report.context['invalid_relation']
        re_services_without_venture = reload_report.context['services_without_venture']
        self.assertEqual(len(re_invalid_relation), 1)
        self.assertEqual(len(re_services_without_venture), 0)
Ejemplo n.º 6
0
class TestReportsServices(TestCase):
    fixtures = [
        '0_types.yaml',
        '1_attributes.yaml',
        '2_layers.yaml',
        '3_prefixes.yaml'
    ]

    def setUp(self):
        self.client = login_as_su()
        self.service = CI(
            name='allegro.pl',
            type=CIType.objects.get(id=CI_TYPES.SERVICE)
        )
        self.service.save()
        self.db_service = CI.objects.get(id=self.service.id)
        self.venture = CI(
            name='allegro_prod',
            type=CIType.objects.get(id=CI_TYPES.VENTURE)
        )
        self.venture.save()
        self.ci_venture = CI.objects.get(id=self.venture.id)
        self.relation = CIRelation(
            parent=self.ci_venture,
            child=self.db_service,
            type=CI_RELATION_TYPES.CONTAINS,
        )
        self.relation.save()

    def test_user_login(self):
        self.assertTrue(self.client)

    def test_reports_devices(self):
        self.assertEqual(self.service.name, 'allegro.pl')
        self.assertEqual(self.db_service.name, self.service.name)

    def test_reports_venture(self):
        self.assertEqual(self.venture.name, 'allegro_prod')
        self.assertEqual(self.ci_venture.name, self.venture.name)

    def test_reports_relation(self):
        self.assertEqual(self.relation.child.type_id, CI_TYPES.SERVICE)
        self.assertEqual(self.relation.parent.type_id, CI_TYPES.VENTURE)
        self.assertNotEqual(self.relation.child.type_id, CI_TYPES.VENTURE)

    def test_reports_client(self):
        url = '/ui/reports/services/'
        report = self.client.get(url, follow=True)
        self.assertEqual(report.status_code, 200)
        invalid_relation = report.context['invalid_relation']
        serv_without_ven = report.context['serv_without_ven']
        self.assertEqual(invalid_relation[0].name, 'allegro.pl')
        self.assertEqual(len(invalid_relation), 1)
        self.assertEqual(len(serv_without_ven), 0)
        # local service for tests
        service = CI(name='ceneo.pl', type=CIType.objects.get(
            id=CI_TYPES.SERVICE)
        )
        service.save()
        # local venture for tests
        venture = CI(name='allegro_prod', type=CIType.objects.get(
            id=CI_TYPES.VENTURE)
        )
        venture.save()
        reload_report = self.client.get(url, follow=True)
        re_invalid_relation = reload_report.context['invalid_relation']
        re_serv_without_ven = reload_report.context['serv_without_ven']
        self.assertEqual(len(re_invalid_relation), 1)
        self.assertEqual(len(re_serv_without_ven), 1)
Ejemplo n.º 7
0
class CMDBApiTest(TestCase):
    def setUp(self):
        self.user = create_user('api_user', '*****@*****.**', 'password')
        self.layers = CILayer.objects.all()
        self.types = CIType.objects.all()
        self.create_owners()
        self.create_cis()
        self.create_ownerships()
        self.create_relations()
        self.data = {
            'format': 'json',
            'username': self.user.username,
            'api_key': self.user.api_key.key
        }
        cache.delete("api_user_accesses")

    def create_owners(self):
        self.owner1 = CIOwner(
            first_name='first_name_owner1',
            last_name='last_name_owner1',
            email='*****@*****.**',
        )
        self.owner1.save()
        self.owner2 = CIOwner(
            first_name='first_name_owner2',
            last_name='last_name_owner2',
            email='*****@*****.**',
        )
        self.owner2.save()

    def create_cis(self):
        self.ci1 = CI(
            uid='uid-ci1',
            type=self.types[0],
            barcode='barcodeci1',
            name='ciname1',
        )
        self.ci1.save()
        self.ci1.layers = [self.layers[0].id, self.layers[1].id]
        self.ci1.save()
        self.ci2 = CI(
            uid='uid-ci2',
            type=self.types[1],
            barcode='barcodeci2',
            name='ciname2',
        )
        self.ci2.save()
        self.ci2.layers = [self.layers[0].id]
        self.ci2.save()
        self.ci3 = CI(
            uid='other-ci3',
            type=self.types[1],
            barcode='otherbarcodeci3',
            name='otherci',
        )
        self.ci3.save()
        self.ci3.layers = [self.layers[1].id]
        self.ci3.save()

    def create_ownerships(self):
        self.ciownership1 = CIOwnership(
            ci=self.ci1,
            owner=self.owner1,
            type=CIOwnershipType.technical,
        )
        self.ciownership1.save()
        self.ciownership2 = CIOwnership(
            ci=self.ci1,
            owner=self.owner2,
            type=CIOwnershipType.business,
        )
        self.ciownership2.save()
        self.ciownership3 = CIOwnership(
            ci=self.ci2,
            owner=self.owner2,
            type=CIOwnershipType.business,
        )
        self.ciownership3.save()

    def create_relations(self):
        self.relation1 = CIRelation(
            parent=self.ci1,
            child=self.ci2,
            type=CI_RELATION_TYPES.CONTAINS,
        )
        self.relation1.save()
        self.relation2 = CIRelation(
            parent=self.ci2,
            child=self.ci3,
            type=CI_RELATION_TYPES.HASROLE,
        )
        self.relation2.save()

    def test_layers(self):
        path = "/api/v0.9/cilayers/"
        response = self.client.get(path=path, data=self.data, format='json')
        json_string = response.content
        json_data = json.loads(json_string)
        resource_uris = [
            ci_layer['resource_uri'] for ci_layer in json_data['objects']
        ]

        response = self.client.get(
            path=resource_uris[0],
            data=self.data,
            format='json',
        )
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['name'], self.layers[0].name)

        response = self.client.get(
            path=resource_uris[1],
            data=self.data,
            format='json',
        )
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['name'], self.layers[1].name)

    def test_types(self):
        path = "/api/v0.9/citypes/"
        response = self.client.get(path=path, data=self.data, format='json')
        json_string = response.content
        json_data = json.loads(json_string)
        resource_uris = [
            ci_type['resource_uri'] for ci_type in json_data['objects']
        ]

        response = self.client.get(
            path=resource_uris[0],
            data=self.data,
            format='json',
        )
        json_string = response.content
        json_data = json.loads(json_string)

        self.assertEqual(json_data['name'], self.types[0].name)

        response = self.client.get(
            path=resource_uris[1],
            data=self.data,
            format='json',
        )
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['name'], self.types[1].name)

    def test_ci(self):
        path = "/api/v0.9/ci/"
        response = self.client.get(path=path, data=self.data, format='json')
        json_string = response.content
        json_data = json.loads(json_string)
        resource_uris = [ci['resource_uri'] for ci in json_data['objects']]

        response = self.client.get(
            path=resource_uris[0],
            data=self.data,
            format='json',
        )
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['layers'][0]['name'], self.layers[0].name)
        self.assertEqual(json_data['layers'][1]['name'], self.layers[1].name)
        self.assertEqual(json_data['barcode'], self.ci1.barcode)
        self.assertEqual(json_data['name'], self.ci1.name)
        self.assertEqual(json_data['type']['name'], self.ci1.type.name)
        self.assertEqual(json_data['uid'], self.ci1.uid)
        self.assertEqual(
            json_data['technical_owners'][0]['username'],
            '{}.{}'.format(self.owner1.first_name, self.owner1.last_name))
        self.assertEqual(
            json_data['business_owners'][0]['username'],
            '{}.{}'.format(self.owner2.first_name, self.owner2.last_name))

        response = self.client.get(
            path=resource_uris[1],
            data=self.data,
            format='json',
        )
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['layers'][0]['name'], self.layers[0].name)
        self.assertEqual(json_data['barcode'], self.ci2.barcode)
        self.assertEqual(json_data['name'], self.ci2.name)
        self.assertEqual(json_data['type']['name'], self.ci2.type.name)
        self.assertEqual(json_data['uid'], self.ci2.uid)
        self.assertFalse(json_data['technical_owners'])
        self.assertEqual(
            json_data['business_owners'][0]['username'],
            '{}.{}'.format(self.owner2.first_name, self.owner2.last_name))

    def test_relations(self):
        path = "/api/v0.9/cirelation/"
        response = self.client.get(path=path, data=self.data, format='json')
        json_string = response.content
        json_data = json.loads(json_string)
        resource_uris = [
            ci_relation['resource_uri'] for ci_relation in json_data['objects']
        ]

        response = self.client.get(
            path=resource_uris[0],
            data=self.data,
            format='json',
        )
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['parent'], self.ci1.id)
        self.assertEqual(json_data['child'], self.ci2.id)
        self.assertEqual(json_data['type'], CI_RELATION_TYPES.CONTAINS)

        response = self.client.get(
            path=resource_uris[1],
            data=self.data,
            format='json',
        )
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['parent'], self.ci2.id)
        self.assertEqual(json_data['child'], self.ci3.id)
        self.assertEqual(json_data['type'], CI_RELATION_TYPES.HASROLE)

    def test_ci_filter_exact(self):
        path = "/api/v0.9/ci/"
        data = self.data.copy()
        data['name__exact'] = 'otherci'
        response = self.client.get(path=path, data=data, format='json')
        json_string = response.content
        json_data = json.loads(json_string)
        resource_uris = [ci['resource_uri'] for ci in json_data['objects']]
        self.assertEqual(len(resource_uris), 1)
        response = self.client.get(
            path=resource_uris[0],
            data=data,
            format='json',
        )
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['layers'][0]['name'], self.layers[1].name)
        self.assertEqual(json_data['barcode'], self.ci3.barcode)
        self.assertEqual(json_data['name'], self.ci3.name)
        self.assertEqual(json_data['type']['name'], self.ci3.type.name)
        self.assertEqual(json_data['uid'], self.ci3.uid)

    def test_ci_filter_startswith(self):
        data = self.data.copy()
        path = "/api/v0.9/ci/"
        data['name__startswith'] = 'ciname'
        response = self.client.get(path=path, data=data, format='json')
        json_string = response.content
        json_data = json.loads(json_string)
        resource_uris = [ci['resource_uri'] for ci in json_data['objects']]
        self.assertEqual(len(resource_uris), 2)
        response = self.client.get(
            path=resource_uris[0],
            data=data,
            format='json',
        )
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['layers'][0]['name'], self.layers[0].name)
        self.assertEqual(json_data['barcode'], self.ci1.barcode)
        self.assertEqual(json_data['name'], self.ci1.name)
        self.assertEqual(json_data['type']['name'], self.ci1.type.name)
        self.assertEqual(json_data['uid'], self.ci1.uid)

        response = self.client.get(
            path=resource_uris[1],
            data=data,
            format='json',
        )
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['layers'][0]['name'], self.layers[0].name)
        self.assertEqual(json_data['barcode'], self.ci2.barcode)
        self.assertEqual(json_data['name'], self.ci2.name)
        self.assertEqual(json_data['type']['name'], self.ci2.type.name)
        self.assertEqual(json_data['uid'], self.ci2.uid)
Ejemplo n.º 8
0
class CMDBApiTest(TestCase):
    def setUp(self):
        self.create_user()
        self.create_cilayers()
        self.create_citypes()
        self.create_owners()
        self.create_cis()
        self.create_ownerships()
        self.create_relations()

    def create_user(self):
        self.user = User.objects.create_user(
            'api_user',
            '*****@*****.**',
            'password'
        )
        self.user.save()
        self.api_key = ApiKey.objects.get(user=self.user)
        self.data = {
            'format': 'json',
            'username': self.user.username,
            'api_key': self.api_key.key
        }
        cache.delete("api_user_accesses")

    def create_cilayers(self):
        self.cilayer1 = CILayer(name='layer1')
        self.cilayer1.save()
        self.cilayer2 = CILayer(name='layer2')
        self.cilayer2.save()

    def create_citypes(self):
        self.citype1 = CIType(name='type1')
        self.citype1.save()
        self.citype2 = CIType(name='type2')
        self.citype2.save()

    def create_owners(self):
        self.owner1 = CIOwner(
            first_name='first_name_owner1',
            last_name='last_name_owner1',
            email='*****@*****.**'
        )
        self.owner1.save()
        self.owner2 = CIOwner(
            first_name='first_name_owner2',
            last_name='last_name_owner2',
            email='*****@*****.**'
        )
        self.owner2.save()

    def create_cis(self):
        self.ci1 = CI(
            uid='uid-ci1',
            type=self.citype1,
            barcode='barcodeci1',
            name='ciname1',
        )
        self.ci1.save()
        self.ci1.layers = [self.cilayer1, self.cilayer2]
        self.ci1.save()
        self.ci2 = CI(
            uid='uid-ci2',
            type=self.citype2,
            barcode='barcodeci2',
            name='ciname2',
        )
        self.ci2.save()
        self.ci2.layers = [self.cilayer1]
        self.ci2.save()
        self.ci3 = CI(
            uid='other-ci3',
            type=self.citype2,
            barcode='otherbarcodeci3',
            name='otherci',
        )
        self.ci3.save()
        self.ci3.layers = [self.cilayer2]
        self.ci3.save()

    def create_ownerships(self):
        self.ciownership1 = CIOwnership(
            ci=self.ci1,
            owner=self.owner1,
            type=CIOwnershipType.technical
        )
        self.ciownership1.save()
        self.ciownership2 = CIOwnership(
            ci=self.ci1,
            owner=self.owner2,
            type=CIOwnershipType.business
        )
        self.ciownership2.save()
        self.ciownership3 = CIOwnership(
            ci=self.ci2,
            owner=self.owner2,
            type=CIOwnershipType.business
        )
        self.ciownership3.save()

    def create_relations(self):
        self.relation1 = CIRelation(
            parent=self.ci1,
            child=self.ci2,
            type=CI_RELATION_TYPES.CONTAINS,
        )
        self.relation1.save()
        self.relation2 = CIRelation(
            parent=self.ci2,
            child=self.ci3,
            type=CI_RELATION_TYPES.HASROLE,
        )
        self.relation2.save()

    def test_layers(self):
        path = "/api/v0.9/cilayers/"
        response = self.client.get(path=path, data=self.data, format='json')
        json_string = response.content
        json_data = json.loads(json_string)
        resource_uris = [x['resource_uri'] for x in json_data['objects']]

        response = self.client.get(
            path=resource_uris[0], data=self.data, format='json'
        )
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['name'], self.cilayer1.name)

        response = self.client.get(
            path=resource_uris[1], data=self.data, format='json'
        )
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['name'], self.cilayer2.name)

    def test_types(self):
        path = "/api/v0.9/citypes/"
        response = self.client.get(path=path, data=self.data, format='json')
        json_string = response.content
        json_data = json.loads(json_string)
        resource_uris = [x['resource_uri'] for x in json_data['objects']]

        response = self.client.get(
            path=resource_uris[0], data=self.data, format='json'
        )
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['name'], self.citype1.name)

        response = self.client.get(
            path=resource_uris[1], data=self.data, format='json'
        )
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['name'], self.citype2.name)

    def test_ci(self):
        path = "/api/v0.9/ci/"
        response = self.client.get(path=path, data=self.data, format='json')
        json_string = response.content
        json_data = json.loads(json_string)
        resource_uris = [x['resource_uri'] for x in json_data['objects']]

        response = self.client.get(
            path=resource_uris[0], data=self.data, format='json'
        )
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['layers'][0]['name'], self.cilayer1.name)
        self.assertEqual(json_data['layers'][1]['name'], self.cilayer2.name)
        self.assertEqual(json_data['barcode'], self.ci1.barcode)
        self.assertEqual(json_data['name'], self.ci1.name)
        self.assertEqual(json_data['type']['name'], self.ci1.type.name)
        self.assertEqual(json_data['uid'], self.ci1.uid)
        self.assertEqual(
            json_data['technical_owners'][0]['username'],
            '{}.{}'.format(self.owner1.first_name, self.owner1.last_name)
        )
        self.assertEqual(
            json_data['business_owners'][0]['username'],
            '{}.{}'.format(self.owner2.first_name, self.owner2.last_name)
        )

        response = self.client.get(
            path=resource_uris[1], data=self.data, format='json'
        )
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['layers'][0]['name'], self.cilayer1.name)
        self.assertEqual(json_data['barcode'], self.ci2.barcode)
        self.assertEqual(json_data['name'], self.ci2.name)
        self.assertEqual(json_data['type']['name'], self.ci2.type.name)
        self.assertEqual(json_data['uid'], self.ci2.uid)
        self.assertFalse(json_data['technical_owners'])
        self.assertEqual(
            json_data['business_owners'][0]['username'],
            '{}.{}'.format(self.owner2.first_name, self.owner2.last_name)
        )

    def test_relations(self):
        path = "/api/v0.9/cirelation/"
        response = self.client.get(path=path, data=self.data, format='json')
        json_string = response.content
        json_data = json.loads(json_string)
        resource_uris = [x['resource_uri'] for x in json_data['objects']]

        response = self.client.get(
            path=resource_uris[0], data=self.data, format='json'
        )
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['parent'], self.ci1.id)
        self.assertEqual(json_data['child'], self.ci2.id)
        self.assertEqual(json_data['type'], CI_RELATION_TYPES.CONTAINS)

        response = self.client.get(
            path=resource_uris[1], data=self.data, format='json',
        )
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['parent'], self.ci2.id)
        self.assertEqual(json_data['child'], self.ci3.id)
        self.assertEqual(json_data['type'], CI_RELATION_TYPES.HASROLE)

    def test_ci_filter_exact(self):
        path = "/api/v0.9/ci/"
        self.data['name__exact'] = 'otherci'
        response = self.client.get(path=path, data=self.data, format='json')
        json_string = response.content
        json_data = json.loads(json_string)
        resource_uris = [x['resource_uri'] for x in json_data['objects']]
        self.assertEqual(len(resource_uris), 1)
        response = self.client.get(
            path=resource_uris[0], data=self.data, format='json'
        )
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['layers'][0]['name'], self.cilayer2.name)
        self.assertEqual(json_data['barcode'], self.ci3.barcode)
        self.assertEqual(json_data['name'], self.ci3.name)
        self.assertEqual(json_data['type']['name'], self.ci3.type.name)
        self.assertEqual(json_data['uid'], self.ci3.uid)
        del(self.data['name__exact'])

    def test_ci_filter_startswith(self):
        path = "/api/v0.9/ci/"
        self.data['name__startswith'] = 'ciname'
        response = self.client.get(path=path, data=self.data, format='json')
        json_string = response.content
        json_data = json.loads(json_string)
        resource_uris = [x['resource_uri'] for x in json_data['objects']]
        self.assertEqual(len(resource_uris), 2)
        response = self.client.get(
            path=resource_uris[0], data=self.data, format='json'
        )
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['layers'][0]['name'], self.cilayer1.name)
        self.assertEqual(json_data['barcode'], self.ci1.barcode)
        self.assertEqual(json_data['name'], self.ci1.name)
        self.assertEqual(json_data['type']['name'], self.ci1.type.name)
        self.assertEqual(json_data['uid'], self.ci1.uid)

        response = self.client.get(
            path=resource_uris[1], data=self.data, format='json'
        )
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['layers'][0]['name'], self.cilayer1.name)
        self.assertEqual(json_data['barcode'], self.ci2.barcode)
        self.assertEqual(json_data['name'], self.ci2.name)
        self.assertEqual(json_data['type']['name'], self.ci2.type.name)
        self.assertEqual(json_data['uid'], self.ci2.uid)

        del(self.data['name__startswith'])
Ejemplo n.º 9
0
class CMDBApiTest(TestCase):
    def setUp(self):
        self.user = create_user("api_user", "*****@*****.**", "password")
        self.layers = CILayer.objects.all()
        self.types = CIType.objects.all()
        self.create_owners()
        self.create_cis()
        self.create_ownerships()
        self.create_attributes()
        self.create_relations()
        self.headers = {
            "HTTP_ACCEPT": "application/json",
            "HTTP_AUTHORIZATION": "ApiKey {}:{}".format(self.user.username, self.user.api_key.key),
        }
        cache.delete("api_user_accesses")

    def create_owners(self):
        self.owner1 = CIOwner(
            first_name="first_name_owner1",
            last_name="last_name_owner1",
            email="*****@*****.**",
        )
        self.owner1.save()
        self.owner2 = CIOwner(
            first_name="first_name_owner2",
            last_name="last_name_owner2",
            email="*****@*****.**",
        )
        self.owner2.save()

    def create_cis(self):
        self.ci1 = CI(uid="uid-ci1", type=self.types[0], barcode="barcodeci1", name="ciname1")
        self.ci1.save()
        self.ci1.layers = [self.layers[0].id, self.layers[1].id]
        self.ci1.save()
        self.ci2 = CI(uid="uid-ci2", type=self.types[1], barcode="barcodeci2", name="ciname2")
        self.ci2.save()
        self.ci2.layers = [self.layers[0].id]
        self.ci2.save()
        self.ci3 = CI(uid="other-ci3", type=self.types[1], barcode="otherbarcodeci3", name="otherci")
        self.ci3.save()
        self.ci3.layers = [self.layers[1].id]
        self.ci3.save()

    def create_ownerships(self):
        self.ciownership1 = CIOwnership(ci=self.ci1, owner=self.owner1, type=CIOwnershipType.technical)
        self.ciownership1.save()
        self.ciownership2 = CIOwnership(ci=self.ci1, owner=self.owner2, type=CIOwnershipType.business)
        self.ciownership2.save()
        self.ciownership3 = CIOwnership(ci=self.ci2, owner=self.owner2, type=CIOwnershipType.business)
        self.ciownership3.save()

    def create_relations(self):
        self.relation1 = CIRelation(parent=self.ci1, child=self.ci2, type=CI_RELATION_TYPES.CONTAINS)
        self.relation1.save()
        self.relation2 = CIRelation(parent=self.ci2, child=self.ci3, type=CI_RELATION_TYPES.HASROLE)
        self.relation2.save()

    def create_attributes(self):
        self.attribute1 = CIAttribute(name="Attribute 1", attribute_type=CI_ATTRIBUTE_TYPES.INTEGER, choices="")
        self.attribute1.save()
        self.attribute1.ci_types.add(self.types[0]),
        self.attribute_value1 = CIAttributeValue(ci=self.ci1, attribute=self.attribute1)
        self.attribute_value1.value = 10
        self.attribute_value1.save()

    def test_layers(self):
        path = "/api/v0.9/cilayers/"
        response = self.client.get(path=path, **self.headers)
        json_string = response.content
        json_data = json.loads(json_string)
        resource_uris = [ci_layer["resource_uri"] for ci_layer in json_data["objects"]]

        response = self.client.get(path=resource_uris[0], **self.headers)
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data["name"], self.layers[0].name)

        response = self.client.get(resource_uris[1], **self.headers)
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data["name"], self.layers[1].name)

    def test_types(self):
        path = "/api/v0.9/citypes/"
        response = self.client.get(path=path, **self.headers)
        json_string = response.content
        json_data = json.loads(json_string)
        resource_uris = [ci_type["resource_uri"] for ci_type in json_data["objects"]]
        response = self.client.get(path=resource_uris[0], **self.headers)
        json_string = response.content
        json_data = json.loads(json_string)

        self.assertEqual(json_data["name"], self.types[0].name)

        response = self.client.get(resource_uris[1], **self.headers)
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data["name"], self.types[1].name)

    def test_ci(self):
        path = "/api/v0.9/ci/"
        response = self.client.get(path, **self.headers)
        json_string = response.content
        json_data = json.loads(json_string)
        resource_uris = [ci["resource_uri"] for ci in json_data["objects"]]

        response = self.client.get(resource_uris[0], **self.headers)
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data["layers"][0]["name"], self.layers[0].name)
        self.assertEqual(json_data["layers"][1]["name"], self.layers[1].name)
        self.assertEqual(json_data["barcode"], self.ci1.barcode)
        self.assertEqual(json_data["name"], self.ci1.name)
        self.assertEqual(json_data["type"]["name"], self.ci1.type.name)
        self.assertEqual(json_data["uid"], self.ci1.uid)
        self.assertEqual(json_data["technical_owners"][0]["first_name"], self.owner1.first_name)
        self.assertEqual(json_data["business_owners"][0]["first_name"], self.owner2.first_name)

        response = self.client.get(resource_uris[1], **self.headers)
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data["layers"][0]["name"], self.layers[0].name)
        self.assertEqual(json_data["barcode"], self.ci2.barcode)
        self.assertEqual(json_data["name"], self.ci2.name)
        self.assertEqual(json_data["type"]["name"], self.ci2.type.name)
        self.assertEqual(json_data["uid"], self.ci2.uid)
        self.assertFalse(json_data["technical_owners"])
        self.assertEqual(json_data["business_owners"][0]["first_name"], self.owner2.first_name)

    def test_ownership(self):
        """Test the direct and effective ownerships."""
        path1 = "/api/v0.9/ci/{}/".format(self.ci1.id)
        path3 = "/api/v0.9/ci/{}/".format(self.ci3.id)
        ci1_data = json.loads(self.client.get(path1, **self.headers).content)
        ci3_data = json.loads(self.client.get(path3, **self.headers).content)
        # CI1 has its own owners
        self.assertListEqual(ci1_data["business_owners"], ci1_data["effective_business_owners"])
        # CI3 inherits owners from CI1
        self.assertListEqual(ci3_data["business_owners"], [])
        self.assertListEqual(ci3_data["effective_business_owners"], ci1_data["business_owners"])

    def test_post_ci(self):
        """POST to ci collection should create a new CI"""
        ci_count_before = CI.objects.count()
        ci_data = json.dumps(
            {
                "uid": "uid-ci-api-1",
                "type": "/api/v0.9/citypes/{0}/".format(self.types[0].id),
                "barcode": "barcodeapi1",
                "name": "ciname from api 1",
                "layers": ["/api/v0.9/cilayers/5/"],
                "business_owners": ["/api/v0.9/ciowners/{0}/".format(self.owner1.id)],
                "technical_owners": ["/api/v0.9/ciowners/{0}/".format(self.owner2.id)],
                "attributes": [
                    {"name": "SLA value", "value": 0.7},
                    {
                        "name": "Documentation Link",
                        "value": "http://www.gutenberg.org/files/27827/" "27827-h/27827-h.htm",
                    },
                ],
            }
        )
        resp = self.client.post("/api/v0.9/ci/?", ci_data, content_type="application/json", **self.headers)
        self.assertEqual(CI.objects.count(), ci_count_before + 1)
        created_id = int(resp["Location"].split("/")[-2])
        created = CI.objects.get(pk=created_id)
        self.assertEqual(created.name, "ciname from api 1")
        self.assertSetEqual(set(created.business_owners.all()), {self.owner1})
        self.assertSetEqual(
            set(av.value for av in created.ciattributevalue_set.all()),
            {0.7, "http://www.gutenberg.org/files/27827/27827-h/27827-h.htm"},
        )

    def test_put_ci(self):
        """PUT should edit existing CI"""
        ci_count_before = CI.objects.count()
        ci_data = json.dumps(
            {
                "uid": "uid-ci-api-1",
                "type": "/api/v0.9/citypes/{0}/".format(self.types[0].id),
                "barcode": "barcodeapi1",
                "name": "ciname from api 1",
                "layers": ["/api/v0.9/cilayers/5/"],
                "business_owners": ["/api/v0.9/ciowners/{0}/".format(self.owner1.id)],
                "technical_owners": ["/api/v0.9/ciowners/{0}/".format(self.owner2.id)],
                "attributes": [
                    {"name": "SLA value", "value": 0.7},
                    {
                        "name": "Documentation Link",
                        "value": "http://www.gutenberg.org/files/27827/" "27827-h/27827-h.htm",
                    },
                ],
            }
        )
        self.client.put(
            "/api/v0.9/ci/{0}/".format(self.ci1.id), ci_data, content_type="application/json", **self.headers
        )
        self.assertEqual(CI.objects.count(), ci_count_before)
        edited = CI.objects.get(pk=self.ci1.id)
        self.assertEqual(edited.name, "ciname from api 1")
        self.assertSetEqual(set(edited.business_owners.all()), {self.owner1})
        self.assertSetEqual(
            set(av.value for av in edited.ciattributevalue_set.all()),
            {0.7, "http://www.gutenberg.org/files/27827/27827-h/27827-h.htm"},
        )

    def test_patch(self):
        """PATCH should edit some attributes."""
        ci_count_before = CI.objects.count()
        ci_data = json.dumps(
            {
                "business_owners": ["/api/v0.9/ciowners/{0}/".format(self.owner1.id)],
                "technical_owners": ["/api/v0.9/ciowners/{0}/".format(self.owner2.id)],
                "attributes": [
                    {"name": "SLA value", "value": 0.7},
                    {
                        "name": "Documentation Link",
                        "value": "http://www.gutenberg.org/files/27827/" "27827-h/27827-h.htm",
                    },
                ],
            }
        )
        req_data = {
            "CONTENT_LENGTH": len(ci_data),
            "CONTENT_TYPE": "application/json",
            "PATH_INFO": "/api/v0.9/ci/{0}/".format(self.ci1.id),
            "REQUEST_METHOD": "PATCH",
            "wsgi.input": FakePayload(ci_data),
        }
        req_data.update(self.headers)
        self.client.request(**req_data)
        self.assertEqual(CI.objects.count(), ci_count_before)
        edited = CI.objects.get(pk=self.ci1.id)
        self.assertEqual(edited.name, "ciname1")
        self.assertEqual(edited.uid, "uid-ci1")
        self.assertSetEqual(set(edited.business_owners.all()), {self.owner1})
        self.assertSetEqual(
            set(av.value for av in edited.ciattributevalue_set.all()),
            {0.7, "http://www.gutenberg.org/files/27827/27827-h/27827-h.htm"},
        )

    def test_get_attribute(self):
        path = "/api/v0.9/ci/{0}/".format(self.ci1.id)
        response = self.client.get(path, **self.headers)
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertListEqual(json_data["attributes"], [{"name": "Attribute 1", "value": 10}])

    def test_relations(self):
        path = "/api/v0.9/cirelation/"
        response = self.client.get(path, **self.headers)
        json_string = response.content
        json_data = json.loads(json_string)
        resource_uris = [ci_relation["resource_uri"] for ci_relation in json_data["objects"]]

        response = self.client.get(resource_uris[0], **self.headers)
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data["parent"], self.ci1.id)
        self.assertEqual(json_data["child"], self.ci2.id)
        self.assertEqual(json_data["type"], CI_RELATION_TYPES.CONTAINS)

        response = self.client.get(resource_uris[1], **self.headers)
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data["parent"], self.ci2.id)
        self.assertEqual(json_data["child"], self.ci3.id)
        self.assertEqual(json_data["type"], CI_RELATION_TYPES.HASROLE)

    def test_ci_filter_exact(self):
        path = "/api/v0.9/ci/"
        data = {"name__exact": "otherci"}
        response = self.client.get(path, data=data, **self.headers)
        json_string = response.content
        json_data = json.loads(json_string)
        resource_uris = [ci["resource_uri"] for ci in json_data["objects"]]
        self.assertEqual(len(resource_uris), 1)
        response = self.client.get(resource_uris[0], data, **self.headers)
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data["layers"][0]["name"], self.layers[1].name)
        self.assertEqual(json_data["barcode"], self.ci3.barcode)
        self.assertEqual(json_data["name"], self.ci3.name)
        self.assertEqual(json_data["type"]["name"], self.ci3.type.name)
        self.assertEqual(json_data["uid"], self.ci3.uid)

    def test_ci_filter_startswith(self):
        path = "/api/v0.9/ci/"
        data = {"name__startswith": "ciname"}
        response = self.client.get(path=path, data=data, **self.headers)
        json_string = response.content
        json_data = json.loads(json_string)
        resource_uris = [ci["resource_uri"] for ci in json_data["objects"]]
        self.assertEqual(len(resource_uris), 2)
        response = self.client.get(resource_uris[0], data=data, **self.headers)
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data["layers"][0]["name"], self.layers[0].name)
        self.assertEqual(json_data["barcode"], self.ci1.barcode)
        self.assertEqual(json_data["name"], self.ci1.name)
        self.assertEqual(json_data["type"]["name"], self.ci1.type.name)
        self.assertEqual(json_data["uid"], self.ci1.uid)

        response = self.client.get(resource_uris[1], data=data, **self.headers)
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data["layers"][0]["name"], self.layers[0].name)
        self.assertEqual(json_data["barcode"], self.ci2.barcode)
        self.assertEqual(json_data["name"], self.ci2.name)
        self.assertEqual(json_data["type"]["name"], self.ci2.type.name)
        self.assertEqual(json_data["uid"], self.ci2.uid)
Ejemplo n.º 10
0
class CMDBApiTest(UserTestCase):

    def setUp(self):
        self.layers = CILayer.objects.all()
        self.types = CIType.objects.all()
        self.create_owners()
        self.create_cis()
        self.create_ownerships()
        self.create_attributes()
        self.create_relations()
        super(CMDBApiTest, self).setUp()

    def create_owners(self):
        self.owner1 = CIOwnerFactory()
        self.owner2 = CIOwnerFactory()

    def create_cis(self):
        self.ci1 = CI(
            uid='uid-ci1',
            type=self.types[0],
            barcode='barcodeci1',
            name='ciname1',
        )
        self.ci1.save()
        self.ci1.layers = [self.layers[0].id, self.layers[1].id]
        self.ci1.save()
        self.ci2 = CI(
            uid='uid-ci2',
            type=self.types[1],
            barcode='barcodeci2',
            name='ciname2',
        )
        self.ci2.save()
        self.ci2.layers = [self.layers[0].id]
        self.ci2.save()
        self.ci3 = CI(
            uid='other-ci3',
            type=self.types[1],
            barcode='otherbarcodeci3',
            name='otherci',
        )
        self.ci3.save()
        self.ci3.layers = [self.layers[1].id]
        self.ci3.save()

    def create_ownerships(self):
        self.ciownership1 = CIOwnership(
            ci=self.ci1,
            owner=self.owner1,
            type=CIOwnershipType.technical,
        )
        self.ciownership1.save()
        self.ciownership2 = CIOwnership(
            ci=self.ci1,
            owner=self.owner2,
            type=CIOwnershipType.business,
        )
        self.ciownership2.save()
        self.ciownership3 = CIOwnership(
            ci=self.ci2,
            owner=self.owner2,
            type=CIOwnershipType.business,
        )
        self.ciownership3.save()

    def create_relations(self):
        self.relation1 = CIRelation(
            parent=self.ci1,
            child=self.ci2,
            type=CI_RELATION_TYPES.CONTAINS,
        )
        self.relation1.save()
        self.relation2 = CIRelation(
            parent=self.ci2,
            child=self.ci3,
            type=CI_RELATION_TYPES.HASROLE,
        )
        self.relation2.save()

    def create_attributes(self):
        self.attribute1 = CIAttribute(
            name='Attribute 1', attribute_type=CI_ATTRIBUTE_TYPES.INTEGER,
            choices='',
        )
        self.attribute1.save()
        self.attribute1.ci_types.add(self.types[0]),
        self.attribute_value1 = CIAttributeValue(
            ci=self.ci1, attribute=self.attribute1,
        )
        self.attribute_value1.value = 10
        self.attribute_value1.save()

    def test_layers(self):
        path = "/api/v0.9/cilayers/"
        response = self.get(path)
        json_string = response.content
        json_data = json.loads(json_string)
        resource_uris = [
            ci_layer['resource_uri'] for ci_layer in json_data['objects']
        ]
        response = self.get(resource_uris[0])
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['name'], self.layers[0].name)

        response = self.get(resource_uris[1])
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['name'], self.layers[1].name)

    def test_types(self):
        path = "/api/v0.9/citypes/"
        response = self.get(path=path)
        json_string = response.content
        json_data = json.loads(json_string)
        resource_uris = [
            ci_type['resource_uri'] for ci_type in json_data['objects']
        ]
        response = self.get(path=resource_uris[0])
        json_string = response.content
        json_data = json.loads(json_string)

        self.assertEqual(json_data['name'], self.types[0].name)

        response = self.get(resource_uris[1])
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['name'], self.types[1].name)

    def test_ci(self):
        path = "/api/v0.9/ci/"
        response = self.get(path)
        json_string = response.content
        json_data = json.loads(json_string)
        resource_uris = [ci['resource_uri'] for ci in json_data['objects']]

        response = self.get(resource_uris[0])
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['layers'][0]['name'], self.layers[0].name)
        self.assertEqual(json_data['layers'][1]['name'], self.layers[1].name)
        self.assertEqual(json_data['barcode'], self.ci1.barcode)
        self.assertEqual(json_data['name'], self.ci1.name)
        self.assertEqual(json_data['type']['name'], self.ci1.type.name)
        self.assertEqual(json_data['uid'], self.ci1.uid)
        self.assertEqual(
            json_data['technical_owners'][0]['first_name'],
            self.owner1.first_name,
        )
        self.assertEqual(
            json_data['business_owners'][0]['first_name'],
            self.owner2.first_name,
        )

        response = self.get(resource_uris[1])
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['layers'][0]['name'], self.layers[0].name)
        self.assertEqual(json_data['barcode'], self.ci2.barcode)
        self.assertEqual(json_data['name'], self.ci2.name)
        self.assertEqual(json_data['type']['name'], self.ci2.type.name)
        self.assertEqual(json_data['uid'], self.ci2.uid)
        self.assertFalse(json_data['technical_owners'])
        self.assertEqual(
            json_data['business_owners'][0]['first_name'],
            self.owner2.first_name,
        )

    def test_ownership(self):
        """Test the direct and effective ownerships."""
        path1 = '/api/v0.9/ci/{}/'.format(self.ci1.id)
        path3 = '/api/v0.9/ci/{}/'.format(self.ci3.id)
        ci1_data = json.loads(self.get(path1).content)
        ci3_data = json.loads(self.get(path3).content)
        # CI1 has its own owners
        self.assertListEqual(
            ci1_data['business_owners'],
            ci1_data['effective_business_owners']
        )
        # CI3 inherits owners from CI1
        self.assertListEqual(ci3_data['business_owners'], [])
        self.assertListEqual(
            ci3_data['effective_business_owners'],
            ci1_data['business_owners']
        )

    def test_post_ci(self):
        """POST to ci collection should create a new CI"""
        ci_count_before = CI.objects.count()
        ci_data = json.dumps({
            'uid': 'uid-ci-api-1',
            'type': '/api/v0.9/citypes/{0}/'.format(self.types[0].id),
            'barcode': 'barcodeapi1',
            'name': 'ciname from api 1',
            'layers': ['/api/v0.9/cilayers/5/'],
            'business_owners': [
                '/api/v0.9/ciowners/{0}/'.format(self.owner1.id)
            ],
            'technical_owners': [
                '/api/v0.9/ciowners/{0}/'.format(self.owner2.id)
            ],
            'attributes': [
                {
                    'name': 'SLA value',
                    'value': 0.7,
                }, {
                    'name': 'Documentation Link',
                    'value': 'http://www.gutenberg.org/files/27827/'
                    '27827-h/27827-h.htm',
                },
            ],
        })
        resp = self.post(
            '/api/v0.9/ci/?',
            ci_data,
            content_type='application/json',
        )
        self.assertEqual(CI.objects.count(), ci_count_before + 1)
        created_id = int(resp['Location'].split('/')[-2])
        created = CI.objects.get(pk=created_id)
        self.assertEqual(created.name, 'ciname from api 1')
        self.assertSetEqual(
            set(created.business_owners.all()),
            {self.owner1},
        )
        self.assertSetEqual(
            set(av.value for av in created.ciattributevalue_set.all()),
            {
                0.7,
                'http://www.gutenberg.org/files/27827/27827-h/27827-h.htm',
            },
        )

    def test_put_ci(self):
        """PUT should edit existing CI"""
        ci_count_before = CI.objects.count()
        ci_data = json.dumps({
            'uid': 'uid-ci-api-1',
            'type': '/api/v0.9/citypes/{0}/'.format(self.types[0].id),
            'barcode': 'barcodeapi1',
            'name': 'ciname from api 1',
            'layers': ['/api/v0.9/cilayers/5/'],
            'business_owners': [
                '/api/v0.9/ciowners/{0}/'.format(self.owner1.id)
            ],
            'technical_owners': [
                '/api/v0.9/ciowners/{0}/'.format(self.owner2.id)
            ],
            'related': [],
            'attributes': [
                {
                    'name': 'SLA value',
                    'value': 0.7,
                }, {
                    'name': 'Documentation Link',
                    'value': 'http://www.gutenberg.org/files/27827/'
                    '27827-h/27827-h.htm',
                },
            ],
        })
        self.put(
            '/api/v0.9/ci/{0}/'.format(
                self.ci1.id,
            ),
            ci_data,
            content_type='application/json',
        )
        self.assertEqual(CI.objects.count(), ci_count_before)
        edited = CI.objects.get(pk=self.ci1.id)
        self.assertEqual(edited.name, 'ciname from api 1')
        self.assertSetEqual(
            set(edited.business_owners.all()),
            {self.owner1},
        )
        self.assertSetEqual(
            set(av.value for av in edited.ciattributevalue_set.all()),
            {
                0.7,
                'http://www.gutenberg.org/files/27827/27827-h/27827-h.htm',
            },
        )

    def test_patch(self):
        """PATCH should edit some attributes."""
        ci_count_before = CI.objects.count()
        ci_data = json.dumps({
            'business_owners': [
                '/api/v0.9/ciowners/{0}/'.format(self.owner1.id)
            ],
            'technical_owners': [
                '/api/v0.9/ciowners/{0}/'.format(self.owner2.id)
            ],
            'attributes': [
                {
                    'name': 'SLA value',
                    'value': 0.7,
                }, {
                    'name': 'Documentation Link',
                    'value': 'http://www.gutenberg.org/files/27827/'
                    '27827-h/27827-h.htm',
                },
            ],
        })
        self.patch(
            '/api/v0.9/ci/{0}/'.format(self.ci1.id),
            ci_data,
            CONTENT_TYPE='application/json'

        )
        self.assertEqual(CI.objects.count(), ci_count_before)
        edited = CI.objects.get(pk=self.ci1.id)
        self.assertEqual(edited.name, 'ciname1')
        self.assertEqual(edited.uid, 'uid-ci1')
        self.assertSetEqual(
            set(edited.business_owners.all()),
            {self.owner1},
        )
        self.assertSetEqual(
            set(av.value for av in edited.ciattributevalue_set.all()),
            {
                0.7,
                'http://www.gutenberg.org/files/27827/27827-h/27827-h.htm',
            },
        )

    def test_patch_relations(self):
        """A test for adding relations via 0.10 version of API."""
        ci_data = json.dumps({
            'related': [
                {
                    'dir': 'INCOMING',
                    'type': 'HASROLE',
                    'id': self.ci2.id,
                }, {
                    'dir': 'OUTGOING',
                    'type': 'CONTAINS',
                    'id': self.ci3.id,
                }
            ],
        })
        req_data = {
            'CONTENT_LENGTH': len(ci_data),
            'CONTENT_TYPE': 'application/json',
            'PATH_INFO': '/api/v0.10/ci/{0}/'.format(self.ci1.id),
            'REQUEST_METHOD': 'PATCH',
            'wsgi.input': FakePayload(ci_data),
        }
        req_data.update(self.headers)
        self.client.request(**req_data)
        rel1 = CIRelation.objects.get(
            child_id=self.ci1.id,
            parent_id=self.ci2.id,
            type=CI_RELATION_TYPES.HASROLE.id,
        )
        rel2 = CIRelation.objects.get(
            child_id=self.ci3.id,
            parent_id=self.ci1.id,
            type=CI_RELATION_TYPES.CONTAINS.id,
        )


    def test_get_attribute(self):
        path = "/api/v0.9/ci/{0}/".format(self.ci1.id)
        response = self.get(path)
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertListEqual(json_data['attributes'], [
            {'name': 'Attribute 1', 'value': 10}
        ])

    def test_relations(self):
        path = "/api/v0.9/cirelation/"
        response = self.get(path)
        json_string = response.content
        json_data = json.loads(json_string)
        resource_uris = [
            ci_relation['resource_uri'] for ci_relation in json_data['objects']
        ]

        response = self.get(resource_uris[0])
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['parent'], self.ci1.id)
        self.assertEqual(json_data['child'], self.ci2.id)
        self.assertEqual(json_data['type'], CI_RELATION_TYPES.CONTAINS)

        response = self.get(resource_uris[1])
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['parent'], self.ci2.id)
        self.assertEqual(json_data['child'], self.ci3.id)
        self.assertEqual(json_data['type'], CI_RELATION_TYPES.HASROLE)

    def test_ci_filter_exact(self):
        path = "/api/v0.9/ci/"
        data = {'name__exact': 'otherci'}
        response = self.get(path, data=data)
        json_string = response.content
        json_data = json.loads(json_string)
        resource_uris = [ci['resource_uri'] for ci in json_data['objects']]
        self.assertEqual(len(resource_uris), 1)
        response = self.get(resource_uris[0], data)
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['layers'][0]['name'], self.layers[1].name)
        self.assertEqual(json_data['barcode'], self.ci3.barcode)
        self.assertEqual(json_data['name'], self.ci3.name)
        self.assertEqual(json_data['type']['name'], self.ci3.type.name)
        self.assertEqual(json_data['uid'], self.ci3.uid)

    def test_ci_filter_startswith(self):
        path = "/api/v0.9/ci/"
        data = {'name__startswith': 'ciname'}
        response = self.get(path=path, data=data)
        json_string = response.content
        json_data = json.loads(json_string)
        resource_uris = [ci['resource_uri'] for ci in json_data['objects']]
        self.assertEqual(len(resource_uris), 2)
        response = self.get(resource_uris[0], data=data)
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['layers'][0]['name'], self.layers[0].name)
        self.assertEqual(json_data['barcode'], self.ci1.barcode)
        self.assertEqual(json_data['name'], self.ci1.name)
        self.assertEqual(json_data['type']['name'], self.ci1.type.name)
        self.assertEqual(json_data['uid'], self.ci1.uid)

        response = self.get(resource_uris[1], data=data)
        json_string = response.content
        json_data = json.loads(json_string)
        self.assertEqual(json_data['layers'][0]['name'], self.layers[0].name)
        self.assertEqual(json_data['barcode'], self.ci2.barcode)
        self.assertEqual(json_data['name'], self.ci2.name)
        self.assertEqual(json_data['type']['name'], self.ci2.type.name)
        self.assertEqual(json_data['uid'], self.ci2.uid)

    def test_filter_related(self):
        path = "/api/v0.10/ci/"
        data = {'parent': self.ci1.id, 'child': self.ci3.id}
        response = self.get(path=path, data=data)
        json_data = json.loads(response.content)
        self.assertEqual(len(json_data['objects']), 1)
        self.assertEqual(json_data['objects'][0]['id'], self.ci2.id)