Improve test accuracy for apps

This commit is contained in:
Alexandre Aubin 2019-10-14 20:26:59 +02:00
parent 3bc65ddc34
commit 08d9717236

View file

@ -4,6 +4,8 @@ import pytest
import shutil import shutil
import requests import requests
from conftest import message, raiseYunohostError
from moulinette import m18n from moulinette import m18n
from moulinette.utils.filesystem import mkdir from moulinette.utils.filesystem import mkdir
@ -113,9 +115,9 @@ def app_is_not_installed(domain, app):
def app_is_exposed_on_http(domain, path, message_in_page): def app_is_exposed_on_http(domain, path, message_in_page):
try: try:
r = requests.get("http://127.0.0.1" + path + "/", headers={"Host": domain}, timeout=10) r = requests.get("http://127.0.0.1" + path + "/", headers={"Host": domain}, timeout=10, verify=False)
return r.status_code == 200 and message_in_page in r.text return r.status_code == 200 and message_in_page in r.text
except Exception: except Exception as e:
return False return False
@ -190,11 +192,11 @@ def test_legacy_app_install_private(secondary_domain):
assert app_is_not_installed(secondary_domain, "legacy_app") assert app_is_not_installed(secondary_domain, "legacy_app")
def test_legacy_app_install_unknown_domain(): def test_legacy_app_install_unknown_domain(mocker):
with pytest.raises(YunohostError): with pytest.raises(YunohostError):
install_legacy_app("whatever.nope", "/legacy") with message(mocker, "app_argument_invalid"):
# TODO check error message install_legacy_app("whatever.nope", "/legacy")
assert app_is_not_installed("whatever.nope", "legacy_app") assert app_is_not_installed("whatever.nope", "legacy_app")
@ -221,55 +223,51 @@ def test_legacy_app_install_multiple_instances(secondary_domain):
assert app_is_not_installed(secondary_domain, "legacy_app__2") assert app_is_not_installed(secondary_domain, "legacy_app__2")
def test_legacy_app_install_path_unavailable(secondary_domain): def test_legacy_app_install_path_unavailable(mocker, secondary_domain):
# These will be removed in teardown # These will be removed in teardown
install_legacy_app(secondary_domain, "/legacy") install_legacy_app(secondary_domain, "/legacy")
with pytest.raises(YunohostError): with pytest.raises(YunohostError):
install_legacy_app(secondary_domain, "/") with message(mocker, "app_location_unavailable"):
# TODO check error message install_legacy_app(secondary_domain, "/")
assert app_is_installed(secondary_domain, "legacy_app") assert app_is_installed(secondary_domain, "legacy_app")
assert app_is_not_installed(secondary_domain, "legacy_app__2") assert app_is_not_installed(secondary_domain, "legacy_app__2")
def test_legacy_app_install_bad_args(): def test_legacy_app_install_with_nginx_down(mocker, secondary_domain):
with pytest.raises(YunohostError):
install_legacy_app("this.domain.does.not.exists", "/legacy")
def test_legacy_app_install_with_nginx_down(secondary_domain):
os.system("systemctl stop nginx") os.system("systemctl stop nginx")
with pytest.raises(YunohostError): with raiseYunohostError(mocker, "app_action_cannot_be_ran_because_required_services_down"):
install_legacy_app(secondary_domain, "/legacy") install_legacy_app(secondary_domain, "/legacy")
def test_legacy_app_failed_install(secondary_domain): def test_legacy_app_failed_install(mocker, secondary_domain):
# This will conflict with the folder that the app # This will conflict with the folder that the app
# attempts to create, making the install fail # attempts to create, making the install fail
mkdir("/var/www/legacy_app/", 0o750) mkdir("/var/www/legacy_app/", 0o750)
with pytest.raises(YunohostError): with pytest.raises(YunohostError):
install_legacy_app(secondary_domain, "/legacy") with message(mocker, 'app_install_script_failed'):
# TODO check error message install_legacy_app(secondary_domain, "/legacy")
assert app_is_not_installed(secondary_domain, "legacy_app") assert app_is_not_installed(secondary_domain, "legacy_app")
def test_legacy_app_failed_remove(secondary_domain): def test_legacy_app_failed_remove(mocker, secondary_domain):
install_legacy_app(secondary_domain, "/legacy") install_legacy_app(secondary_domain, "/legacy")
# The remove script runs with set -eu and attempt to remove this # The remove script runs with set -eu and attempt to remove this
# file without -f, so will fail if it's not there ;) # file without -f, so will fail if it's not there ;)
os.remove("/etc/nginx/conf.d/%s.d/%s.conf" % (secondary_domain, "legacy_app")) os.remove("/etc/nginx/conf.d/%s.d/%s.conf" % (secondary_domain, "legacy_app"))
with pytest.raises(YunohostError):
app_remove("legacy") # TODO / FIXME : can't easily validate that 'app_not_properly_removed'
# is triggered for weird reasons ...
app_remove("legacy_app")
# #
# Well here, we hit the classical issue where if an app removal script # Well here, we hit the classical issue where if an app removal script
@ -286,59 +284,61 @@ def test_full_domain_app(secondary_domain):
assert app_is_exposed_on_http(secondary_domain, "/", "This is a dummy app") assert app_is_exposed_on_http(secondary_domain, "/", "This is a dummy app")
def test_full_domain_app_with_conflicts(secondary_domain): def test_full_domain_app_with_conflicts(mocker, secondary_domain):
install_legacy_app(secondary_domain, "/legacy") install_legacy_app(secondary_domain, "/legacy")
# TODO : once #808 is merged, add test that the message raised is 'app_full_domain_unavailable' with raiseYunohostError(mocker, "app_full_domain_unavailable"):
with pytest.raises(YunohostError):
install_full_domain_app(secondary_domain) install_full_domain_app(secondary_domain)
def test_systemfuckedup_during_app_install(secondary_domain): def test_systemfuckedup_during_app_install(mocker, secondary_domain):
with pytest.raises(YunohostError): with pytest.raises(YunohostError):
install_break_yo_system(secondary_domain, breakwhat="install") with message(mocker, "app_install_failed"):
os.system("nginx -t") with message(mocker, 'app_action_broke_system'):
os.system("systemctl status nginx") install_break_yo_system(secondary_domain, breakwhat="install")
assert app_is_not_installed(secondary_domain, "break_yo_system") assert app_is_not_installed(secondary_domain, "break_yo_system")
def test_systemfuckedup_during_app_remove(secondary_domain): def test_systemfuckedup_during_app_remove(mocker, secondary_domain):
install_break_yo_system(secondary_domain, breakwhat="remove") install_break_yo_system(secondary_domain, breakwhat="remove")
with pytest.raises(YunohostError): with pytest.raises(YunohostError):
app_remove("break_yo_system") with message(mocker, 'app_action_broke_system'):
os.system("nginx -t") with message(mocker, 'app_removed'):
os.system("systemctl status nginx") app_remove("break_yo_system")
assert app_is_not_installed(secondary_domain, "break_yo_system") assert app_is_not_installed(secondary_domain, "break_yo_system")
def test_systemfuckedup_during_app_install_and_remove(secondary_domain): def test_systemfuckedup_during_app_install_and_remove(mocker, secondary_domain):
with pytest.raises(YunohostError): with pytest.raises(YunohostError):
install_break_yo_system(secondary_domain, breakwhat="everything") with message(mocker, "app_install_failed"):
with message(mocker, 'app_action_broke_system'):
install_break_yo_system(secondary_domain, breakwhat="everything")
assert app_is_not_installed(secondary_domain, "break_yo_system") assert app_is_not_installed(secondary_domain, "break_yo_system")
def test_systemfuckedup_during_app_upgrade(secondary_domain): def test_systemfuckedup_during_app_upgrade(mocker, secondary_domain):
install_break_yo_system(secondary_domain, breakwhat="upgrade") install_break_yo_system(secondary_domain, breakwhat="upgrade")
with pytest.raises(YunohostError): with pytest.raises(YunohostError):
app_upgrade("break_yo_system", file="./tests/apps/break_yo_system_ynh") with message(mocker, 'app_action_broke_system'):
app_upgrade("break_yo_system", file="./tests/apps/break_yo_system_ynh")
def test_failed_multiple_app_upgrade(secondary_domain): def test_failed_multiple_app_upgrade(mocker, secondary_domain):
install_legacy_app(secondary_domain, "/legacy") install_legacy_app(secondary_domain, "/legacy")
install_break_yo_system(secondary_domain, breakwhat="upgrade") install_break_yo_system(secondary_domain, breakwhat="upgrade")
with pytest.raises(YunohostError): with raiseYunohostError(mocker, 'app_not_upgraded'):
app_upgrade(["break_yo_system", "legacy_app"], app_upgrade(["break_yo_system", "legacy_app"],
file={"break_yo_system": "./tests/apps/break_yo_system_ynh", file={"break_yo_system": "./tests/apps/break_yo_system_ynh",
"legacy": "./tests/apps/legacy_app_ynh"}) "legacy": "./tests/apps/legacy_app_ynh"})