Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix tests #1198

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 3 additions & 3 deletions docker-test/Dockerfile
@@ -1,11 +1,11 @@
FROM debian:stretch-slim
FROM debian:stable-slim
LABEL maintainer="k@ndk.name"

ENV LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 LANGUAGE=en_US.UTF-8

RUN apt-get update -y \
&& apt-get install -y --no-install-recommends apt-transport-https locales locales-all python3-pip python3-setuptools python3-dev curl libsasl2-dev libldap2-dev libssl-dev libxml2-dev libxslt1-dev libxmlsec1-dev libffi-dev build-essential libmariadb-dev-compat \
&& curl -sL https://deb.nodesource.com/setup_10.x | bash - \
&& apt-get install -y --no-install-recommends apt-transport-https locales locales-all python3-pip python3-setuptools python3-dev curl libsasl2-dev libldap2-dev libssl-dev libxml2-dev libxslt1-dev libxmlsec1-dev libffi-dev libxmlsec1-openssl pkg-config build-essential libmariadb-dev-compat \
&& curl -sL https://deb.nodesource.com/setup_lts.x | bash - \
&& curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
&& echo "deb https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list \
&& apt-get update -y \
Expand Down
2 changes: 1 addition & 1 deletion powerdnsadmin/decorators.py
Expand Up @@ -388,7 +388,7 @@ def decorated_function(*args, **kwargs):
def allowed_record_types(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if request.method == 'GET':
if request.method in ['GET', 'DELETE', 'PUT']:
return f(*args, **kwargs)

if g.apikey.role.name in ['Administrator', 'Operator']:
Expand Down
3 changes: 2 additions & 1 deletion requirements.txt
Expand Up @@ -20,8 +20,9 @@ jsmin==3.0.0
Authlib==0.15
Flask-SeaSurf==1.1.1
bravado-core==5.17.0
jsonschema[format]>=2.5.1,<4.0.0 # until https://github.com/Yelp/bravado-core/pull/385
lima==0.5
pytest==6.1.1
pytest==6.2.5
pytimeparse==1.1.8
PyYAML==5.4
Flask-SSLify==0.1.5
Expand Down
4 changes: 4 additions & 0 deletions tests/fixtures.py → tests/conftest.py
Expand Up @@ -36,6 +36,8 @@ def load_data(setting_name, *args, **kwargs):
return 10
if setting_name == 'allow_user_create_domain':
return True
if setting_name == 'allow_user_remove_domain':
return True


@pytest.fixture
Expand Down Expand Up @@ -131,13 +133,15 @@ def initial_apikey_data():
api_url_setting = Setting('pdns_api_url', pdns_api_url)
api_key_setting = Setting('pdns_api_key', os.environ['PDNS_API_KEY'])
allow_create_domain_setting = Setting('allow_user_create_domain', True)
allow_remove_domain_setting = Setting('allow_user_remove_domain', True)

try:
flask_migrate.upgrade()

db.session.add(api_url_setting)
db.session.add(api_key_setting)
db.session.add(allow_create_domain_setting)
db.session.add(allow_remove_domain_setting)

test_user_apikey = app.config.get('TEST_USER_APIKEY')
test_admin_apikey = app.config.get('TEST_ADMIN_APIKEY')
Expand Down
7 changes: 3 additions & 4 deletions tests/integration/api/apikey/test_admin_user.py
Expand Up @@ -4,8 +4,7 @@

from powerdnsadmin.lib.validators import validate_apikey
from powerdnsadmin.lib.schema import ApiKeySchema
from tests.fixtures import client, initial_data, basic_auth_admin_headers
from tests.fixtures import user_apikey_data, admin_apikey_data, zone_data
from tests.conftest import user_apikey_data, admin_apikey_data


class TestIntegrationApiApiKeyAdminUser(object):
Expand Down Expand Up @@ -39,7 +38,7 @@ def test_create_apikey(self, client, initial_data, apikey_data, zone_data,
assert res.status_code == 201

apikey_url_format = "/api/v1/pdnsadmin/apikeys/{0}"
apikey_url = apikey_url_format.format(data[0]['id'])
apikey_url = apikey_url_format.format(data['id'])

res = client.delete(apikey_url, headers=basic_auth_admin_headers)

Expand Down Expand Up @@ -123,7 +122,7 @@ def test_delete_apikey(self, client, initial_data, apikey_data, zone_data,
assert res.status_code == 201

apikey_url_format = "/api/v1/pdnsadmin/apikeys/{0}"
apikey_url = apikey_url_format.format(data[0]['id'])
apikey_url = apikey_url_format.format(data['id'])
res = client.delete(apikey_url, headers=basic_auth_admin_headers)

assert res.status_code == 204
Expand Down
3 changes: 0 additions & 3 deletions tests/integration/api/apikey/test_user.py
@@ -1,11 +1,8 @@
import pytest
import json
from collections import namedtuple

from powerdnsadmin.lib.validators import validate_zone
from powerdnsadmin.lib.schema import DomainSchema
from tests.fixtures import client, initial_data, basic_auth_user_headers
from tests.fixtures import zone_data


class TestIntegrationApiZoneUser(object):
Expand Down
14 changes: 9 additions & 5 deletions tests/integration/api/management/__init__.py
Expand Up @@ -14,8 +14,10 @@ def get_account(self, account_name, status_code=200):
assert res.status_code == status_code
if res.status_code == 200:
data = res.get_json(force=True)
assert len(data) == 1
return data[0]
assert isinstance(data, dict)
assert len(data) == 7
assert data.get('id', None)
return data
return None

def check_account(self, cmpdata, data=None):
Expand All @@ -37,8 +39,10 @@ def get_user(self, username, status_code=200):
assert res.status_code == status_code
if status_code == 200:
data = res.get_json(force=True)
assert len(data) == 1
return data[0]
assert isinstance(data, dict)
assert len(data) == 7
assert data.get('id', None)
return data
return None

def check_user(self, cmpdata, data=None):
Expand All @@ -50,5 +54,5 @@ def check_user(self, cmpdata, data=None):
elif key == 'role':
assert data[key]['name'] == cmpdata['role_name']
else:
assert key in ("id",)
assert key in ("id","accounts",)
return data
23 changes: 12 additions & 11 deletions tests/integration/api/management/test_admin_user.py
@@ -1,9 +1,5 @@

import json
from tests.fixtures import ( # noqa: F401
client, initial_data, basic_auth_admin_headers,
test_admin_user, test_user, account_data, user1_data,
)

from . import IntegrationApiManagement


Expand Down Expand Up @@ -89,8 +85,9 @@ def test_accounts(
)
data = res.get_json(force=True)
assert res.status_code == 200
assert len(data) == 1
data = data[0]
assert isinstance(data, dict)
assert len(data) == 7
assert data.get('id', None)
account_id = data["id"]
for key, value in account_data.items():
assert data[key] == value
Expand Down Expand Up @@ -142,10 +139,12 @@ def test_users(
)
data = res.get_json(force=True)
assert res.status_code == 201
assert len(data) == 1
assert isinstance(data, dict)
assert len(data) == 6
assert data.get('id', None)

# Check user
user1 = self.check_user(user1_data, data[0])
user1 = self.check_user(user1_data, data)
user1_id = user1["id"]

updated = user1_data.copy()
Expand Down Expand Up @@ -240,10 +239,12 @@ def test_account_users(
)
data = res.get_json(force=True)
assert res.status_code == 201
assert len(data) == 1
assert isinstance(data, dict)
assert len(data) == 6
assert data.get('id', None)

# Check user
user1 = self.check_user(user1_data, data[0])
user1 = self.check_user(user1_data, data)
user1_id = user1["id"]

# Assert test account has no users
Expand Down
20 changes: 10 additions & 10 deletions tests/integration/api/management/test_user.py
@@ -1,10 +1,6 @@

import json

from tests.fixtures import ( # noqa: F401
client, initial_data, basic_auth_admin_headers, basic_auth_user_headers,
test_admin_user, test_user, account_data, user1_data,
)
from . import IntegrationApiManagement


Expand Down Expand Up @@ -33,8 +29,8 @@ def test_self_get(
headers=basic_auth_user_headers)
data = res.get_json(force=True)
assert res.status_code == 200
assert len(data) == 1, data
self.user = data
assert data
self.user = [data]

def test_accounts(
self, client, initial_data, # noqa: F811
Expand Down Expand Up @@ -118,10 +114,12 @@ def test_users(
)
data = res.get_json(force=True)
assert res.status_code == 201
assert len(data) == 1
assert isinstance(data, dict)
assert len(data) == 6
assert data.get('id', None)

# Check user
user1 = self.check_user(user1_data, data[0])
user1 = self.check_user(user1_data, data)
user1_id = user1["id"]

# Update to defaults (should fail)
Expand Down Expand Up @@ -181,10 +179,12 @@ def test_account_users(
)
data = res.get_json(force=True)
assert res.status_code == 201
assert len(data) == 1
assert isinstance(data, dict)
assert len(data) == 6
assert data.get('id', None)

# Check user
user1 = self.check_user(user1_data, data[0])
user1 = self.check_user(user1_data, data)
user1_id = user1["id"]

# Assert test account has no users
Expand Down
3 changes: 0 additions & 3 deletions tests/integration/api/zone/test_admin_user.py
@@ -1,11 +1,8 @@
import pytest
import json
from collections import namedtuple

from powerdnsadmin.lib.validators import validate_zone
from powerdnsadmin.lib.schema import DomainSchema
from tests.fixtures import client, initial_data, basic_auth_admin_headers
from tests.fixtures import zone_data


class TestIntegrationApiZoneAdminUser(object):
Expand Down
3 changes: 0 additions & 3 deletions tests/integration/api/zone/test_apikey_admin_user.py
Expand Up @@ -3,9 +3,6 @@

from powerdnsadmin.lib.validators import validate_zone
from powerdnsadmin.lib.schema import DomainSchema
from tests.fixtures import client
from tests.fixtures import zone_data, initial_apikey_data
from tests.fixtures import admin_apikey_integration


class TestIntegrationApiZoneAdminApiKey(object):
Expand Down
3 changes: 0 additions & 3 deletions tests/integration/api/zone/test_apikey_user.py
Expand Up @@ -3,9 +3,6 @@

from powerdnsadmin.lib.validators import validate_zone
from powerdnsadmin.lib.schema import DomainSchema
from tests.fixtures import client
from tests.fixtures import zone_data, initial_apikey_data
from tests.fixtures import user_apikey_integration

class TestIntegrationApiZoneUserApiKey(object):

Expand Down
2 changes: 0 additions & 2 deletions tests/integration/api/zone/test_user.py
Expand Up @@ -3,8 +3,6 @@

from powerdnsadmin.lib.validators import validate_zone
from powerdnsadmin.lib.schema import DomainSchema
from tests.fixtures import client, initial_data, basic_auth_user_headers
from tests.fixtures import zone_data


class TestIntegrationApiZoneUser(object):
Expand Down
Empty file removed tests/unit/apikey/__init__.py
Empty file.
Empty file removed tests/unit/test_decorators.py
Empty file.
39 changes: 32 additions & 7 deletions tests/unit/zone/test_admin_apikey.py
Expand Up @@ -2,20 +2,15 @@
import pytest
from unittest.mock import patch
from collections import namedtuple
import sys
import os
sys.path.append(os.getcwd())

import powerdnsadmin
from powerdnsadmin.models.setting import Setting
from powerdnsadmin.models.domain import Domain
from powerdnsadmin.models.api_key import ApiKey
from powerdnsadmin.models.role import Role
from powerdnsadmin.lib.validators import validate_zone
from powerdnsadmin.lib.schema import DomainSchema, ApiKeySchema
from tests.fixtures import client, initial_data, created_zone_data
from tests.fixtures import user_apikey, admin_apikey, zone_data
from tests.fixtures import admin_apikey_data, load_data
from powerdnsadmin.lib.schema import DomainSchema
from tests.conftest import admin_apikey_data, load_data


class TestUnitApiZoneAdminApiKey(object):
Expand All @@ -27,6 +22,9 @@ def common_data_mock(self):
self.github_setting_patcher = patch(
'powerdnsadmin.services.github.Setting',
spec=powerdnsadmin.models.setting.Setting)
self.azure_setting_patcher = patch(
'powerdnsadmin.services.azure.Setting',
spec=powerdnsadmin.models.setting.Setting)
self.oidc_setting_patcher = patch(
'powerdnsadmin.services.oidc.Setting',
spec=powerdnsadmin.models.setting.Setting)
Expand Down Expand Up @@ -54,6 +52,9 @@ def common_data_mock(self):
self.mock_setting_patcher = patch(
'powerdnsadmin.routes.api.Setting',
spec=powerdnsadmin.models.setting.Setting)
self.mock_decorators_setting_patcher = patch(
'powerdnsadmin.decorators.Setting',
spec=powerdnsadmin.models.setting.Setting)

data = admin_apikey_data()
api_key = ApiKey(desc=data['description'],
Expand All @@ -63,6 +64,7 @@ def common_data_mock(self):

self.mock_google_setting = self.google_setting_patcher.start()
self.mock_github_setting = self.github_setting_patcher.start()
self.mock_azure_setting = self.azure_setting_patcher.start()
self.mock_oidc_setting = self.oidc_setting_patcher.start()
self.mock_helpers_setting = self.helpers_setting_patcher.start()
self.mock_models_setting = self.models_setting_patcher.start()
Expand All @@ -75,17 +77,40 @@ def common_data_mock(self):
self.mock_apikey = self.mock_apikey_patcher.start()
self.mock_hist = self.mock_hist_patcher.start()
self.mock_setting = self.mock_setting_patcher.start()
self.mock_decorators_setting = self.mock_decorators_setting_patcher.start()

self.mock_google_setting.return_value.get.side_effect = load_data
self.mock_github_setting.return_value.get.side_effect = load_data
self.mock_azure_setting.return_value.get.side_effect = load_data
self.mock_oidc_setting.return_value.get.side_effect = load_data
self.mock_helpers_setting.return_value.get.side_effect = load_data
self.mock_models_setting.return_value.get.side_effect = load_data
self.mock_domain_model_setting.return_value.get.side_effect = load_data
self.mock_record_model_setting.return_value.get.side_effect = load_data
self.mock_server_model_setting.return_value.get.side_effect = load_data
self.mock_decorators_setting.return_value.get.side_effect = load_data
self.mock_apikey.return_value.is_validate.return_value = api_key

yield

for patcher in [
self.google_setting_patcher,
self.github_setting_patcher,
self.azure_setting_patcher,
self.oidc_setting_patcher,
self.helpers_setting_patcher,
self.models_setting_patcher,
self.domain_model_setting_patcher,
self.record_model_setting_patcher,
self.server_model_setting_patcher,
self.mock_apikey_patcher,
self.mock_hist_patcher,
self.mock_setting_patcher,
self.mock_decorators_setting_patcher,
]:
patcher.stop()


def test_empty_get(self, client, common_data_mock, admin_apikey):
with patch('powerdnsadmin.routes.api.Domain') as mock_domain, \
patch('powerdnsadmin.lib.utils.requests.get') as mock_get:
Expand Down