diff --git a/admin/tests/files/securedrop/i18n.json b/admin/tests/files/securedrop/i18n.json new file mode 100644 index 00000000000..6d72b8fcca9 --- /dev/null +++ b/admin/tests/files/securedrop/i18n.json @@ -0,0 +1,16 @@ +{ + "supported_locales": { + "de_DE": { + "name": "German", + "desktop": "de_DE" + }, + "es_ES": { + "name": "Spanish", + "desktop": "es_ES" + }, + "fr_FR": { + "name": "French", + "desktop": "fr" + } + } +} diff --git a/admin/tests/test_integration.py b/admin/tests/test_integration.py index e4384e2ab7e..43ba9c5b0f4 100644 --- a/admin/tests/test_integration.py +++ b/admin/tests/test_integration.py @@ -140,6 +140,9 @@ def setup_function(function): for name in ["de_DE", "es_ES", "fr_FR", "pt_BR"]: dircmd = "mkdir -p {0}/securedrop/translations/{1}".format(SD_DIR, name) subprocess.check_call(dircmd.split()) + subprocess.check_call( + "cp {0}/files/securedrop/i18n.json {1}/securedrop".format(CURRENT_DIR, SD_DIR).split() + ) def teardown_function(function): diff --git a/admin/tests/test_securedrop-admin.py b/admin/tests/test_securedrop-admin.py index c112610f7cc..8792c0bd2d1 100644 --- a/admin/tests/test_securedrop-admin.py +++ b/admin/tests/test_securedrop-admin.py @@ -480,13 +480,16 @@ def test_exit_codes(self, tmpdir): class TestSiteConfig(object): - def test_exists(self): + def test_exists(self, tmpdir): args = argparse.Namespace( - site_config="DOES_NOT_EXIST", ansible_path=".", app_path=dirname(__file__) + site_config="DOES_NOT_EXIST", + ansible_path=".", + app_path=dirname(__file__), + root=tmpdir, ) assert not securedrop_admin.SiteConfig(args).exists() args = argparse.Namespace( - site_config=__file__, ansible_path=".", app_path=dirname(__file__) + site_config=__file__, ansible_path=".", app_path=dirname(__file__), root=tmpdir ) assert securedrop_admin.SiteConfig(args).exists() @@ -623,9 +626,12 @@ def test_validate_optional_fingerprint(self): assert validator.validate(Document("012345678901234567890123456789ABCDEFABCD")) assert validator.validate(Document("")) - def test_sanitize_fingerprint(self): + def test_sanitize_fingerprint(self, tmpdir): args = argparse.Namespace( - site_config="DOES_NOT_EXIST", ansible_path=".", app_path=dirname(__file__) + site_config="DOES_NOT_EXIST", + ansible_path=".", + app_path=dirname(__file__), + root=tmpdir, ) site_config = securedrop_admin.SiteConfig(args) assert "ABC" == site_config.sanitize_fingerprint(" A bc") @@ -643,7 +649,9 @@ def test_locales(self): assert "fr_FR" in translations def test_validate_locales(self): - validator = securedrop_admin.SiteConfig.ValidateLocales(dirname(__file__)) + validator = securedrop_admin.SiteConfig.ValidateLocales( + dirname(__file__), {"en_US", "fr_FR"} + ) assert validator.validate(Document("en_US fr_FR ")) with pytest.raises(ValidationError) as e: validator.validate(Document("BAD")) @@ -652,7 +660,10 @@ def test_validate_locales(self): def test_save(self, tmpdir): site_config_path = join(str(tmpdir), "site_config") args = argparse.Namespace( - site_config=site_config_path, ansible_path=".", app_path=dirname(__file__) + site_config=site_config_path, + ansible_path=".", + app_path=dirname(__file__), + root=tmpdir, ) site_config = securedrop_admin.SiteConfig(args) site_config.config = {"var1": "val1", "var2": "val2"} @@ -665,9 +676,12 @@ def test_save(self, tmpdir): ) assert expected == io.open(site_config_path).read() - def test_validate_gpg_key(self, caplog): + def test_validate_gpg_key(self, tmpdir, caplog): args = argparse.Namespace( - site_config="INVALID", ansible_path="tests/files", app_path=dirname(__file__) + site_config="INVALID", + ansible_path="tests/files", + app_path=dirname(__file__), + root=tmpdir, ) good_config = { "securedrop_app_gpg_public_key": "test_journalist_key.pub", @@ -689,9 +703,12 @@ def test_validate_gpg_key(self, caplog): site_config.validate_gpg_keys() assert "FAIL does not match" in str(e) - def test_journalist_alert_email(self): + def test_journalist_alert_email(self, tmpdir): args = argparse.Namespace( - site_config="INVALID", ansible_path="tests/files", app_path=dirname(__file__) + site_config="INVALID", + ansible_path="tests/files", + app_path=dirname(__file__), + root=tmpdir, ) site_config = securedrop_admin.SiteConfig(args) site_config.config = { @@ -723,6 +740,7 @@ def test_update_config(self, mock_save, mock_validate_input): site_config="tests/files/site-specific", ansible_path="tests/files", app_path=dirname(__file__), + root="tests/files", ) site_config = securedrop_admin.SiteConfig(args) @@ -736,7 +754,10 @@ def test_update_config(self, mock_save, mock_validate_input): def test_update_config_no_site_specific(self, validate_gpg_keys, mock_validate_input, tmpdir): site_config_path = join(str(tmpdir), "site_config") args = argparse.Namespace( - site_config=site_config_path, ansible_path=".", app_path=dirname(__file__) + site_config=site_config_path, + ansible_path=".", + app_path=dirname(__file__), + root=tmpdir, ) site_config = securedrop_admin.SiteConfig(args) assert site_config.load_and_update_config() @@ -744,11 +765,12 @@ def test_update_config_no_site_specific(self, validate_gpg_keys, mock_validate_i validate_gpg_keys.assert_called_once() assert exists(site_config_path) - def test_load_and_update_config(self): + def test_load_and_update_config(self, tmpdir): args = argparse.Namespace( site_config="tests/files/site-specific", ansible_path="tests/files", app_path=dirname(__file__), + root=tmpdir, ) site_config = securedrop_admin.SiteConfig(args) with mock.patch("securedrop_admin.SiteConfig.update_config"): @@ -759,6 +781,7 @@ def test_load_and_update_config(self): site_config="tests/files/site-specific-missing-entries", ansible_path="tests/files", app_path=dirname(__file__), + root=tmpdir, ) site_config = securedrop_admin.SiteConfig(args) with mock.patch("securedrop_admin.SiteConfig.update_config"): @@ -766,7 +789,10 @@ def test_load_and_update_config(self): assert site_config.config != {} args = argparse.Namespace( - site_config="UNKNOWN", ansible_path="tests/files", app_path=dirname(__file__) + site_config="UNKNOWN", + ansible_path="tests/files", + app_path=dirname(__file__), + root=tmpdir, ) site_config = securedrop_admin.SiteConfig(args) with mock.patch("securedrop_admin.SiteConfig.update_config"): @@ -797,7 +823,7 @@ def verify_prompt_boolean(self, site_config, desc): assert site_config.user_prompt_config_one(desc, "YES") is True assert site_config.user_prompt_config_one(desc, "NO") is False - def test_desc_conditional(self): + def test_desc_conditional(self, tmpdir): """Ensure that conditional prompts behave correctly. Prompts which depend on another question should only be @@ -827,6 +853,7 @@ def test_desc_conditional(self): site_config="tests/files/site-specific", ansible_path="tests/files", app_path=dirname(__file__), + root=tmpdir, ) site_config = securedrop_admin.SiteConfig(args) site_config.desc = questions @@ -904,9 +931,12 @@ def verify_prompt_securedrop_supported_locales(self, site_config, desc): with pytest.raises(ValidationError): site_config.user_prompt_config_one(desc, "wrong") - def test_user_prompt_config_one(self): + def test_user_prompt_config_one(self, tmpdir): args = argparse.Namespace( - site_config="UNKNOWN", ansible_path="tests/files", app_path=dirname(__file__) + site_config="UNKNOWN", + ansible_path="tests/files", + app_path=dirname(__file__), + root=tmpdir, ) site_config = securedrop_admin.SiteConfig(args) @@ -922,9 +952,12 @@ def auto_prompt(prompt, default, **kwargs): print("checking " + method) getattr(self, method)(site_config, desc) - def test_validated_input(self): + def test_validated_input(self, tmpdir): args = argparse.Namespace( - site_config="UNKNOWN", ansible_path="tests/files", app_path=dirname(__file__) + site_config="UNKNOWN", + ansible_path="tests/files", + app_path=dirname(__file__), + root=tmpdir, ) site_config = securedrop_admin.SiteConfig(args) @@ -941,17 +974,21 @@ def auto_prompt(prompt, default, **kwargs): assert "a b" == site_config.validated_input("", ["a", "b"], lambda: True, None) assert "{}" == site_config.validated_input("", {}, lambda: True, None) - def test_load(self, caplog): + def test_load(self, tmpdir, caplog): args = argparse.Namespace( site_config="tests/files/site-specific", ansible_path="tests/files", app_path=dirname(__file__), + root=tmpdir, ) site_config = securedrop_admin.SiteConfig(args) assert "app_hostname" in site_config.load() args = argparse.Namespace( - site_config="UNKNOWN", ansible_path="tests/files", app_path=dirname(__file__) + site_config="UNKNOWN", + ansible_path="tests/files", + app_path=dirname(__file__), + root=tmpdir, ) site_config = securedrop_admin.SiteConfig(args) with pytest.raises(IOError) as e: @@ -963,6 +1000,7 @@ def test_load(self, caplog): site_config="tests/files/corrupted", ansible_path="tests/files", app_path=dirname(__file__), + root=tmpdir, ) site_config = securedrop_admin.SiteConfig(args) with pytest.raises(yaml.YAMLError) as e: