Skip to content
This repository has been archived by the owner on May 15, 2020. It is now read-only.

Commit

Permalink
Merge pull request #15 from rodgomes/master
Browse files Browse the repository at this point in the history
NEW add scm repository views
  • Loading branch information
rodgomes authored Feb 18, 2019
2 parents 4d3e01d + 4d12ef6 commit 3678fbf
Show file tree
Hide file tree
Showing 6 changed files with 156 additions and 7 deletions.
12 changes: 11 additions & 1 deletion katka/serializer_fields.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from katka.constants import STATUS_ACTIVE
from katka.models import Credential, Project, SCMRepository, Team
from katka.models import Credential, Project, SCMRepository, SCMService, Team
from rest_framework import serializers
from rest_framework.exceptions import NotFound, PermissionDenied
from rest_framework.relations import PrimaryKeyRelatedField
Expand Down Expand Up @@ -64,11 +64,21 @@ def get_queryset(self):
)


class SCMServiceRelatedField(PrimaryKeyRelated403Field):
does_not_exist_message = 'SCMService does not exist'

def get_queryset(self):
return SCMService.objects.filter(
status=STATUS_ACTIVE
)


class SCMRepositoryRelatedField(PrimaryKeyRelated403Field):
does_not_exist_message = 'SCMRepository does not exist'

def get_queryset(self):
return SCMRepository.objects.filter(
scm_service__status=STATUS_ACTIVE,
credential__status=STATUS_ACTIVE,
status=STATUS_ACTIVE
)
14 changes: 12 additions & 2 deletions katka/serializers.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
from django.contrib.auth.models import Group

from katka.models import Application, Credential, CredentialSecret, Project, SCMService, Team
from katka.models import Application, Credential, CredentialSecret, Project, SCMRepository, SCMService, Team
from katka.serializer_fields import (
CredentialRelatedField, GroupNameField, ProjectRelatedField, SCMRepositoryRelatedField, TeamRelatedField,
CredentialRelatedField, GroupNameField, ProjectRelatedField, SCMRepositoryRelatedField, SCMServiceRelatedField,
TeamRelatedField,
)
from rest_framework import serializers
from rest_framework.exceptions import PermissionDenied
Expand Down Expand Up @@ -65,3 +66,12 @@ class SCMServiceSerializer(serializers.ModelSerializer):
class Meta:
model = SCMService
fields = ('public_identifier', 'type', 'server_url')


class SCMRepositorySerializer(serializers.ModelSerializer):
credential = CredentialRelatedField()
scm_service = SCMServiceRelatedField()

class Meta:
model = SCMRepository
fields = ('public_identifier', 'organisation', 'repository_name', 'credential', 'scm_service')
1 change: 1 addition & 0 deletions katka/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
router.register('applications', views.ApplicationViewSet, basename='applications')
router.register('credentials', views.CredentialViewSet, basename='credentials')
router.register('scm-services', views.SCMServiceViewSet, basename='scm-services')
router.register('scm-repositories', views.SCMRepositoryViewSet, basename='scm-repositories')

secrets_router = NestedSimpleRouter(router, 'credentials', lookup='credentials')
secrets_router.register('secrets', views.CredentialSecretsViewSet, basename='secrets')
Expand Down
15 changes: 12 additions & 3 deletions katka/views.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from katka.models import Application, Credential, CredentialSecret, Project, SCMService, Team
from katka.models import Application, Credential, CredentialSecret, Project, SCMRepository, SCMService, Team
from katka.serializers import (
ApplicationSerializer, CredentialSecretSerializer, CredentialSerializer, ProjectSerializer, SCMServiceSerializer,
TeamSerializer,
ApplicationSerializer, CredentialSecretSerializer, CredentialSerializer, ProjectSerializer,
SCMRepositorySerializer, SCMServiceSerializer, TeamSerializer,
)
from katka.viewsets import AuditViewSet, ReadOnlyAuditViewMixin
from rest_framework.permissions import IsAuthenticated
Expand Down Expand Up @@ -60,3 +60,12 @@ class SCMServiceViewSet(ReadOnlyAuditViewMixin):
model = SCMService
serializer_class = SCMServiceSerializer
permission_classes = [IsAuthenticated]


class SCMRepositoryViewSet(AuditViewSet):
model = SCMRepository
serializer_class = SCMRepositorySerializer

def get_queryset(self):
user_groups = self.request.user.groups.all()
return super().get_queryset().filter(credential__team__group__in=user_groups)
1 change: 0 additions & 1 deletion tests/integration/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -166,4 +166,3 @@ def deactivated_application(application):
application.save()

return application

120 changes: 120 additions & 0 deletions tests/integration/test_scmrepository_view.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
from uuid import UUID

import pytest
from katka import models
from katka.constants import STATUS_INACTIVE


