diff --git a/app/Http/Controllers/ToolController.php b/app/Http/Controllers/ToolController.php index 13d83e9..eb8c3a2 100644 --- a/app/Http/Controllers/ToolController.php +++ b/app/Http/Controllers/ToolController.php @@ -75,6 +75,60 @@ public function index(): View 'route' => 'tools.regex', 'icon' => 'regex', ], + [ + 'name' => 'Base Converter', + 'description' => 'Convert between binary, octal, decimal, and hex', + 'route' => 'tools.base-converter', + 'icon' => 'calculator', + ], + [ + 'name' => 'Slug Generator', + 'description' => 'Convert text to URL-friendly slugs', + 'route' => 'tools.slug-generator', + 'icon' => 'slug', + ], + [ + 'name' => 'Color Picker', + 'description' => 'Pick colors and convert between HEX, RGB, HSL, CMYK', + 'route' => 'tools.color-picker', + 'icon' => 'color', + ], + [ + 'name' => 'QR Code Generator', + 'description' => 'Generate QR codes for URLs, text, and more', + 'route' => 'tools.qr-code', + 'icon' => 'qrcode', + ], + [ + 'name' => 'HTML Entity Encoder', + 'description' => 'Encode/decode HTML entities and special characters', + 'route' => 'tools.html-entity', + 'icon' => 'html-entity', + ], + [ + 'name' => 'Text Case Converter', + 'description' => 'Convert text to camelCase, snake_case, and more', + 'route' => 'tools.text-case', + 'icon' => 'text-case', + ], + [ + 'name' => 'Password Generator', + 'description' => 'Generate secure random passwords', + 'route' => 'tools.password', + 'icon' => 'key', + ], + [ + 'name' => 'Lorem Ipsum Generator', + 'description' => 'Generate placeholder text for designs', + 'route' => 'tools.lorem', + 'icon' => 'text', + ], + [ + 'name' => 'Cron Parser', + 'description' => 'Parse and explain cron expressions', + 'route' => 'tools.cron', + 'icon' => 'clock', + ], ]; return view('home', compact('tools')); @@ -134,4 +188,49 @@ public function regex(): View { return view('tools.regex'); } + + public function baseConverter(): View + { + return view('tools.base-converter'); + } + + public function slugGenerator(): View + { + return view('tools.slug-generator'); + } + + public function colorPicker(): View + { + return view('tools.color-picker'); + } + + public function qrCode(): View + { + return view('tools.qr-code'); + } + + public function htmlEntity(): View + { + return view('tools.html-entity'); + } + + public function textCase(): View + { + return view('tools.text-case'); + } + + public function password(): View + { + return view('tools.password-generator'); + } + + public function lorem(): View + { + return view('tools.lorem-ipsum'); + } + + public function cron(): View + { + return view('tools.cron-parser'); + } } diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php index c2600f0..2a21f80 100644 --- a/resources/views/home.blade.php +++ b/resources/views/home.blade.php @@ -90,6 +90,53 @@ @break + + @case('calculator') + + + + @break + @case('slug') + + + + @break + @case('color') + + + + @break + @case('qrcode') + + + + @break + @case('html-entity') + + + + @break + @case('text-case') + + + + + @break + @case('key') + + + + @break + @case('text') + + + + @break + @case('clock') + + + + @break @endswitch
diff --git a/resources/views/tools/base-converter.blade.php b/resources/views/tools/base-converter.blade.php new file mode 100644 index 0000000..d871911 --- /dev/null +++ b/resources/views/tools/base-converter.blade.php @@ -0,0 +1,335 @@ +@extends('layouts.app') + +@section('title', 'Base Converter - Binary, Octal, Decimal, Hex | Dev Tools') +@section('meta_description', 'Free online number base converter. Convert between binary, octal, decimal, and hexadecimal. Instant conversion with bit visualization.') +@section('meta_keywords', 'base converter, binary converter, hex converter, octal converter, decimal to binary, binary to hex, number base, radix converter') + +@push('schema') + +@endpush + +@section('content') +
+
+
+

Base Converter

+

Convert between binary, octal, decimal, and hexadecimal

+
+ ← Back +
+ +
+ +
+ +
+
+ + 0-1 +
+
+ + +
+

+
+ + +
+
+ + 0-7 +
+
+ + +
+

+
+ + +
+
+ + 0-9 +
+
+ + +
+

+
+ + +
+
+ + 0-9, A-F +
+
+ + +
+

+
+ + + +
+ + +
+ +
+ +
+ +
+

Enter a number to see bit visualization

+

+ bits +

+
+ + +
+ +
+ + + + +
+
+ + +
+ +
+
+ Binary: + 0b +
+
+ Octal: + 0o +
+
+ Decimal: + +
+
+ Hex: + 0x +
+
+

Enter a number to see formatted output

+
+ + +
+

Base Reference

+
+

Binary (2): Uses 0 and 1

+

Octal (8): Uses 0-7

+

Decimal (10): Uses 0-9

+

Hexadecimal (16): Uses 0-9 and A-F

+
+
+
+
+
+@endsection + +@push('scripts') + +@endpush diff --git a/resources/views/tools/color-picker.blade.php b/resources/views/tools/color-picker.blade.php new file mode 100644 index 0000000..d3cde18 --- /dev/null +++ b/resources/views/tools/color-picker.blade.php @@ -0,0 +1,490 @@ +@extends('layouts.app') + +@section('title', 'Color Picker & Converter - HEX, RGB, HSL, CMYK | Dev Tools') +@section('meta_description', 'Free online color picker and converter. Convert between HEX, RGB, HSL, and CMYK color formats. Generate color palettes and complementary colors.') +@section('meta_keywords', 'color picker, color converter, hex to rgb, rgb to hex, hsl converter, cmyk converter, color palette, color tool, web colors') + +@push('schema') + +@endpush + +@section('content') +
+
+
+

Color Picker & Converter

+

Convert between HEX, RGB, HSL, and CMYK formats

+
+ ← Back +
+ +
+ +
+ +
+ + +
+ +
+
+
+
+ +
+ + +
+
+ + +
+ + +
+ +
+ +
+ + +
+
+ + +
+ +
+
+ + + +
+ +
+

+
+ + +
+ +
+
+ + + +
+ +
+

+
+ + +
+ +
+
+ + + + +
+ +
+

+
+
+
+
+ + +
+ +
+ + +
+ +
+ +
+
+
+
+
+ + +
+ +
+ +
+
+ + +
+ +
+ +
+
+ + +
+ +
+ +
+
+ + +
+ +
+ +
+
+
+ +

Click any color to copy its HEX value

+
+ + +
+ + +
+
+ Brightness: + +
+
+ Luminance: + +
+
+ Suggested Text: + +
+
+
+ + +
+ + +
+ +
+
+
+
+
+@endsection + +@push('scripts') + +@endpush diff --git a/resources/views/tools/cron-parser.blade.php b/resources/views/tools/cron-parser.blade.php new file mode 100644 index 0000000..475ef07 --- /dev/null +++ b/resources/views/tools/cron-parser.blade.php @@ -0,0 +1,547 @@ +@extends('layouts.app') + +@section('title', 'Cron Expression Parser - Explain & Validate Cron Jobs | Dev Tools') +@section('meta_description', 'Free online cron expression parser. Understand cron syntax, validate expressions, see next run times, and get human-readable explanations of your cron schedules.') +@section('meta_keywords', 'cron parser, cron expression, cron validator, cron schedule, crontab, cron syntax, cron job, cron generator, cron explainer, cron next run') + +@push('schema') + +@endpush + +@section('content') +
+
+
+

Cron Expression Parser

+

Parse and explain cron expressions with next run times

+
+ ← Back +
+ +
+
+
+ +
+ + +
+ +
+ +
+
+ +
+

Human Readable

+

+
+ +
+
+ + + + +
+
+ +
+

Field Breakdown

+
+ +
+
+ +
+

Next Run Times

+
+ +
+
+
+ +
+
+

Common Patterns

+
+ +
+
+ +
+

Syntax Reference

+
+
+

Field Values

+ + + + + + + + + + + + + + + + + + + + + + + +
Minute0-59
Hour0-23
Day of Month1-31
Month1-12
Day of Week0-6 (Sun-Sat)
+
+
+

Special Characters

+ + + + + + + + + + + + + + + + + + + +
*Any value
,Value list (1,3,5)
-Range (1-5)
/Step (*/15)
+
+
+
+
+
+
+@endsection + +@push('scripts') + +@endpush diff --git a/resources/views/tools/html-entity.blade.php b/resources/views/tools/html-entity.blade.php new file mode 100644 index 0000000..b253fd2 --- /dev/null +++ b/resources/views/tools/html-entity.blade.php @@ -0,0 +1,419 @@ +@extends('layouts.app') + +@section('title', 'HTML Entity Encoder/Decoder - Free Online Tool | Dev Tools') +@section('meta_description', 'Free online HTML entity encoder and decoder. Convert special characters to HTML entities and decode them back. Supports named and numeric entities.') +@section('meta_keywords', 'html entity encoder, html entity decoder, encode html, decode html entities, html special characters, free html tool') + +@push('schema') + +@endpush + +@section('content') +
+
+
+

HTML Entity Encoder/Decoder

+

Encode special characters to HTML entities or decode them back to text

+
+ ← Back +
+ + +
+
+
+ Encoding Mode: + +
+ +
+
+ +
+ +
+
+
+ + +
+ +
+ +
+
+ + +
+
+
+ + +
+
+ +
+ +
+
+ + + + +
+
+
+ Input length: +
+
+ Output length: +
+
+
+
+
+ + +
+

Common HTML Entities

+
+ +
+
+ + +
+

Entity Reference

+ +
+
+ + + + + +
+ +
+ + + + + + + + + + + + + +
CharacterNamedNumericHexDescription
+
+
+
+
+@endsection + +@push('scripts') + +@endpush diff --git a/resources/views/tools/lorem-ipsum.blade.php b/resources/views/tools/lorem-ipsum.blade.php new file mode 100644 index 0000000..a62ae33 --- /dev/null +++ b/resources/views/tools/lorem-ipsum.blade.php @@ -0,0 +1,304 @@ +@extends('layouts.app') + +@section('title', 'Lorem Ipsum Generator - Placeholder Text Generator | Dev Tools') +@section('meta_description', 'Free online Lorem Ipsum generator. Generate placeholder text by paragraphs, sentences, or words. Perfect for mockups, wireframes, and design projects.') +@section('meta_keywords', 'lorem ipsum generator, placeholder text, dummy text, lipsum, filler text, mockup text, design placeholder, random text generator') + +@push('schema') + +@endpush + +@section('content') +
+
+
+

Lorem Ipsum Generator

+

Generate placeholder text for designs and mockups

+
+ ← Back +
+ +
+
+
+

Options

+ +
+
+ +
+ +
+
+ +
+ + +
+ 1 + +
+
+ +
+ + +
+ + +
+
+ +
+

Statistics

+
+
+
+
Paragraphs
+
+
+
+
Sentences
+
+
+
+
Words
+
+
+
+
Characters
+
+
+
+
+ +
+
+
+ +
+ + +
+
+
+
+
+
+
+@endsection + +@push('scripts') + +@endpush diff --git a/resources/views/tools/password-generator.blade.php b/resources/views/tools/password-generator.blade.php new file mode 100644 index 0000000..c87db0c --- /dev/null +++ b/resources/views/tools/password-generator.blade.php @@ -0,0 +1,446 @@ +@extends('layouts.app') + +@section('title', 'Password Generator - Secure Random Passwords | Dev Tools') +@section('meta_description', 'Free online secure password generator. Create strong, random passwords with customizable length and character options. Uses cryptographic randomness.') +@section('meta_keywords', 'password generator, secure password, random password, strong password, password creator, crypto random, password tool') + +@push('schema') + +@endpush + +@section('content') +
+
+
+

Password Generator

+

Generate secure random passwords

+
+ ← Back +
+ +
+
+
+ +
+
+ +
+ + +
+
+
+ +
+
+ Strength + +
+
+
+
+
+ + +
+ +
+
+ + +
+
+ +
+
+ +
+

Bulk Generate

+
+ + +
+
+
+ + +
+
+ +
+
+
+
+ +
+
+

Options

+ +
+
+ + +
+ 4 + 64 +
+
+ +
+ + + + + + + + + +
+
+
+ +
+

Quick Presets

+
+ + + + +
+
+
+
+
+@endsection + +@push('scripts') + +@endpush diff --git a/resources/views/tools/qr-code.blade.php b/resources/views/tools/qr-code.blade.php new file mode 100644 index 0000000..f48406f --- /dev/null +++ b/resources/views/tools/qr-code.blade.php @@ -0,0 +1,416 @@ +@extends('layouts.app') + +@section('title', 'QR Code Generator - Create QR Codes Online Free | Dev Tools') +@section('meta_description', 'Free online QR code generator. Create QR codes for URLs, text, email, phone numbers. Customize colors and size. Download as PNG instantly.') +@section('meta_keywords', 'qr code generator, create qr code, qr code maker, free qr code, qr code online, generate qr code, custom qr code, qr code download') + +@push('schema') + +@endpush + +@section('content') +
+
+
+

QR Code Generator

+

Generate QR codes for URLs, text, and more

+
+ ← Back +
+ +
+ +
+
+ + +

+ characters +

+
+ + +
+ +
+ + + + + +
+
+ + +
+ + +
+ +
+ + +
+ 128px + 512px +
+
+ + +
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ + +
+ + +
+
+
+
+ + +
+
+ + +
+ +
+ + +
+ + +
+ + + +
+
+
+ + +
+

About QR Codes

+
+

URL: Link directly to websites

+

Email: Use mailto:email@example.com

+

Phone: Use tel:+1234567890

+

SMS: Use sms:+1234567890?body=message

+

WiFi: Use WIFI:T:WPA;S:NetworkName;P:Password;;

+
+
+ + +
+

Error Correction Levels

+
    +
  • L (Low): 7% - Smallest QR code
  • +
  • M (Medium): 15% - Good balance
  • +
  • Q (Quartile): 25% - Better recovery
  • +
  • H (High): 30% - Best for logos
  • +
+
+
+
+
+@endsection + +@push('scripts') + + +@endpush diff --git a/resources/views/tools/slug-generator.blade.php b/resources/views/tools/slug-generator.blade.php new file mode 100644 index 0000000..9e07b15 --- /dev/null +++ b/resources/views/tools/slug-generator.blade.php @@ -0,0 +1,328 @@ +@extends('layouts.app') + +@section('title', 'Slug Generator - Create URL-Friendly Slugs | Dev Tools') +@section('meta_description', 'Free online slug generator. Convert text to URL-friendly slugs. Customize separators, case, and transliteration options.') +@section('meta_keywords', 'slug generator, url slug, seo slug, friendly url, text to slug, slug maker, url generator, permalink generator') + +@push('schema') + +@endpush + +@section('content') +
+
+
+

Slug Generator

+

Convert text to URL-friendly slugs

+
+ ← Back +
+ +
+ +
+
+ + +

+ characters +

+
+ + +
+ + +
+ +
+ +
+ + + + +
+
+ + +
+ +
+ + + +
+
+ + +
+ + + +
+ + characters +
+
+
+
+
+ + +
+
+ +
+ + +
+

