. */ declare(strict_types=1); namespace Tests\Unit\Middleware; use FireflyIII\Http\Middleware\Sandstorm; use FireflyIII\Models\Role; use FireflyIII\Repositories\User\UserRepositoryInterface; use Route; use Symfony\Component\HttpFoundation\Response; use Tests\TestCase; /** * Class RangeTest */ class SandstormTest extends TestCase { /** * @covers \FireflyIII\Http\Middleware\Sandstorm::handle */ public function testMiddlewareAnonEmpty(): void { putenv('SANDSTORM=1'); $repository = $this->mock(UserRepositoryInterface::class); $repository->shouldReceive('count')->once()->andReturn(0); $response = $this->get('/_test/sandstorm'); $this->assertEquals(Response::HTTP_INTERNAL_SERVER_ERROR, $response->getStatusCode()); $response->assertSee('The first visit to a new Firefly III administration cannot be by a guest user.'); putenv('SANDSTORM=0'); } /** * @covers \FireflyIII\Http\Middleware\Sandstorm::handle */ public function testMiddlewareAnonLoggedIn(): void { putenv('SANDSTORM=1'); $this->be($this->user()); $response = $this->get('/_test/sandstorm'); $this->assertEquals(Response::HTTP_OK, $response->getStatusCode()); $response->assertSee('sandstorm-anon: true'); putenv('SANDSTORM=0'); } /** * @covers \FireflyIII\Http\Middleware\Sandstorm::handle */ public function testMiddlewareAnonUser(): void { putenv('SANDSTORM=1'); $repository = $this->mock(UserRepositoryInterface::class); $repository->shouldReceive('count')->twice()->andReturn(1); $repository->shouldReceive('hasRole')->andReturn(true); $response = $this->get('/_test/sandstorm'); $this->assertEquals(Response::HTTP_OK, $response->getStatusCode()); $response->assertSee('sandstorm-anon: true'); putenv('SANDSTORM=0'); } /** * @covers \FireflyIII\Http\Middleware\Sandstorm::handle */ public function testMiddlewareLoggedIn(): void { putenv('SANDSTORM=1'); $this->be($this->user()); $response = $this->get('/_test/sandstorm', ['X-Sandstorm-User-Id' => 'abcd']); $this->assertEquals(Response::HTTP_OK, $response->getStatusCode()); $response->assertSee('sandstorm-anon: false'); putenv('SANDSTORM=0'); } /** * @covers \FireflyIII\Http\Middleware\Sandstorm::handle */ public function testMiddlewareMultiUser(): void { putenv('SANDSTORM=1'); $repository = $this->mock(UserRepositoryInterface::class); $repository->shouldReceive('count')->once()->andReturn(2); $response = $this->get('/_test/sandstorm'); $this->assertEquals(Response::HTTP_INTERNAL_SERVER_ERROR, $response->getStatusCode()); $response->assertSee('Your Firefly III installation has more than one user, which is weird.'); putenv('SANDSTORM=0'); } /** * @covers \FireflyIII\Http\Middleware\Sandstorm::handle */ public function testMiddlewareNoUser(): void { putenv('SANDSTORM=1'); $repository = $this->mock(UserRepositoryInterface::class); $repository->shouldReceive('count')->twice()->andReturn(0); $repository->shouldReceive('store')->once()->andReturn($this->user()); $repository->shouldReceive('attachRole')->once()->andReturn(true); //$repository->shouldReceive('getRole')->once()->andReturn(new Role); $repository->shouldReceive('hasRole')->andReturn(false); $response = $this->get('/_test/sandstorm', ['X-Sandstorm-User-Id' => 'abcd']); $this->assertEquals(Response::HTTP_OK, $response->getStatusCode()); $response->assertSee('sandstorm-anon: false'); putenv('SANDSTORM=0'); } /** * @covers \FireflyIII\Http\Middleware\Sandstorm::handle */ public function testMiddlewareNotSandstorm(): void { $this->withoutExceptionHandling(); $response = $this->get('/_test/sandstorm'); $this->assertEquals(Response::HTTP_OK, $response->getStatusCode()); } /** * @covers \FireflyIII\Http\Middleware\Sandstorm::handle */ public function testMiddlewareOneUser(): void { putenv('SANDSTORM=1'); $repository = $this->mock(UserRepositoryInterface::class); $repository->shouldReceive('count')->twice()->andReturn(1); $repository->shouldReceive('first')->once()->andReturn($this->user()); $repository->shouldReceive('hasRole')->andReturn(true); $response = $this->get('/_test/sandstorm', ['X-Sandstorm-User-Id' => 'abcd']); $this->assertEquals(Response::HTTP_OK, $response->getStatusCode()); $response->assertSee('sandstorm-anon: false'); putenv('SANDSTORM=0'); } /** * Set up test */ protected function setUp(): void { parent::setUp(); Route::middleware(Sandstorm::class)->any( '/_test/sandstorm', function () { return view('test.test'); } ); } }