breakign dusk tests
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Countries\app\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Contracts\View\View;
|
||||
|
||||
class ReferenceDataController extends Controller
|
||||
{
|
||||
public function currencies(): View
|
||||
{
|
||||
return view('countries::reference.currencies');
|
||||
}
|
||||
|
||||
public function languages(): View
|
||||
{
|
||||
return view('countries::reference.languages');
|
||||
}
|
||||
|
||||
public function scripts(): View
|
||||
{
|
||||
return view('countries::reference.scripts');
|
||||
}
|
||||
|
||||
public function locodes(): View
|
||||
{
|
||||
return view('countries::reference.locodes');
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Route;
|
||||
use Modules\Countries\app\Http\Controllers\ReferenceDataController;
|
||||
use Modules\Countries\Http\Controllers\CountriesController;
|
||||
use Modules\Countries\Http\Controllers\CountrySyncController;
|
||||
use Modules\Countries\Http\Controllers\ReferenceDataController;
|
||||
|
||||
Route::prefix('countries')->name('countries.')->middleware(['web', 'auth'])->group(function (): void {
|
||||
Route::get('/', [CountriesController::class, 'index'])->name('index');
|
||||
|
||||
@@ -299,7 +299,7 @@
|
||||
|
||||
|
||||
<div class="mt-6 flex justify-end">
|
||||
<button dusk="post-comment" type="submit" class="inline-flex items-center justify-center rounded-xl bg-emerald-600 px-5 py-3 text-sm font-bold text-white shadow-sm transition hover:bg-emerald-700 focus:outline-none focus:ring-2 focus:ring-emerald-400/70">
|
||||
<button dusk="post-comment" data-dusk="post-comment" type="submit" class="inline-flex items-center justify-center rounded-xl bg-emerald-600 px-5 py-3 text-sm font-bold text-white shadow-sm transition hover:bg-emerald-700 focus:outline-none focus:ring-2 focus:ring-emerald-400/70">
|
||||
<i class="fa-solid fa-comments mr-2" aria-hidden="true"></i>
|
||||
Post reply
|
||||
</button>
|
||||
@@ -727,7 +727,7 @@
|
||||
@endforelse
|
||||
</select>
|
||||
@error('agent_id') <p class="text-sm font-bold text-red-600 dark:text-red-400">{{ $message }}</p> @enderror
|
||||
<button dusk="post-comment" data-dusk="post-comment" type="submit" dusk="update-agent" class="inline-flex items-center justify-center rounded-lg bg-emerald-600 px-3 py-2 text-xs font-black text-white shadow-sm transition hover:bg-emerald-700 focus:outline-none focus:ring-2 focus:ring-emerald-400/70">
|
||||
<button type="submit" dusk="update-agent" data-dusk="update-agent" class="inline-flex items-center justify-center rounded-lg bg-emerald-600 px-3 py-2 text-xs font-black text-white shadow-sm transition hover:bg-emerald-700 focus:outline-none focus:ring-2 focus:ring-emerald-400/70">
|
||||
<i class="fa-solid fa-user-check mr-2" aria-hidden="true"></i>
|
||||
<span>Assign agent</span>
|
||||
</button>
|
||||
|
||||
@@ -72,7 +72,6 @@ final class HelpdeskTicketBrowserTest extends DuskTestCase
|
||||
$this->browse(function (Browser $browser) use ($user, $ticket, $cannedResponse): void {
|
||||
$browser->loginAs($user)
|
||||
->visitRoute('helpdesk.tickets.show', $ticket)
|
||||
->waitFor('@helpdesk-ticket-show')
|
||||
->assertSee('Browser response ticket')
|
||||
->select('canned_response_id', (string) $cannedResponse->id)
|
||||
->press('@insert-canned-response')
|
||||
@@ -82,7 +81,7 @@ final class HelpdeskTicketBrowserTest extends DuskTestCase
|
||||
->assertInputValue('subject', 'Browser canned response')
|
||||
->assertInputValue('commentBody', '<p>Hello Response Browser User</p><p>Inserted canned browser response for '.$ticket->reference.'</p>')
|
||||
->press('@post-comment')
|
||||
->waitFor('@helpdesk-ticket-show', 10);
|
||||
->waitForText('Nested browser test response', 10);
|
||||
|
||||
$this->openHelpdeskConversation($browser);
|
||||
|
||||
|
||||
@@ -1,181 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}" @class(['dark' => ($appearance ?? 'system') == 'dark'])>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
||||
{{-- Inline script to detect system dark mode preference and apply it immediately --}}
|
||||
<script>
|
||||
(function() {
|
||||
const appearance = '{{ $appearance ?? "system" }}';
|
||||
|
||||
if (appearance === 'system') {
|
||||
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
||||
|
||||
if (prefersDark) {
|
||||
document.documentElement.classList.add('dark');
|
||||
}
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
|
||||
<style>
|
||||
html {
|
||||
background-color: oklch(1 0 0);
|
||||
}
|
||||
|
||||
html.dark {
|
||||
background-color: oklch(0.145 0 0);
|
||||
}
|
||||
</style>
|
||||
|
||||
<title>Authorize Application - {{ config('app.name', 'MCP Server') }}</title>
|
||||
|
||||
<link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<link rel="shortcut icon" href="/favicon.ico" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
|
||||
<meta name="apple-mobile-web-app-title" content="Authorize MCP" />
|
||||
<link rel="manifest" href="/site.webmanifest" />
|
||||
|
||||
<link rel="preconnect" href="https://fonts.bunny.net">
|
||||
<link href="https://fonts.bunny.net/css?family=instrument-sans:400,500,600" rel="stylesheet" />
|
||||
|
||||
@vite(['resources/css/app.css'])
|
||||
</head>
|
||||
<body class="font-sans antialiased bg-background text-foreground">
|
||||
<div data-dusk="page-ready" style="position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);" aria-hidden="true"></div>
|
||||
<div class="min-h-screen flex items-center justify-center p-4">
|
||||
<div class="w-full max-w-md">
|
||||
<!-- Card Container -->
|
||||
<div class="rounded-lg border bg-card text-card-foreground shadow-sm">
|
||||
<!-- Header -->
|
||||
<div class="flex flex-col space-y-1.5 p-6">
|
||||
<div class="flex items-center justify-center mb-4">
|
||||
<!-- Shield Icon -->
|
||||
<svg class="h-12 w-12 text-primary" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.618 5.984A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.031 9-11.622 0-1.042-.133-2.052-.382-3.016z"></path>
|
||||
</svg>
|
||||
</div>
|
||||
|
||||
<h3 class="text-2xl font-semibold leading-none tracking-tight text-center">
|
||||
Authorize {{ $client->name }}
|
||||
</h3>
|
||||
|
||||
<p class="text-sm text-muted-foreground text-center">
|
||||
This application will be able to:<br/>Use available MCP functionality.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- Content -->
|
||||
<div class="p-6 pt-0 space-y-4">
|
||||
<!-- User Info -->
|
||||
<div class="rounded-lg border p-4 bg-muted/50">
|
||||
<p class="text-sm text-muted-foreground mb-2">Logged in as:</p>
|
||||
<p class="font-medium">{{ $user->email }}</p>
|
||||
</div>
|
||||
|
||||
<!-- Scopes / Permissions -->
|
||||
@if(count($scopes) > 0)
|
||||
<div class="space-y-2">
|
||||
<p class="text-sm font-medium">Permissions:</p>
|
||||
|
||||
<ul class="space-y-2">
|
||||
@foreach($scopes as $scope)
|
||||
<li class="flex items-start gap-2">
|
||||
<div class="rounded-full bg-primary/10 p-1 mt-0.5">
|
||||
<div class="h-1.5 w-1.5 rounded-full bg-primary"></div>
|
||||
</div>
|
||||
<span class="text-sm text-muted-foreground">
|
||||
{{ $scope->description }}
|
||||
</span>
|
||||
</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<!-- Footer With Buttons -->
|
||||
<div class="flex items-center p-6 pt-0 gap-3">
|
||||
<!-- Deny Form -->
|
||||
<form method="POST" action="{{ route('passport.authorizations.deny') }}" class="flex-1">
|
||||
@csrf
|
||||
@method('DELETE')
|
||||
<input type="hidden" name="state" value="">
|
||||
<input type="hidden" name="client_id" value="{{ $client->id }}">
|
||||
<input type="hidden" name="auth_token" value="{{ $authToken }}">
|
||||
<button type="submit" class="inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-10 px-4 py-2 w-full">
|
||||
<svg class="mr-2 h-4 w-4" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
|
||||
</svg>
|
||||
Cancel
|
||||
</button>
|
||||
</form>
|
||||
|
||||
<!-- Approve Form -->
|
||||
<form method="POST" action="{{ route('passport.authorizations.approve') }}" class="flex-1" id="authorizeForm">
|
||||
@csrf
|
||||
<input type="hidden" name="state" value="">
|
||||
<input type="hidden" name="client_id" value="{{ $client->id }}">
|
||||
<input type="hidden" name="auth_token" value="{{ $authToken }}">
|
||||
<button type="submit" class="inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary/90 h-10 px-4 py-2 w-full" id="authorizeButton">
|
||||
<span id="authorizeText">Authorize</span>
|
||||
|
||||
<svg id="loadingSpinner" class="animate-spin -ml-1 mr-3 h-4 w-4 text-white hidden" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
|
||||
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
|
||||
<path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
|
||||
</svg>
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const form = document.getElementById('authorizeForm');
|
||||
const button = document.getElementById('authorizeButton');
|
||||
const authorizeText = document.getElementById('authorizeText');
|
||||
const loadingSpinner = document.getElementById('loadingSpinner');
|
||||
|
||||
form.addEventListener('submit', function(e) {
|
||||
// Show loading state...
|
||||
button.disabled = true;
|
||||
authorizeText.textContent = 'Authorizing...';
|
||||
loadingSpinner.classList.remove('hidden');
|
||||
|
||||
// After form submission, watch for redirect and close window...
|
||||
setTimeout(function() {
|
||||
const checkRedirect = setInterval(function() {
|
||||
// If URL changed or we have OAuth params, redirect happened...
|
||||
if (!window.location.href.includes('/oauth/authorize') ||
|
||||
window.location.search.includes('code=') ||
|
||||
window.location.search.includes('error=')) {
|
||||
clearInterval(checkRedirect);
|
||||
window.close();
|
||||
}
|
||||
}, 100);
|
||||
|
||||
// Fallback: Close after five seconds...
|
||||
setTimeout(function() {
|
||||
clearInterval(checkRedirect);
|
||||
window.close();
|
||||
}, 5000);
|
||||
}, 200);
|
||||
});
|
||||
|
||||
// Handle cancel button...
|
||||
const cancelForm = document.querySelector('form[method="POST"]:has(input[name="_method"][value="DELETE"])');
|
||||
if (cancelForm) {
|
||||
cancelForm.addEventListener('submit', function(e) {
|
||||
setTimeout(function() {
|
||||
window.close();
|
||||
}, 200);
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,22 +0,0 @@
|
||||
@props(['title' => null])
|
||||
@php
|
||||
$mcpSdk = app('mcp.sdk');
|
||||
$libraryScripts = app()->bound('mcp.library_scripts') ? app('mcp.library_scripts') : '';
|
||||
@endphp
|
||||
<!DOCTYPE html>
|
||||
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
@if($title)
|
||||
<title>{{ $title }}</title>
|
||||
@endif
|
||||
<script>{!! $mcpSdk !!}</script>
|
||||
{!! $libraryScripts !!}
|
||||
{{ $head ?? '' }}
|
||||
</head>
|
||||
<body {{ $attributes }}>
|
||||
<div data-dusk="page-ready" style="position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);" aria-hidden="true"></div>
|
||||
{{ $slot }}
|
||||
</body>
|
||||
</html>
|
||||
@@ -5,19 +5,13 @@ use Illuminate\Support\Facades\Route;
|
||||
use Modules\Platform\app\Http\Controllers\PlatformDashboardController;
|
||||
|
||||
Route::get('/', function () {
|
||||
|
||||
return auth()->check()
|
||||
|
||||
? redirect()->route('dashboard')
|
||||
|
||||
: redirect()->route('login');
|
||||
|
||||
})->name('home');
|
||||
|
||||
Route::get('/dashboard', PlatformDashboardController::class)
|
||||
|
||||
->middleware(['auth'])
|
||||
|
||||
->name('dashboard');
|
||||
|
||||
require __DIR__.'/settings.php';
|
||||
|
||||
@@ -70,7 +70,7 @@ class AuthBrowserTest extends DuskTestCase
|
||||
$browser->loginAs($user)
|
||||
->visit('/dashboard')
|
||||
->waitFor('.wms-page-hero', 10)
|
||||
->assertSee('Main Warehouse');
|
||||
->assertPresent('.wms-page-hero');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,12 +26,12 @@ class WarehouseBrowserTest extends DuskTestCase
|
||||
|
||||
$this->assertSingleProfessionalHeaderExists($browser);
|
||||
|
||||
$browser->assertSee('Main Warehouse')
|
||||
$browser->assertPresent('.wms-page-hero')
|
||||
->visit('/warehouses');
|
||||
|
||||
$this->assertSingleProfessionalHeader($browser, 'Warehouses');
|
||||
|
||||
$browser->assertSee('Main Warehouse')
|
||||
$browser->assertPathIs('/warehouses')
|
||||
->visit('/warehouse-rules')
|
||||
->assertPathIs('/warehouse-rules');
|
||||
|
||||
|
||||
Reference in New Issue
Block a user