CluPilotCloud/tests/Feature
nexxo 880b5f1998 Merge main into the operating-mode branch
Three real conflicts, and one file that did not conflict and mattered more.

Overview::notices(): both sides added notices. Kept all of them, and pointed
main's mail check at MailboxTransport::NON_DELIVERING — its own comment already
named the constant while the code carried a copy of the list.

billing.blade.php: main wrapped the page in a contract branch. The "payment is
not set up" error moved OUTSIDE it, because the customer most likely to meet
that message is the one buying for the first time, who has no contract yet and
would never have seen it from inside the @else.

ConsoleReportsRealDataTest: kept both sides rather than choosing. The renamed
test and its docblock explain why admin.systems_ok can no longer be asserted on
a bare install; main's mail pin still keeps "clean" clean in the mail
dimension. Picking one would have quietly weakened the other's claim.

HostStepsTest: git combined main's config()->set('provisioning.dns.zone',
'clupilot.com') with this branch's assertion on clupilot.cloud, and produced a
test that contradicted itself with no marker. Main's approach is the better one
— it pins the zone in the test and asserts the SHAPE of the name rather than
this box's domain — so its assertion stands.

HttpStripeClient merged silently and correctly: secret() still throws,
isConfigured() still reads the vault directly. Had it taken main's
filled($this->secret()), six callers that ask in order NOT to get an exception
would have become exception throwers, and the suite would have stayed green.
CheckoutWithoutStripeKeyTest is the lock that would have caught it.

StripeIdempotencyKeyTest (new on main) leaned on the environment fallback for
stripe.secret. That entry is strict now — no fallback in either direction, so
the .env cannot be a back door for a live key in test mode. It stores a real
vault row instead.

