Skip to content
This repository was archived by the owner on Feb 21, 2022. It is now read-only.

Commit 034f65f

Browse files
author
Jaroslav Sevcik
committed
chore(entity): tests and fixes
1 parent 0add7ca commit 034f65f

File tree

12 files changed

+309
-78
lines changed

12 files changed

+309
-78
lines changed

test/components/test_components_generation.py renamed to test/entities/test_objects_to_yaml.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99

1010

1111
@pytest.fixture
12-
def generate_base_component(base_component_factory, link_factory, group_factory):
12+
def generate_base_component(component_base_factory, link_factory, group_factory):
1313
group = group_factory(id=1, product_owner="john", project_owner="doe")
1414
group.save()
15-
component = base_component_factory(
15+
component = component_base_factory(
1616
id=1,
1717
name="base",
1818
type="database",
@@ -34,20 +34,20 @@ def generate_base_component(base_component_factory, link_factory, group_factory)
3434
name="Datadog",
3535
url="https://dashboard.datadog.com",
3636
icon="poop",
37-
component=component,
37+
entity=component,
3838
)
3939
link_factory(
4040
id=2,
4141
name="Sentry",
4242
url="https://sentry.skypicker.com",
43-
component=component,
43+
entity=component,
4444
)
4545

4646

4747
def test_generate_base_component(generate_base_component):
4848
expected = """
4949
- apiVersion: v1alpha1
50-
kind: component
50+
kind_: component
5151
metadata:
5252
name: base
5353
owner: platform
@@ -65,7 +65,7 @@ def test_generate_base_component(generate_base_component):
6565
url: https://sentry.skypicker.com
6666
icon: null
6767
spec:
68-
type: database
68+
type_: database
6969
"""
7070
repository = Repository.objects.get(pk=1)
7171
content = generate(repository)
Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
import pytest
2+
3+
import zoo.repos.tasks as uut
4+
from zoo.entities.models import Entity
5+
from zoo.libraries.models import Library
6+
from zoo.services.models import Service
7+
8+
pytestmark = pytest.mark.django_db
9+
10+
11+
def test_create_base_component(mocker, repository_factory):
12+
repository = repository_factory(
13+
id=1,
14+
remote_id=11,
15+
name="test_proj1",
16+
owner="john_doe1",
17+
url="https://github.co m/john_doe1/test_proj1",
18+
provider="github",
19+
)
20+
repository_dict = {"id": repository.remote_id, "provider": repository.provider}
21+
22+
base_component = """
23+
- apiVersion: v1alpha1
24+
kind_: component
25+
metadata:
26+
name: base
27+
owner: platform
28+
group:
29+
product_owner: john
30+
project_owner: doe
31+
maintainers: []
32+
description: This is my fancy component
33+
tags: []
34+
links:
35+
- name: Datadog
36+
url: https://dashboard.datadog.com
37+
icon: poop
38+
- name: Sentry
39+
url: https://sentry.skypicker.com
40+
spec:
41+
type_: database
42+
"""
43+
44+
mocker.patch("zoo.repos.tasks.get_entity_file_content", return_value=base_component)
45+
uut.update_project_from_entity_file(proj=repository_dict)
46+
component_entity = Entity.objects.first()
47+
assert Entity.objects.all().count() == 1
48+
assert component_entity.kind == "component"
49+
assert component_entity.name == "base"
50+
assert component_entity.owner == "platform"
51+
assert component_entity.service is None
52+
assert component_entity.library is None
53+
assert component_entity.type == "database"
54+
assert component_entity.links.all().count() == 2
55+
assert component_entity.group
56+
57+
58+
def test_create_base_component_and_service(mocker, repository_factory):
59+
repository = repository_factory(
60+
id=1,
61+
remote_id=11,
62+
name="test_proj1",
63+
owner="john_doe1",
64+
url="https://github.co m/john_doe1/test_proj1",
65+
provider="github",
66+
)
67+
repository_dict = {"id": repository.remote_id, "provider": repository.provider}
68+
69+
service_component = """
70+
- apiVersion: v1alpha1
71+
kind_: component
72+
metadata:
73+
name: base
74+
owner: platform
75+
group:
76+
product_owner: john
77+
project_owner: doe
78+
maintainers: []
79+
description: This is my fancy component
80+
tags: []
81+
links:
82+
- name: Datadog
83+
url: https://dashboard.datadog.com
84+
icon: poop
85+
- name: Sentry
86+
url: https://sentry.skypicker.com
87+
spec:
88+
type_: service
89+
environments:
90+
- name: production
91+
dashboard_url: https://dashboard.datadog.com
92+
health_check_url: https://dashboard.datadog.com
93+
service_urls:
94+
- https://service.prod.com
95+
- name: sandbox
96+
dashboard_url: https://dashboard.datadog.sandbox.com
97+
health_check_url: https://dashboard.datadog.sandbox.com
98+
service_urls:
99+
- https://service.sandbox.com
100+
impact: profit
101+
integrations:
102+
pagerduty_service: pagerduty_service1234
103+
sentry_project: sentry project 15234
104+
lifecycle: production
105+
"""
106+
107+
mocker.patch(
108+
"zoo.repos.tasks.get_entity_file_content", return_value=service_component
109+
)
110+
uut.update_project_from_entity_file(proj=repository_dict)
111+
component_entity = Entity.objects.first()
112+
assert Entity.objects.all().count() == 1
113+
assert Service.objects.all().count() == 1
114+
assert component_entity.kind == "component"
115+
assert component_entity.name == "base"
116+
assert component_entity.owner == "platform"
117+
assert component_entity.library is None
118+
assert component_entity.type == "service"
119+
assert component_entity.links.all().count() == 2
120+
assert component_entity.group
121+
assert component_entity.service is not None
122+
assert component_entity.service.environments.all().count() == 2
123+
124+
125+
def test_create_base_component_and_library(mocker, repository_factory):
126+
repository = repository_factory(
127+
id=1,
128+
remote_id=11,
129+
name="test_proj1",
130+
owner="john_doe1",
131+
url="https://github.co m/john_doe1/test_proj1",
132+
provider="github",
133+
)
134+
repository_dict = {"id": repository.remote_id, "provider": repository.provider}
135+
136+
library_component = """
137+
- apiVersion: v1alpha1
138+
kind_: component
139+
metadata:
140+
name: base_lib
141+
owner: platform
142+
group:
143+
product_owner: john
144+
project_owner: doe
145+
maintainers: []
146+
description: This is my fancy component
147+
tags: []
148+
links:
149+
- name: Datadog
150+
url: https://dashboard.datadog.com
151+
icon: poop
152+
- name: Sentry
153+
url: https://sentry.skypicker.com
154+
spec:
155+
type_: library
156+
impact: profit
157+
integrations:
158+
sonarqube_project: sonarqube
159+
lifecycle: production
160+
"""
161+
162+
mocker.patch(
163+
"zoo.repos.tasks.get_entity_file_content", return_value=library_component
164+
)
165+
uut.update_project_from_entity_file(proj=repository_dict)
166+
component_entity = Entity.objects.first()
167+
assert Entity.objects.all().count() == 1
168+
assert Library.objects.all().count() == 1
169+
assert component_entity.kind == "component"
170+
assert component_entity.name == "base_lib"
171+
assert component_entity.owner == "platform"
172+
assert component_entity.type == "library"
173+
assert component_entity.links.all().count() == 2
174+
assert component_entity.group
175+
assert component_entity.service is None
176+
assert component_entity.library is not None

zoo/entities/builder.py

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55

66
class EntityBuilder:
77
def create_entity(self, data, repository):
8-
if data["kind"] != "component":
8+
if data["kind_"] != "component":
99
return NotImplemented
10-
if data["spec"]["type"] == "service":
10+
if data["spec"]["type_"] == "service":
1111
self._build_service(data, repository)
12-
elif data["spec"]["spec"] == "library":
12+
elif data["spec"]["type_"] == "library":
1313
self._build_library(data, repository)
1414
else:
1515
self._build_base_component(data, repository)
@@ -22,30 +22,26 @@ def _build_base_component(data, repository):
2222
maintainers=data["metadata"]["group"]["maintainers"],
2323
)
2424