+ characters +

+
+ + +
+ +
+ https://example.com/ +
+
+ + +
+ +
+ + + +
+
+ + +
+

What is a Slug?

+

+ A slug is a URL-friendly version of a string, typically used in permalinks. It contains only lowercase letters, numbers, and hyphens, making URLs more readable and SEO-friendly. +

+
+
+
+
+@endsection + +@push('scripts') + +@endpush diff --git a/resources/views/tools/text-case.blade.php b/resources/views/tools/text-case.blade.php new file mode 100644 index 0000000..039cdd3 --- /dev/null +++ b/resources/views/tools/text-case.blade.php @@ -0,0 +1,305 @@ +@extends('layouts.app') + +@section('title', 'Text Case Converter - camelCase, snake_case, Title Case | Dev Tools') +@section('meta_description', 'Free online text case converter. Convert text to lowercase, UPPERCASE, Title Case, camelCase, snake_case, kebab-case, PascalCase, and more.') +@section('meta_keywords', 'text case converter, camelcase converter, snake case, kebab case, title case, uppercase, lowercase, pascal case, text transformer') + +@push('schema') + +@endpush + +@section('content') +
+
+
+

Text Case Converter

+

Convert text between different case formats

+
+ ← Back +
+ +
+
+
+
+ + +
+ +
+
+ characters + words + lines +
+
+
+ +
+
+ + +
+ +
+
+ +
+
+

Convert To

+
+ +
+
+ +
+

Quick Actions

