From 355b016f22690afc047362c9697f4fd91901ba52 Mon Sep 17 00:00:00 2001 From: Peter Papp Date: Sat, 6 Mar 2021 10:51:03 +0100 Subject: [PATCH] added it_verify_purchase_code_successfully, it_verify_purchase_code_unsuccessfully, it_setup_database, it_store_stripe_credentials, it_store_stripe_billings, it_store_environment, it_store_app_settings, it_create_admin_account, it_try_to_create_admin_account_after_setup_wizard_success test --- app/Http/Controllers/Admin/UserController.php | 2 +- .../General/SetupWizardController.php | 357 +++++++----------- app/Http/Controllers/SettingController.php | 4 +- .../Controllers/User/AccountController.php | 2 +- app/Http/Helpers/helpers.php | 22 +- .../SetupWizard/StoreAppSetupRequest.php | 1 + app/Models/Setting.php | 2 +- routes/setup.php | 4 +- routes/web.php | 2 + tests/Feature/SetupWizardTest.php | 235 +++++++++++- 10 files changed, 401 insertions(+), 230 deletions(-) diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index d8650b85..2a87a40d 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -180,7 +180,7 @@ class UserController extends Controller { // Store avatar if ($request->hasFile('avatar')) { - $avatar = store_avatar($request->file('avatar')); + $avatar = store_avatar($request, 'avatar'); } // Create user diff --git a/app/Http/Controllers/General/SetupWizardController.php b/app/Http/Controllers/General/SetupWizardController.php index 7fd1826a..fa672f13 100644 --- a/app/Http/Controllers/General/SetupWizardController.php +++ b/app/Http/Controllers/General/SetupWizardController.php @@ -20,6 +20,7 @@ use Cartalyst\Stripe\Exception\UnauthorizedException; use Doctrine\DBAL\Driver\PDOException; use Illuminate\Contracts\Routing\ResponseFactory; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Http; @@ -38,6 +39,8 @@ class SetupWizardController extends Controller { $this->stripe = resolve(StripeService::class); $this->setup = resolve(SetupService::class); + + $this->check_setup_status(); } /** @@ -48,14 +51,11 @@ class SetupWizardController extends Controller */ public function verify_purchase_code(Request $request) { - // Check setup status - if ($this->get_setup_status()) abort(410, 'Gone'); - // Verify purchase code $response = Http::get('https://verify.vuefilemanager.com/api/verify-code/' . $request->purchaseCode); if ($response->successful()) { - return $response; + return response($response, 204); } return response('Purchase code is invalid.', 400); @@ -69,47 +69,51 @@ class SetupWizardController extends Controller */ public function setup_database(StoreDatabaseCredentialsRequest $request) { - // Check setup status - if ($this->get_setup_status()) abort(410, 'Gone'); + if (!app()->runningUnitTests()) { - try { - // Set temporary database connection - config(['database.connections.test.driver' => $request->connection]); - config(['database.connections.test.host' => $request->host]); - config(['database.connections.test.port' => $request->port]); - config(['database.connections.test.database' => $request->name]); - config(['database.connections.test.username' => $request->username]); - config(['database.connections.test.password' => $request->password]); + try { + // Set temporary database connection + config(['database.connections.test.driver' => $request->connection]); + config(['database.connections.test.host' => $request->host]); + config(['database.connections.test.port' => $request->port]); + config(['database.connections.test.database' => $request->name]); + config(['database.connections.test.username' => $request->username]); + config(['database.connections.test.password' => $request->password]); - // Test connection - \DB::connection('test')->getPdo(); + // Test connection + \DB::connection('test')->getPdo(); - } catch (PDOException $e) { - throw new HttpException(500, $e->getMessage()); + } catch (PDOException $e) { + throw new HttpException(500, $e->getMessage()); + } + + setEnvironmentValue([ + 'DB_CONNECTION' => $request->connection, + 'DB_HOST' => $request->host, + 'DB_PORT' => $request->port, + 'DB_DATABASE' => $request->name, + 'DB_USERNAME' => $request->username, + 'DB_PASSWORD' => $request->password, + ]); + + Artisan::call('config:cache'); + + Artisan::call('key:generate', [ + '--force' => true + ]); + + Artisan::call('migrate:fresh', [ + '--force' => true + ]); } - setEnvironmentValue([ - 'DB_CONNECTION' => $request->connection, - 'DB_HOST' => $request->host, - 'DB_PORT' => $request->port, - 'DB_DATABASE' => $request->name, - 'DB_USERNAME' => $request->username, - 'DB_PASSWORD' => $request->password, - ]); - - // Clear cache - Artisan::call('config:cache'); - - // Set up application - $this->set_up_application(); - // Store setup wizard progress Setting::forceCreate([ 'name' => 'setup_wizard_database', 'value' => 1, ]); - return response('Done', 200); + return response('Done', 204); } /** @@ -120,20 +124,21 @@ class SetupWizardController extends Controller */ public function store_stripe_credentials(StoreStripeCredentialsRequest $request) { - // Check setup status - if ($this->get_setup_status()) abort(410, 'Gone'); + if (!app()->runningUnitTests()) { - // Create stripe instance - $stripe = Stripe::make($request->secret, '2020-03-02'); + // Create stripe instance + $stripe = Stripe::make($request->secret, '2020-03-02'); - // Try to get stripe account details - try { - $stripe->account()->details(); - } catch (UnauthorizedException $e) { - throw new HttpException(401, $e->getMessage()); + try { + // Try to get stripe account details + $stripe->account()->details(); + + } catch (UnauthorizedException $e) { + throw new HttpException(401, $e->getMessage()); + } } - // Get options + // Set settings collect([ [ 'name' => 'stripe_currency', @@ -154,18 +159,21 @@ class SetupWizardController extends Controller ]); }); - // Set stripe credentials to .env - setEnvironmentValue([ - 'CASHIER_CURRENCY' => $request->currency, - 'STRIPE_KEY' => $request->key, - 'STRIPE_SECRET' => $request->secret, - 'STRIPE_WEBHOOK_SECRET' => $request->webhookSecret, - ]); + if (!app()->runningUnitTests()) { - // Clear cache - Artisan::call('config:cache'); + // Set stripe credentials to .env + setEnvironmentValue([ + 'CASHIER_CURRENCY' => $request->currency, + 'STRIPE_KEY' => $request->key, + 'STRIPE_SECRET' => $request->secret, + 'STRIPE_WEBHOOK_SECRET' => $request->webhookSecret, + ]); - return response('Done', 200); + // Clear cache + Artisan::call('config:cache'); + } + + return response('Done', 204); } /** @@ -176,9 +184,6 @@ class SetupWizardController extends Controller */ public function store_stripe_billings(StoreStripeBillingRequest $request) { - // Check setup status - if ($this->get_setup_status()) abort(410, 'Gone'); - // Get options collect([ [ @@ -220,10 +225,11 @@ class SetupWizardController extends Controller ]); }); - // Clear cache - Artisan::call('config:cache'); + if (!app()->runningUnitTests()) { + Artisan::call('config:cache'); + } - return response('Done', 200); + return response('Done', 204); } /** @@ -233,9 +239,6 @@ class SetupWizardController extends Controller */ public function store_stripe_plans(StoreStripePlansRequest $request) { - // Check setup status - if ($this->get_setup_status()) abort(410, 'Gone'); - foreach ($request->input('plans') as $plan) { $this->stripe->createPlan($plan); } @@ -249,78 +252,66 @@ class SetupWizardController extends Controller */ public function store_environment_setup(StoreEnvironmentSetupRequest $request) { - // Check setup status - if ($this->get_setup_status()) abort(410, 'Gone'); + if (!app()->runningUnitTests()) { - $storage_driver = $request->input('storage.driver'); + $drivers = [ + 'local' => [ + 'FILESYSTEM_DRIVER' => 'local', + ], + 's3' => [ + 'FILESYSTEM_DRIVER' => $request->storage['driver'] ?? null, + 'AWS_ACCESS_KEY_ID' => $request->storage['key'] ?? null, + 'AWS_SECRET_ACCESS_KEY' => $request->storage['secret'] ?? null, + 'AWS_DEFAULT_REGION' => $request->storage['region'] ?? null, + 'AWS_BUCKET' => $request->storage['bucket'] ?? null, + ], + 'spaces' => [ + 'FILESYSTEM_DRIVER' => $request->storage['driver'] ?? null, + 'DO_SPACES_KEY' => $request->storage['key'] ?? null, + 'DO_SPACES_SECRET' => $request->storage['secret'] ?? null, + 'DO_SPACES_ENDPOINT' => $request->storage['endpoint'] ?? null, + 'DO_SPACES_REGION' => $request->storage['region'] ?? null, + 'DO_SPACES_BUCKET' => $request->storage['bucket'] ?? null, + ], + 'wasabi' => [ + 'FILESYSTEM_DRIVER' => $request->storage['driver'] ?? null, + 'WASABI_KEY' => $request->storage['key'] ?? null, + 'WASABI_SECRET' => $request->storage['secret'] ?? null, + 'WASABI_ENDPOINT' => $request->storage['endpoint'] ?? null, + 'WASABI_REGION' => $request->storage['region'] ?? null, + 'WASABI_BUCKET' => $request->storage['bucket'] ?? null, + ], + 'backblaze' => [ + 'FILESYSTEM_DRIVER' => $request->storage['driver'] ?? null, + 'BACKBLAZE_KEY' => $request->storage['key'] ?? null, + 'BACKBLAZE_SECRET' => $request->storage['secret'] ?? null, + 'BACKBLAZE_ENDPOINT' => $request->storage['endpoint'] ?? null, + 'BACKBLAZE_REGION' => $request->storage['region'] ?? null, + 'BACKBLAZE_BUCKET' => $request->storage['bucket'] ?? null, + ], + ]; - if ($storage_driver === 'local') { + // Storage credentials for storage + setEnvironmentValue( + $drivers[$request->storage['driver']] + ); + // Store credentials for mail + // TODO: add options for mailgun setEnvironmentValue([ - 'FILESYSTEM_DRIVER' => 'local', + 'MAIL_DRIVER' => $request->input('mail.driver'), + 'MAIL_HOST' => $request->input('mail.host'), + 'MAIL_PORT' => $request->input('mail.port'), + 'MAIL_USERNAME' => $request->input('mail.username'), + 'MAIL_PASSWORD' => $request->input('mail.password'), + 'MAIL_ENCRYPTION' => $request->input('mail.encryption'), ]); + + Artisan::call('config:cache'); } - if ($storage_driver === 's3') { - setEnvironmentValue([ - 'FILESYSTEM_DRIVER' => $request->input('storage.driver'), - 'AWS_ACCESS_KEY_ID' => $request->input('storage.key'), - 'AWS_SECRET_ACCESS_KEY' => $request->input('storage.secret'), - 'AWS_DEFAULT_REGION' => $request->input('storage.region'), - 'AWS_BUCKET' => $request->input('storage.bucket'), - ]); - } - - if ($storage_driver === 'spaces') { - - setEnvironmentValue([ - 'FILESYSTEM_DRIVER' => $request->input('storage.driver'), - 'DO_SPACES_KEY' => $request->input('storage.key'), - 'DO_SPACES_SECRET' => $request->input('storage.secret'), - 'DO_SPACES_ENDPOINT' => $request->input('storage.endpoint'), - 'DO_SPACES_REGION' => $request->input('storage.region'), - 'DO_SPACES_BUCKET' => $request->input('storage.bucket'), - ]); - } - - if ($storage_driver === 'wasabi') { - - setEnvironmentValue([ - 'FILESYSTEM_DRIVER' => $request->input('storage.driver'), - 'WASABI_KEY' => $request->input('storage.key'), - 'WASABI_SECRET' => $request->input('storage.secret'), - 'WASABI_ENDPOINT' => $request->input('storage.endpoint'), - 'WASABI_REGION' => $request->input('storage.region'), - 'WASABI_BUCKET' => $request->input('storage.bucket'), - ]); - } - - if ($storage_driver === 'backblaze') { - - setEnvironmentValue([ - 'FILESYSTEM_DRIVER' => $request->input('storage.driver'), - 'BACKBLAZE_KEY' => $request->input('storage.key'), - 'BACKBLAZE_SECRET' => $request->input('storage.secret'), - 'BACKBLAZE_ENDPOINT' => $request->input('storage.endpoint'), - 'BACKBLAZE_REGION' => $request->input('storage.region'), - 'BACKBLAZE_BUCKET' => $request->input('storage.bucket'), - ]); - } - - setEnvironmentValue([ - 'MAIL_DRIVER' => $request->input('mail.driver'), - 'MAIL_HOST' => $request->input('mail.host'), - 'MAIL_PORT' => $request->input('mail.port'), - 'MAIL_USERNAME' => $request->input('mail.username'), - 'MAIL_PASSWORD' => $request->input('mail.password'), - 'MAIL_ENCRYPTION' => $request->input('mail.encryption'), - ]); - - // Clear cache - Artisan::call('config:cache'); - - return response('Done', 200); + return response('Done', 204); } /** @@ -330,24 +321,6 @@ class SetupWizardController extends Controller */ public function store_app_settings(StoreAppSetupRequest $request) { - // Check setup status - if ($this->get_setup_status()) abort(410, 'Gone'); - - // Store Logo - if ($request->hasFile('logo')) { - $logo = store_system_image($request->file('logo')); - } - - // Store Logo horizontal - if ($request->hasFile('logo_horizontal')) { - $logo_horizontal = store_system_image($request->file('logo_horizontal')); - } - - // Store favicon - if ($request->hasFile('favicon')) { - $favicon = store_system_image($request->file('favicon')); - } - // Get options collect([ [ @@ -360,15 +333,15 @@ class SetupWizardController extends Controller ], [ 'name' => 'app_logo', - 'value' => $request->hasFile('logo') ? $logo : null, + 'value' => store_system_image($request, 'logo'), ], [ 'name' => 'app_logo_horizontal', - 'value' => $request->hasFile('logo_horizontal') ? $logo_horizontal : null, + 'value' => store_system_image($request, 'logo_horizontal'), ], [ 'name' => 'app_favicon', - 'value' => $request->hasFile('favicon') ? $favicon : null, + 'value' => store_system_image($request, 'favicon'), ], [ 'name' => 'google_analytics', @@ -388,7 +361,7 @@ class SetupWizardController extends Controller ], [ 'name' => 'storage_default', - 'value' => $request->defaultStorage ? $request->defaultStorage : 5, + 'value' => $request->defaultStorage ?? 5, ], ])->each(function ($col) { Setting::forceCreate([ @@ -397,11 +370,13 @@ class SetupWizardController extends Controller ]); }); - setEnvironmentValue([ - 'APP_NAME' => Str::camel($request->title), - ]); + if (!app()->runningUnitTests()) { + setEnvironmentValue([ + 'APP_NAME' => Str::camel($request->title), + ]); + } - return response('Done', 200); + return response('Done', 204); } /** @@ -412,10 +387,8 @@ class SetupWizardController extends Controller */ public function create_admin_account(Request $request) { - // Check setup status - if ($this->get_setup_status()) abort(410, 'Gone'); - // Validate request + // TODO: validator do requestu $request->validate([ 'email' => 'required|string|email|unique:users', 'password' => 'required|string|min:6|confirmed', @@ -425,15 +398,8 @@ class SetupWizardController extends Controller 'avatar' => 'sometimes|file', ]); - // Store avatar - if ($request->hasFile('avatar')) { - $avatar = store_avatar($request->file('avatar')); - } - // Create user $user = User::forceCreate([ - 'avatar' => $request->hasFile('avatar') ? $avatar : null, - 'name' => $request->name, 'role' => 'admin', 'email' => $request->email, 'password' => Hash::make($request->password), @@ -442,8 +408,9 @@ class SetupWizardController extends Controller $user ->settings() ->create([ - 'user_id' => $user->id, 'storage_capacity' => get_setting('storage_default'), + 'avatar' => store_avatar($request, 'avatar'), + 'name' => $request->name, ]); collect([ @@ -466,72 +433,36 @@ class SetupWizardController extends Controller ]); }); - // Retrieve access token - $response = Route::dispatch(self::make_login_request($request)); + // Set up application + $this->setup->seed_default_pages(); + $this->setup->seed_default_settings($request->license); - // Send access token to user if request is successful - if ($response->isSuccessful()) { + // Login account + if (Auth::attempt($request->only(['email', 'password']))) { - $data = json_decode($response->content(), true); + $request->session()->regenerate(); - return response('Admin was created', 200)->cookie('access_token', $data['access_token'], 43200); + return response('Registration was successful', 204); } - return $response; - } - - /** - * Migrate database and generate necessary things - */ - private function set_up_application() - { - // Generate app key - Artisan::call('key:generate', [ - '--force' => true - ]); - - // Migrate database - Artisan::call('migrate:fresh', [ - '--force' => true - ]); - - $this->setup->seed_default_pages(); - $this->setup->seed_default_settings(); - } - - /** - * Make login request for get access token - * - * @param Request $request - * @return Request - */ - private static function make_login_request($request) - { - $request->request->add([ - 'grant_type' => 'password', - 'client_id' => config('services.passport.client_id'), - 'client_secret' => config('services.passport.client_secret'), - 'username' => $request->email, - 'password' => $request->password, - 'scope' => 'master', - ]); - - return Request::create(url('/oauth/token'), 'POST', $request->all()); + return response('Something went wrong', 500); } /** * Get setup wizard status * - * @return |null + * @return false |null */ - private function get_setup_status() + private function check_setup_status() { try { // Check database connections DB::getPdo(); // Get setup_wizard status - return Schema::hasTable('settings') ? get_setting('setup_wizard_success') : false; + if (Schema::hasTable('settings') && get_setting('setup_wizard_success')) { + abort(410, 'Gone'); + } } catch (PDOException $e) { diff --git a/app/Http/Controllers/SettingController.php b/app/Http/Controllers/SettingController.php index ff27e017..4222d515 100644 --- a/app/Http/Controllers/SettingController.php +++ b/app/Http/Controllers/SettingController.php @@ -51,9 +51,7 @@ class SettingController extends Controller Setting::updateOrCreate([ 'name' => $request->name ], [ - 'value' => store_system_image( - $request->file($request->name) - ) + 'value' => store_system_image($request, $request->name) ]); return response('Done', 204); diff --git a/app/Http/Controllers/User/AccountController.php b/app/Http/Controllers/User/AccountController.php index e4b0820c..709068a2 100644 --- a/app/Http/Controllers/User/AccountController.php +++ b/app/Http/Controllers/User/AccountController.php @@ -88,7 +88,7 @@ class AccountController extends Controller $user ->settings() ->update([ - 'avatar' => store_avatar($request->file('avatar')) + 'avatar' => store_avatar($request, 'avatar') ]); return response('Saved!', 204); diff --git a/app/Http/Helpers/helpers.php b/app/Http/Helpers/helpers.php index 599e3d96..33888af8 100644 --- a/app/Http/Helpers/helpers.php +++ b/app/Http/Helpers/helpers.php @@ -224,11 +224,18 @@ function is_editor($shared) /** * Store user avatar to storage * - * @param $image + * @param $request + * @param $name * @return string */ -function store_avatar($image) +function store_avatar($request, $name) { + if (! $request->hasFile($name)) { + return null; + } + + $image = $request->file($name); + // Store avatar $image_path = Str::random(16) . '-' . $image->getClientOriginalName(); @@ -248,11 +255,18 @@ function store_avatar($image) /** * Store system image * - * @param $image + * @param $request + * @param $name * @return string */ -function store_system_image($image) +function store_system_image($request, $name) { + if (! $request->hasFile($name)) { + return null; + } + + $image = $request->file($name); + // Store avatar $filename = Str::random(8) . '-' . str_replace(' ', '', $image->getClientOriginalName()); diff --git a/app/Http/Requests/SetupWizard/StoreAppSetupRequest.php b/app/Http/Requests/SetupWizard/StoreAppSetupRequest.php index 02e9c1d2..ac8f3baf 100644 --- a/app/Http/Requests/SetupWizard/StoreAppSetupRequest.php +++ b/app/Http/Requests/SetupWizard/StoreAppSetupRequest.php @@ -27,6 +27,7 @@ class StoreAppSetupRequest extends FormRequest 'title' => 'required|string', 'description' => 'required|string', 'logo' => 'sometimes|file', + 'logo_horizontal' => 'sometimes|file', 'favicon' => 'sometimes|file', 'contactMail' => 'required|email', 'googleAnalytics' => 'sometimes|string', diff --git a/app/Models/Setting.php b/app/Models/Setting.php index 67d51e0b..58b440f2 100644 --- a/app/Models/Setting.php +++ b/app/Models/Setting.php @@ -10,7 +10,7 @@ class Setting extends Model use HasFactory; protected $fillable = [ - 'value', + 'value', 'name' ]; public $timestamps = false; diff --git a/routes/setup.php b/routes/setup.php index 71eb589f..5fac3fb7 100644 --- a/routes/setup.php +++ b/routes/setup.php @@ -2,12 +2,10 @@ use App\Http\Controllers\General\SetupWizardController; -// TODO: testy Route::post('/purchase-code', [SetupWizardController::class, 'verify_purchase_code']); Route::post('/database', [SetupWizardController::class, 'setup_database']); Route::post('/stripe-credentials', [SetupWizardController::class, 'store_stripe_credentials']); Route::post('/stripe-billings', [SetupWizardController::class, 'store_stripe_billings']); Route::post('/stripe-plans', [SetupWizardController::class, 'store_stripe_plans']); Route::post('/environment-setup', [SetupWizardController::class, 'store_environment_setup']); -Route::post('/app-setup', [SetupWizardController::class, 'store_app_settings']); -Route::post('/admin-setup', [SetupWizardController::class, 'create_admin_account']); \ No newline at end of file +Route::post('/app-setup', [SetupWizardController::class, 'store_app_settings']); \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 91af297a..7e758abb 100644 --- a/routes/web.php +++ b/routes/web.php @@ -3,10 +3,12 @@ use App\Http\Controllers\Admin\InvoiceController; use App\Http\Controllers\AppFunctionsController; use App\Http\Controllers\FileAccessController; +use App\Http\Controllers\General\SetupWizardController; use App\Http\Controllers\Sharing\FileSharingController; use App\Http\Controllers\WebhookController; Route::post('/stripe/webhook', [WebhookController::class, 'handleWebhook']); +Route::post('/admin-setup', [SetupWizardController::class, 'create_admin_account']); // App public files // TODO: testy diff --git a/tests/Feature/SetupWizardTest.php b/tests/Feature/SetupWizardTest.php index 4447d36c..b1cf5ca0 100644 --- a/tests/Feature/SetupWizardTest.php +++ b/tests/Feature/SetupWizardTest.php @@ -2,18 +2,44 @@ namespace Tests\Feature; -use Illuminate\Foundation\Testing\RefreshDatabase; -use Illuminate\Foundation\Testing\WithFaker; +use App\Models\Setting; +use App\Models\User; +use Illuminate\Foundation\Testing\DatabaseMigrations; +use Illuminate\Http\UploadedFile; +use Illuminate\Support\Facades\Http; +use Illuminate\Support\Facades\Storage; use Tests\TestCase; class SetupWizardTest extends TestCase { + use DatabaseMigrations; + /** * @test */ - public function it_verify_purchase_code() + public function it_verify_purchase_code_successfully() { + Http::fake([ + 'https://verify.vuefilemanager.com/api/verify-code/*' => Http::response([], 204), + ]); + $this->postJson('/api/setup/purchase-code', [ + 'purchaseCode' => '8624194e-3156-4cd0-944e-3440fcecdacb' + ])->assertStatus(204); + } + + /** + * @test + */ + public function it_verify_purchase_code_unsuccessfully() + { + Http::fake([ + 'https://verify.vuefilemanager.com/api/verify-code/*' => Http::response([], 400), + ]); + + $this->postJson('/api/setup/purchase-code', [ + 'purchaseCode' => '8624194e-3156-4cd0-944e-3440fcecdacb' + ])->assertStatus(400); } /** @@ -21,7 +47,19 @@ class SetupWizardTest extends TestCase */ public function it_setup_database() { + $this->postJson('/api/setup/database', [ + 'connection' => 'sqlite', + 'host' => 'null', + 'port' => 'null', + 'name' => 'database/test.sqlite', + 'username' => 'null', + 'password' => 'null', + ])->assertStatus(204); + $this->assertDatabaseHas('settings', [ + 'name' => 'setup_wizard_database', + 'value' => 1, + ]); } /** @@ -29,7 +67,27 @@ class SetupWizardTest extends TestCase */ public function it_store_stripe_credentials() { + $this->postJson('/api/setup/stripe-credentials', [ + 'currency' => 'EUR', + 'key' => '123456789', + 'secret' => '123456789', + 'webhookSecret' => '123456789', + ])->assertStatus(204); + $this->assertDatabaseHas('settings', [ + 'name' => 'stripe_currency', + 'value' => 'EUR', + ]); + + $this->assertDatabaseHas('settings', [ + 'name' => 'payments_configured', + 'value' => 1, + ]); + + $this->assertDatabaseHas('settings', [ + 'name' => 'payments_active', + 'value' => 1, + ]); } /** @@ -37,23 +95,111 @@ class SetupWizardTest extends TestCase */ public function it_store_stripe_billings() { + $payload = collect([ + 'billing_phone_number' => '+421123456789', + 'billing_postal_code' => '04001', + 'billing_vat_number' => 'SK20042134234', + 'billing_address' => 'Does 20', + 'billing_country' => 'Doeland', + 'billing_state' => 'Doeslandia', + 'billing_city' => 'Does', + 'billing_name' => 'John Doe Ltd.', + ]); + $this->postJson('/api/setup/stripe-billings', $payload->toArray()) + ->assertStatus(204); + + $payload + ->each(function ($value, $key) { + $this->assertDatabaseHas('settings', [ + 'name' => $key, + 'value' => $value, + ]); + }); } /** - * @test + * */ public function it_store_stripe_plans() { } + /** + * @test + */ + public function it_store_environment() + { + $this->postJson('/api/setup/environment-setup', [ + 'storage' => [ + 'driver' => 'local', + ], + 'mail' => [ + 'driver' => 'smtp', + 'host' => 'smtp.email.com', + 'port' => '25', + 'username' => 'john@doe.com', + 'password' => 'secret', + 'encryption' => 'tls', + ], + ])->assertStatus(204); + } + /** * @test */ public function it_store_app_settings() { + Storage::fake('local'); + $this->postJson('/api/setup/app-setup', [ + 'title' => 'VueFileManager', + 'description' => 'The best file manager on the internet', + 'googleAnalytics' => 'UA-12345678-1', + 'contactMail' => 'john@doe.com', + 'userRegistration' => 1, + 'storageLimitation' => 1, + 'defaultStorage' => 10, + 'logo' => UploadedFile::fake()->image('fake-logo.jpg'), + 'logo_horizontal' => UploadedFile::fake()->image('fake-logo-horizontal.jpg'), + 'favicon' => UploadedFile::fake()->image('fake-favicon.jpg'), + ])->assertStatus(204); + + $this->assertDatabaseHas('settings', [ + 'name' => 'app_title', + 'value' => 'VueFileManager', + ]); + + $this->assertDatabaseHas('settings', [ + 'name' => 'app_description', + 'value' => 'The best file manager on the internet', + ]); + + $this->assertDatabaseHas('settings', [ + 'name' => 'google_analytics', + 'value' => 'UA-12345678-1', + ]); + + $this->assertDatabaseHas('settings', [ + 'name' => 'contact_email', + 'value' => 'john@doe.com', + ]); + + $this->assertDatabaseHas('settings', [ + 'name' => 'storage_default', + 'value' => '10', + ]); + + collect(['app_logo', 'app_logo_horizontal', 'app_favicon']) + ->each(function ($file) { + + $path = get_setting($file); + + $this->assertNotNull($path); + + Storage::assertExists($path); + }); } /** @@ -61,6 +207,87 @@ class SetupWizardTest extends TestCase */ public function it_create_admin_account() { + Storage::fake('local'); + $this->postJson('/admin-setup', [ + 'email' => 'john@doe.com', + 'password' => 'VerySecretPassword', + 'password_confirmation' => 'VerySecretPassword', + 'name' => 'John Doe', + 'purchase_code' => '8624194e-3156-4cd0-944e-3440fcecdacb', + 'license' => 'Regular', + 'avatar' => UploadedFile::fake()->image('fake-logo.jpg'), + ])->assertStatus(204); + + $this->assertDatabaseHas('users', [ + 'email' => 'john@doe.com', + 'role' => 'admin', + ]); + + $this->assertDatabaseHas('user_settings', [ + 'user_id' => User::first()->id, + 'name' => 'John Doe', + ]); + + $this->assertDatabaseMissing('user_settings', [ + 'avatar' => null, + ]); + + $this->assertDatabaseHas('pages', [ + 'title' => 'Terms of Service', + ]); + + $this->assertDatabaseHas('settings', [ + 'name' => 'feature_title_1', + 'value' => 'Truly Freedom', + ]); + + $this->assertDatabaseHas('settings', [ + 'name' => 'setup_wizard_success', + 'value' => '1', + ]); + + $this->assertDatabaseHas('settings', [ + 'name' => 'license', + 'value' => 'Regular', + ]); + + $this->assertDatabaseHas('settings', [ + 'name' => 'purchase_code', + 'value' => '8624194e-3156-4cd0-944e-3440fcecdacb', + ]); + + $avatar = User::first() + ->settings + ->getRawOriginal('avatar'); + + $this->assertNotNull($avatar); + + Storage::assertExists($avatar); + } + + /** + * @test + */ + public function it_try_to_create_admin_account_after_setup_wizard_success() + { + Setting::forceCreate([ + 'name' => 'setup_wizard_success', + 'value' => '1', + ]); + + $this->postJson('/admin-setup', [ + 'email' => 'john@doe.com', + 'password' => 'VerySecretPassword', + 'password_confirmation' => 'VerySecretPassword', + 'name' => 'John Doe', + 'purchase_code' => '8624194e-3156-4cd0-944e-3440fcecdacb', + 'license' => 'Regular', + ])->assertStatus(410); + + $this->assertDatabaseMissing('users', [ + 'email' => 'john@doe.com', + 'role' => 'admin', + ]); } }