diff options
author | Brian Leung <leungbk@posteo.net> | 2022-09-02 02:02:51 -0700 |
---|---|---|
committer | Yt <happysalada@proton.me> | 2022-09-02 05:55:11 -0400 |
commit | cbf8e91772e18b94614320cee596611d41155f8e (patch) | |
tree | d531abcb123e7aecbf0f4e0f7898df2135b31cdd /nixos | |
parent | 50361fb66109b81e12d79c32edfda3624cda7d32 (diff) | |
download | nixlib-cbf8e91772e18b94614320cee596611d41155f8e.tar nixlib-cbf8e91772e18b94614320cee596611d41155f8e.tar.gz nixlib-cbf8e91772e18b94614320cee596611d41155f8e.tar.bz2 nixlib-cbf8e91772e18b94614320cee596611d41155f8e.tar.lz nixlib-cbf8e91772e18b94614320cee596611d41155f8e.tar.xz nixlib-cbf8e91772e18b94614320cee596611d41155f8e.tar.zst nixlib-cbf8e91772e18b94614320cee596611d41155f8e.zip |
nixos/tests/lemmy: init
Co-authored-by: Ctem <c@ctem.me> Co-authored-by: cab <cab404@mailbox.org> Co-authored-by: a-kenji <aks.kenji@protonmail.com> Co-authored-by: Shahar Dawn Or <mightyiampresence@gmail.com> Co-authored-by: Matthias Meschede <MMesch@users.noreply.github.com> Co-authored-by: Ilan Joselevich <personal@ilanjoselevich.com>
Diffstat (limited to 'nixos')
-rw-r--r-- | nixos/tests/all-tests.nix | 1 | ||||
-rw-r--r-- | nixos/tests/lemmy.nix | 85 |
2 files changed, 86 insertions, 0 deletions
diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix index 1cf310cb3321..e3c699dfd0c9 100644 --- a/nixos/tests/all-tests.nix +++ b/nixos/tests/all-tests.nix @@ -278,6 +278,7 @@ in { kubernetes = handleTestOn ["x86_64-linux"] ./kubernetes {}; latestKernel.login = handleTest ./login.nix { latestKernel = true; }; leaps = handleTest ./leaps.nix {}; + lemmy = handleTest ./lemmy.nix {}; libinput = handleTest ./libinput.nix {}; libreddit = handleTest ./libreddit.nix {}; libresprite = handleTest ./libresprite.nix {}; diff --git a/nixos/tests/lemmy.nix b/nixos/tests/lemmy.nix new file mode 100644 index 000000000000..5436d0b300cc --- /dev/null +++ b/nixos/tests/lemmy.nix @@ -0,0 +1,85 @@ +import ./make-test-python.nix ({ pkgs, lib, ... }: +let + uiPort = 1234; + backendPort = 5678; + lemmyNodeName = "server"; +in +{ + name = "lemmy"; + meta = with lib.maintainers; { maintainers = [ mightyiam ]; }; + + nodes = { + client = { }; + + "${lemmyNodeName}" = { + services.lemmy = { + enable = true; + jwtSecretPath = pkgs.writeTextFile { + name = "lemmy-secret"; + text = "very-secret-password123"; + }; + ui.port = uiPort; + settings = { + hostname = "http://${lemmyNodeName}"; + port = backendPort; + database.createLocally = true; + }; + caddy.enable = true; + }; + + networking.firewall.allowedTCPPorts = [ 80 ]; + + # pict-rs seems to need more than 1025114112 bytes + virtualisation.memorySize = 2000; + }; + }; + + testScript = '' + server = ${lemmyNodeName} + + with subtest("the backend starts and responds"): + server.wait_for_unit("lemmy.service") + server.wait_for_open_port(${toString backendPort}) + server.succeed("curl --fail localhost:${toString backendPort}/api/v3/site") + + with subtest("the UI starts and responds"): + server.wait_for_unit("lemmy-ui.service") + server.wait_for_open_port(${toString uiPort}) + server.succeed("curl --fail localhost:${toString uiPort}") + + with subtest("Lemmy-UI responds through the caddy reverse proxy"): + server.wait_for_unit("network-online.target") + server.wait_for_unit("caddy.service") + server.wait_for_open_port(80) + body = server.execute("curl --fail --location ${lemmyNodeName}")[1] + assert "Lemmy" in body, f"String Lemmy not found in response for ${lemmyNodeName}: \n{body}" + + with subtest("the server is exposed externally"): + client.wait_for_unit("network-online.target") + client.succeed("curl -v --fail ${lemmyNodeName}") + + with subtest("caddy correctly routes backend requests"): + # Make sure we are not hitting frontend + server.execute("systemctl stop lemmy-ui.service") + + def assert_http_code(url, expected_http_code, extra_curl_args=""): + _, http_code = server.execute(f'curl --silent -o /dev/null {extra_curl_args} --fail --write-out "%{{http_code}}" {url}') + assert http_code == str(expected_http_code), f"expected http code {expected_http_code}, got {http_code}" + + # Caddy responds with HTTP code 502 if it cannot handle the requested path + assert_http_code("${lemmyNodeName}/obviously-wrong-path/", 502) + + assert_http_code("${lemmyNodeName}/static/js/client.js", 200) + assert_http_code("${lemmyNodeName}/api/v3/site", 200) + + # A 404 confirms that the request goes to the backend + # No path can return 200 until after we upload an image to pict-rs + assert_http_code("${lemmyNodeName}/pictrs/", 404) + + # The paths `/feeds/*` and `/nodeinfo/*` are not tested because they seem to be misconfigured + + assert_http_code("${lemmyNodeName}/some-other-made-up-path/", 404, "-X POST") + assert_http_code("${lemmyNodeName}/some-other-path", 404, "-H 'Accept: application/activity+json'") + assert_http_code("${lemmyNodeName}/some-other-path", 404, "-H 'Accept: application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"'") + ''; +}) |