diff --git a/framework/core/src/Foundation/InstalledApp.php b/framework/core/src/Foundation/InstalledApp.php index 94d8d570f..39478d96e 100644 --- a/framework/core/src/Foundation/InstalledApp.php +++ b/framework/core/src/Foundation/InstalledApp.php @@ -42,6 +42,11 @@ class InstalledApp implements AppInterface $this->config = $config; } + public function getContainer() + { + return $this->container; + } + /** * @return \Psr\Http\Server\RequestHandlerInterface */ diff --git a/framework/core/src/Foundation/InstalledSite.php b/framework/core/src/Foundation/InstalledSite.php index bf1de46c5..88abddbd6 100644 --- a/framework/core/src/Foundation/InstalledSite.php +++ b/framework/core/src/Foundation/InstalledSite.php @@ -72,7 +72,7 @@ class InstalledSite implements SiteInterface /** * Create and boot a Flarum application instance. * - * @return AppInterface + * @return InstalledApp */ public function bootApp(): AppInterface { diff --git a/framework/core/tests/integration/CreatesForum.php b/framework/core/tests/integration/CreatesForum.php deleted file mode 100644 index 9d2838057..000000000 --- a/framework/core/tests/integration/CreatesForum.php +++ /dev/null @@ -1,141 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Flarum\Tests\integration; - -use Flarum\Database\DatabaseMigrationRepository; -use Flarum\Database\Migrator; -use Flarum\Foundation\Application; -use Flarum\Foundation\InstalledSite; -use Flarum\Foundation\SiteInterface; -use Flarum\Foundation\UninstalledSite; -use Flarum\Http\Server; -use Flarum\Install\Console\DataProviderInterface; -use Flarum\Install\DatabaseConfig; -use Illuminate\Database\ConnectionInterface; -use Illuminate\Database\Connectors\MySqlConnector; -use Illuminate\Database\MySqlConnection; -use Illuminate\Filesystem\Filesystem; - -trait CreatesForum -{ - /** - * @var Server - */ - protected $http; - - /** - * @var SiteInterface - */ - protected $site; - - /** - * @var Application - */ - protected $app; - - /** - * @var DataProviderInterface - */ - protected $configuration; - - /** - * Make the test set up Flarum as an installed app. - * - * @var bool - */ - protected $isInstalled = true; - - protected function createsSite() - { - $paths = [ - 'base' => __DIR__.'/tmp', - 'public' => __DIR__.'/tmp/public', - 'storage' => __DIR__.'/tmp/storage', - ]; - - if ($this->isInstalled) { - $this->site = new InstalledSite($paths, $this->getFlarumConfig()); - } else { - $this->site = new UninstalledSite($paths); - } - } - - protected function createsHttpForum() - { - $this->app = $this->site->bootApp(); - } - - protected function getDatabaseConfiguration(): DatabaseConfig - { - return new DatabaseConfig( - 'mysql', - env('DB_HOST', 'localhost'), - 3306, - env('DB_DATABASE', 'flarum'), - env('DB_USERNAME', 'root'), - env('DB_PASSWORD', ''), - env('DB_PREFIX', '') - ); - } - - protected function refreshApplication() - { - $this->seedsDatabase(); - - $this->createsSite(); - - $this->createsHttpForum(); - } - - protected function teardownApplication() - { - /** @var ConnectionInterface $connection */ - $connection = app(ConnectionInterface::class); - $connection->rollBack(); - } - - protected function getFlarumConfig() - { - return [ - 'debug' => true, - 'database' => $this->getDatabaseConfiguration()->toArray(), - 'url' => 'http://flarum.local', - 'paths' => [ - 'api' => 'api', - 'admin' => 'admin', - ], - ]; - } - - protected function seedsDatabase() - { - if (! $this->isInstalled) { - return; - } - - $dbConfig = $this->getDatabaseConfiguration()->toArray(); - - $pdo = (new MySqlConnector)->connect($dbConfig); - $db = new MySqlConnection($pdo, $dbConfig['database'], $dbConfig['prefix'], $dbConfig); - - $repository = new DatabaseMigrationRepository($db, 'migrations'); - $migrator = new Migrator($repository, $db, new Filesystem); - - if (! $migrator->getRepository()->repositoryExists()) { - $migrator->getRepository()->createRepository(); - } - - $migrator->run(__DIR__.'/../../../migrations'); - - $db->beginTransaction(); - } -} diff --git a/framework/core/tests/integration/MakesApiRequests.php b/framework/core/tests/integration/MakesApiRequests.php deleted file mode 100644 index 7bbfc2ee3..000000000 --- a/framework/core/tests/integration/MakesApiRequests.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Flarum\Tests\integration; - -use Flarum\Api\Client; -use Flarum\User\Guest; -use Flarum\User\User; -use Psr\Http\Message\ResponseInterface; - -trait MakesApiRequests -{ - public function call(string $controller, User $actor = null, array $queryParams = [], array $body = []): ResponseInterface - { - /** @var Client $api */ - $api = app(Client::class); - - $api->setErrorHandler(null); - - return $api->send($controller, $actor ?? new Guest, $queryParams, $body); - } -} diff --git a/framework/core/tests/integration/ManagesContent.php b/framework/core/tests/integration/ManagesContent.php deleted file mode 100644 index 2be3562ae..000000000 --- a/framework/core/tests/integration/ManagesContent.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Flarum\Tests\integration; - -use Flarum\Post\CommentPost; -use Flarum\Post\Event\Posted; - -trait ManagesContent -{ - use RetrievesAuthorizedUsers; - - protected function addPostByNormalUser(): CommentPost - { - $actor = $this->getNormalUser(); - - $post = CommentPost::reply( - $this->discussion->id, - 'a normal reply - too-obscure', - $actor->id, - '127.0.0.1' - ); - - $post->save(); - - if (! $this->discussion->firstPost) { - $this->discussion->setFirstPost($post); - $this->discussion->setLastPost($post); - - $this->discussion->save(); - - event(new Posted($post, $actor)); - } - - return $post; - } -} diff --git a/framework/core/tests/integration/RetrievesAuthorizedUsers.php b/framework/core/tests/integration/RetrievesAuthorizedUsers.php index 31b685a9a..135ef7bec 100644 --- a/framework/core/tests/integration/RetrievesAuthorizedUsers.php +++ b/framework/core/tests/integration/RetrievesAuthorizedUsers.php @@ -11,27 +11,60 @@ namespace Flarum\Tests\integration; -use Flarum\User\User; - trait RetrievesAuthorizedUsers { - protected $userAttributes = [ - 'username' => 'normal', - 'password' => 'too-obscure', - 'email' => 'normal@machine.local' - ]; - - public function getAdminUser(): User + protected function adminGroup(): array { - return User::find(1); + return [ + 'id' => 1, + 'name_singular' => 'Admin', + 'name_plural' => 'Admins', + 'color' => '#B72A2A', + 'icon' => 'fas fa-wrench', + ]; } - public function getNormalUser(): User + protected function guestGroup(): array { - return User::unguarded(function () { - return User::firstOrCreate([ - 'username' => $this->userAttributes['username'] - ], $this->userAttributes); - }); + return [ + 'id' => 2, + 'name_singular' => 'Guest', + 'name_plural' => 'Guests', + 'color' => null, + 'icon' => null, + ]; + } + + protected function memberGroup(): array + { + return [ + 'id' => 3, + 'name_singular' => 'Member', + 'name_plural' => 'Members', + 'color' => null, + 'icon' => null, + ]; + } + + protected function adminUser(): array + { + return [ + 'id' => 1, + 'username' => 'admin', + 'password' => '$2y$10$HMOAe.XaQjOimA778VmFue1OCt7tj5j0wk5vfoL/CMSJq2BQlfBV2', // BCrypt hash for "password" + 'email' => 'admin@machine.local', + 'is_email_confirmed' => 1, + ]; + } + + protected function normalUser(): array + { + return [ + 'id' => 2, + 'username' => 'normal', + 'password' => '$2y$10$LO59tiT7uggl6Oe23o/O6.utnF6ipngYjvMvaxo1TciKqBttDNKim', // BCrypt hash for "too-obscure" + 'email' => 'normal@machine.local', + 'is_email_confirmed' => 1, + ]; } } diff --git a/framework/core/tests/integration/TestCase.php b/framework/core/tests/integration/TestCase.php index b313f533e..9d199564e 100644 --- a/framework/core/tests/integration/TestCase.php +++ b/framework/core/tests/integration/TestCase.php @@ -11,21 +11,71 @@ namespace Flarum\Tests\integration; -use PHPUnit\Framework\TestCase as Test; +use Flarum\Foundation\InstalledSite; +use Illuminate\Database\ConnectionInterface; -abstract class TestCase extends Test +abstract class TestCase extends \PHPUnit\Framework\TestCase { - use CreatesForum, - MakesApiRequests; - public function setUp() { - $this->refreshApplication(); - $this->init(); + parent::setUp(); + + // Boot the Flarum app + $this->app(); } - protected function init() + protected $app; + + /** + * @return \Flarum\Foundation\InstalledApp + */ + protected function app() { - // .. allows implementation by children without the need to call the parent. + if (! is_null($this->app)) { + return $this->app; + } + + $site = new InstalledSite( + [ + 'base' => __DIR__.'/tmp', + 'public' => __DIR__.'/tmp/public', + 'storage' => __DIR__.'/tmp/storage', + ], + include __DIR__.'/tmp/config.php' + ); + + return $this->app = $site->bootApp(); + } + + protected $database; + + protected function database(): ConnectionInterface + { + if (is_null($this->database)) { + $this->database = $this->app()->getContainer()->make( + ConnectionInterface::class + ); + } + + return $this->database; + } + + protected function prepareDatabase(array $tableData) + { + // We temporarily disable foreign key checks to simplify this process. + $this->database()->getSchemaBuilder()->disableForeignKeyConstraints(); + + // First, truncate all referenced tables so that they are empty. + foreach (array_keys($tableData) as $table) { + $this->database()->table($table)->truncate(); + } + + // Then, insert all rows required for this test case. + foreach ($tableData as $table => $rows) { + $this->database()->table($table)->insert($rows); + } + + // And finally, turn on foreign key checks again. + $this->database()->getSchemaBuilder()->enableForeignKeyConstraints(); } } diff --git a/framework/core/tests/integration/api/Auth/AuthenticateWithApiKeyTest.php b/framework/core/tests/integration/api/Auth/AuthenticateWithApiKeyTest.php index a2463b58c..9614ba888 100644 --- a/framework/core/tests/integration/api/Auth/AuthenticateWithApiKeyTest.php +++ b/framework/core/tests/integration/api/Auth/AuthenticateWithApiKeyTest.php @@ -13,9 +13,12 @@ namespace Flarum\Tests\integration\api\Auth; use Carbon\Carbon; use Flarum\Api\ApiKey; +use Flarum\Api\Client; use Flarum\Api\Controller\CreateGroupController; use Flarum\Tests\integration\RetrievesAuthorizedUsers; use Flarum\Tests\integration\TestCase; +use Flarum\User\Guest; +use Flarum\User\User; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; @@ -28,6 +31,18 @@ class AuthenticateWithApiKeyTest extends TestCase { use RetrievesAuthorizedUsers; + public function setUp() + { + parent::setUp(); + + $this->prepareDatabase([ + 'users' => [ + $this->adminUser(), + $this->normalUser(), + ], + ]); + } + protected function key(int $user_id = null): ApiKey { return ApiKey::unguarded(function () use ($user_id) { @@ -45,9 +60,11 @@ class AuthenticateWithApiKeyTest extends TestCase */ public function cannot_authorize_without_key() { - $this->call( - CreateGroupController::class - ); + /** @var Client $api */ + $api = $this->app()->getContainer()->make(Client::class); + $api->setErrorHandler(null); + + $api->send(CreateGroupController::class, new Guest); } /** @@ -79,7 +96,7 @@ class AuthenticateWithApiKeyTest extends TestCase */ public function personal_api_token_cannot_authenticate_as_anyone() { - $user = $this->getNormalUser(); + $user = User::find(2); $key = $this->key($user->id); @@ -105,7 +122,7 @@ class AuthenticateWithApiKeyTest extends TestCase */ public function personal_api_token_authenticates_user() { - $user = $this->getNormalUser(); + $user = User::find(2); $key = $this->key($user->id); diff --git a/framework/core/tests/integration/api/Controller/ApiControllerTestCase.php b/framework/core/tests/integration/api/Controller/ApiControllerTestCase.php index d00446db1..4f0b1296f 100644 --- a/framework/core/tests/integration/api/Controller/ApiControllerTestCase.php +++ b/framework/core/tests/integration/api/Controller/ApiControllerTestCase.php @@ -11,8 +11,10 @@ namespace Flarum\Tests\integration\api\Controller; +use Flarum\Api\Client; use Flarum\Tests\integration\RetrievesAuthorizedUsers; use Flarum\Tests\integration\TestCase; +use Flarum\User\Guest; use Flarum\User\User; use Illuminate\Support\Arr; use Psr\Http\Message\ResponseInterface; @@ -46,9 +48,13 @@ abstract class ApiControllerTestCase extends TestCase ); } - protected function tearDown() + public function call(string $controller, User $actor = null, array $queryParams = [], array $body = []): ResponseInterface { - $this->actor = null; - parent::tearDown(); + /** @var Client $api */ + $api = $this->app()->getContainer()->make(Client::class); + + $api->setErrorHandler(null); + + return $api->send($controller, $actor ?? new Guest, $queryParams, $body); } } diff --git a/framework/core/tests/integration/api/Controller/CreateDiscussionControllerTest.php b/framework/core/tests/integration/api/Controller/CreateDiscussionControllerTest.php index af658a801..23580f85b 100644 --- a/framework/core/tests/integration/api/Controller/CreateDiscussionControllerTest.php +++ b/framework/core/tests/integration/api/Controller/CreateDiscussionControllerTest.php @@ -13,7 +13,7 @@ namespace Flarum\Tests\integration\api\Controller; use Flarum\Api\Controller\CreateDiscussionController; use Flarum\Discussion\Discussion; -use Flarum\Post\Post; +use Flarum\User\User; use Illuminate\Support\Arr; class CreateDiscussionControllerTest extends ApiControllerTestCase @@ -25,12 +25,31 @@ class CreateDiscussionControllerTest extends ApiControllerTestCase 'content' => 'predetermined content for automated testing - too-obscure' ]; + public function setUp() + { + parent::setUp(); + + $this->prepareDatabase([ + 'discussions' => [], + 'posts' => [], + 'users' => [ + $this->adminUser(), + ], + 'groups' => [ + $this->adminGroup(), + ], + 'group_user' => [ + ['user_id' => 1, 'group_id' => 1], + ], + ]); + } + /** * @test */ public function can_create_discussion() { - $this->actor = $this->getAdminUser(); + $this->actor = User::find(1); $response = $this->callWith($this->data); @@ -51,7 +70,7 @@ class CreateDiscussionControllerTest extends ApiControllerTestCase */ public function cannot_create_discussion_without_content() { - $this->actor = $this->getAdminUser(); + $this->actor = User::find(1); $data = Arr::except($this->data, 'content'); @@ -65,18 +84,10 @@ class CreateDiscussionControllerTest extends ApiControllerTestCase */ public function cannot_create_discussion_without_title() { - $this->actor = $this->getAdminUser(); + $this->actor = User::find(1); $data = Arr::except($this->data, 'title'); $this->callWith($data); } - - public function tearDown() - { - Discussion::where('title', $this->data['title'])->delete(); - // Prevent floodgate from kicking in. - Post::where('user_id', $this->getAdminUser()->id)->delete(); - parent::tearDown(); - } } diff --git a/framework/core/tests/integration/api/Controller/CreateGroupControllerTest.php b/framework/core/tests/integration/api/Controller/CreateGroupControllerTest.php index 402950480..8a52f63f7 100644 --- a/framework/core/tests/integration/api/Controller/CreateGroupControllerTest.php +++ b/framework/core/tests/integration/api/Controller/CreateGroupControllerTest.php @@ -13,6 +13,7 @@ namespace Flarum\Tests\integration\api\Controller; use Flarum\Api\Controller\CreateGroupController; use Flarum\Group\Group; +use Flarum\User\User; use Illuminate\Support\Str; class CreateGroupControllerTest extends ApiControllerTestCase @@ -26,6 +27,24 @@ class CreateGroupControllerTest extends ApiControllerTestCase 'color' => null ]; + public function setUp() + { + parent::setUp(); + + $this->prepareDatabase([ + 'users' => [ + $this->adminUser(), + $this->normalUser(), + ], + 'groups' => [ + $this->adminGroup(), + ], + 'group_user' => [ + ['user_id' => 1, 'group_id' => 1], + ], + ]); + } + /** * @test * @expectedException \Illuminate\Validation\ValidationException @@ -33,7 +52,7 @@ class CreateGroupControllerTest extends ApiControllerTestCase */ public function admin_cannot_create_group_without_data() { - $this->actor = $this->getAdminUser(); + $this->actor = User::find(1); $this->callWith(); } @@ -43,7 +62,7 @@ class CreateGroupControllerTest extends ApiControllerTestCase */ public function admin_can_create_group() { - $this->actor = $this->getAdminUser(); + $this->actor = User::find(1); $response = $this->callWith($this->data); @@ -65,14 +84,8 @@ class CreateGroupControllerTest extends ApiControllerTestCase */ public function unauthorized_user_cannot_create_group() { - $this->actor = $this->getNormalUser(); + $this->actor = User::find(2); $this->callWith($this->data); } - - public function tearDown() - { - Group::where('icon', $this->data['icon'])->delete(); - parent::tearDown(); - } } diff --git a/framework/core/tests/integration/api/Controller/CreatePostControllerTest.php b/framework/core/tests/integration/api/Controller/CreatePostControllerTest.php index 541d8a1ce..286c7afec 100644 --- a/framework/core/tests/integration/api/Controller/CreatePostControllerTest.php +++ b/framework/core/tests/integration/api/Controller/CreatePostControllerTest.php @@ -11,8 +11,9 @@ namespace Flarum\Tests\integration\api\Controller; +use Carbon\Carbon; use Flarum\Api\Controller\CreatePostController; -use Flarum\Discussion\Discussion; +use Flarum\User\User; use Illuminate\Support\Arr; class CreatePostControllerTest extends ApiControllerTestCase @@ -23,17 +24,28 @@ class CreatePostControllerTest extends ApiControllerTestCase 'content' => 'reply with predetermined content for automated testing - too-obscure' ]; - /** - * @var Discussion - */ - protected $discussion; - - protected function init() + public function setUp() { - $this->actor = $this->getNormalUser(); - $this->discussion = Discussion::start(__CLASS__, $this->actor); + parent::setUp(); - $this->discussion->save(); + $this->prepareDatabase([ + 'discussions' => [ + ['id' => 1, 'title' => __CLASS__, 'created_at' => Carbon::now()->toDateTimeString(), 'user_id' => 2], + ], + 'posts' => [], + 'users' => [ + $this->normalUser(), + ], + 'groups' => [ + $this->memberGroup(), + ], + 'group_user' => [ + ['user_id' => 2, 'group_id' => 3], + ], + 'group_permission' => [ + ['permission' => 'viewDiscussions', 'group_id' => 3], + ] + ]); } /** @@ -41,9 +53,11 @@ class CreatePostControllerTest extends ApiControllerTestCase */ public function can_create_reply() { + $this->actor = User::find(2); + $body = []; Arr::set($body, 'data.attributes', $this->data); - Arr::set($body, 'data.relationships.discussion.data.id', $this->discussion->id); + Arr::set($body, 'data.relationships.discussion.data.id', 1); $response = $this->callWith($body); diff --git a/framework/core/tests/integration/api/Controller/CreateTokenControllerTest.php b/framework/core/tests/integration/api/Controller/CreateTokenControllerTest.php index eb6e6beb7..0d86d63c1 100644 --- a/framework/core/tests/integration/api/Controller/CreateTokenControllerTest.php +++ b/framework/core/tests/integration/api/Controller/CreateTokenControllerTest.php @@ -18,24 +18,33 @@ class CreateTokenControllerTest extends ApiControllerTestCase { protected $controller = CreateTokenController::class; + public function setUp() + { + parent::setUp(); + + $this->prepareDatabase([ + 'users' => [ + $this->normalUser(), + ], + ]); + } + /** * @test */ public function user_generates_token() { - $user = $this->getNormalUser(); - $response = $this->call($this->controller, null, [], [ - 'identification' => $user->username, - 'password' => $this->userAttributes['password'] + 'identification' => 'normal', + 'password' => 'too-obscure' ]); $data = json_decode($response->getBody()->getContents(), true); - $this->assertEquals($user->id, $data['userId']); + $this->assertEquals(2, $data['userId']); $token = $data['token']; - $this->assertEquals($user->id, AccessToken::findOrFail($token)->user_id); + $this->assertEquals(2, AccessToken::findOrFail($token)->user_id); } } diff --git a/framework/core/tests/integration/api/Controller/CreateUserControllerTest.php b/framework/core/tests/integration/api/Controller/CreateUserControllerTest.php index 14feb6055..ee9979aa8 100644 --- a/framework/core/tests/integration/api/Controller/CreateUserControllerTest.php +++ b/framework/core/tests/integration/api/Controller/CreateUserControllerTest.php @@ -26,6 +26,23 @@ class CreateUserControllerTest extends ApiControllerTestCase 'email' => 'test@machine.local' ]; + public function setUp() + { + parent::setUp(); + + $this->prepareDatabase([ + 'users' => [ + $this->adminUser(), + ], + 'groups' => [ + $this->adminGroup(), + ], + 'group_user' => [ + ['user_id' => 1, 'group_id' => 1], + ], + ]); + } + /** * @test * @expectedException \Illuminate\Validation\ValidationException @@ -60,7 +77,7 @@ class CreateUserControllerTest extends ApiControllerTestCase */ public function admins_can_create_activated_users() { - $this->actor = $this->getAdminUser(); + $this->actor = User::find(1); $response = $this->callWith(array_merge($this->data, [ 'isEmailConfirmed' => 1 @@ -90,10 +107,4 @@ class CreateUserControllerTest extends ApiControllerTestCase $settings->set('allow_sign_up', true); } } - - public function tearDown() - { - User::where('username', $this->data['username'])->delete(); - parent::tearDown(); - } } diff --git a/framework/core/tests/integration/api/Controller/DeleteDiscussionControllerTest.php b/framework/core/tests/integration/api/Controller/DeleteDiscussionControllerTest.php index 9d7f87f93..cceaeb1e9 100644 --- a/framework/core/tests/integration/api/Controller/DeleteDiscussionControllerTest.php +++ b/framework/core/tests/integration/api/Controller/DeleteDiscussionControllerTest.php @@ -11,19 +11,34 @@ namespace Flarum\Tests\integration\api\Controller; +use Carbon\Carbon; use Flarum\Api\Controller\DeleteDiscussionController; -use Flarum\Discussion\Discussion; +use Flarum\User\User; class DeleteDiscussionControllerTest extends ApiControllerTestCase { protected $controller = DeleteDiscussionController::class; - protected $discussion; - protected function init() + public function setUp() { - $this->discussion = Discussion::start(__CLASS__, $this->getNormalUser()); + parent::setUp(); - $this->discussion->save(); + $this->prepareDatabase([ + 'discussions' => [ + ['id' => 1, 'title' => __CLASS__, 'created_at' => Carbon::now()->toDateTimeString(), 'user_id' => 2], + ], + 'posts' => [], + 'users' => [ + $this->adminUser(), + $this->normalUser(), + ], + 'groups' => [ + $this->adminGroup(), + ], + 'group_user' => [ + ['user_id' => 1, 'group_id' => 1], + ], + ]); } /** @@ -31,9 +46,9 @@ class DeleteDiscussionControllerTest extends ApiControllerTestCase */ public function admin_can_delete() { - $this->actor = $this->getAdminUser(); + $this->actor = User::find(1); - $response = $this->callWith([], ['id' => $this->discussion->id]); + $response = $this->callWith([], ['id' => 1]); $this->assertEquals(204, $response->getStatusCode()); } diff --git a/framework/core/tests/integration/api/Controller/ListDiscussionsControllerTest.php b/framework/core/tests/integration/api/Controller/ListDiscussionsControllerTest.php index 3471f3444..24f476038 100644 --- a/framework/core/tests/integration/api/Controller/ListDiscussionsControllerTest.php +++ b/framework/core/tests/integration/api/Controller/ListDiscussionsControllerTest.php @@ -11,13 +11,38 @@ namespace Flarum\Tests\integration\api\Controller; +use Carbon\Carbon; use Flarum\Api\Controller\ListDiscussionsController; -use Flarum\Discussion\Discussion; +use Flarum\User\User; class ListDiscussionsControllerTest extends ApiControllerTestCase { protected $controller = ListDiscussionsController::class; + public function setUp() + { + parent::setUp(); + + $this->prepareDatabase([ + 'discussions' => [ + ['id' => 1, 'title' => __CLASS__, 'created_at' => Carbon::now()->toDateTimeString(), 'user_id' => 2, 'first_post_id' => 1, 'comment_count' => 1], + ], + 'posts' => [ + ['id' => 1, 'discussion_id' => 1, 'created_at' => Carbon::now()->toDateTimeString(), 'user_id' => 2, 'type' => 'comment', 'content' => '

foo bar

'], + ], + 'users' => [ + $this->normalUser(), + ], + 'groups' => [ + $this->memberGroup(), + $this->guestGroup(), + ], + 'group_permission' => [ + ['permission' => 'viewDiscussions', 'group_id' => 2], + ] + ]); + } + /** * @test */ @@ -28,7 +53,7 @@ class ListDiscussionsControllerTest extends ApiControllerTestCase $this->assertEquals(200, $response->getStatusCode()); $data = json_decode($response->getBody()->getContents(), true); - $this->assertEquals(Discussion::count(), count($data['data'])); + $this->assertEquals(1, count($data['data'])); } /** @@ -36,7 +61,7 @@ class ListDiscussionsControllerTest extends ApiControllerTestCase */ public function can_search_for_author() { - $user = $this->getNormalUser(); + $user = User::find(2); $response = $this->callWith([], [ 'filter' => [ diff --git a/framework/core/tests/integration/api/Controller/ListNotificationsControllerTest.php b/framework/core/tests/integration/api/Controller/ListNotificationsControllerTest.php index 5f64d7b54..f72fd9e5c 100644 --- a/framework/core/tests/integration/api/Controller/ListNotificationsControllerTest.php +++ b/framework/core/tests/integration/api/Controller/ListNotificationsControllerTest.php @@ -12,11 +12,23 @@ namespace Flarum\Tests\integration\api\Controller; use Flarum\Api\Controller\ListNotificationsController; +use Flarum\User\User; class ListNotificationsControllerTest extends ApiControllerTestCase { protected $controller = ListNotificationsController::class; + public function setUp() + { + parent::setUp(); + + $this->prepareDatabase([ + 'users' => [ + $this->normalUser(), + ], + ]); + } + /** * @test * @expectedException \Flarum\User\Exception\PermissionDeniedException @@ -31,7 +43,7 @@ class ListNotificationsControllerTest extends ApiControllerTestCase */ public function show_index_for_user() { - $this->actor = $this->getNormalUser(); + $this->actor = User::find(2); $response = $this->callWith(); diff --git a/framework/core/tests/integration/api/Controller/ListUsersControllerTest.php b/framework/core/tests/integration/api/Controller/ListUsersControllerTest.php index c6e6e0551..30a961849 100644 --- a/framework/core/tests/integration/api/Controller/ListUsersControllerTest.php +++ b/framework/core/tests/integration/api/Controller/ListUsersControllerTest.php @@ -12,11 +12,29 @@ namespace Flarum\Tests\integration\api\Controller; use Flarum\Api\Controller\ListUsersController; +use Flarum\User\User; class ListUsersControllerTest extends ApiControllerTestCase { protected $controller = ListUsersController::class; + public function setUp() + { + parent::setUp(); + + $this->prepareDatabase([ + 'users' => [ + $this->adminUser(), + ], + 'groups' => [ + $this->adminGroup(), + ], + 'group_user' => [ + ['user_id' => 1, 'group_id' => 1], + ], + ]); + } + /** * @test * @expectedException \Flarum\User\Exception\PermissionDeniedException @@ -31,7 +49,7 @@ class ListUsersControllerTest extends ApiControllerTestCase */ public function shows_index_for_admin() { - $this->actor = $this->getAdminUser(); + $this->actor = User::find(1); $response = $this->callWith(); diff --git a/framework/core/tests/integration/api/Controller/ShowDiscussionControllerTest.php b/framework/core/tests/integration/api/Controller/ShowDiscussionControllerTest.php index 6931e7d9b..ab1fe702a 100644 --- a/framework/core/tests/integration/api/Controller/ShowDiscussionControllerTest.php +++ b/framework/core/tests/integration/api/Controller/ShowDiscussionControllerTest.php @@ -11,14 +11,13 @@ namespace Flarum\Tests\integration\api\Controller; +use Carbon\Carbon; use Flarum\Api\Controller\ShowDiscussionController; use Flarum\Discussion\Discussion; -use Flarum\Tests\integration\ManagesContent; +use Flarum\User\User; class ShowDiscussionControllerTest extends ApiControllerTestCase { - use ManagesContent; - protected $controller = ShowDiscussionController::class; /** @@ -26,9 +25,34 @@ class ShowDiscussionControllerTest extends ApiControllerTestCase */ protected $discussion; - protected function init() + public function setUp() { - $this->discussion = Discussion::start(__CLASS__, $this->getNormalUser()); + parent::setUp(); + + $this->prepareDatabase([ + 'discussions' => [ + ['id' => 1, 'title' => 'Empty discussion', 'created_at' => Carbon::now()->toDateTimeString(), 'user_id' => 2, 'first_post_id' => null, 'comment_count' => 0, 'is_private' => 0], + ['id' => 2, 'title' => 'Discussion with post', 'created_at' => Carbon::now()->toDateTimeString(), 'user_id' => 2, 'first_post_id' => 1, 'comment_count' => 1, 'is_private' => 0], + ['id' => 3, 'title' => 'Private discussion', 'created_at' => Carbon::now()->toDateTimeString(), 'user_id' => 2, 'first_post_id' => null, 'comment_count' => 0, 'is_private' => 1], + ], + 'posts' => [ + ['id' => 1, 'discussion_id' => 2, 'created_at' => Carbon::now()->toDateTimeString(), 'user_id' => 2, 'type' => 'comment', 'content' => '

a normal reply - too-obscure

'], + ], + 'users' => [ + $this->normalUser(), + ], + 'groups' => [ + $this->guestGroup(), + $this->memberGroup(), + ], + 'group_user' => [ + ['user_id' => 2, 'group_id' => 3], + ], + 'group_permission' => [ + ['permission' => 'viewDiscussions', 'group_id' => 2], + ['permission' => 'viewDiscussions', 'group_id' => 3], + ] + ]); } /** @@ -36,11 +60,9 @@ class ShowDiscussionControllerTest extends ApiControllerTestCase */ public function author_can_see_discussion() { - $this->discussion->save(); + $this->actor = User::find(2); - $this->actor = $this->getNormalUser(); - - $response = $this->callWith([], ['id' => $this->discussion->id]); + $response = $this->callWith([], ['id' => 1]); $this->assertEquals(200, $response->getStatusCode()); } @@ -51,9 +73,7 @@ class ShowDiscussionControllerTest extends ApiControllerTestCase */ public function guest_cannot_see_empty_discussion() { - $this->discussion->save(); - - $response = $this->callWith([], ['id' => $this->discussion->id]); + $response = $this->callWith([], ['id' => 1]); $this->assertEquals(200, $response->getStatusCode()); } @@ -63,11 +83,7 @@ class ShowDiscussionControllerTest extends ApiControllerTestCase */ public function guest_can_see_discussion() { - $this->discussion->save(); - - $this->addPostByNormalUser(); - - $response = $this->callWith([], ['id' => $this->discussion->id]); + $response = $this->callWith([], ['id' => 2]); $this->assertEquals(200, $response->getStatusCode()); } @@ -78,9 +94,6 @@ class ShowDiscussionControllerTest extends ApiControllerTestCase */ public function guests_cannot_see_private_discussion() { - $this->discussion->is_private = true; - $this->discussion->save(); - - $this->callWith([], ['id' => $this->discussion->id]); + $this->callWith([], ['id' => 3]); } } diff --git a/framework/core/tests/integration/api/Controller/UpdateUserControllerTest.php b/framework/core/tests/integration/api/Controller/UpdateUserControllerTest.php index a42562b62..bceb4895f 100644 --- a/framework/core/tests/integration/api/Controller/UpdateUserControllerTest.php +++ b/framework/core/tests/integration/api/Controller/UpdateUserControllerTest.php @@ -12,6 +12,7 @@ namespace Flarum\Tests\integration\api\Controller; use Flarum\Api\Controller\UpdateUserController; +use Flarum\User\User; class UpdateUserControllerTest extends ApiControllerTestCase { @@ -21,24 +22,41 @@ class UpdateUserControllerTest extends ApiControllerTestCase 'email' => 'newemail@machine.local', ]; - protected $userAttributes = [ - 'username' => 'timtom', - 'password' => 'too-obscure', - 'email' => 'timtom@machine.local', - 'is_email_confirmed' => true, - ]; + public function setUp() + { + parent::setUp(); + + $this->prepareDatabase([ + 'users' => [ + $this->adminUser(), + $this->normalUser(), + ], + 'groups' => [ + $this->adminGroup(), + $this->memberGroup(), + ], + 'group_user' => [ + ['user_id' => 1, 'group_id' => 1], + ['user_id' => 2, 'group_id' => 3], + ], + 'group_permission' => [ + ['permission' => 'viewUserList', 'group_id' => 3], + ] + ]); + } /** * @test */ public function users_can_see_their_private_information() { - $this->actor = $this->getNormalUser(); - $response = $this->callWith([], ['id' => $this->actor->id]); + $this->actor = User::find(2); + + $response = $this->callWith([], ['id' => 2]); // Test for successful response and that the email is included in the response $this->assertEquals(200, $response->getStatusCode()); - $this->assertContains('timtom@machine.local', (string) $response->getBody()); + $this->assertContains('normal@machine.local', (string) $response->getBody()); } /** @@ -46,17 +64,12 @@ class UpdateUserControllerTest extends ApiControllerTestCase */ public function users_can_not_see_other_users_private_information() { - $this->actor = $this->getNormalUser(); + $this->actor = User::find(2); $response = $this->callWith([], ['id' => 1]); // Make sure sensitive information is not made public $this->assertEquals(200, $response->getStatusCode()); - $this->assertNotContains('admin@example.com', (string) $response->getBody()); - } - - public function tearDown() - { - parent::tearDown(); + $this->assertNotContains('admin@machine.local', (string) $response->getBody()); } } diff --git a/framework/core/tests/integration/installer/DefaultInstallationTest.php b/framework/core/tests/integration/installer/DefaultInstallationTest.php deleted file mode 100644 index 27eac7a42..000000000 --- a/framework/core/tests/integration/installer/DefaultInstallationTest.php +++ /dev/null @@ -1,75 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Flarum\Tests\Install; - -use Flarum\Install\AdminUser; -use Flarum\Install\Installation; -use Flarum\Tests\Test\TestCase; -use Illuminate\Database\Connectors\ConnectionFactory; - -class DefaultInstallationTest extends TestCase -{ - protected $isInstalled = false; - - /** - * @test - */ - public function allows_forum_installation() - { - if (file_exists(base_path('config.php'))) { - unlink(base_path('config.php')); - } - - /** @var Installation $installation */ - $installation = app(Installation::class); - - $installation - ->debugMode(true) - ->baseUrl('http://flarum.local') - ->databaseConfig($this->getDatabaseConfiguration()) - ->adminUser($this->getAdmin()) - ->settings($this->getSettings()) - ->build()->run(); - - $this->assertFileExists(base_path('config.php')); - - $this->assertEquals( - $this->getDatabase()->table('users')->find(1)->username, - 'admin' - ); - } - - private function getDatabase() - { - $factory = new ConnectionFactory(app()); - - return $factory->make($this->getDatabaseConfiguration()->toArray()); - } - - private function getAdmin(): AdminUser - { - return new AdminUser( - 'admin', - 'password', - 'admin@example.com' - ); - } - - private function getSettings() - { - return [ - 'forum_title' => 'Development Forum', - 'mail_driver' => 'log', - 'welcome_title' => 'Welcome to Development Forum', - ]; - } -} diff --git a/framework/core/tests/phpunit.integration.xml b/framework/core/tests/phpunit.integration.xml new file mode 100644 index 000000000..2ebc8b719 --- /dev/null +++ b/framework/core/tests/phpunit.integration.xml @@ -0,0 +1,23 @@ + + + + + + + ./integration + + + + + ./src/ + + +