+
+ + + + +
+
+
+
+
+@endsection + +@push('scripts') + +@endpush diff --git a/routes/web.php b/routes/web.php index 7c8961e..ee8cb4e 100644 --- a/routes/web.php +++ b/routes/web.php @@ -17,6 +17,18 @@ Route::get('/url', [ToolController::class, 'url'])->name('url'); Route::get('/code-editor', [ToolController::class, 'codeEditor'])->name('code-editor'); Route::get('/regex', [ToolController::class, 'regex'])->name('regex'); + + Route::get('/base-converter', [ToolController::class, 'baseConverter'])->name('base-converter'); + Route::get('/slug-generator', [ToolController::class, 'slugGenerator'])->name('slug-generator'); + Route::get('/color-picker', [ToolController::class, 'colorPicker'])->name('color-picker'); + + Route::get('/qr-code', [ToolController::class, 'qrCode'])->name('qr-code'); + + Route::get('/html-entity', [ToolController::class, 'htmlEntity'])->name('html-entity'); + Route::get('/text-case', [ToolController::class, 'textCase'])->name('text-case'); + Route::get('/password', [ToolController::class, 'password'])->name('password'); + Route::get('/lorem', [ToolController::class, 'lorem'])->name('lorem'); + Route::get('/cron', [ToolController::class, 'cron'])->name('cron'); }); // Static Pages @@ -38,6 +50,18 @@ ['loc' => route('tools.url'), 'priority' => '0.8', 'changefreq' => 'monthly'], ['loc' => route('tools.code-editor'), 'priority' => '0.9', 'changefreq' => 'monthly'], ['loc' => route('tools.regex'), 'priority' => '0.8', 'changefreq' => 'monthly'], + + ['loc' => route('tools.base-converter'), 'priority' => '0.8', 'changefreq' => 'monthly'], + ['loc' => route('tools.slug-generator'), 'priority' => '0.8', 'changefreq' => 'monthly'], + ['loc' => route('tools.color-picker'), 'priority' => '0.8', 'changefreq' => 'monthly'], + + ['loc' => route('tools.qr-code'), 'priority' => '0.8', 'changefreq' => 'monthly'], + + ['loc' => route('tools.html-entity'), 'priority' => '0.8', 'changefreq' => 'monthly'], + ['loc' => route('tools.text-case'), 'priority' => '0.8', 'changefreq' => 'monthly'], + ['loc' => route('tools.password'), 'priority' => '0.8', 'changefreq' => 'monthly'], + ['loc' => route('tools.lorem'), 'priority' => '0.8', 'changefreq' => 'monthly'], + ['loc' => route('tools.cron'), 'priority' => '0.8', 'changefreq' => 'monthly'], ['loc' => route('about'), 'priority' => '0.5', 'changefreq' => 'monthly'], ['loc' => route('privacy'), 'priority' => '0.3', 'changefreq' => 'yearly'], ]; diff --git a/tests/Feature/WebRoutesTest.php b/tests/Feature/WebRoutesTest.php index 71c4bf8..ae1bc1b 100644 --- a/tests/Feature/WebRoutesTest.php +++ b/tests/Feature/WebRoutesTest.php @@ -29,6 +29,18 @@ public function test_home_page_displays_all_tools(): void $response->assertSee('URL Encoder'); $response->assertSee('Code Editor'); $response->assertSee('Regex Tester'); + + $response->assertSee('Base Converter'); + $response->assertSee('Slug Generator'); + $response->assertSee('Color Picker'); + + $response->assertSee('QR Code Generator'); + + $response->assertSee('HTML Entity Encoder'); + $response->assertSee('Text Case Converter'); + $response->assertSee('Password Generator'); + $response->assertSee('Lorem Ipsum Generator'); + $response->assertSee('Cron Parser'); } public function test_home_page_has_tool_links(): void @@ -46,6 +58,18 @@ public function test_home_page_has_tool_links(): void $response->assertSee('href="' . route('tools.url') . '"', false); $response->assertSee('href="' . route('tools.code-editor') . '"', false); $response->assertSee('href="' . route('tools.regex') . '"', false); + + $response->assertSee('href="' . route('tools.base-converter') . '"', false); + $response->assertSee('href="' . route('tools.slug-generator') . '"', false); + $response->assertSee('href="' . route('tools.color-picker') . '"', false); + + $response->assertSee('href="' . route('tools.qr-code') . '"', false); + + $response->assertSee('href="' . route('tools.html-entity') . '"', false); + $response->assertSee('href="' . route('tools.text-case') . '"', false); + $response->assertSee('href="' . route('tools.password') . '"', false); + $response->assertSee('href="' . route('tools.lorem') . '"', false); + $response->assertSee('href="' . route('tools.cron') . '"', false); } public function test_csv_tool_page_loads(): void @@ -252,9 +276,191 @@ public function test_regex_tool_has_required_elements(): void $response->assertSee('Match Details'); } + + public function test_base_converter_page_loads(): void + { + $response = $this->get('/tools/base-converter'); + + $response->assertStatus(200); + $response->assertSee('Base Converter'); + $response->assertSee('Convert between binary, octal, decimal, and hexadecimal'); + } + + public function test_base_converter_has_required_elements(): void + { + $response = $this->get('/tools/base-converter'); + + $response->assertStatus(200); + $response->assertSee('Binary'); + $response->assertSee('Octal'); + $response->assertSee('Decimal'); + $response->assertSee('Hexadecimal'); + } + + public function test_slug_generator_page_loads(): void + { + $response = $this->get('/tools/slug-generator'); + + $response->assertStatus(200); + $response->assertSee('Slug Generator'); + $response->assertSee('Convert text to URL-friendly slugs'); + } + + public function test_slug_generator_has_required_elements(): void + { + $response = $this->get('/tools/slug-generator'); + + $response->assertStatus(200); + $response->assertSee('Input Text'); + $response->assertSee('Generated Slug'); + $response->assertSee('Separator'); + $response->assertSee('Hyphen'); + } + + public function test_color_picker_page_loads(): void + { + $response = $this->get('/tools/color-picker'); + + $response->assertStatus(200); + $response->assertSee('Color Picker'); + $response->assertSee('Convert between HEX, RGB, HSL, and CMYK'); + } + + public function test_color_picker_has_required_elements(): void + { + $response = $this->get('/tools/color-picker'); + + $response->assertStatus(200); + $response->assertSee('HEX'); + $response->assertSee('RGB'); + $response->assertSee('HSL'); + $response->assertSee('CMYK'); + $response->assertSee('Color Harmony'); + } + + public function test_qr_code_tool_page_loads(): void + { + $response = $this->get('/tools/qr-code'); + + $response->assertStatus(200); + $response->assertSee('QR Code Generator'); + $response->assertSee('Generate QR codes for URLs, text, and more'); + } + + public function test_qr_code_tool_has_required_elements(): void + { + $response = $this->get('/tools/qr-code'); + + $response->assertStatus(200); + $response->assertSee('Content'); + $response->assertSee('Quick Templates'); + $response->assertSee('Download PNG'); + $response->assertSee('Error Correction'); + } + + public function test_html_entity_tool_page_loads(): void + { + $response = $this->get('/tools/html-entity'); + + $response->assertStatus(200); + $response->assertSee('HTML Entity Encoder/Decoder'); + $response->assertSee('Encode special characters to HTML entities or decode them back to text'); + } + + public function test_html_entity_tool_has_required_elements(): void + { + $response = $this->get('/tools/html-entity'); + + $response->assertStatus(200); + $response->assertSee('Encode'); + $response->assertSee('Decode'); + $response->assertSee('Common HTML Entities'); + $response->assertSee('Entity Reference'); + } + + public function test_text_case_tool_page_loads(): void + { + $response = $this->get('/tools/text-case'); + + $response->assertStatus(200); + $response->assertSee('Text Case Converter'); + $response->assertSee('Convert text between different case formats'); + } + + public function test_text_case_tool_has_required_elements(): void + { + $response = $this->get('/tools/text-case'); + + $response->assertStatus(200); + $response->assertSee('Input Text'); + $response->assertSee('Convert To'); + $response->assertSee('camelCase'); + $response->assertSee('snake_case'); + } + + public function test_password_tool_page_loads(): void + { + $response = $this->get('/tools/password'); + + $response->assertStatus(200); + $response->assertSee('Password Generator'); + $response->assertSee('Generate secure random passwords'); + } + + public function test_password_tool_has_required_elements(): void + { + $response = $this->get('/tools/password'); + + $response->assertStatus(200); + $response->assertSee('Generated Password'); + $response->assertSee('Strength'); + $response->assertSee('Options'); + $response->assertSee('Quick Presets'); + } + + public function test_lorem_tool_page_loads(): void + { + $response = $this->get('/tools/lorem'); + + $response->assertStatus(200); + $response->assertSee('Lorem Ipsum Generator'); + $response->assertSee('Generate placeholder text'); + } + + public function test_lorem_tool_has_required_elements(): void + { + $response = $this->get('/tools/lorem'); + + $response->assertStatus(200); + $response->assertSee('Paragraphs'); + $response->assertSee('Sentences'); + $response->assertSee('Words'); + $response->assertSee('Generate'); + } + + public function test_cron_tool_page_loads(): void + { + $response = $this->get('/tools/cron'); + + $response->assertStatus(200); + $response->assertSee('Cron Expression Parser'); + $response->assertSee('Parse and explain cron expressions'); + } + + public function test_cron_tool_has_required_elements(): void + { + $response = $this->get('/tools/cron'); + + $response->assertStatus(200); + $response->assertSee('Cron Expression'); + $response->assertSee('Common Patterns'); + $response->assertSee('Syntax Reference'); + $response->assertSee('Next Run Times'); + } + public function test_all_pages_have_navigation(): void { - $pages = ['/', '/tools/csv', '/tools/yaml', '/tools/markdown', '/tools/sql', '/tools/base64', '/tools/uuid', '/tools/hash', '/tools/url', '/tools/code-editor', '/tools/regex']; + $pages = ['/', '/tools/csv', '/tools/yaml', '/tools/markdown', '/tools/sql', '/tools/base64', '/tools/uuid', '/tools/hash', '/tools/url', '/tools/code-editor', '/tools/regex', '/tools/base-converter', '/tools/slug-generator', '/tools/color-picker', '/tools/qr-code', '/tools/html-entity', '/tools/text-case', '/tools/password', '/tools/lorem', '/tools/cron']; foreach ($pages as $page) { $response = $this->get($page); @@ -266,7 +472,7 @@ public function test_all_pages_have_navigation(): void public function test_all_pages_have_theme_toggle(): void { - $pages = ['/', '/tools/csv', '/tools/yaml', '/tools/markdown', '/tools/sql', '/tools/base64', '/tools/uuid', '/tools/hash', '/tools/url', '/tools/code-editor', '/tools/regex']; + $pages = ['/', '/tools/csv', '/tools/yaml', '/tools/markdown', '/tools/sql', '/tools/base64', '/tools/uuid', '/tools/hash', '/tools/url', '/tools/code-editor', '/tools/regex', '/tools/base-converter', '/tools/slug-generator', '/tools/color-picker', '/tools/qr-code', '/tools/html-entity', '/tools/text-case', '/tools/password', '/tools/lorem', '/tools/cron']; foreach ($pages as $page) { $response = $this->get($page); @@ -279,7 +485,7 @@ public function test_all_pages_have_theme_toggle(): void public function test_all_pages_load_vite_assets(): void { // Code editor uses standalone template without Vite - $pages = ['/', '/tools/csv', '/tools/yaml', '/tools/markdown', '/tools/sql', '/tools/base64', '/tools/uuid', '/tools/hash', '/tools/url', '/tools/regex']; + $pages = ['/', '/tools/csv', '/tools/yaml', '/tools/markdown', '/tools/sql', '/tools/base64', '/tools/uuid', '/tools/hash', '/tools/url', '/tools/regex', '/tools/base-converter', '/tools/slug-generator', '/tools/color-picker', '/tools/qr-code', '/tools/html-entity', '/tools/text-case', '/tools/password', '/tools/lorem', '/tools/cron']; foreach ($pages as $page) { $response = $this->get($page); @@ -292,7 +498,7 @@ public function test_all_pages_load_vite_assets(): void public function test_all_tool_pages_have_back_link(): void { // Code editor uses standalone template with home link instead of back - $toolPages = ['/tools/csv', '/tools/yaml', '/tools/markdown', '/tools/sql', '/tools/base64', '/tools/uuid', '/tools/hash', '/tools/url', '/tools/regex']; + $toolPages = ['/tools/csv', '/tools/yaml', '/tools/markdown', '/tools/sql', '/tools/base64', '/tools/uuid', '/tools/hash', '/tools/url', '/tools/regex', '/tools/base-converter', '/tools/slug-generator', '/tools/color-picker', '/tools/qr-code', '/tools/html-entity', '/tools/text-case', '/tools/password', '/tools/lorem', '/tools/cron']; foreach ($toolPages as $page) { $response = $this->get($page); @@ -345,7 +551,7 @@ public function test_api_routes_reject_get_requests(): void public function test_pages_have_csrf_token(): void { - $pages = ['/tools/csv', '/tools/yaml', '/tools/markdown', '/tools/sql', '/tools/base64', '/tools/uuid', '/tools/hash', '/tools/url', '/tools/code-editor']; + $pages = ['/tools/csv', '/tools/yaml', '/tools/markdown', '/tools/sql', '/tools/base64', '/tools/uuid', '/tools/hash', '/tools/url', '/tools/code-editor', '/tools/base-converter', '/tools/slug-generator', '/tools/color-picker', '/tools/qr-code', '/tools/html-entity', '/tools/text-case', '/tools/password', '/tools/lorem', '/tools/cron']; foreach ($pages as $page) { $response = $this->get($page);