Trek_CN/server/tests/unit/services
Julien G. 1f5deeba6c
Bug fixes - April 27th 2026 (#907)
* fix: clean up dangling FK references before deleting a user

Resolves FOREIGN KEY constraint failed (500) on DELETE /api/admin/users/:id
and DELETE /api/auth/me when the target user had rows in trip_members.invited_by,
share_tokens.created_by, budget_items.paid_by_user_id, journeys.user_id,
journey_entries.author_id, journey_contributors.user_id, or
journey_share_tokens.created_by — none of which had ON DELETE clauses.

Introduces deleteUserCompletely() in userCleanupService.ts which wraps all
cleanup and the final DELETE FROM users in a single transaction. Both
adminService.deleteUser and authService.deleteAccount now call it instead of
the bare DELETE. Tests ADMIN-005b and AUTH-040 cover all reference types
including notification sender/recipient and notice dismissals.

* test: extend FK deletion tests to cover journeys, files, and photos

ADMIN-005b and AUTH-040 now also seed and assert:
- owned journey with entries (cascade-deleted via journeys.user_id cleanup)
- trip_files.uploaded_by (SET NULL — file survives, attribution cleared)
- trek_photos.owner_id (SET NULL — photo record survives, owner cleared)
- trip_photos.user_id (CASCADE — photo association removed)

* test: extend user deletion tests to cover all FK relationships

ADMIN-005b and AUTH-040 now seed and assert every user FK relationship:

CASCADE (row deleted): trips, trip_members, tags, mcp_tokens, oauth_tokens,
oauth_consents, vacay_plans, vacay_plan_members, bucket_list,
visited_countries, visited_regions, packing_templates, invite_tokens,
collab_notes, settings, password_reset_tokens, notification_channel_preferences

SET NULL (row survives, column nulled): categories, todo_items.assigned_user_id,
packing_bags, audit_log

Caught and fixed: notification_preferences was dropped in migration 72;
correct table is notification_channel_preferences.

* fix: preserve URL hash and OIDC redirect target through login flow

- Include location.hash in redirect param at all three producer sites
  (ProtectedRoute, axios 401 interceptor, OAuthAuthorizePage) so
  hash fragments survive the login bounce
- Stash redirectTarget in sessionStorage before any OIDC provider
  redirect and restore it after the code exchange, since the IdP
  strips the original ?redirect= param during the roundtrip
- Clear sessionStorage on OIDC error to avoid stale state
- Add tests covering sessionStorage stash on mount, navigate to saved
  redirect after OIDC exchange, fallback to /dashboard, and cleanup
  on error

* fix: use day position instead of ID for accommodation date range clamping

Math.min/Math.max over raw day IDs breaks the start/end picker when a
trip's day IDs are non-monotonic relative to day_number (normal after
repeated generateDays extend/shrink cycles). Replaced with findIndex
lookups so clamping is always based on positional order.

Closes #889

* fix: normalize env var comparisons to be case-insensitive

All NODE_ENV, DEMO_MODE, OIDC_ONLY, FORCE_HTTPS, COOKIE_SECURE, and
ALLOW_INTERNAL_NETWORK checks now use .toLowerCase() so values like
'Production' or 'True' behave identically to their lowercase forms.
Also adds APP_VERSION to the startup banner.

* fix: delete surplus days when shortening a trip

