From dd87a30c58b960e331b5b0fb819e9dbd865ee0a2 Mon Sep 17 00:00:00 2001 From: Defelo Date: Sat, 1 Mar 2025 01:53:25 +0100 Subject: [PATCH] nixos/tests/glitchtip: init Co-authored-by: Nico Felbinger --- nixos/tests/all-tests.nix | 1 + nixos/tests/glitchtip.nix | 103 ++++++++++++++++++ pkgs/by-name/gl/glitchtip/package.nix | 2 + .../python-modules/symbolic/default.nix | 3 + 4 files changed, 109 insertions(+) create mode 100644 nixos/tests/glitchtip.nix diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix index f753795bc629..643ae643066b 100644 --- a/nixos/tests/all-tests.nix +++ b/nixos/tests/all-tests.nix @@ -434,6 +434,7 @@ in { gitolite-fcgiwrap = handleTest ./gitolite-fcgiwrap.nix {}; glance = runTest ./glance.nix; glances = runTest ./glances.nix; + glitchtip = runTest ./glitchtip.nix; glusterfs = handleTest ./glusterfs.nix {}; gnome = handleTest ./gnome.nix {}; gnome-extensions = handleTest ./gnome-extensions.nix {}; diff --git a/nixos/tests/glitchtip.nix b/nixos/tests/glitchtip.nix new file mode 100644 index 000000000000..408ac5fc81a3 --- /dev/null +++ b/nixos/tests/glitchtip.nix @@ -0,0 +1,103 @@ +{ lib, ... }: + +let + domain = "http://glitchtip.local:8000"; +in + +{ + name = "glitchtip"; + meta.maintainers = with lib.maintainers; [ + defelo + felbinger + ]; + + nodes.machine = + { pkgs, ... }: + { + services.glitchtip = { + enable = true; + port = 8000; + settings.GLITCHTIP_DOMAIN = domain; + environmentFiles = [ + (builtins.toFile "glitchtip.env" '' + SECRET_KEY=8Hz7YCGzo7fiicHb8Qr22ZqwoIB7lSRx + '') + ]; + }; + + environment.systemPackages = [ pkgs.sentry-cli ]; + + networking.hosts."127.0.0.1" = [ "glitchtip.local" ]; + }; + + interactive.nodes.machine = { + services.glitchtip.listenAddress = "0.0.0.0"; + networking.firewall.allowedTCPPorts = [ 8000 ]; + virtualisation.forwardPorts = [ + { + from = "host"; + host.port = 8000; + guest.port = 8000; + } + ]; + }; + + testScript = '' + import json + import re + import time + + machine.wait_for_unit("glitchtip.service") + machine.wait_for_unit("glitchtip-worker.service") + machine.wait_for_open_port(8000) + + origin_url = "${domain}" + cookie_jar_path = "/tmp/cookies.txt" + curl = f"curl -b {cookie_jar_path} -c {cookie_jar_path} -fS -H 'Origin: {origin_url}'" + + # create superuser account + machine.succeed("DJANGO_SUPERUSER_PASSWORD=password glitchtip-manage createsuperuser --no-input --email=admin@example.com") + + # login + machine.fail(f"{curl} -s {origin_url}/_allauth/browser/v1/auth/session") # get the csrf token, returns a 401 + csrf_token = machine.succeed(f"grep csrftoken {cookie_jar_path} | cut -f7").rstrip() + machine.succeed(f"{curl} {origin_url}/_allauth/browser/v1/auth/login -s -H 'X-Csrftoken: {csrf_token}' -H 'Content-Type: application/json' -d '{{\"email\": \"admin@example.com\", \"password\": \"password\"}}'") + + resp = json.loads(machine.succeed(f"{curl} {origin_url}/api/0/users/me/")) + assert resp["email"] == "admin@example.com" + assert resp["isSuperuser"] is True + + # create organization + csrf_token = machine.succeed(f"grep csrftoken {cookie_jar_path} | cut -f7").rstrip() + machine.succeed(f"{curl} {origin_url}/api/0/organizations/ -s -H 'X-Csrftoken: {csrf_token}' -H 'Content-Type: application/json' -d '{{\"name\": \"main\"}}'") + + resp = json.loads(machine.succeed(f"{curl} {origin_url}/api/0/organizations/")) + assert len(resp) == 1 + assert resp[0]["name"] == "main" + assert resp[0]["slug"] == "main" + + # create team + csrf_token = machine.succeed(f"grep csrftoken {cookie_jar_path} | cut -f7").rstrip() + machine.succeed(f"{curl} {origin_url}/api/0/organizations/main/teams/ -s -H 'X-Csrftoken: {csrf_token}' -H 'Content-Type: application/json' -d '{{\"slug\": \"test\"}}'") + + # create project + csrf_token = machine.succeed(f"grep csrftoken {cookie_jar_path} | cut -f7").rstrip() + machine.succeed(f"{curl} {origin_url}/api/0/teams/main/test/projects/ -s -H 'X-Csrftoken: {csrf_token}' -H 'Content-Type: application/json' -d '{{\"name\": \"test\"}}'") + + # fetch dsn + resp = json.loads(machine.succeed(f"{curl} {origin_url}/api/0/projects/main/test/keys/")) + assert len(resp) == 1 + assert re.match(r"^http://[\da-f]+@glitchtip\.local:8000/\d+$", dsn := resp[0]["dsn"]["public"]) + + # send event + machine.succeed(f"SENTRY_DSN={dsn} sentry-cli send-event -m 'hello world'") + + for _ in range(20): + resp = json.loads(machine.succeed(f"{curl} {origin_url}/api/0/organizations/main/issues/?query=is:unresolved")) + if len(resp) != 0: break + time.sleep(1) + assert len(resp) == 1 + assert resp[0]["title"] == "hello world" + assert int(resp[0]["count"]) == 1 + ''; +} diff --git a/pkgs/by-name/gl/glitchtip/package.nix b/pkgs/by-name/gl/glitchtip/package.nix index c18875b42994..bdb275631e8e 100644 --- a/pkgs/by-name/gl/glitchtip/package.nix +++ b/pkgs/by-name/gl/glitchtip/package.nix @@ -5,6 +5,7 @@ callPackage, stdenv, makeWrapper, + nixosTests, }: let @@ -111,6 +112,7 @@ stdenv.mkDerivation (finalAttrs: { passthru = { inherit frontend python; + tests = { inherit (nixosTests) glitchtip; }; updateScript = ./update.sh; }; diff --git a/pkgs/development/python-modules/symbolic/default.nix b/pkgs/development/python-modules/symbolic/default.nix index 7b6206d2336c..0097ddec364b 100644 --- a/pkgs/development/python-modules/symbolic/default.nix +++ b/pkgs/development/python-modules/symbolic/default.nix @@ -9,6 +9,7 @@ milksnake, cffi, pytestCheckHook, + nixosTests, }: buildPythonPackage rec { @@ -63,6 +64,8 @@ buildPythonPackage rec { pythonImportsCheck = [ "symbolic" ]; + passthru.tests = { inherit (nixosTests) glitchtip; }; + meta = { description = "Python library for dealing with symbol files and more"; homepage = "https://github.com/getsentry/symbolic";