@pytest.mark.django_db
class TestSCMRepositoryViewSetUnauthenticated:
"""
When a user is not logged in, no group information is available, so nothing is returned.
For listing, that would be an empty list for other operations, an error like the object could
not be found, except on create (you need to be part of a group and anonymous users do not have any)
"""

def test_list(self, client, scm_repository):
response = client.get('/scm-repositories/')
assert response.status_code == 200
parsed = response.json()
assert len(parsed) == 0

def test_get(self, client, scm_repository):
response = client.get(f'/scm-repositories/{scm_repository.public_identifier}/')
assert response.status_code == 404

def test_delete(self, client, scm_repository):
response = client.delete(f'/scm-repositories/{scm_repository.public_identifier}/')
assert response.status_code == 404

def test_update(self, client, credential, scm_service, scm_repository):
url = f'/scm-repositories/{scm_repository.public_identifier}/'
data = {'organisation': 'orgA', 'repository_name': 'repoA',
'credential': credential.public_identifier,
'scm_service': scm_service.public_identifier}
response = client.put(url, data, content_type='application/json')
assert response.status_code == 404

def test_partial_update(self, client, scm_repository):
url = f'/scm-repositories/{scm_repository.public_identifier}/'
data = {'organisation': 'orgB'}
response = client.patch(url, data, content_type='application/json')
assert response.status_code == 404

def test_create(self, client, credential, scm_service, scm_repository):
url = f'/scm-repositories/'
data = {'organisation': 'orgC', 'repository_name': 'repoC',
'credential': credential.public_identifier,
'scm_service': scm_service.public_identifier}
response = client.post(url, data=data, content_type='application/json')
assert response.status_code == 403


@pytest.mark.django_db
class TestSCMRepositoryViewSet:

def test_list(self, client, logged_in_user, credential, scm_service, scm_repository):
response = client.get('/scm-repositories/')
assert response.status_code == 200
parsed = response.json()
assert len(parsed) == 1
assert parsed[0]['organisation'] == 'acme'
assert parsed[0]['repository_name'] == 'sample'
assert UUID(parsed[0]['credential']) == credential.public_identifier
assert UUID(parsed[0]['scm_service']) == scm_service.public_identifier
UUID(parsed[0]['public_identifier']) # should not raise

def test_list_excludes_inactive(self, client, logged_in_user, deactivated_scm_repository):
response = client.get('/scm-repositories/')
assert response.status_code == 200
parsed = response.json()
assert len(parsed) == 0

def test_get(self, client, logged_in_user, credential, scm_service, scm_repository):
response = client.get(f'/scm-repositories/{scm_repository.public_identifier}/')
assert response.status_code == 200
parsed = response.json()
assert parsed['organisation'] == 'acme'
assert parsed['repository_name'] == 'sample'
assert UUID(parsed['credential']) == credential.public_identifier
assert UUID(parsed['scm_service']) == scm_service.public_identifier

def test_get_excludes_inactive(self, client, logged_in_user, deactivated_scm_repository):
response = client.get(f'/scm-repositories/{deactivated_scm_repository.public_identifier}/')
assert response.status_code == 404

def test_delete(self, client, logged_in_user, scm_repository):
response = client.delete(f'/scm-repositories/{scm_repository.public_identifier}/')
assert response.status_code == 204
p = models.SCMRepository.objects.get(pk=scm_repository.public_identifier)
assert p.status == STATUS_INACTIVE

def test_update(self, client, logged_in_user, credential, scm_service, scm_repository):
url = f'/scm-repositories/{scm_repository.public_identifier}/'
data = {'organisation': 'orgA', 'repository_name': 'repoA',
'credential': credential.public_identifier,
'scm_service': scm_service.public_identifier}
response = client.put(url, data, content_type='application/json')
assert response.status_code == 200
p = models.SCMRepository.objects.get(pk=scm_repository.public_identifier)
assert p.organisation == 'orgA'

def test_partial_update(self, client, logged_in_user, scm_repository):
url = f'/scm-repositories/{scm_repository.public_identifier}/'
data = {'organisation': 'orgB'}
response = client.patch(url, data, content_type='application/json')
assert response.status_code == 200
p = models.SCMRepository.objects.get(pk=scm_repository.public_identifier)
assert p.organisation == 'orgB'

def test_create(self, client, logged_in_user, credential, scm_service):
initial_count = models.SCMRepository.objects.count()
url = f'/scm-repositories/'
data = {'organisation': 'orgC', 'repository_name': 'repoC',
'credential': credential.public_identifier,
'scm_service': scm_service.public_identifier}
response = client.post(url, data=data, content_type='application/json')
assert response.status_code == 201
assert models.SCMRepository.objects.filter(organisation='orgC').exists()
assert models.SCMRepository.objects.count() == initial_count + 1

0 comments on commit 3678fbf

Please sign in to comment.