25-
links = []
26-
for link in data["metadata"]["links"]:
27-
l, _ = Link.objects.update_or_create(
28-
url=link["url"],
29-
defaults={
30-
"name": link["name"],
31-
"icon": link["icon"],
32-
},
33-
)
34-
links.append(l)
35-
3625
obj, _ = Entity.objects.update_or_create(
3726
name=data["metadata"]["name"],
38-
kind=data["kind"],
27+
kind=data["kind_"],
3928
owner=data["metadata"]["owner"],
40-
type=data["spec"]["type"],
29+
type=data["spec"]["type_"],
4130
source=repository,
4231
defaults={
4332
"group": group,
4433
"description": data["metadata"]["description"],
4534
"tags": data["metadata"]["tags"],
46-
"links": links,
4735
},
4836
)
37+
38+
for link in data["metadata"]["links"]:
39+
l, _ = Link.objects.update_or_create(
40+
url=link["url"],
41+
entity=obj,
42+
defaults={"name": link["name"], "icon": getattr(link, "icon", None)},
43+
)
44+
4945
return obj
5046

5147
def _build_service(self, data, repository):
@@ -58,10 +54,18 @@ def _build_service(self, data, repository):
5854
defaults={
5955
"lifecycle": data["spec"]["lifecycle"],
6056
"impact": data["spec"]["impact"],
61-
"sentry_project": data["spec"]["integrations"]["sentry_project"],
62-
"sonarqube_project": data["spec"]["integrations"]["sonarqube_project"],
63-
"slack_channel": data["spec"]["integrations"]["slack_channel"],
64-
"pagerduty_service": data["spec"]["integrations"]["pagerduty_service"],
57+
"sentry_project": data["spec"]
58+
.get("integrations", {})
59+
.get("sentry_project"),
60+
"sonarqube_project": data["spec"]
61+
.get("integrations", {})
62+
.get("sonarqube_project"),
63+
"slack_channel": data["spec"]
64+
.get("integrations", {})
65+
.get("slack_channel"),
66+
"pagerduty_service": data["spec"]
67+
.get("integrations", {})
68+
.get("pagerduty_service"),
6569
"description": data["metadata"]["description"],
6670
},
6771
)
@@ -90,8 +94,12 @@ def _build_library(self, data, repository):
9094
defaults={
9195
"lifecycle": data["spec"]["lifecycle"],
9296
"impact": data["spec"]["impact"],
93-
"sonarqube_project": data["spec"]["integrations"]["sonarqube_project"],
94-
"slack_channel": data["spec"]["integrations"]["slack_channel"],
97+
"sonarqube_project": data["spec"]
98+
.get("integrations", {})
99+
.get("sonarqube_project"),
100+
"slack_channel": data["spec"]
101+
.get("integrations", {})
102+
.get("slack_channel"),
95103
},
96104
)
97105

