diff --git a/tests/Feature/Initialize/InitializeTest.php b/tests/Feature/Initialize/InitializeTest.php index 033742ff..0f542382 100644 --- a/tests/Feature/Initialize/InitializeTest.php +++ b/tests/Feature/Initialize/InitializeTest.php @@ -3,27 +3,19 @@ namespace Tests\Feature\Initialize; use App\Activity; -use App\Console\Commands\NamiInitializeCommand; use App\Country; use App\Course\Models\Course; use App\Gender; use App\Group; -use App\Initialize\Actions\InitializeAction; use App\Initialize\InitializeJob; use App\Member\Member; use App\Nationality; -use App\Setting\GeneralSettings; -use App\Setting\NamiSettings; use App\Subactivity; use Illuminate\Foundation\Testing\DatabaseTransactions; -use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Http; -use Illuminate\Support\Facades\Queue; use Tests\TestCase; -use Zoomyboy\LaravelNami\Authentication\Auth; use Zoomyboy\LaravelNami\Backend\FakeBackend; use Zoomyboy\LaravelNami\Fakes\GroupFake; -use Zoomyboy\LaravelNami\Fakes\SearchFake; class InitializeTest extends TestCase { @@ -73,83 +65,6 @@ class InitializeTest extends TestCase ]); } - public function testItSetsSettingsBeforeRunningInitializer(): void - { - $this->withoutExceptionHandling()->login(); - InitializeAction::partialMock()->shouldReceive('handle')->with(12345, 'secret', 185)->once()->andReturn(true); - Auth::success(12345, 'secret'); - app(GroupFake::class)->fetches(null, [185 => ['name' => 'testgroup']]); - - $response = $this->post('/initialize', [ - 'group_id' => 185, - 'password' => 'secret', - 'mglnr' => 12345, - ]); - - $response->assertRedirect('/'); - $settings = app(NamiSettings::class); - $this->assertEquals(12345, $settings->mglnr); - $this->assertEquals('secret', $settings->password); - $this->assertEquals(185, $settings->default_group_id); - } - - public function testItValidatesSetupInfo(): void - { - $this->login(); - InitializeAction::partialMock()->shouldReceive('handle')->never(); - - $response = $this->post('/initialize', [ - 'group_id' => null, - 'password' => null, - 'mglnr' => null, - ]); - - $this->assertErrors(['password' => 'Passwort ist erforderlich.'], $response); - $this->assertErrors(['mglnr' => 'Mitgliedsnummer ist erforderlich.'], $response); - $this->assertErrors(['group_id' => 'Gruppierungsnr ist erforderlich.'], $response); - } - - public function testItValidatesLogin(): void - { - $this->login(); - Auth::fails(12345, 'secret'); - InitializeAction::partialMock()->shouldReceive('handle')->never(); - - $response = $this->post('/initialize', [ - 'group_id' => 12345, - 'password' => 'secret', - 'mglnr' => 100102, - ]); - - $this->assertErrors(['nami' => 'NaMi Login fehlgeschlagen.'], $response); - } - - public function testItValidatesGroupExistance(): void - { - $this->login(); - InitializeAction::partialMock()->shouldReceive('handle')->never(); - Auth::success(12345, 'secret'); - app(GroupFake::class)->fetches(null, []); - - $response = $this->post('/initialize', [ - 'group_id' => 185, - 'password' => 'secret', - 'mglnr' => 12345, - ]); - - $this->assertErrors(['nami' => 'Gruppierung nicht gefunden.'], $response); - } - - public function testItFiresJobWhenRunningInitializer(): void - { - Queue::fake(); - $this->withoutExceptionHandling()->login(); - - app(InitializeAction::class)->handle(12345, 'secret', 185); - - Queue::assertPushed(InitializeJob::class); - } - public function testItInitializesAll(): void { $this->withoutExceptionHandling()->login()->loginNami(); @@ -206,20 +121,6 @@ class InitializeTest extends TestCase Http::assertSentCount(17); } - public function testItInitializesFromCommandLine(): void - { - $this->withoutExceptionHandling()->loginNami(); - $this->initializeProvider(); - GeneralSettings::fake(['allowed_nami_accounts' => [123]]); - - Artisan::call(NamiInitializeCommand::class); - - $this->assertDatabaseHas('regions', [ - 'name' => 'nrw', - 'nami_id' => 304, - ]); - } - public function testSyncCoursesOfMember(): void { $this->withoutExceptionHandling()->login()->loginNami(); @@ -496,21 +397,6 @@ class InitializeTest extends TestCase $this->assertDatabaseCount('members', $num); } - public function testRenderErrorInConsoleWhenUsingArtisan(): void - { - $this->withoutExceptionHandling()->login()->loginNami(); - $this->initializeProvider(function ($backend) { - app(SearchFake::class)->fetchFails($page = 1, $start = 0, 'search error'); - }); - $this->login(); - - $command = $this->artisan(NamiInitializeCommand::class); - - $command->assertFailed(); - $command->expectsOutput('response: {"success":false,"message":"search error"}'); - $command->expectsOutput('Search failed'); - } - /** * @param array<string, mixed> $overwrites * diff --git a/tests/Feature/Initialize/RequestTest.php b/tests/Feature/Initialize/RequestTest.php new file mode 100644 index 00000000..daba6b00 --- /dev/null +++ b/tests/Feature/Initialize/RequestTest.php @@ -0,0 +1,104 @@ +<?php + +namespace Tests\Feature\Initialize; + +use App\Console\Commands\NamiInitializeCommand; +use App\Initialize\Actions\InitializeAction; +use App\Initialize\InitializeJob; +use App\Initialize\Initializer; +use App\Setting\NamiSettings; +use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Support\Facades\Artisan; +use Illuminate\Support\Facades\Queue; +use Tests\TestCase; +use Zoomyboy\LaravelNami\Authentication\Auth; +use Zoomyboy\LaravelNami\Fakes\GroupFake; + +class RequestTest extends TestCase +{ + use DatabaseTransactions; + + public function testItSetsSettingsBeforeRunningInitializer(): void + { + $this->withoutExceptionHandling()->login(); + InitializeAction::partialMock()->shouldReceive('handle')->with(12345, 'secret', 185)->once()->andReturn(true); + Auth::success(12345, 'secret'); + app(GroupFake::class)->fetches(null, [185 => ['name' => 'testgroup']]); + + $response = $this->post('/initialize', [ + 'group_id' => 185, + 'password' => 'secret', + 'mglnr' => 12345, + ]); + + $response->assertRedirect('/'); + $settings = app(NamiSettings::class); + $this->assertEquals(12345, $settings->mglnr); + $this->assertEquals('secret', $settings->password); + $this->assertEquals(185, $settings->default_group_id); + } + + public function testItValidatesSetupInfo(): void + { + $this->login(); + InitializeAction::partialMock()->shouldReceive('handle')->never(); + + $response = $this->post('/initialize', [ + 'group_id' => null, + 'password' => null, + 'mglnr' => null, + ]); + + $this->assertErrors(['password' => 'Passwort ist erforderlich.'], $response); + $this->assertErrors(['mglnr' => 'Mitgliedsnummer ist erforderlich.'], $response); + $this->assertErrors(['group_id' => 'Gruppierungsnr ist erforderlich.'], $response); + } + + public function testItValidatesLogin(): void + { + $this->login(); + Auth::fails(12345, 'secret'); + InitializeAction::partialMock()->shouldReceive('handle')->never(); + + $response = $this->post('/initialize', [ + 'group_id' => 12345, + 'password' => 'secret', + 'mglnr' => 100102, + ]); + + $this->assertErrors(['nami' => 'NaMi Login fehlgeschlagen.'], $response); + } + + public function testItValidatesGroupExistance(): void + { + $this->login(); + InitializeAction::partialMock()->shouldReceive('handle')->never(); + Auth::success(12345, 'secret'); + app(GroupFake::class)->fetches(null, []); + + $response = $this->post('/initialize', [ + 'group_id' => 185, + 'password' => 'secret', + 'mglnr' => 12345, + ]); + + $this->assertErrors(['nami' => 'Gruppierung nicht gefunden.'], $response); + } + + public function testItFiresJobWhenRunningInitializer(): void + { + Queue::fake(); + $this->withoutExceptionHandling()->login(); + + app(InitializeAction::class)->handle(12345, 'secret', 185); + + Queue::assertPushed(InitializeJob::class); + } + + public function testItInitializesFromCommandLine(): void + { + $this->stubIo(Initializer::class, fn ($mock) => $mock->shouldReceive('run')->once()); + + Artisan::call(NamiInitializeCommand::class); + } +} diff --git a/tests/TestCase.php b/tests/TestCase.php index 12850c94..889d9bfa 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -9,6 +9,8 @@ use App\User; use Illuminate\Foundation\Testing\TestCase as BaseTestCase; use Illuminate\Http\RedirectResponse; use Illuminate\Testing\TestResponse; +use Mockery as M; +use Mockery\MockInterface; use Tests\Lib\TestsInertia; use Zoomyboy\LaravelNami\Authentication\Auth; @@ -88,4 +90,19 @@ abstract class TestCase extends BaseTestCase return $this; } + + /** + * @param <class-string> $class + * @param callable(MockInterface $mock): void $mocker + */ + public function stubIo(string $class, callable $mocker): self + { + $mock = M::mock($class); + + $mocker($mock); + + app()->instance($class, $mock); + + return $this; + } }