hobo/tests/test_environment.py

299 lines
11 KiB
Python

# -*- coding: utf-8 -*-
import pytest
from django.core.exceptions import ValidationError
from django.core.management import call_command
from django.utils import timezone
from hobo.environment.models import AVAILABLE_SERVICES, Combo, Passerelle, ServiceBase, Variable
from test_manager import login
pytestmark = pytest.mark.django_db
def test_service_id():
for service in AVAILABLE_SERVICES:
assert service.Extra.service_id
def test_unique_slug():
combo = Combo(title='Combo test',
slug='wesh',
last_operational_success_timestamp=timezone.now(),
last_operational_check_timestamp=timezone.now(),
secret_key='1nesüper5Cr!eteKAaY~',
base_url='http://example.com')
combo.save()
passerelle = Passerelle(title='Passerelle test',
slug='wesh',
last_operational_success_timestamp=timezone.now(),
last_operational_check_timestamp=timezone.now(),
secret_key='1nesüper5Cr!eteKAaY~',
base_url='http://example.com')
with pytest.raises(ValidationError) as e:
passerelle.clean()
assert e.value.messages[0] == u'This slug is already used. It must be unique.'
def test_unique_title():
Combo.objects.create(
title='Combo test',
slug='bar',
last_operational_success_timestamp=timezone.now(),
last_operational_check_timestamp=timezone.now(),
secret_key='1nesüper5Cr!eteKAaY~',
base_url='http://example.com'
)
combo = Combo(
title='Combo test',
slug='foo',
last_operational_success_timestamp=timezone.now(),
last_operational_check_timestamp=timezone.now(),
secret_key='1nesüper5Cr!eteKAaY~',
base_url='http://example.com'
)
with pytest.raises(ValidationError) as e:
combo.clean()
assert e.value.messages[0] == u'This title is already used. It must be unique.'
def test_base_url_field_validator():
kwargs = {'last_operational_success_timestamp': timezone.now(),
'last_operational_check_timestamp': timezone.now(),
'secret_key': '1nesüper5Cr!eteKAaY~'}
cpt = 0 # slugs must be unique
# accept well formated url
for url in ('https://example.com', 'http://example.com'):
cpt += 1
slug = 'wesh' + str(cpt)
title = 'Combo test ' + str(cpt)
combo = Combo(base_url=url, slug=slug, title=title, **kwargs)
combo.full_clean()
combo.save()
assert True # no exception raised
# reject baddly formated url
for url in ('example.com', 'http:/example.com', 'file:///home/me'):
cpt += 1
slug = 'wesh' + str(cpt)
title = 'Combo test ' + str(cpt)
with pytest.raises(ValidationError):
combo = Combo(base_url=url, slug=slug, title=title, **kwargs)
combo.full_clean()
combo.save()
def test_service_creation_filling(app, admin_user, monkeypatch):
from django.http.request import HttpRequest
monkeypatch.setattr(HttpRequest, 'get_host', lambda x: 'test.example.net')
app = login(app)
response = app.get('/sites/new-combo')
assert 'value="http://portal.example.net"' in response.text
monkeypatch.setattr(HttpRequest, 'get_host', lambda x: 'hobo-test.example.net')
app = login(app)
response = app.get('/sites/new-combo')
assert 'value="http://portal-test.example.net"' in response.text
def test_service_creation_url_validation(app, admin_user, monkeypatch):
app = login(app)
response = app.get('/sites/new-combo')
form = response.form
form['title'] = "test"
form['base_url'] = "http://portal-test.example.net"
response = form.submit()
assert 'not resolvable' in response
monkeypatch.setattr(ServiceBase, 'is_resolvable', lambda x: True)
form = response.form
response = form.submit()
assert 'no valid certificate' in response
assert not Combo.objects.exists()
monkeypatch.setattr(ServiceBase, 'has_valid_certificate', lambda x: True)
form = response.form
response = form.submit()
assert Combo.objects.exists()
def test_home_view(app, admin_user):
app = login(app)
Combo.objects.create(base_url='https://combo.agglo.love',
template_name='...portal-user...',
slug='portal')
response = app.get('/sites').follow()
assert 'Add new service:' in response.text
for service in AVAILABLE_SERVICES:
if service.is_enabled():
assert str(service._meta.verbose_name) in response.text
assert response.html.find('span', {'class': 'slug'}).a.text == 'https://combo.agglo.love/'
def test_variables_view(app, admin_user):
app = login(app)
Variable.objects.create(name='foo', value='bar')
response = app.get('/sites/variables')
assert response.html.find('label').text == 'foo'
assert response.html.find('input')['value'] == 'bar'
assert 'Add new variable' in response.text
def test_new_variable_view(app, admin_user):
app = login(app)
response = app.get('/sites/new-variable')
response.form['name'] = 'foo'
response.form['label'] = 'bar'
response.form['value'] = 'barbar'
response = response.form.submit()
assert response.location == '/sites/variables'
assert Variable.objects.all()[0].name == 'foo'
assert Variable.objects.all()[0].label == 'bar'
assert Variable.objects.all()[0].value == 'barbar'
response = app.get('/sites/new-variable')
response.form['name'] = 'foo'
response.form['label'] = 'bar'
response.form['value'] = 'foofoo'
response = response.form.submit()
assert response.location == '/sites/variables'
assert Variable.objects.all()[0].value == 'foofoo'
def test_new_variable_service_view(app, admin_user):
app = login(app)
Combo.objects.create(base_url='https://combo.agglo.love',
template_name='...portal-user...',
slug='portal')
response = app.get('/sites/new-variable-combo/portal')
response.form['name'] = 'foo'
response.form['label'] = 'bar'
response.form['value'] = 'barbar'
response = response.form.submit()
assert response.location == '/sites/'
assert Variable.objects.all()[0].name == 'foo'
assert Variable.objects.all()[0].label == 'bar'
assert Variable.objects.all()[0].value == 'barbar'
def test_variable_update_view(app, admin_user):
app = login(app)
Variable.objects.create(name='foo', value='bar')
response = app.get('/sites/update-variable/1')
assert response.html.find('input', {'name': 'name'})['value'] == 'foo'
assert response.html.find('textarea').text == '\nbar'
response.form['value'] = 'barbar'
response = response.form.submit()
assert response.location == '/sites/variables'
assert Variable.objects.all()[0].value == 'barbar'
def test_variable_delete_view(app, admin_user):
app = login(app)
Variable.objects.create(name='foo', value='bar')
response = app.get('/sites/delete-variable/1')
assert response.html.find('h2').text == 'Removal of "foo"'
response = response.form.submit()
assert response.location == '/sites/variables'
assert Variable.objects.count() == 0
def test_service_update_view(app, admin_user):
app = login(app)
Combo.objects.create(base_url='https://combo.agglo.love',
template_name='...portal-user...',
slug='portal')
response = app.get('/sites/save-combo/portal')
response.form['title'] = 'foobar'
response = response.form.submit()
assert response.location == '/sites/'
assert Combo.objects.all()[0].title == 'foobar'
def test_service_save_extra_variables(app, admin_user, settings):
settings.SERVICE_EXTRA_VARIABLES = {
'passerelle': ['legal_url', 'commune_url', 'domain_key'],
'combo': [{'name': 'theme', 'label': 'Theme'}],
}
app = login(app)
Combo.objects.create(base_url='https://combo.agglo.love',
template_name='...portal-user...',
slug='portal')
Passerelle.objects.create(base_url='https://passerelle.agglo.love',
slug='passerelle')
app.get('/sites/save-combo/portal')
Variable.objects.all()[0].name = 'theme'
Variable.objects.all()[0].label = 'Theme'
app.get('/sites/save-passerelle/passerelle')
Variable.objects.all()[0].name = 'legal_url'
Variable.objects.all()[1].name = 'commune_url'
Variable.objects.all()[2].name = 'domain_key'
def test_service_delete_view(app, admin_user):
app = login(app)
Combo.objects.create(base_url='https://combo.agglo.love',
template_name='...portal-user...',
title='foo',
slug='portal')
response = app.get('/sites/delete-combo/portal')
assert response.html.find('h2').text == 'Removal of "foo"'
response = response.form.submit()
assert response.location == '/sites/'
assert Combo.objects.count() == 0
def test_check_operational_view(app, admin_user, monkeypatch):
app = login(app)
Combo.objects.create(base_url='https://combo.agglo.love',
template_name='...portal-user...',
slug='portal')
response = app.get('/sites/check_operational/combo/portal')
assert response.json['operational'] == False
monkeypatch.setattr(ServiceBase, 'is_operational', lambda x: True)
response = app.get('/sites/check_operational/combo/portal')
assert response.json['operational'] == True
response = app.get('/sites/check_operational/foo/bar', status=404)
def test_debug_json_view(app, admin_user):
app = login(app)
Variable.objects.create(name='foo', value='bar')
Combo.objects.create(base_url='https://combo.agglo.love',
template_name='...portal-user...',
slug='portal')
response = app.get('/sites/debug-json')
assert response.json[0]['variables']['foo'] == 'bar'
assert response.json[0]['services'][0]['slug'] == 'hobo'
assert response.json[0]['services'][1]['slug'] == 'portal'
def test_check_operational_command(monkeypatch, capsys):
combo = Combo.objects.create(base_url='https://combo.agglo.love',
template_name='...portal-user...',
title='foo',
slug='portal')
monkeypatch.setattr(ServiceBase, 'is_operational', lambda x: True)
call_command('check_operational', '-v2')
captured = capsys.readouterr()
assert captured.out == 'foo is operational\n'
monkeypatch.setattr(ServiceBase, 'is_operational', lambda x: False)
combo.last_operational_success_timestamp = '2022-2-22'
combo.save()
call_command('check_operational', '-v2')
captured = capsys.readouterr()
assert captured.out.split('\n')[:-1] == [
'foo is NOT operational',
' last operational success: 2022-02-22 00:00:00+00:00'
]