1966 tests pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 17:53:20 +02:00
..
Admin Merge main into the operating-mode branch 2026-07-30 17:53:20 +02:00
Auth Accept terms instead of a start date, and fix the sender no server accepts 2026-07-30 15:22:35 +02:00
Billing Merge main into the operating-mode branch 2026-07-30 17:53:20 +02:00
Console Restart a machine, enforce the quota that was sold, end a route that ended 2026-07-29 18:28:28 +02:00
Mail Stop mailing the initial admin password, hold it in the panel until noted 2026-07-28 23:19:20 +02:00
Portal Make mails readable on a phone, and let an operator look at one 2026-07-30 14:50:37 +02:00
Provisioning Take the address by field, fix the customer type, ask why they leave 2026-07-30 16:41:32 +02:00
Readiness Never tell anyone to delete a catalogue their contracts bill on 2026-07-30 17:30:56 +02:00
BillingTest.php Refuse the sale instead of reaching Stripe without a key 2026-07-30 11:58:01 +02:00
BladeCommentsTest.php Sell the year as well as the month, and say what it saves 2026-07-30 15:44:35 +02:00
CartTest.php Refuse the sale instead of reaching Stripe without a key 2026-07-30 11:58:01 +02:00
CheckoutPageTest.php Give the order a checkout page, and stop hiding what a year costs 2026-07-30 16:00:08 +02:00
CheckoutWithoutStripeKeyTest.php Pin the one question that must never throw 2026-07-30 16:58:22 +02:00
ComponentTest.php feat(portal): Fortify auth + Login/2FA/Dashboard + component kit 2026-07-25 01:20:25 +02:00
ConfirmInModalTest.php Replace native confirm() dialogs with the app's own modal pattern 2026-07-28 19:34:27 +02:00
ConnectionStateTest.php Recover silently from an expired session, and show a connection banner when offline 2026-07-28 21:36:21 +02:00
CustomDomainServingTest.php Fix nine defects in the provisioning pipelines 2026-07-30 01:34:55 +02:00
CustomDomainTest.php Close the domain page to packages that may not have one 2026-07-29 16:20:21 +02:00
CustomerTwoFactorTest.php Replace native confirm() dialogs with the app's own modal pattern 2026-07-28 19:34:27 +02:00
DashboardTest.php Stop mailing the initial admin password, hold it in the panel until noted 2026-07-28 23:19:20 +02:00
DeliveryPromiseTest.php Take the order, park it, and say when it will be delivered 2026-07-29 18:50:46 +02:00
DeploymentRunsAsTheAppUserTest.php Fix nine defects in the provisioning pipelines 2026-07-30 01:34:55 +02:00
DisplayTimezoneTest.php Show times on the operator's clock, keep storing them in UTC 2026-07-27 17:32:21 +02:00
DoubleOptInTest.php Require a confirmed address before an account can use anything 2026-07-28 23:43:20 +02:00
DowngradeTest.php Refuse the sale instead of reaching Stripe without a key 2026-07-30 11:58:01 +02:00
EditInModalTest.php Fix a cancel button that did nothing, and fit the answers on one screen 2026-07-29 22:50:16 +02:00
EnsureCustomerActiveTest.php Satisfy Pint on the two new guard-boundary tests 2026-07-28 15:10:58 +02:00
ErrorPagesTest.php Ask the tunnel gateway where it actually listens 2026-07-27 14:43:23 +02:00
ExampleTest.php chore: bootstrap CluPilot control-plane (Laravel 13, Docker stack) 2026-07-25 00:21:30 +02:00
GrossPricingTest.php Quote what a person pays, and tab the settings page 2026-07-29 19:18:10 +02:00
HostStepTest.php Let an update install host packages, without handing out root 2026-07-29 10:27:56 +02:00
IconLayoutTest.php Ask the tunnel gateway where it actually listens 2026-07-27 14:43:23 +02:00
IdentitySeparationTest.php Write down that the console and the portal share no identity 2026-07-28 12:15:13 +02:00
ImpersonationTest.php Refuse a portal login for an address that already belongs to an operator 2026-07-28 14:42:16 +02:00
InstanceMetricsTest.php Measure what the template draws 2026-07-27 16:29:28 +02:00
LandingPriceSheetTest.php Quote what a person pays, and tab the settings page 2026-07-29 19:18:10 +02:00
MailSenderOwnershipTest.php Accept terms instead of a start date, and fix the sender no server accepts 2026-07-30 15:22:35 +02:00
MailTemplatesTest.php Actually issue the invoice when the money arrives 2026-07-29 03:25:56 +02:00
ModalHeightTest.php R24: a modal is never taller than the screen 2026-07-29 23:33:57 +02:00
MonitoringStatusSyncTest.php Move the console off /admin, give the status page its own address, and measure monitoring 2026-07-27 06:05:40 +02:00
NewDeviceWarningTest.php Recognise the devices an account signs in from, and warn about a new one 2026-07-28 23:28:34 +02:00
OfficialDomainsTest.php Re-apply what the last release commit silently reverted 2026-07-29 17:36:43 +02:00
OperatingModeTest.php Give the installation a test mode and a live mode 2026-07-30 10:41:23 +02:00
PortalHostTest.php Answer on every name for the website, and send them all to one 2026-07-29 01:29:33 +02:00
PortalTabsTest.php Re-apply what the last release commit silently reverted 2026-07-29 17:36:43 +02:00
ProcessingAgreementTest.php Stop asking for a signature the law does not want, and lay out the tab 2026-07-30 17:30:55 +02:00
PublicSiteGateTest.php Stop a disabled operator from bypassing the hidden-site gate 2026-07-28 14:42:29 +02:00
ReadinessPageTest.php Refuse a key that does not belong to the slot it sits in 2026-07-30 17:05:58 +02:00
ReleaseComparisonTest.php Stop the update agent dying on its own tag arithmetic 2026-07-29 00:00:17 +02:00
ReleaseVersionTest.php Move the console's identity out of the customer table 2026-07-28 10:31:43 +02:00
SeatsTest.php Replace native confirm() dialogs with the app's own modal pattern 2026-07-28 19:34:27 +02:00
SecretSlotMigrationTest.php Remember which Stripe account the catalogue was built in 2026-07-30 17:12:56 +02:00
SecretVaultModeTest.php Say which slot the value in force is really coming from 2026-07-30 17:01:33 +02:00
SelfServiceOrderTest.php Give the order a checkout page, and stop hiding what a year costs 2026-07-30 16:00:08 +02:00
ServerMarketTest.php Take the order, park it, and say when it will be delivered 2026-07-29 18:50:46 +02:00
SessionListTest.php Show where an account is signed in, and let it sign the other places out 2026-07-28 23:38:17 +02:00
SettingsTest.php Rebuild the settings page out of panels and rows 2026-07-30 17:38:57 +02:00
SiteDesignSystemTest.php Write the processing agreement and its annex, and let it be downloaded 2026-07-30 17:12:30 +02:00
StatusHistoryTest.php Let an incident be deleted, and start measuring whether the hosts answer 2026-07-29 15:16:48 +02:00
StripeStrictModeTest.php Make source() respect strict entries like get() does 2026-07-30 11:21:07 +02:00
StripeWebhookSecretByModeTest.php Verify webhooks against the secret of the mode we are in 2026-07-30 12:13:55 +02:00
SupportRequestTest.php Editing in modals, an update button that is not gated on a stale reading, and a support page that is real 2026-07-27 17:55:49 +02:00
SwitchOperatingModeTest.php Fix round: name the slot on the card, and cover the modal that already worked 2026-07-30 15:32:16 +02:00
TrafficTest.php Measure availability, and let a customer move down again 2026-07-27 16:41:15 +02:00
TranslationParityTest.php Ask the tunnel gateway where it actually listens 2026-07-27 14:43:23 +02:00
WelcomeTest.php Give customers two-factor, and stop every button on the settings page reacting at once 2026-07-27 08:48:34 +02:00