Files
PostfixAdminRS/TESTING.md
T
2026-11-03 16:52:28 +01:00

6.1 KiB

PostfixAdmin-RS 0.0.1-dev - test checklist

1. Static / compiler gate

Run on Rust 1.99.1:

cargo fmt --check
cargo check --all-targets
cargo test --all-targets
cargo clippy --all-targets -- -D warnings

Then start the isolated development database:

POSTFIXADMIN_RS_DEV_RESET=1 bash dev.sh

Expected test accounts are printed by dev.sh.

2. UI / i18n

  • Login page starts in English when there is no pa_language value in localStorage.
  • Language selector is available on login and in the top bar.
  • Switching EN <-> PL does not log the user out and reloads the current page.
  • API endpoints and JSON error payloads remain English.
  • Theme selector still works independently of the language selector.
  • Forms, confirmations and prompts use application modals, not browser prompt/confirm dialogs.

3. Mock DB regression

As global admin test: domains, mailboxes, aliases, alias domains, admins, fetchmail, DKIM, TOTP/application passwords and logs. Verify permission restrictions with domain-admin and mailbox-user test accounts.

4. Production DB through SSH - read-only first

cp .env.example .env
$EDITOR .env
bash dev.sh

.env.example is prefilled for host.linuxiarz.pl; set the SSH username and database password before starting. SSH mode forces database.read_only=true unless POSTFIXADMIN_RS_DEV_DB_WRITES=1 is explicitly set.

In read-only mode verify:

  • login for global admin, domain admin and mailbox user,
  • domain/mailbox/alias lists,
  • quota/status fields,
  • schema warnings and password scheme detection,
  • fetchmail/vacation/DKIM list pages that exist in the production schema,
  • every write attempt returns an English API error and does not alter data.

Do not enable writes until a database backup exists and a dedicated test domain/account has been selected.

5. Production DB write test

Only after backup:

POSTFIXADMIN_RS_DEV_DB_MODE=ssh POSTFIXADMIN_RS_DEV_DB_WRITES=1 bash dev.sh

Use a dedicated test domain. Exercise create/update/delete for one domain, mailbox and alias; verify Postfix/Dovecot behaviour and the PostfixAdmin log table. Do not change password.scheme during this test.

Mailbox-user regression

Zaloguj sie jako mailbox-user i sprawdz:

  • nawigacja nie pokazuje Domains, Mailboxes, Administrators, Logs, Broadcast ani System; DKIM moze byc widoczny tylko jako read-only, gdy istnieje backend DKIM i [dkim].user_read_only=true;
  • Overview nie pokazuje panelu Enabled modules, tylko dane wlasnej skrzynki, self-alias i quota progress;
  • /mailboxes zwraca tylko zalogowana skrzynke, a /aliases tylko jej self-alias;
  • Aliases pokazuje domene jako read-only i nie pozwala zmienic adresu/domeny;
  • Security od razu pokazuje formularz zmiany hasla, bez technicznego opisu cookies/CSRF;
  • Vacation pokazuje formularz wlasnego autorespondera tylko gdy features.vacation=true i vacation_control=true;
  • Filters pojawia sie tylko gdy [sieve].enabled=true;
  • DKIM usera pokazuje tylko rekordy jego domeny, z pelnym selector._domainkey.domain IN TXT "...", bez klucza prywatnego i bez akcji zapisu.

ManageSieve mozna przetestowac przez ten sam SSH host bez IMAP:

POSTFIXADMIN_RS_DEV_DB_MODE=ssh \
POSTFIXADMIN_RS_DEV_SIEVE_ENABLED=true \
bash dev.sh

W tym samym trybie dev.sh domyslnie synchronizuje publiczne rekordy Rspamd DKIM przez SSH. Prywatne klucze pozostaja na serwerze. W logu startowym oczekuj linii DKIM: Rspamd public DNS records synced over SSH.

Pierwszy test Sieve pozostaw read-only. Do PUT/DELETE/activate dodaj dopiero po wyborze konta testowego:

POSTFIXADMIN_RS_DEV_SIEVE_WRITES=1

Sprawdz list/get/check, a nastepnie create/save/activate/rename/delete. Po zmianie hasla w Security ponownie sprawdz Sieve w tej samej sesji.

6. Rspamd DKIM

Test first with the development mock. On the mail host test rspamadm configtest, generation/adoption, DNS TXT display, mapping updates and reload. Keep a backup of dkim_signing.conf and existing key files.

Current readiness

The source tree contains development mock coverage and a guarded production-DB tunnel path. It should be treated as test-ready, not production-ready, until the compiler/test/clippy gate above passes on Rust 1.99.1 and the production schema has completed the read-only regression checklist.

MySQL/MariaDB through sqlx::Any

PostfixAdmin commonly stores boolean flags such as active, superadmin, backupmx, smtp_active, Fetchmail SSL flags and Vacation state as TINYINT(1). SQLx Any does not map MySQL TINY result metadata directly. PostfixAdmin-RS therefore casts these flags to a portable signed integer in SELECT projections before decoding them.

If a test build reports Any driver does not support MySql type ... Tiny, include the failing endpoint and SQL-related log line in the bug report; raw flag columns must not be selected without the normalization helper.

UI and quota checks

  • Switch domains in Mailboxes and Aliases: a top loading bar and spinner must be visible while requests are in flight.
  • Mailbox quota renders a progress bar. When quota2/quota usage is available it is used as the numerator; otherwise configured mailbox quota is compared with the domain max quota.
  • Medium/high quota thresholds default to 55/90 percent and are configurable under [defaults].
  • Theme icon must render after upgrades; the icon sprite is served under a content-hashed URL.

Debian package

Run ./scripts/build-deb.sh. Expected output is packages/postfixadmin-rs_0.0.1~dev_<arch>.deb plus .sha256. Install on a disposable Debian-compatible host first and configure /etc/postfixadmin-rs/config.toml before enabling the service. Verify getent passwd postfixadmin, systemctl cat postfixadmin-rs (User/Group must be postfixadmin), and permissions root:postfixadmin 0640 on the config file.

Local Rust quality gate

Run this before packaging or committing changes:

./scripts/quality.sh

It formats the Rust sources first, then runs cargo check, cargo test, and cargo clippy --all-targets -- -D warnings. The Debian builder runs the same format/test/lint sequence inside its writable Docker worktree.