zoo/entities/migrations/0002_auto_20210706_1033.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Generated by Django 2.2.19 on 2021-07-06 10:33
22

3-
from django.db import migrations, models
43
import django.db.models.deletion
4+
from django.db import migrations, models
55

66

77
class Migration(migrations.Migration):
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Generated by Django 2.2.19 on 2021-07-08 11:54
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
("entities", "0002_auto_20210706_1033"),
11+
]
12+
13+
operations = [
14+
migrations.AlterField(
15+
model_name="link",
16+
name="entity",
17+
field=models.ForeignKey(
18+
on_delete=django.db.models.deletion.PROTECT,
19+
related_name="links",
20+
related_query_name="link",
21+
to="entities.Entity",
22+
),
23+
),
24+
]

zoo/entities/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class Link(models.Model):
2323
)
2424
url = models.URLField()
2525
entity = models.ForeignKey(
26-
"entities.Link",
26+
"entities.Entity",
2727
related_name="links",
2828
related_query_name="link",
2929
on_delete=models.PROTECT,

zoo/entities/yaml_definitions/component_base.yaml

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ additionalProperties: false
33
properties:
44
apiVersion:
55
type: string
6-
kind:
6+
kind_:
77
enum:
88
- component
99
type: string
@@ -46,18 +46,20 @@ properties:
4646
type: string
4747
type: array
4848
type: object
49+
required:
50+
- name
51+
- owner
4952
spec:
5053
properties:
51-
type:
54+
type_:
5255
enum:
5356
- database
5457
- service
5558
- library
5659
type: string
5760
type: object
58-
required:
59-
- kind
60-
- name
61-
- owner
62-
- type
61+
required:
62+
- type_
6363
type: object
64+
required:
65+
- kind_

0 commit comments

Comments
 (0)