|
| 1 | +import ../make-test-python.nix ( |
| 2 | + { pkgs, lib, ... }: |
| 3 | + { |
| 4 | + name = "immich-public-proxy"; |
| 5 | + |
| 6 | + nodes.machine = |
| 7 | + { pkgs, ... }@args: |
| 8 | + { |
| 9 | + environment.systemPackages = [ |
| 10 | + pkgs.imagemagick |
| 11 | + pkgs.immich-cli |
| 12 | + ]; |
| 13 | + services.immich = { |
| 14 | + enable = true; |
| 15 | + port = 2283; |
| 16 | + # disable a lot of features that aren't needed for this test |
| 17 | + machine-learning.enable = false; |
| 18 | + settings = { |
| 19 | + backup.database.enabled = false; |
| 20 | + machineLearning.enabled = false; |
| 21 | + map.enabled = false; |
| 22 | + reverseGeocoding.enabled = false; |
| 23 | + metadata.faces.import = false; |
| 24 | + newVersionCheck.enabled = false; |
| 25 | + notifications.smtp.enabled = false; |
| 26 | + }; |
| 27 | + }; |
| 28 | + services.immich-public-proxy = { |
| 29 | + enable = true; |
| 30 | + immichUrl = "http://localhost:2283"; |
| 31 | + port = 8002; |
| 32 | + settings.ipp.responseHeaders."X-NixOS" = "Rules"; |
| 33 | + }; |
| 34 | + }; |
| 35 | + |
| 36 | + testScript = '' |
| 37 | + import json |
| 38 | +
|
| 39 | + machine.wait_for_unit("immich-server.service") |
| 40 | + machine.wait_for_unit("immich-public-proxy.service") |
| 41 | + machine.wait_for_open_port(2283) |
| 42 | + machine.wait_for_open_port(8002) |
| 43 | +
|
| 44 | + # The proxy should be up |
| 45 | + machine.succeed("curl -sf http://localhost:8002") |
| 46 | +
|
| 47 | + # Verify the static assets are served |
| 48 | + machine.succeed("curl -sf http://localhost:8002/robots.txt") |
| 49 | + machine.succeed("curl -sf http://localhost:8002/share/static/style.css") |
| 50 | +
|
| 51 | + # Check that the response header in the settings is sent |
| 52 | + res = machine.succeed(""" |
| 53 | + curl -sD - http://localhost:8002 -o /dev/null |
| 54 | + """) |
| 55 | + assert "x-nixos: rules" in res.lower(), res |
| 56 | +
|
| 57 | + # Log in to Immich and create an access key |
| 58 | + machine.succeed(""" |
| 59 | + curl -sf --json '{ "email": "[email protected]", "name": "Admin", "password": "admin" }' http://localhost:2283/api/auth/admin-sign-up |
| 60 | + """) |
| 61 | + res = machine.succeed(""" |
| 62 | + curl -sf --json '{ "email": "[email protected]", "password": "admin" }' http://localhost:2283/api/auth/login |
| 63 | + """) |
| 64 | + token = json.loads(res)['accessToken'] |
| 65 | + res = machine.succeed(""" |
| 66 | + curl -sf -H 'Cookie: immich_access_token=%s' --json '{ "name": "API Key", "permissions": ["all"] }' http://localhost:2283/api/api-keys |
| 67 | + """ % token) |
| 68 | + key = json.loads(res)['secret'] |
| 69 | + machine.succeed(f"immich login http://localhost:2283/api {key}") |
| 70 | + res = machine.succeed("immich server-info") |
| 71 | + print(res) |
| 72 | +
|
| 73 | + # Upload some blank images to a new album |
| 74 | + # If there's only one image, the proxy serves the image directly |
| 75 | + machine.succeed("magick -size 800x600 canvas:white /tmp/white.png") |
| 76 | + machine.succeed("immich upload -A '✨ Reproducible Moments ✨' /tmp/white.png") |
| 77 | + machine.succeed("magick -size 800x600 canvas:black /tmp/black.png") |
| 78 | + machine.succeed("immich upload -A '✨ Reproducible Moments ✨' /tmp/black.png") |
| 79 | + res = machine.succeed("immich server-info") |
| 80 | + print(res) |
| 81 | +
|
| 82 | + # Get the new album id |
| 83 | + res = machine.succeed(""" |
| 84 | + curl -sf -H 'Cookie: immich_access_token=%s' http://localhost:2283/api/albums |
| 85 | + """ % token) |
| 86 | + album_id = json.loads(res)[0]['id'] |
| 87 | +
|
| 88 | + # Create a shared link |
| 89 | + res = machine.succeed(""" |
| 90 | + curl -sf -H 'Cookie: immich_access_token=%s' --json '{ "albumId": "%s", "type": "ALBUM" }' http://localhost:2283/api/shared-links |
| 91 | + """ % (token, album_id)) |
| 92 | + share_key = json.loads(res)['key'] |
| 93 | +
|
| 94 | + # Access the share |
| 95 | + machine.succeed(""" |
| 96 | + curl -sf http://localhost:2283/share/%s |
| 97 | + """ % share_key) |
| 98 | +
|
| 99 | + # Access the share through the proxy |
| 100 | + machine.succeed(""" |
| 101 | + curl -sf http://localhost:8002/share/%s |
| 102 | + """ % share_key) |
| 103 | + ''; |
| 104 | + } |
| 105 | +) |
0 commit comments