diff --git a/lumen-test/.gitignore b/lumen-test/.gitignore index c6490f3..4e840fe 100644 --- a/lumen-test/.gitignore +++ b/lumen-test/.gitignore @@ -1,5 +1,6 @@ /vendor .env +codecept.phar tests/_output/* @@ -7,3 +8,4 @@ composer.lock tests/_output/* codecept.phar + diff --git a/lumen-test/tests/_data/ResourcesTest.yml b/lumen-test/tests/_data/ResourcesTest.yml index e691b71..fd2d201 100644 --- a/lumen-test/tests/_data/ResourcesTest.yml +++ b/lumen-test/tests/_data/ResourcesTest.yml @@ -23,4 +23,4 @@ Library: tags: fillable address: schema: string - tags: fillable \ No newline at end of file + tags: fillable diff --git a/lumen-test/tests/acceptance/ResourcesCommandCept.php b/lumen-test/tests/acceptance/ResourcesCommandCept.php new file mode 100644 index 0000000..467ee7b --- /dev/null +++ b/lumen-test/tests/acceptance/ResourcesCommandCept.php @@ -0,0 +1,136 @@ +wantTo('Generate RESTful resources from a file'); +$I->writeToFile('database/database.sqlite', ''); + +$I->runShellCommand('php artisan wn:resources tests/_data/ResourcesTest.yml'); + +// Checking the model +$I->seeInShellOutput('Author model generated'); +$I->seeInShellOutput('Book model generated'); +$I->seeInShellOutput('Library model generated'); +$I->seeFileFound('./app/Author.php'); +$I->seeFileFound('./app/Book.php'); +$I->seeFileFound('./app/Library.php'); +$I->deleteFile('./app/Author.php'); +$I->deleteFile('./app/Book.php'); +$I->deleteFile('./app/Library.php'); + +// Checking the migration +$I->seeInShellOutput('authors migration generated'); +$I->seeInShellOutput('books migration generated'); +$I->seeInShellOutput('libraries migration generated'); +// Can't check for specific file names, so we'll just strip the directory +$I->cleanDir('database/migrations'); +$I->writeToFile('database/migrations/.gitkeep', ''); + +// Checking the RESTActions trait +$I->seeFileFound('./app/Http/Controllers/RESTActions.php'); +$I->deleteFile('./app/Http/Controllers/RESTActions.php'); + +// Checking the controller +$I->seeInShellOutput('AuthorsController generated'); +$I->seeInShellOutput('LibrariesController generated'); +$I->seeInShellOutput('BooksController generated'); +$I->seeFileFound('./app/Http/Controllers/AuthorsController.php'); +$I->seeFileFound('./app/Http/Controllers/LibrariesController.php'); +$I->seeFileFound('./app/Http/Controllers/BooksController.php'); + +$I->deleteFile('./app/Http/Controllers/AuthorsController.php'); +$I->deleteFile('./app/Http/Controllers/LibrariesController.php'); +$I->deleteFile('./app/Http/Controllers/BooksController.php'); + + +// Checking routes +$I->openFile('./app/Http/routes.php'); +$I->seeInThisFile(' +$app->get(\'author\', \'AuthorsController@all\'); +$app->get(\'author/{id}\', \'AuthorsController@get\'); +$app->post(\'author\', \'AuthorsController@add\'); +$app->put(\'author/{id}\', \'AuthorsController@put\'); +$app->delete(\'author/{id}\', \'AuthorsController@remove\');'); + +$I->seeInThisFile(' +$app->get(\'book\', \'BooksController@all\'); +$app->get(\'book/{id}\', \'BooksController@get\'); +$app->post(\'book\', \'BooksController@add\'); +$app->put(\'book/{id}\', \'BooksController@put\'); +$app->delete(\'book/{id}\', \'BooksController@remove\');'); + +$I->seeInThisFile(' +$app->get(\'library\', \'LibrariesController@all\'); +$app->get(\'library/{id}\', \'LibrariesController@get\'); +$app->post(\'library\', \'LibrariesController@add\'); +$app->put(\'library/{id}\', \'LibrariesController@put\'); +$app->delete(\'library/{id}\', \'LibrariesController@remove\');'); +$I->writeToFile('./app/Http/routes.php', 'get("/", function () use ($app) { + return $app->welcome(); +}); +'); + +// Checking model factory +// $I->openFile('./database/factories/ModelFactory.php'); +// $I->seeInThisFile( +// "/** +// * Factory definition for model App\TaskCategory. +// */ +// \$factory->define(App\TaskCategory::class, function (\$faker) { +// return [ +// 'name' => \$faker->word, +// 'descr' => \$faker->paragraph, +// 'due' => \$faker->date, +// ]; +// });"); +$I->writeToFile('./database/factories/ModelFactory.php', "define(App\User::class, function (\$faker) { + return [ + 'name' => \$faker->name, + 'email' => \$faker->email, + 'password' => str_random(10), + 'remember_token' => str_random(10), + ]; +}); +"); + +$I->deleteFile('database/database.sqlite'); + + +// Checking database seeder +// $I->openFile('./database/seeds/TaskCategoriesTableSeeder.php'); +// $I->seeInThisFile(' +// use Illuminate\Database\Seeder; + +// class TaskCategoriesTableSeeder extends Seeder +// { +// public function run() +// { +// factory(App\TaskCategory::class, 10)->create(); +// } +// }'); +// $I->deleteFile('./database/seeds/TaskCategoriesTableSeeder.php'); diff --git a/src/Commands/ResourcesCommand.php b/src/Commands/ResourcesCommand.php index 666f4f5..b592bfa 100644 --- a/src/Commands/ResourcesCommand.php +++ b/src/Commands/ResourcesCommand.php @@ -23,8 +23,12 @@ class ResourcesCommand extends BaseCommand { $content = $this->fs->get($this->argument('file')); $content = Yaml::parse($content); + $modelIndex = 0; foreach ($content as $model => $i){ $i = $this->getResourceParams($model, $i); + $migrationName = 'Create' . ucwords(str_plural($i['name'])); + $migrationFile = date('Y_m_d_His') . '-' . str_pad($modelIndex , 3, 0, STR_PAD_LEFT) . '_' . snake_case($migrationName) . '_table'; + $options = [ 'name' => $i['name'], @@ -36,12 +40,14 @@ class ResourcesCommand extends BaseCommand { '--belongs-to-many' => $i['belongsToMany'], '--path' => $this->option('path'), '--force' => $this->option('force'), + '--migration-file' => $migrationFile ]; if ($this->option('laravel')) { $options['--laravel'] = true; } $this->call('wn:resource', $options); + $modelIndex++; } // $this->call('migrate'); // actually needed for pivot seeders !