11 Commits
Author SHA1 Message Date
Adam Daley c6992931bc Add open-source gettext extractor and translation source check (#4353)
* Add open-source gettext extractor and translation source check

Replaces the manual Poedit Pro step for regenerating messages.pot.
The extractor covers Twig |trans literals and PHP __trans /
__pluralTrans / exception keywords, mirroring the historical Poedit
runs (validated against the May 2026 messages.pot: only obsolete
fossils differ). Also adds an informational per-PR check reporting
msgid changes, as gettext matching is case-sensitive and casing-only
changes silently invalidate translations.

* Remove AI slop from extractor and workflow

Drop the unused function, unused parameters, unreachable branches,
restating comments and oversized docstring. No behavior change:
output verified byte-identical.

* Fix actions/github-script pin to a resolvable SHA

* Refresh i18n POT header and check label

* Rename translation workflow title

* Run translation source check on ubuntu-slim

* Ignore Python bytecode cache in scripts dir

* Address review: plural edge case and workflow injection

Skip __pluralTrans calls without a complete static plural instead
of emitting a misleading singular entry. Pass the pot diff to the
comment script via env to close the template-injection vector.

* Address review: one-to-one casing match and comment pagination

Consume each removed msgid at most once when pairing casing-only
changes, and paginate issue comments when locating the sticky
check comment.

* Address review: string-content calls, concat fragments, plural diff, credentials

Ignore keyword-like text inside PHP string/heredoc content, skip
concatenated first arguments instead of recording untranslatable
fragments (13 such fragments dropped from current output), report
plural changes across casing pairs, and set persist-credentials:
false with a non-failing comment step for fork PRs.

* Skip PHP string-content matches and fix heredoc terminators

Track string/heredoc spans during comment masking and ignore
keyword-like text inside them; also accept comma-terminated
flexible heredocs. Removes phantom refs and entries, keeps real
calls with correct line numbers (verified: timeago entries
intact, May-validation residuals all still excluded-path
fossils or untranslatable fragments).
2026-09-19 07:32:22 +01:00
Adam Daley aa0f776160 Migrate E2E suite from Cypress to Playwright (#4186)
* Migrate E2E suite from Cypress to Playwright

* Address review feedback for Playwright migration

Use Symfony Filesystem::mkdir() for the test uploads directory instead of
suppressed native mkdir, and tolerate an optional trailing slash in the
admin smoke test URL assertions.
2026-08-23 22:23:06 +01:00
Adam Daley c6e6ad0e09 Optimise CI workflows with ubuntu-slim and Docker caching (#3944)
* Use ubuntu-slim in GitHub workflows

* Optimize CI Docker caching and test startup
2026-07-09 06:44:36 +01:00
Adam Daley 4315d610b2 Move E2E tests into modules and update test config (#3707)
* Move E2E tests into modules and update test config

* Update php-build-test.yml

* Remove premature curl_close calls

* E2E tests: clean assertions, cart client, currency

* Refactor E2E tests imports & assertions

* Fix Antispam E2E - skip disposable email test when domain list unavailable
2026-06-03 11:18:29 +01:00
Adam Daley dd3dcbfd52 Enhance type safety, authentication checks, and testing framework (#3701)
* Improve type safety, auth checks and PHPStan fixes (#3250)

* Improve type safety, auth checks and PHPStan fixes

* Remove @phpstan-ignore annotations

* Improve type safety, auth checks and PHPStan fixes

* Remove @phpstan-ignore annotations

* Remove redundant @phpstan-ignore comment

* Improve code robustness and reliability (#3248)

* Harden code against null/undefined values

* Update dependency lockfiles

* Sanitize ticket input and use IDs in email list

* Restructure tests and add test utilities

* Move E2E tests to `Library\E2E` namespace

* Update `php-build` action ref in workflows

* Switch tests to Pest and add test scaffolding

* Refactor E2E tests to Pest-style tests

m

Skip E2E tests when env not configured

* Refactor Unit tests and update test config

Add test datasets and refine test helpers

* Add DEBUG guard, fix API JSON decode, update tests

* Refactor tests: add types and Mockery expectations

* Adjust tests, phpstan config, and composer script

* Instantiate test APIs locally, remove beforeEach

* Refactor runtime checks, types & logging

* Apply PHP Code Styling Changes

m

* Add PHPStan ignores, test renames & small fixes

* Enable Pest tests in CI workflow

* Remove legacy tests; add new unit tests/config

* Avoid undefined index in fingerprint comparison

* Ignore properties absent in both fingerprints

* Remove public_ticket_create API method

* Add Fingerprint unit tests

* Remove em dash from fingerprint test name

* Switch to Pest; assorted bug fixes & refactors

* Prefer getDi() and guard DEBUG define

* Refactor tests: DBAL, Antispam rename, helpers

* Refactor email tests to use Doctrine entities

* Update tests, use DBAL mocks & improve Formbuilder admin

* Validate plan_id and update unit tests

* Replace error_log with DI logger and update tests

* Expect db->store in Invoice Service test

* Use DI logger instead of error_log; fix tests

* Fix typo in Hook Service test

* Fix Staff test spelling fixture

* Complete Pest test migration

* Fix Product test spelling fixtures

* Fix Product test spelling fixtures

* Run live tests with Pest and load helpers

* Migrate tests to ApiClient; remove legacy APIHelper

* Fix Email test spelling

* Remove unused PHPUnit bridge

* Organize Cypress end-to-end tests

* Document Pest test directory root

* Remove noisy Pest comments
2026-06-02 07:43:01 +01:00
a7ef873368 Revamp admin UI and improve dashboard layout and functionality (#3596)
* Adjust admin alerts and installer warning

* Make dashboard cards full-height and align badges

* Split dashboard cards into partials and add AJAX

* Replace status badges with ribbon elements

* Revamp activity panel layout and responsiveness

* Adjust dashboard card spacing and styles

* Style dashboard links and adjust chart heights

* Back-to-top: update classes and styles

* Fix client admin UI labels and flags

* Improve API response parsing and errors

* Mark action columns no-sort, add table-hover

* Update table classes for hover and wrapping

* Refactor admin templates to card-header layout

* Update admin templates layout and semantics

* Tidy admin templates; remove tabs, update notice

* Standardize admin alert styles and messages

* Handle null/empty status in status_name macro

* Validate resolved renewal price before invoicing

* Keep IP actions inline in activity table

* Right-align activity pagination controls

* Align pagination and export buttons in admin lists

* Improve admin pagination & per-page defaults

* Extract record selector into partial

* Add tab deep-linking and URL hash persistence

* Refactor search controls & capitalize 'One Time'

* Refactor client search filters and toggle state

* Refactor activity filters UI and tomselect styling

* Redesign admin filters; capitalize 'On Hold'

* Revamp admin filter panels (Invoice & Support)

* Group search clause in Massmailer query

* Add filters and expanded search for pages/gateways

* Add filter panels, refine search logic, tests

* Add advanced search filters for activity modules

* Add structured filters, date/ip search & tests

* Add Email queue filters and admin tab

* Add collapsible filter panel to Staff settings

* Refactor badges to use shared macros

* Add massmailer statuses & boolean badges

* Add search icon and refine search input layout

* Update admin templates layout and markup

* Use modals for creating clients/groups

* Centralize tab header action buttons

* Centralize toolbar actions; add Order modal

* Bump Composer dependencies (lockfile)

* Capitalize 'One Time' payment label

* Return raw API body; use button for search

* Wrap search button in input-group-text

* Make search max width configurable

* Fix malformed aria-label Twig expression in layout_default.html.twig

Agent-Logs-Url: https://github.com/FOSSBilling/FOSSBilling/sessions/c8db6ba9-bda4-413a-989f-e4777e06bd12

Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>

* Fix XSS risk in updateExternalIP: append IP via createTextNode instead of innerHTML concat

Agent-Logs-Url: https://github.com/FOSSBilling/FOSSBilling/sessions/0c435e52-1784-4466-a8dc-c41e12443a6f

Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>

* Refactor New Client modal layout and styles

* Limit and style phone country code field

* Use `country_names` helper and `country_name` filter

* Use Symfony Intl for currencies & locales

* Use Symfony Intl for currencies; drop built-in country lists

* Refactor Currency module API, entity and service

* Remove system checkLimits usages from modules and tests

* Remove `currency.title` column and update APIs

* Add inputmode and maxlength to cspell dictionary

* Fix dropdown toggle accessibility: use button instead of anchor

Agent-Logs-Url: https://github.com/FOSSBilling/FOSSBilling/sessions/b7f9474b-1988-4c08-aec0-f8991edfea71

Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>

* Improve multi-currency handling and installer

* Log currency code when changing cart currency

* Use removeCurrency in Admin API and update tests

* Use Intl currency symbols and fraction digits

* Use currency filters in templates

* Rename currency title to name and update schema

* Remove deprecated Service::getLanguages

* Capitalize system permission labels and fix messages

* Use Symfony Countries and remove phone codes list

* Validate country codes; use country select

* Set fb_locale cookie and fix admin locale display

* Validate locales and add default locale selector

* Use Locales::getNames; tweak language selector CSS

* Tweak header spacing and make nav links icon-only

* Localize client login texts

* Add phone country-code attrs and styles

* Center .modal-dialog in two themes

* Add phone_codes API to list calling codes

* Make form the modal-content wrapper

* Move create forms to Bootstrap modals

* Convert new-item tabs to modals in admin UI

* Revamp admin UI, embed snippets & modal

* Revamp admin settings UI and templates

* Revamp Formbuilder & Redirect admin UIs

* Add 'Segoe' and 'minmax' to cspell dictionary

* Rename warning() to warn() in test logger

* Refactor admin templates to card-based layout

* Expose initAvatars globally and scoped init

* Add 'view' permissions and enforce checks

* Refactor Servicehosting admin UI and scripts

* Add staff permission checks and module permissions

* Refactor admin templates layout and forms

* Add staff permission checks and module perms

* Add staff permission checks and module perms

* Refactor admin Twig templates and UI

* Refactor client admin UI to use summary/form cards

* Refactor admin invoice/subscription/transaction templates

* Refactor Order admin UI; fix country labels

* Refactor admin templates and add IP country filter

* Add 'view' permissions and checks to admin APIs

* Use detail/related partials in admin templates

* Refactor admin product templates to use partials

* Add endembed to cspell ignoreWords to fix spellcheck CI failure

Agent-Logs-Url: https://github.com/FOSSBilling/FOSSBilling/sessions/e8973bef-7364-4b30-8dd8-13701ca15c5d

Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>

* Refactor admin templates to use common partials

* Validate order status, add permission checks

* Center form buttons and add horizontal padding

* Introduce createAdminApi and BBTestCaseContainer

* Refactor admin UI templates and forms

* Run intl compression after composer install

* Disable provenance in buildx outputs

* Revamp admin templates for UI and previews

* Refactor admin templates, pricing UI & styles

* Refactor admin invoice sidebar and SEO settings UI

* Use minor currency units, country list & API fixes

* Rename language selector class to locale-selector

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
2026-05-24 23:10:28 +01:00
474fa6b24c Introduce E2E tests using Cypress (#3563)
* Introduce E2E tests using Cypress

* Removed unrelated submodule

* Add Cypress Cloud project ID

* Save Cypress runs to Cloud

* Pass commit information to the container

* Added admin smoke tests

* Redo Cypress workflow

* Increase shm size

* Run Cypress using Electron

* Add dedicated Docker network alias

* Fixed hostname

* Validate sessions via browser navigation

* Disable session fingerprinting during Cypress tests

* Adjust smoke test paths

* Move Cypress usage to npx

* Remove redundant assertions

* Added basic tests for the client area

* Make spellcheck happy

* Fix test cases

* Added client support lifecycle tests

* Separate tests by directories

* Account for the max subject length

* Fix an actual FOSSBilling error

* Getting around the subject character limit

* Restored the long subject

* Timing issues with Bootstrap modals

* Fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Only upload artifacts when recording is disabled

---------

Co-authored-by: Adam Daley <admdly@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-05-24 00:35:52 +03:00
Adam Daley 1d58543600 Extract live tests into reusable Docker Compose workflow (#3565)
* Extract live tests into reusable workflow

* Use Docker Compose for live tests

* Normalize CI job names
2026-05-16 15:46:33 +01:00
4a9d44ff06 Refactor currency formatting and enhance admin UI features (#3539)
* Remove currency format fields & refactor formatting

* Handle missing currency and remove bold

* Adjust column widths in redirect settings form

* Add unified filter panel & request globals

* Normalize admin path and revamp activity UI

* Fix ADMIN_PREFIX check and ignore search filter

* Point docs links to docs.fossbilling.org

* ci: make live installer step retry before phpunit-live

Agent-Logs-Url: https://github.com/FOSSBilling/FOSSBilling/sessions/3c14643b-8b1c-441d-8592-c3ba09df048f

Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>

* ci: avoid duplicate install attempt in live test retries

Agent-Logs-Url: https://github.com/FOSSBilling/FOSSBilling/sessions/3c14643b-8b1c-441d-8592-c3ba09df048f

Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>

* Remove currency_format and simplify request handling

* Ensure request exists in DI for Twig tests

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
2026-05-14 18:55:36 +01:00
9acf34ec12 Fix installer re-entry in non-production environments (#3526)
* Fix installer re-entry in non-production environments

* fix(ci): remove preseeded config before live installer test

Agent-Logs-Url: https://github.com/FOSSBilling/FOSSBilling/sessions/f3734598-a33a-4900-b4d5-7203db35a3b3

Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>

* fix(ci): clear app config before live installer post

Agent-Logs-Url: https://github.com/FOSSBilling/FOSSBilling/sessions/f3734598-a33a-4900-b4d5-7203db35a3b3

Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>

* Fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* fix(ci): remove placeholder config before installer health check

Agent-Logs-Url: https://github.com/FOSSBilling/FOSSBilling/sessions/7d41cc16-e0ee-414e-9fe3-d834bc8e6acf

Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-05-12 02:38:03 +01:00
b82df887fe Enhance CI/CD with Docker optimizations and error handling (#3509)
* Bump Dockerfile syntax to 1.18

* Add getStatusCode to Response and update test

* Expect error code 740 for invalid theme action

* Use Docker-based CI/test image and live test script

* Add PHP 8.5 to CI matrix

* Add Buildx caching and optimize Docker build

* Add CI timeouts, quoting fixes, and release tree build

* Add concurrency, caching, and cleanup to CI

* Grant permissions for preview-build job

* Map error code 740 to HTTP 404 and update test

* Update cache-scope names in GitHub workflows

* Remove redundant status guard in theme admin test

Agent-Logs-Url: https://github.com/FOSSBilling/FOSSBilling/sessions/b20f484f-0aaa-4afc-ae43-adb264bb05aa

Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>

* Grant cache export permissions to CI build job

Agent-Logs-Url: https://github.com/FOSSBilling/FOSSBilling/sessions/a088c94f-a176-40fb-9e0b-ee3cac2aeb5b

Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>

* Disable cache for release artifact build

* Fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: admdly <2807620+admdly@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-05-10 22:43:16 +01:00