diff --git a/tests/Feature/ExampleTest.php b/tests/Feature/ExampleTest.php deleted file mode 100644 index 78ccc21..0000000 --- a/tests/Feature/ExampleTest.php +++ /dev/null @@ -1,21 +0,0 @@ -get('/'); - - $response->assertStatus(200); - } -} diff --git a/tests/Feature/HomeTest.php b/tests/Feature/HomeTest.php new file mode 100644 index 0000000..6431399 --- /dev/null +++ b/tests/Feature/HomeTest.php @@ -0,0 +1,56 @@ +get('/') + ->assertOk() + ->assertInertia(fn ($page) => + $page->component('Home') + ->where('screen', 1) + ); + } + + #[Test] + public function screen_two_renders_with_json_param(): void + { + Http::fake([ + 'example.test/feed' => Http::response( + json_decode(file_get_contents(base_path('tests/Fixtures/meetings.json')), true), + 200 + ), + ]); + + $this->get('/?json=https://example.test/feed') + ->assertOk() + ->assertInertia(fn ($page) => + $page->component('Home') + ->where('screen', 2) + ->has('availableRegions') + ); + } + + #[Test] + public function screen_one_with_error_when_json_fetch_fails(): void + { + Http::fake([ + 'broken.test/feed' => Http::response(null, 500), + ]); + + $this->get('/?json=https://broken.test/feed') + ->assertOk() + ->assertInertia(fn ($page) => + $page->component('Home') + ->where('screen', 1) + ->has('error') + ); + } +} diff --git a/tests/Feature/PdfTest.php b/tests/Feature/PdfTest.php new file mode 100644 index 0000000..ffe3872 --- /dev/null +++ b/tests/Feature/PdfTest.php @@ -0,0 +1,84 @@ + Http::response( + json_decode(file_get_contents(base_path('tests/Fixtures/meetings.json')), true), + 200 + ), + ]); + } + + #[Test] + public function default_pdf_generation_returns_a_pdf(): void + { + $response = $this->get('/pdf?json=https://example.test/feed'); + + $response->assertOk(); + $this->assertSame('application/pdf', $response->headers->get('Content-Type')); + $this->assertStringStartsWith('%PDF-', $response->getContent()); + } + + #[Test] + #[DataProvider('groupingStrategies')] + public function pdf_generates_for_each_grouping_strategy(string $strategy): void + { + $response = $this->get('/pdf?json=https://example.test/feed&group_by=' . $strategy); + + $response->assertOk(); + $this->assertSame('application/pdf', $response->headers->get('Content-Type')); + } + + public static function groupingStrategies(): array + { + return [ + 'day-region' => ['day-region'], + 'region-day' => ['region-day'], + 'day' => ['day'], + ]; + } + + #[Test] + public function pdf_generates_with_cjk_language(): void + { + $response = $this->get('/pdf?json=https://example.test/feed&language=ja'); + + $response->assertOk(); + $this->assertSame('application/pdf', $response->headers->get('Content-Type')); + } + + #[Test] + public function pdf_generates_from_google_sheets_url(): void + { + Http::fake([ + 'sheets.googleapis.com/*' => Http::response([ + 'values' => [ + ['slug', 'name', 'day', 'time', 'types', 'address'], + ['sheets-sun', 'Sunday Sheets Meeting', 'Sunday', '10:00', 'open, discussion', '100 Peachtree St, Atlanta, GA'], + ['sheets-mon', 'Monday Sheets Meeting', 'Monday', '19:30', 'closed, men', '200 Peachtree St, Atlanta, GA'], + ['sheets-wed', 'Wednesday Sheets Meeting', 'Wednesday', '07:00', 'open, big book', '300 Peachtree St, Atlanta, GA'], + ['sheets-sat', 'Saturday Sheets Meeting', 'Saturday', '12:00', 'open, beginners', '400 Peachtree St, Atlanta, GA'], + ], + ], 200), + ]); + + $userFacingUrl = 'https://docs.google.com/spreadsheets/d/12Ga8uwMG4WJ8pZ_SEU7vNETp_aQZ-2yNVsYDFqIwHyE/edit?gid=0#gid=0'; + + $response = $this->get('/pdf?json=' . urlencode($userFacingUrl)); + + $response->assertOk(); + $this->assertSame('application/pdf', $response->headers->get('Content-Type')); + } +} diff --git a/tests/Feature/SmokeTest.php b/tests/Feature/SmokeTest.php new file mode 100644 index 0000000..c39836c --- /dev/null +++ b/tests/Feature/SmokeTest.php @@ -0,0 +1,21 @@ +artisan('about')->assertSuccessful(); + } + + #[Test] + public function package_discover_succeeds(): void + { + $this->artisan('package:discover')->assertSuccessful(); + } +} diff --git a/tests/Fixtures/meetings.json b/tests/Fixtures/meetings.json new file mode 100644 index 0000000..30043ba --- /dev/null +++ b/tests/Fixtures/meetings.json @@ -0,0 +1,231 @@ +[ + { + "slug": "sunday-serenity", + "name": "Sunday Serenity", + "day": 0, + "time": "09:00", + "address": "100 Main St, Tupelo, MS", + "regions": ["Mississippi", "North", "Tupelo"], + "types": ["O", "D"] + }, + { + "slug": "evening-reflection", + "name": "Evening Reflection", + "day": 0, + "time": "19:00", + "address": "200 University Ave, Oxford, MS", + "regions": ["Mississippi", "North", "Oxford"], + "types": ["O", "B"] + }, + { + "slug": "beginners-sun", + "name": "Beginners Sunday", + "day": 0, + "time": "11:00", + "address": "303 Bourbon St", + "city": "New Orleans", + "state": "LA", + "types": ["O", "BE"] + }, + { + "slug": "morning-meditation", + "name": "Morning Meditation", + "day": 1, + "time": "07:00", + "address": "400 Capitol St, Jackson, MS", + "regions": ["Mississippi", "South", "Jackson"], + "types": ["O", "M"] + }, + { + "slug": "lunch-bunch", + "name": "Lunch Bunch", + "day": 1, + "time": "12:00", + "address": "500 Beach Blvd, Gulfport, MS", + "regions": ["Mississippi", "South", "Gulfport"], + "types": ["O", "D"] + }, + { + "slug": "online-mondays", + "name": "Online Mondays", + "day": 1, + "time": "20:00", + "address": "Online", + "city": "Memphis", + "state": "TN", + "types": ["O", "ONL"] + }, + { + "slug": "tuesday-steps", + "name": "Tuesday Steps", + "day": 2, + "time": "18:00", + "address": "401 Capitol St, Jackson, MS", + "regions": ["Mississippi", "South", "Jackson"], + "types": ["O", "ST"] + }, + { + "slug": "asa-no-tsudoi", + "name": "朝の集い", + "day": 2, + "time": "20:00", + "address": "150 Beale St", + "city": "Memphis", + "state": "TN", + "types": ["O", "D"] + }, + { + "slug": "early-bird-wed", + "name": "Early Bird Wednesday", + "day": 3, + "time": "06:30", + "address": "101 Main St, Tupelo, MS", + "regions": ["Mississippi", "North", "Tupelo"], + "types": ["O", "BE"] + }, + { + "slug": "womens-wed", + "name": "Women's Wednesday", + "day": 3, + "time": "19:30", + "address": "201 University Ave, Oxford, MS", + "regions": ["Mississippi", "North", "Oxford"], + "types": ["C", "W"] + }, + { + "slug": "wednesday-discussion", + "name": "Wednesday Discussion", + "day": 3, + "time": "12:00", + "address": "501 Beach Blvd, Gulfport, MS", + "regions": ["Mississippi", "South", "Gulfport"], + "types": ["O", "D"] + }, + { + "slug": "thursday-thinkers", + "name": "Thursday Thinkers", + "day": 4, + "time": "07:00", + "address": "402 Capitol St, Jackson, MS", + "regions": ["Mississippi", "South", "Jackson"], + "types": ["O", "D"] + }, + { + "slug": "bigbook-thu", + "name": "Big Book Thursday", + "day": 4, + "time": "18:30", + "address": "502 Beach Blvd, Gulfport, MS", + "regions": ["Mississippi", "South", "Gulfport"], + "types": ["O", "B"] + }, + { + "slug": "thursday-closed", + "name": "Thursday Closed Group", + "day": 4, + "time": "20:00", + "address": "202 University Ave, Oxford, MS", + "regions": ["Mississippi", "North", "Oxford"], + "types": ["C", "D"] + }, + { + "slug": "friday-noon", + "name": "Friday Noon Group", + "day": 5, + "time": "12:00", + "address": "102 Main St, Tupelo, MS", + "regions": ["Mississippi", "North", "Tupelo"], + "types": ["O", "D"] + }, + { + "slug": "closed-fri", + "name": "Closed Friday Discussion", + "day": 5, + "time": "20:00", + "address": "203 University Ave, Oxford, MS", + "regions": ["Mississippi", "North", "Oxford"], + "types": ["C", "D"] + }, + { + "slug": "friday-mens", + "name": "Friday Men's Group", + "day": 5, + "time": "18:00", + "address": "403 Capitol St, Jackson, MS", + "regions": ["Mississippi", "South", "Jackson"], + "types": ["O", "M"] + }, + { + "slug": "sat-sunrise", + "name": "Saturday Sunrise", + "day": 6, + "time": "07:00", + "address": "404 Capitol St, Jackson, MS", + "regions": ["Mississippi", "South", "Jackson"], + "types": ["O", "M"] + }, + { + "slug": "sat-womens", + "name": "Saturday Women's Meeting", + "day": 6, + "time": "10:00", + "address": "204 University Ave, Oxford, MS", + "regions": ["Mississippi", "North", "Oxford"], + "types": ["C", "W"] + }, + { + "slug": "sat-steps", + "name": "Saturday Step Study", + "day": 6, + "time": "19:00", + "address": "103 Main St, Tupelo, MS", + "regions": ["Mississippi", "North", "Tupelo"], + "types": ["O", "ST"] + }, + { + "slug": "closed-renovation", + "name": "Closed for Renovation", + "day": 6, + "time": "11:00", + "address": "503 Beach Blvd, Gulfport, MS", + "regions": ["Mississippi", "South", "Gulfport"], + "types": ["TC"] + }, + { + "slug": "suspended-sat", + "name": "Suspended Saturday", + "day": 6, + "time": "20:00", + "address": "104 Main St, Tupelo, MS", + "regions": ["Mississippi", "North", "Tupelo"], + "types": ["TC", "D"] + }, + { + "slug": "sunday-bigbook", + "name": "Sunday Big Book", + "day": 0, + "time": "17:00", + "address": "405 Capitol St, Jackson, MS", + "regions": ["Mississippi", "South", "Jackson"], + "types": ["O", "B"] + }, + { + "slug": "tuesday-beginners", + "name": "Tuesday Beginners", + "day": 2, + "time": "19:00", + "address": "504 Beach Blvd, Gulfport, MS", + "regions": ["Mississippi", "South", "Gulfport"], + "types": ["O", "BE"] + }, + { + "slug": "wednesday-online", + "name": "Wednesday Online Meeting", + "day": 3, + "time": "20:30", + "address": "Online", + "city": "New Orleans", + "state": "LA", + "types": ["O", "ONL"] + } +] diff --git a/tests/Unit/ExampleTest.php b/tests/Unit/ExampleTest.php deleted file mode 100644 index e5c5fef..0000000 --- a/tests/Unit/ExampleTest.php +++ /dev/null @@ -1,18 +0,0 @@ -assertTrue(true); - } -}