To monitor your server, you need to first install a{' '}
-
+
monitoring service
.
diff --git a/resources/js/pages/networks/components/add-peer.tsx b/resources/js/pages/networks/components/add-peer.tsx
index 63e859a2f..3250dce97 100644
--- a/resources/js/pages/networks/components/add-peer.tsx
+++ b/resources/js/pages/networks/components/add-peer.tsx
@@ -28,7 +28,7 @@ export default function AddNetworkPeer({
const submit = (e: FormEvent) => {
e.preventDefault();
form.transform((data) => ({ name: data.name, public_key: byo ? data.public_key : '' }));
- form.post(route('networks.peers.store', { network: networkId }), {
+ form.post(`/networks/${networkId}/peers`, {
onSuccess: () => {
form.reset();
setByo(false);
diff --git a/resources/js/pages/networks/components/add-server.tsx b/resources/js/pages/networks/components/add-server.tsx
index 8ead8661e..8e04ef9ad 100644
--- a/resources/js/pages/networks/components/add-server.tsx
+++ b/resources/js/pages/networks/components/add-server.tsx
@@ -41,7 +41,7 @@ export default function AddServer({
const submit = (e: FormEvent) => {
e.preventDefault();
- form.post(route('networks.servers.store', { network: networkId }), {
+ form.post(`/networks/${networkId}/servers`, {
onSuccess: () => {
onOpenChange(false);
form.reset();
diff --git a/resources/js/pages/networks/components/create-network.tsx b/resources/js/pages/networks/components/create-network.tsx
index c49283cd2..75949166a 100644
--- a/resources/js/pages/networks/components/create-network.tsx
+++ b/resources/js/pages/networks/components/create-network.tsx
@@ -59,7 +59,7 @@ export default function CreateNetwork({
const submit = (e: FormEvent) => {
e.preventDefault();
- form.post(route('networks.store'), {
+ form.post('/networks', {
onSuccess: () => {
onOpenChange(false);
form.reset();
diff --git a/resources/js/pages/networks/components/edit-network-server.tsx b/resources/js/pages/networks/components/edit-network-server.tsx
index 0c2e48096..62b0f61c8 100644
--- a/resources/js/pages/networks/components/edit-network-server.tsx
+++ b/resources/js/pages/networks/components/edit-network-server.tsx
@@ -28,7 +28,7 @@ export default function EditNetworkServer({
const submit = (e: FormEvent) => {
e.preventDefault();
- form.put(route('networks.servers.update', { network: networkId, networkServer: member.id }), {
+ form.put(`/networks/${networkId}/servers/${member.id}`, {
preserveScroll: true,
onSuccess: () => onOpenChange(false),
});
diff --git a/resources/js/pages/networks/components/firewall-rule-form.tsx b/resources/js/pages/networks/components/firewall-rule-form.tsx
index c71af719c..7382666b4 100644
--- a/resources/js/pages/networks/components/firewall-rule-form.tsx
+++ b/resources/js/pages/networks/components/firewall-rule-form.tsx
@@ -34,12 +34,12 @@ export default function NetworkFirewallRuleForm({
const submit = (e: FormEvent) => {
e.preventDefault();
if (rule) {
- form.put(route('networks.firewall.update', { network: networkId, networkFirewallRule: rule.id }), {
+ form.put(`/networks/${networkId}/firewall/${rule.id}`, {
onSuccess: () => onOpenChange(false),
});
return;
}
- form.post(route('networks.firewall.store', { network: networkId }), {
+ form.post(`/networks/${networkId}/firewall`, {
onSuccess: () => onOpenChange(false),
});
};
diff --git a/resources/js/pages/networks/components/log-columns.tsx b/resources/js/pages/networks/components/log-columns.tsx
index 70940655e..5020a5dce 100644
--- a/resources/js/pages/networks/components/log-columns.tsx
+++ b/resources/js/pages/networks/components/log-columns.tsx
@@ -13,7 +13,7 @@ const serverColumn: ColumnDef = {
const name = row.original.server_name ?? `#${row.original.server_id}`;
return (
-
+
{truncate(name, SERVER_NAME_LIMIT)}
);
diff --git a/resources/js/pages/networks/components/peer-config.tsx b/resources/js/pages/networks/components/peer-config.tsx
index 0fe55e45f..c8c906a8f 100644
--- a/resources/js/pages/networks/components/peer-config.tsx
+++ b/resources/js/pages/networks/components/peer-config.tsx
@@ -47,7 +47,7 @@ export default function PeerConfigDialog({
setError('');
return axios
- .get(route('networks.peers.config', { network: networkId, networkPeer: peerId }), { signal })
+ .get(`/networks/${networkId}/peers/${peerId}/config`, { signal })
.then((response) => {
setConfig(response.data.config);
setPrivateKey(response.data.private_key ?? null);
@@ -96,7 +96,7 @@ export default function PeerConfigDialog({
const conceal = () => {
setConcealing(true);
router.post(
- route('networks.peers.conceal', { network: networkId, networkPeer: peerId }),
+ `/networks/${networkId}/peers/${peerId}/conceal`,
{},
{
preserveScroll: true,
diff --git a/resources/js/pages/networks/components/private-ip-select.tsx b/resources/js/pages/networks/components/private-ip-select.tsx
index 5336dc392..22be01bdb 100644
--- a/resources/js/pages/networks/components/private-ip-select.tsx
+++ b/resources/js/pages/networks/components/private-ip-select.tsx
@@ -49,7 +49,7 @@ export default function PrivateIpSelect({
}
setRefreshing(true);
router.post(
- route('servers.network.refresh', { server: serverId }),
+ `/servers/${serverId}/network/refresh`,
{},
{
preserveScroll: true,
diff --git a/resources/js/pages/networks/firewall.tsx b/resources/js/pages/networks/firewall.tsx
index 7158dce3e..6c539f80c 100644
--- a/resources/js/pages/networks/firewall.tsx
+++ b/resources/js/pages/networks/firewall.tsx
@@ -70,7 +70,7 @@ export default function NetworkFirewall() {
variant: 'destructive',
confirmLabel: 'Delete',
method: 'delete',
- url: route('networks.firewall.destroy', { network: network.id, networkFirewallRule: rule.id }),
+ url: `/networks/${network.id}/firewall/${rule.id}`,
})
}
>
diff --git a/resources/js/pages/networks/index.tsx b/resources/js/pages/networks/index.tsx
index f68d0a30a..b4e97b426 100644
--- a/resources/js/pages/networks/index.tsx
+++ b/resources/js/pages/networks/index.tsx
@@ -40,7 +40,7 @@ export default function Networks() {
"Query every cloud provider connection used by this project's servers and create, update or remove provider-managed networks to match. Servers Vito does not manage are ignored.",
confirmLabel: 'Sync',
method: 'post',
- url: route('networks.sync-providers'),
+ url: '/networks/sync',
})
}
>
@@ -59,7 +59,7 @@ export default function Networks() {
actions={(row: Row) => (
-
+
diff --git a/resources/js/pages/networks/peers.tsx b/resources/js/pages/networks/peers.tsx
index d3b21672f..2beb38273 100644
--- a/resources/js/pages/networks/peers.tsx
+++ b/resources/js/pages/networks/peers.tsx
@@ -70,7 +70,7 @@ export default function NetworkPeers() {
'Generate a new key pair for this peer. Its current configuration will stop working until the peer is reconfigured.',
confirmLabel: 'Regenerate',
method: 'post',
- url: route('networks.peers.regenerate', { network: network.id, networkPeer: peer.id }),
+ url: `/networks/${network.id}/peers/${peer.id}/regenerate`,
})
}
>
@@ -85,7 +85,7 @@ export default function NetworkPeers() {
: 'Remove this peer from every member configuration. Its IP address stays reserved.',
confirmLabel: disabled ? 'Enable' : 'Disable',
method: 'put',
- url: route('networks.peers.update', { network: network.id, networkPeer: peer.id }),
+ url: `/networks/${network.id}/peers/${peer.id}`,
data: { name: peer.name, enabled: disabled },
})
}
@@ -102,7 +102,7 @@ export default function NetworkPeers() {
variant: 'destructive',
confirmLabel: 'Remove',
method: 'delete',
- url: route('networks.peers.destroy', { network: network.id, networkPeer: peer.id }),
+ url: `/networks/${network.id}/peers/${peer.id}`,
})
}
>
diff --git a/resources/js/pages/networks/servers.tsx b/resources/js/pages/networks/servers.tsx
index 1e9a97b50..6b4bfc2e3 100644
--- a/resources/js/pages/networks/servers.tsx
+++ b/resources/js/pages/networks/servers.tsx
@@ -50,7 +50,7 @@ export default function NetworkServers() {
: 'Re-apply configuration to every server in this network.',
confirmLabel: 'Sync',
method: 'post',
- url: route('networks.sync', { network: network.id }),
+ url: `/networks/${network.id}/sync`,
})
}
>
@@ -106,7 +106,7 @@ export default function NetworkServers() {
description: 'Re-apply the network configuration to this server.',
confirmLabel: 'Regenerate',
method: 'post',
- url: route('networks.servers.sync', { network: network.id, networkServer: member.id }),
+ url: `/networks/${network.id}/servers/${member.id}/sync`,
})
}
>
@@ -123,7 +123,7 @@ export default function NetworkServers() {
variant: 'destructive',
confirmLabel: 'Remove',
method: 'delete',
- url: route('networks.servers.destroy', { network: network.id, networkServer: member.id }),
+ url: `/networks/${network.id}/servers/${member.id}`,
})
}
>
diff --git a/resources/js/pages/networks/settings.tsx b/resources/js/pages/networks/settings.tsx
index f38a639fa..b912278b5 100644
--- a/resources/js/pages/networks/settings.tsx
+++ b/resources/js/pages/networks/settings.tsx
@@ -40,7 +40,7 @@ export default function NetworkSettings() {
}, [network.name, isDirty, setDefaults, setData]);
const submit = () => {
- form.put(route('networks.update', { network: network.id }), {
+ form.put(`/networks/${network.id}`, {
preserveScroll: true,
onSuccess: () => {
setEditMode(undefined);
@@ -228,7 +228,7 @@ export default function NetworkSettings() {
variant: 'destructive',
confirmLabel: 'Delete',
method: 'delete',
- url: route('networks.destroy', { network: network.id }),
+ url: `/networks/${network.id}`,
})
}
>
diff --git a/resources/js/pages/notification-channels/components/connect-notification-channel.tsx b/resources/js/pages/notification-channels/components/connect-notification-channel.tsx
index 484bf5ff7..b7a0f2645 100644
--- a/resources/js/pages/notification-channels/components/connect-notification-channel.tsx
+++ b/resources/js/pages/notification-channels/components/connect-notification-channel.tsx
@@ -49,7 +49,7 @@ export default function ConnectNotificationChannel({
const submit: FormEventHandler = (e) => {
e.preventDefault();
- form.post(route('notification-channels.store'), {
+ form.post('/settings/notification-channels', {
onSuccess: () => {
setOpen(false);
if (onProviderAdded) {
diff --git a/resources/js/pages/notification-channels/components/delete.tsx b/resources/js/pages/notification-channels/components/delete.tsx
index 25cf8adf9..f2febce16 100644
--- a/resources/js/pages/notification-channels/components/delete.tsx
+++ b/resources/js/pages/notification-channels/components/delete.tsx
@@ -15,7 +15,7 @@ export default function Delete({ notificationChannel }: { notificationChannel: N
variant: 'destructive',
confirmLabel: 'Delete',
method: 'delete',
- url: route('notification-channels.destroy', notificationChannel.id),
+ url: `/settings/notification-channels/${notificationChannel.id}`,
})
}
>
diff --git a/resources/js/pages/notification-channels/components/edit-dialog.tsx b/resources/js/pages/notification-channels/components/edit-dialog.tsx
index 2569164c5..4f1b2b3ba 100644
--- a/resources/js/pages/notification-channels/components/edit-dialog.tsx
+++ b/resources/js/pages/notification-channels/components/edit-dialog.tsx
@@ -27,7 +27,7 @@ export default function NotificationChannelEditDialog({
const submit = (e: FormEvent) => {
e.preventDefault();
- form.patch(route('notification-channels.update', notificationChannel.id), {
+ form.patch(`/settings/notification-channels/${notificationChannel.id}`, {
onSuccess: () => onOpenChange(false),
});
};
diff --git a/resources/js/pages/php/components/default-cli.tsx b/resources/js/pages/php/components/default-cli.tsx
index 95fa1b4b3..9d0191fbb 100644
--- a/resources/js/pages/php/components/default-cli.tsx
+++ b/resources/js/pages/php/components/default-cli.tsx
@@ -14,7 +14,7 @@ export default function DefaultCli({ service }: { service: Service }) {
description: `Are you sure you want to make PHP ${service.version} the default cli?`,
confirmLabel: 'Save',
method: 'post',
- url: route('php.default-cli', { server: service.server_id, service: service.id }),
+ url: `/servers/${service.server_id}/php/${service.id}/default-cli`,
data: { version: service.version },
})
}
diff --git a/resources/js/pages/php/components/extensions-dialog.tsx b/resources/js/pages/php/components/extensions-dialog.tsx
index c09483ee1..bc2415a98 100644
--- a/resources/js/pages/php/components/extensions-dialog.tsx
+++ b/resources/js/pages/php/components/extensions-dialog.tsx
@@ -31,7 +31,7 @@ export default function PhpExtensionsDialog({
const submit = (e: FormEvent) => {
e.preventDefault();
- form.post(route('php.install-extension', { server: service.server_id, service: service.id }), {
+ form.post(`/servers/${service.server_id}/php/${service.id}/install-extension`, {
onSuccess: () => onOpenChange(false),
});
};
diff --git a/resources/js/pages/php/components/ini-dialog.tsx b/resources/js/pages/php/components/ini-dialog.tsx
index b81e2fcb3..1a8b77fc1 100644
--- a/resources/js/pages/php/components/ini-dialog.tsx
+++ b/resources/js/pages/php/components/ini-dialog.tsx
@@ -43,7 +43,7 @@ export default function PhpIniDialog({
const submit = (e: FormEvent) => {
e.preventDefault();
- form.patch(route('php.ini.update', { server: service.server_id, service: service.id }), {
+ form.patch(`/servers/${service.server_id}/php/${service.id}/ini`, {
onSuccess: () => onOpenChange(false),
});
};
@@ -51,14 +51,9 @@ export default function PhpIniDialog({
const query = useQuery({
queryKey: ['php.ini', service.server_id, service.id, type],
queryFn: async () => {
- const response = await axios.get(
- route('php.ini', {
- server: service.server_id,
- service: service.id,
- version: service.version,
- type: type,
- }),
- );
+ const response = await axios.get(`/servers/${service.server_id}/php/${service.id}/ini`, {
+ params: { version: service.version, type },
+ });
if (typeof response.data?.ini === 'string') {
form.setData('ini', response.data.ini);
}
diff --git a/resources/js/pages/plugins/components/check-updates.tsx b/resources/js/pages/plugins/components/check-updates.tsx
index 9c295640b..e583179a2 100644
--- a/resources/js/pages/plugins/components/check-updates.tsx
+++ b/resources/js/pages/plugins/components/check-updates.tsx
@@ -6,7 +6,7 @@ export default function CheckForUpdates() {
const form = useForm();
const submit = () => {
- form.get(route('plugins.updates'));
+ form.get('/admin/plugins/updates');
};
return (
diff --git a/resources/js/pages/plugins/components/delete-logs.tsx b/resources/js/pages/plugins/components/delete-logs.tsx
index d854d3b8a..c3ce4a454 100644
--- a/resources/js/pages/plugins/components/delete-logs.tsx
+++ b/resources/js/pages/plugins/components/delete-logs.tsx
@@ -14,7 +14,7 @@ export default function DeleteLogs({ plugin }: { plugin: Plugin }) {
variant: 'destructive',
confirmLabel: 'Delete Logs',
method: 'delete',
- url: route('plugins.logs'),
+ url: '/admin/plugins/logs',
data: { id: plugin.id },
})
}
diff --git a/resources/js/pages/plugins/components/disable.tsx b/resources/js/pages/plugins/components/disable.tsx
index fa650f08e..49578a662 100644
--- a/resources/js/pages/plugins/components/disable.tsx
+++ b/resources/js/pages/plugins/components/disable.tsx
@@ -15,7 +15,7 @@ export default function Disable({ plugin }: { plugin: Plugin }) {
variant: 'destructive',
confirmLabel: 'Disable',
method: 'patch',
- url: route('plugins.disable'),
+ url: '/admin/plugins/disable',
data: { id: plugin.id },
})
}
diff --git a/resources/js/pages/plugins/components/enable.tsx b/resources/js/pages/plugins/components/enable.tsx
index 3216350c0..fed059f76 100644
--- a/resources/js/pages/plugins/components/enable.tsx
+++ b/resources/js/pages/plugins/components/enable.tsx
@@ -13,7 +13,7 @@ export default function EnablePlugin({ plugin }: { plugin: Plugin }) {
description: `Are you sure you want to enable the plugin ${plugin.name ?? plugin.folder}?`,
confirmLabel: 'Enable',
method: 'patch',
- url: route('plugins.enable'),
+ url: '/admin/plugins/enable',
data: { id: plugin.id },
})
}
diff --git a/resources/js/pages/plugins/components/install-dialog.tsx b/resources/js/pages/plugins/components/install-dialog.tsx
index 0cb9a9368..d93d80490 100644
--- a/resources/js/pages/plugins/components/install-dialog.tsx
+++ b/resources/js/pages/plugins/components/install-dialog.tsx
@@ -31,7 +31,7 @@ export default function InstallDialog({ repo }: { repo?: Repo }) {
});
const submit = () => {
- form.post(route('plugins.install.github'), {
+ form.post('/admin/plugins/install/github', {
onSuccess: () => {
form.reset();
setOpen(false);
diff --git a/resources/js/pages/plugins/components/install.tsx b/resources/js/pages/plugins/components/install.tsx
index 0be1664ad..4b42dca1e 100644
--- a/resources/js/pages/plugins/components/install.tsx
+++ b/resources/js/pages/plugins/components/install.tsx
@@ -13,7 +13,7 @@ export default function InstallPlugin({ plugin }: { plugin: Plugin }) {
description: `Are you sure you want to install the plugin located at ${plugin.folder}?`,
confirmLabel: 'Install',
method: 'patch',
- url: route('plugins.install'),
+ url: '/admin/plugins/install',
data: { id: plugin.id },
})
}
diff --git a/resources/js/pages/plugins/components/quick-install.tsx b/resources/js/pages/plugins/components/quick-install.tsx
index 21404a753..79deeb593 100644
--- a/resources/js/pages/plugins/components/quick-install.tsx
+++ b/resources/js/pages/plugins/components/quick-install.tsx
@@ -16,7 +16,7 @@ export default function QuickInstall({ url }: { url: string }) {
const isInstalled = page.props.plugins.some((plugin) => plugin.repo === url);
const submit = () => {
- form.post(route('plugins.install.github'), {
+ form.post('/admin/plugins/install/github', {
onSuccess: () => {},
});
};
diff --git a/resources/js/pages/plugins/components/uninstall.tsx b/resources/js/pages/plugins/components/uninstall.tsx
index b0aa7aad5..9e7018536 100644
--- a/resources/js/pages/plugins/components/uninstall.tsx
+++ b/resources/js/pages/plugins/components/uninstall.tsx
@@ -16,7 +16,7 @@ export default function Uninstall({ plugin }: { plugin: Plugin }) {
variant: 'destructive',
confirmLabel: label,
method: 'delete',
- url: route('plugins.uninstall'),
+ url: '/admin/plugins/uninstall',
data: { id: plugin.id },
})
}
diff --git a/resources/js/pages/plugins/components/update.tsx b/resources/js/pages/plugins/components/update.tsx
index 740757453..009d6a649 100644
--- a/resources/js/pages/plugins/components/update.tsx
+++ b/resources/js/pages/plugins/components/update.tsx
@@ -13,7 +13,7 @@ export default function UpdatePlugin({ plugin }: { plugin: Plugin }) {
description: `Are you sure you want to update the plugin ${plugin.name ?? plugin.folder} to the latest released version?`,
confirmLabel: 'Update',
method: 'patch',
- url: route('plugins.update'),
+ url: '/admin/plugins/update',
data: { id: plugin.id },
})
}
diff --git a/resources/js/pages/redirects/components/columns.tsx b/resources/js/pages/redirects/components/columns.tsx
index 3e1ac33cf..b29a3f450 100644
--- a/resources/js/pages/redirects/components/columns.tsx
+++ b/resources/js/pages/redirects/components/columns.tsx
@@ -26,7 +26,7 @@ function Delete({ redirect }: { redirect: Redirect }) {
variant: 'destructive',
confirmLabel: 'Delete',
method: 'delete',
- url: route('redirects.destroy', { server: redirect.server_id, site: redirect.site_id, redirect: redirect.id }),
+ url: `/servers/${redirect.server_id}/sites/${redirect.site_id}/redirects/${redirect.id}`,
})
}
>
diff --git a/resources/js/pages/redirects/components/create-redirect.tsx b/resources/js/pages/redirects/components/create-redirect.tsx
index 1d7f2dc57..5743bf527 100644
--- a/resources/js/pages/redirects/components/create-redirect.tsx
+++ b/resources/js/pages/redirects/components/create-redirect.tsx
@@ -28,7 +28,7 @@ export default function CreateRedirect({ site, children }: { site: Site; childre
const submit = (e: FormEvent) => {
e.preventDefault();
- form.post(route('redirects.store', { server: site.server_id, site: site.id }), {
+ form.post(`/servers/${site.server_id}/sites/${site.id}/redirects`, {
onSuccess: () => {
form.reset();
setOpen(false);
diff --git a/resources/js/pages/redirects/components/edit-redirect.tsx b/resources/js/pages/redirects/components/edit-redirect.tsx
index 31633b0ac..db6444352 100644
--- a/resources/js/pages/redirects/components/edit-redirect.tsx
+++ b/resources/js/pages/redirects/components/edit-redirect.tsx
@@ -17,7 +17,7 @@ export default function EditRedirect({ open, onOpenChange, redirect }: { open: b
const submit = (e: FormEvent) => {
e.preventDefault();
- form.put(route('redirects.update', { server: redirect.server_id, site: redirect.site_id, redirect: redirect.id }), {
+ form.put(`/servers/${redirect.server_id}/sites/${redirect.site_id}/redirects/${redirect.id}`, {
onSuccess: () => onOpenChange(false),
});
};
diff --git a/resources/js/pages/scripts/components/columns.tsx b/resources/js/pages/scripts/components/columns.tsx
index 94eb37ed5..1af4596c8 100644
--- a/resources/js/pages/scripts/components/columns.tsx
+++ b/resources/js/pages/scripts/components/columns.tsx
@@ -26,7 +26,7 @@ function Delete({ script }: { script: Script }) {
variant: 'destructive',
confirmLabel: 'Delete',
method: 'delete',
- url: route('scripts.destroy', { server: script.server_id, site: script.site_id, script: script.id }),
+ url: `/scripts/${script.id}`,
})
}
>
@@ -64,9 +64,7 @@ export const columns: ColumnDef
@viteReactRefresh
@vite(['resources/js/app.tsx', "resources/js/pages/{$page['component']}.tsx"])
@inertiaHead
diff --git a/tests/ArchTestCase.php b/tests/ArchTestCase.php
index 24e0e53fd..abbc05ae1 100644
--- a/tests/ArchTestCase.php
+++ b/tests/ArchTestCase.php
@@ -36,7 +36,6 @@ abstract class ArchTestCase extends BaseTestCase
'reason' => 'Hashes for cache keys and content fingerprints only — never for authentication, signing or password storage.',
'entries' => [
'App\Actions\Bootstrap\GetBootstrap',
- 'App\Actions\Ziggy\GetZiggyRoutes',
'App\Helpers\Apr1Hasher',
'App\SourceControlProviders',
],
@@ -203,7 +202,6 @@ abstract class ArchTestCase extends BaseTestCase
'api/github-hooks',
'api/servers/{server}/agent',
'api/webhooks',
- 'ziggy',
'login',
'logout',
'register',
diff --git a/tests/Feature/Auth/AuthenticationTest.php b/tests/Feature/Auth/AuthenticationTest.php
index 6cd3f2262..d2a32420d 100644
--- a/tests/Feature/Auth/AuthenticationTest.php
+++ b/tests/Feature/Auth/AuthenticationTest.php
@@ -2,13 +2,26 @@
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
+use Inertia\Ssr\Gateway;
+use Inertia\Testing\AssertableInertia;
+use Mockery\MockInterface;
uses(RefreshDatabase::class);
-test('login screen can be rendered', function () {
- $response = $this->get(route('login'));
+test('login screen can be rendered', function (bool $ssrEnabled) {
+ config()->set('inertia.ssr.enabled', $ssrEnabled);
+ $this->mock(Gateway::class, function (MockInterface $mock): void {
+ $mock->shouldReceive('dispatch')->andReturnNull();
+ });
- $response->assertStatus(200);
+ $this->get('/login')
+ ->assertSuccessful()
+ ->assertDontSee('/ziggy/', false)
+ ->assertInertia(fn (AssertableInertia $page) => $page->component('auth/login')->missing('ziggy'));
+})->with([false, true]);
+
+test('client route catalogue is not served', function () {
+ $this->get('/ziggy/deadbeef.js')->assertNotFound();
});
test('users can authenticate using the login screen', function () {
diff --git a/tests/Feature/BootstrapTest.php b/tests/Feature/BootstrapTest.php
new file mode 100644
index 000000000..26148c8ec
--- /dev/null
+++ b/tests/Feature/BootstrapTest.php
@@ -0,0 +1,49 @@
+set([
+ 'horizon.domain' => null,
+ 'horizon.path' => 'horizon',
+ 'log-viewer.route_domain' => null,
+ 'log-viewer.route_path' => 'logs',
+ ...$configuration,
+ ]);
+
+ $response = $this->actingAs($this->user)
+ ->withHeader('X-Forwarded-Host', 'untrusted.example')
+ ->getJson('https://panel.example/bootstrap')
+ ->assertSuccessful()
+ ->assertJsonPath('configs.dashboard_urls', $urls);
+
+ $this->withHeader('X-Forwarded-Host', 'panel.example')
+ ->getJson('https://panel.example/bootstrap')
+ ->assertSuccessful()
+ ->assertJsonPath('configs.dashboard_urls', $urls)
+ ->assertJsonPath('version', $response->json('version'));
+})->with([
+ 'default paths' => [
+ [],
+ ['horizon' => '/horizon', 'logs' => '/logs'],
+ ],
+ 'custom paths' => [
+ ['horizon.path' => '/queue-monitor/', 'log-viewer.route_path' => 'ops/logs'],
+ ['horizon' => '/queue-monitor', 'logs' => '/ops/logs'],
+ ],
+ 'configured domains' => [
+ [
+ 'horizon.domain' => 'queues.example',
+ 'horizon.path' => 'queue-monitor',
+ 'log-viewer.route_domain' => 'logs.example:8443',
+ 'log-viewer.route_path' => 'ops/logs',
+ ],
+ ['horizon' => '//queues.example/queue-monitor', 'logs' => '//logs.example:8443/ops/logs'],
+ ],
+ 'root paths' => [
+ ['horizon.path' => '', 'log-viewer.route_path' => '/'],
+ ['horizon' => '/', 'logs' => '/'],
+ ],
+]);
diff --git a/tests/Feature/ServerTest.php b/tests/Feature/ServerTest.php
index 5085b4edf..72a36bfc0 100644
--- a/tests/Feature/ServerTest.php
+++ b/tests/Feature/ServerTest.php
@@ -25,10 +25,29 @@
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Queue;
use Illuminate\Support\Facades\Storage;
+use Inertia\Testing\AssertableInertia;
use Laravel\Sanctum\Sanctum;
uses(RefreshDatabase::class);
+test('server table links are resolved without a client route catalogue', function () {
+ $this->actingAs($this->user)
+ ->get('/servers')
+ ->assertSuccessful()
+ ->assertDontSee('/ziggy/', false)
+ ->assertInertia(function (AssertableInertia $page): void {
+ $page->component('servers/index')->missing('ziggy');
+
+ $table = $page->toArray()['props']['servers'];
+ $column = collect($table['columns'])->firstWhere('name', 'name');
+ $display = $column['displays'][0];
+ $row = collect($table['data'])->firstWhere('id', $this->server->id);
+
+ expect($display)->toHaveKey('href_key')->not->toHaveKeys(['route', 'params']);
+ expect($row[$display['href_key']])->toBe(url('/servers/'.$this->server->id));
+ });
+});
+
test('create server', function () {
$this->actingAs($this->user);
diff --git a/tsconfig.json b/tsconfig.json
index f113eb245..6b769bb1a 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -121,9 +121,6 @@
"paths": {
"@/*": [
"./resources/js/*"
- ],
- "ziggy-js": [
- "./vendor/tightenco/ziggy"
]
},
"jsx": "react-jsx"
diff --git a/vite.config.ts b/vite.config.ts
index 17ddb32a1..2d9b28719 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -21,7 +21,6 @@ export default defineConfig({
},
resolve: {
alias: {
- 'ziggy-js': resolve(__dirname, 'vendor/tightenco/ziggy'),
'decimal.js-light': resolve(__dirname, 'node_modules/decimal.js-light/decimal.mjs'),
},
},