summaryrefslogtreecommitdiff
path: root/gnu/tests/web.scm
diff options
context:
space:
mode:
authorRodion Goritskov <rodion@goritskov.com>2025-07-19 10:52:11 +0200
committerLudovic Courtès <ludo@gnu.org>2025-09-26 21:39:40 +0200
commit054aae7bb201f6ba83390017a4cc644061a6abda (patch)
treedcb79b68c76b50984c0f397d6477ba60382de22a /gnu/tests/web.scm
parentd411aff61193c9ce542aa66c047d91e00660586d (diff)
services: Add miniflux-service-type.
* doc/guix.texi: Document Miniflux service and configuration. * gnu/services/web.scm: New service. * gnu/services/web.scm: Define shepherd service and account roles. * gnu/tests/web.scm: (%miniflux-create-admin-credentials, miniflux-base-system, %test-miniflux-admin-string, %test-miniflux-admin-file, %test-miniflux-socket): Add system tests for Miniflux service. Change-Id: I4a336e677ec8b46aed632f0ded9cc11c2d38975f Signed-off-by: Ludovic Courtès <ludo@gnu.org>
Diffstat (limited to 'gnu/tests/web.scm')
-rw-r--r--gnu/tests/web.scm194
1 files changed, 193 insertions, 1 deletions
diff --git a/gnu/tests/web.scm b/gnu/tests/web.scm
index 431996ede48..419b5f0b5bf 100644
--- a/gnu/tests/web.scm
+++ b/gnu/tests/web.scm
@@ -5,6 +5,7 @@
;;; Copyright © 2018 Pierre-Antoine Rouby <pierre-antoine.rouby@inria.fr>
;;; Copyright © 2018 Marius Bakke <mbakke@fastmail.com>
;;; Copyright © 2024 Maxim Cournoyer <maxim@guixotic.coop>
+;;; Copyright © 2025 Rodion Goritskov <rodion@goritskov.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -37,6 +38,7 @@
#:use-module (gnu packages base)
#:use-module (gnu packages databases)
#:use-module (gnu packages guile-xyz)
+ #:use-module (gnu packages gnupg)
#:use-module (gnu packages patchutils)
#:use-module (gnu packages python)
#:use-module (gnu packages tls)
@@ -56,7 +58,10 @@
%test-hpcguix-web
%test-anonip
%test-patchwork
- %test-agate))
+ %test-agate
+ %test-miniflux-admin-string
+ %test-miniflux-admin-file
+ %test-miniflux-socket))
(define %index.html-contents
;; Contents of the /index.html file.
@@ -848,3 +853,190 @@ HTTP-PORT."
(name "agate")
(description "Connect to a running Agate service.")
(value (run-agate-test name %agate-os %index.gmi-contents))))
+
+
+;;;
+;;; Miniflux
+;;;
+
+(define %miniflux-create-admin-credentials
+ #~(begin
+ (mkdir "/var/miniflux")
+ (call-with-output-file "/var/miniflux/admin-username"
+ (lambda (port)
+ (display "test" port)))
+ (call-with-output-file "/var/miniflux/admin-password"
+ (lambda (port)
+ (display "testpassword" port)))))
+
+(define miniflux-base-system
+ (lambda (miniflux-config)
+ (simple-operating-system
+ (simple-service 'create-admin-credentials
+ activation-service-type
+ %miniflux-create-admin-credentials)
+ (service dhcpcd-service-type)
+ (service postgresql-service-type
+ (postgresql-configuration
+ (postgresql postgresql-13)))
+ (service miniflux-service-type
+ miniflux-config))))
+
+(define %miniflux-with-admin-as-string
+ (miniflux-base-system
+ (miniflux-configuration
+ (listen-address "0.0.0.0:8080")
+ (create-administrator-account? #t)
+ (administrator-account-name "test")
+ (administrator-account-password "testpassword"))))
+
+(define %miniflux-with-admin-as-file
+ (miniflux-base-system
+ (miniflux-configuration
+ (listen-address "0.0.0.0:8080")
+ (create-administrator-account? #t)
+ (administrator-account-name "/var/miniflux/admin-username")
+ (administrator-account-password "/var/miniflux/admin-password"))))
+
+(define %miniflux-with-socket
+ (miniflux-base-system
+ (miniflux-configuration
+ (listen-address "/var/run/miniflux/miniflux.sock"))))
+
+(define* (run-miniflux-test name test-os)
+ (define os
+ (marionette-operating-system
+ test-os
+ #:imported-modules '((gnu services herd)
+ (guix combinators))))
+
+ (define forwarded-port 8080)
+
+ (define vm
+ (virtual-machine
+ (operating-system os)
+ (memory-size 512)
+ (port-forwardings `((8080 . ,forwarded-port)))))
+
+ (define test
+ (with-extensions (list guile-gcrypt)
+ (with-imported-modules '((gnu build marionette))
+ #~(begin
+ (use-modules (srfi srfi-64)
+ (srfi srfi-11)
+ (gnu build marionette)
+ (web client)
+ (web uri)
+ (web response)
+ (ice-9 match)
+ (ice-9 iconv)
+ (gcrypt base64))
+
+ (define marionette
+ (make-marionette (list #$vm)))
+
+ (test-runner-current (system-test-runner #$output))
+ (test-begin #$name)
+
+ (test-assert "Check Miniflux service is running"
+ (begin
+ (#$retry-on-error
+ (lambda ()
+ (marionette-eval
+ '(begin
+ (use-modules (gnu services herd))
+ (match (start-service '#$(string->symbol "miniflux"))
+ (#f #f)
+ (('service response-parts ...)
+ (match (assq-ref response-parts 'running)
+ (#f #f)
+ ((running) #t)))))
+ marionette))
+ #:delay 1
+ #:times 10)))
+
+ (test-assert "Miniflux TCP port ready, IPv4"
+ (wait-for-tcp-port #$forwarded-port marionette))
+
+ (test-assert "Miniflux login page is opened"
+ (begin
+ (wait-for-tcp-port #$forwarded-port marionette)
+ (#$retry-on-error
+ (lambda ()
+ (let-values (((_ text)
+ (http-get
+ #$(format #f "http://localhost:~A/" forwarded-port)
+ #:decode-body? #t)))
+ (string-contains text "<title>Sign In - Miniflux</title>")))
+ #:times 10
+ #:delay 2)))
+
+ (define authorization-header
+ (let ((encoded (base64-encode (string->bytevector "test:testpassword" "utf-8"))))
+ `(authorization . (basic . ,encoded))))
+
+ (test-equal "Miniflux initial admin API call is successful"
+ 200
+ (begin
+ (wait-for-tcp-port #$forwarded-port marionette)
+ (#$retry-on-error
+ (lambda ()
+ (let-values (((response _)
+ (http-get #$(format #f "http://localhost:~A/v1/me" forwarded-port)
+ #:headers (list authorization-header)
+ #:decode-body? #t)))
+
+ (response-code response)))
+ #:times 10
+ #:delay 2)))
+
+ (test-end)))))
+ (gexp->derivation (string-append name "-test") test))
+
+(define* (run-miniflux-socket-test name test-os)
+ (define os
+ (marionette-operating-system
+ test-os
+ #:imported-modules '((gnu services herd)
+ (guix combinators))))
+
+ (define vm
+ (virtual-machine
+ (operating-system os)
+ (memory-size 512)))
+
+ (define test
+ (with-imported-modules '((gnu build marionette))
+ #~(begin
+ (use-modules (srfi srfi-64)
+ (gnu build marionette))
+
+ (define marionette
+ (make-marionette (list #$vm)))
+
+ (test-runner-current (system-test-runner #$output))
+ (test-begin #$name)
+
+ (test-assert "Check socket file is created"
+ (wait-for-unix-socket "/var/run/miniflux/miniflux.sock" marionette))
+
+ (test-end))))
+ (gexp->derivation (string-append name "-test") test))
+
+(define %test-miniflux-admin-string
+ (system-test
+ (name "miniflux-admin-string")
+ (description "Run Miniflux with initial admin credentials as string.")
+ (value (run-miniflux-test name %miniflux-with-admin-as-string))))
+
+(define %test-miniflux-admin-file
+ (system-test
+ (name "miniflux-admin-file")
+ (description "Run Miniflux with initial admin credentials as file.")
+ (value (run-miniflux-test name %miniflux-with-admin-as-file))))
+
+(define %test-miniflux-socket
+ (system-test
+ (name "miniflux-socket")
+ (description "Run Miniflux on unix socket.")
+ (value (run-miniflux-socket-test name %miniflux-with-socket))))