When shrinking a trip's date range, surplus days are now deleted along
with their assignments, notes, and accommodations (cascade). Places
remain in the trip pool; reservations keep their day reference nulled
by the existing ON DELETE SET NULL constraint (issue #909).

Updates TRIP-SVC-011 to reflect the new behaviour; adds TRIP-SVC-016
as a regression test for the empty-day case.

* fix: auto-backup retention deletes itself and manual backups on Docker

Two bugs in cleanupOldBackups:
1. Filter was .endsWith('.zip') — swept manual backup-*.zip files too.
   Now restricted to auto-backup-* prefix.
2. Age was derived from stat.birthtimeMs, which is 0 on overlayfs
   (Docker default), making every backup appear epoch-old and get
   deleted immediately. Age is now parsed from the filename timestamp
   and falls back to mtimeMs (reliable on overlayfs).

Also converts inline require('./services/auditLog') calls to a static
import throughout scheduler.ts, and adds 8 unit tests covering the
fixed retention logic including the overlayfs regression case.

* test: update TRIP-024 to match delete behavior on trip shrink

* feat: add bypass-branch-check label to skip branch enforcement
2026-04-28 05:17:20 +02:00
..
adminService.test.ts fix(tests): update tests for granular auth toggles 2026-04-11 20:33:51 +02:00
apiKeyCrypto.test.ts Add comprehensive backend test suite (#339) 2026-04-03 13:17:53 +02:00
atlasService.test.ts fix(tests): update test helpers and assertions for migration-98 photo schema 2026-04-14 13:54:48 +02:00
auditLog.test.ts Add comprehensive backend test suite (#339) 2026-04-03 13:17:53 +02:00
authService.test.ts Add comprehensive backend test suite (#339) 2026-04-03 13:17:53 +02:00
authServiceDb.test.ts feat(auth): split OIDC_ONLY into granular auth toggles 2026-04-11 20:21:36 +02:00
backupService.test.ts fix(backups,files): auto-backups rejected by validator; trip file download broken after cookie migration 2026-04-21 11:18:17 +02:00
budgetService.test.ts test: apply suite review improvements (01–11) 2026-04-06 20:08:13 +02:00
categoryService.test.ts test: expand test suite to 87.3% backend coverage 2026-04-06 20:08:30 +02:00
collabService.test.ts test: add comprehensive coverage for OAuth scopes, MCP, and core services 2026-04-11 14:08:09 +02:00
cookie.test.ts test: update cookie test to match sameSite lax change 2026-04-03 14:42:48 +02:00
dayService.test.ts test: expand test suite to 87.3% backend coverage 2026-04-06 20:08:30 +02:00
ephemeralTokens.test.ts test: expand test suite to 87.3% backend coverage 2026-04-06 20:08:30 +02:00
inAppNotificationActions.test.ts test: apply suite review improvements (01–11) 2026-04-06 20:08:13 +02:00
inAppNotificationPrefs.test.ts feat(notifications): add unified multi-channel notification system 2026-04-05 01:22:18 +02:00
journeyService.test.ts fix(journey,pdf): journey reorder sort_order + PDF multi-day transport (#848) 2026-04-23 10:53:32 +02:00
journeyShareService.test.ts fix: update backend tests and service bugs for gallery 1-to-N schema 2026-04-22 16:05:18 +02:00
kmlImportUtils.test.ts feat(places): unified file import modal with drag-and-drop and deduplication 2026-04-15 06:07:26 +02:00
kmzUnpack.test.ts fix(kml-import): address PR #488 review issues 2026-04-15 05:16:47 +02:00
mapsService.test.ts test(maps): update getPlacePhoto stubs to use text() instead of json() 2026-04-21 00:16:54 +02:00
memoriesHelpers.test.ts test: add comprehensive coverage for OAuth scopes, MCP, and core services 2026-04-11 14:08:09 +02:00
memoriesUnified.test.ts test: add comprehensive coverage for OAuth scopes, MCP, and core services 2026-04-11 14:08:09 +02:00
mfaCrypto.test.ts Add comprehensive backend test suite (#339) 2026-04-03 13:17:53 +02:00
migration.test.ts feat(notifications): add unified multi-channel notification system 2026-04-05 01:22:18 +02:00
notificationPreferencesService.test.ts test(notifications): bump event_types count to 9 after adding todo_due 2026-04-20 17:38:25 +02:00
notifications.test.ts feat(notifications): add ntfy as a first-class notification channel 2026-04-15 13:59:25 +02:00
notificationService.test.ts feat(notifications): add ntfy as a first-class notification channel 2026-04-15 13:59:25 +02:00
oauthService.test.ts fix(mcp): add RFC 9728 PRM, RFC 8707 audience binding, and collab sub-feature gating 2026-04-20 07:34:38 +02:00
oidcService.test.ts fix(oidc,ui): restore Authentik login and fix mobile delete dialog (#845) 2026-04-23 09:13:35 +02:00
packingService.test.ts test: expand test suite to 87.3% backend coverage 2026-04-06 20:08:30 +02:00
passwordPolicy.test.ts Add comprehensive backend test suite (#339) 2026-04-03 13:17:53 +02:00
permissions.test.ts test: expand test suite to 87.3% backend coverage 2026-04-06 20:08:30 +02:00
placeService.test.ts feat(import): selective GPX/KML element import and performance improvements 2026-04-18 01:28:37 +02:00
queryHelpers.test.ts test: apply suite review improvements (01–11) 2026-04-06 20:08:13 +02:00
settingsService.test.ts test: expand test suite to 87.3% backend coverage 2026-04-06 20:08:30 +02:00
tagService.test.ts test: expand test suite to 87.3% backend coverage 2026-04-06 20:08:30 +02:00
todoService.test.ts test: expand test suite to 87.3% backend coverage 2026-04-06 20:08:30 +02:00
tripService.test.ts Bug fixes - April 27th 2026 (#907) 2026-04-28 05:17:20 +02:00
vacayService.test.ts test: expand test suite to 87.3% backend coverage 2026-04-06 20:08:30 +02:00
versionNotification.test.ts fix: restore broken tests after prerelease workflow refactor 2026-04-12 17:19:24 +02:00
weatherService.test.ts fix tests for sidebar/settings refactor + weather archive fallback 2026-04-18 11:45:19 +02:00