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

This commit is contained in:
Peter Papp
2021-03-06 10:51:03 +01:00
parent 485dddec68
commit 355b016f22
10 changed files with 401 additions and 230 deletions

View File

@@ -180,7 +180,7 @@ class UserController extends Controller
{ {
// Store avatar // Store avatar
if ($request->hasFile('avatar')) { if ($request->hasFile('avatar')) {
$avatar = store_avatar($request->file('avatar')); $avatar = store_avatar($request, 'avatar');
} }
// Create user // Create user

View File

@@ -20,6 +20,7 @@ use Cartalyst\Stripe\Exception\UnauthorizedException;
use Doctrine\DBAL\Driver\PDOException; use Doctrine\DBAL\Driver\PDOException;
use Illuminate\Contracts\Routing\ResponseFactory; use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Http;
@@ -38,6 +39,8 @@ class SetupWizardController extends Controller
{ {
$this->stripe = resolve(StripeService::class); $this->stripe = resolve(StripeService::class);
$this->setup = resolve(SetupService::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) public function verify_purchase_code(Request $request)
{ {
// Check setup status
if ($this->get_setup_status()) abort(410, 'Gone');
// Verify purchase code // Verify purchase code
$response = Http::get('https://verify.vuefilemanager.com/api/verify-code/' . $request->purchaseCode); $response = Http::get('https://verify.vuefilemanager.com/api/verify-code/' . $request->purchaseCode);
if ($response->successful()) { if ($response->successful()) {
return $response; return response($response, 204);
} }
return response('Purchase code is invalid.', 400); return response('Purchase code is invalid.', 400);
@@ -69,47 +69,51 @@ class SetupWizardController extends Controller
*/ */
public function setup_database(StoreDatabaseCredentialsRequest $request) public function setup_database(StoreDatabaseCredentialsRequest $request)
{ {
// Check setup status if (!app()->runningUnitTests()) {
if ($this->get_setup_status()) abort(410, 'Gone');
try { try {
// Set temporary database connection // Set temporary database connection
config(['database.connections.test.driver' => $request->connection]); config(['database.connections.test.driver' => $request->connection]);
config(['database.connections.test.host' => $request->host]); config(['database.connections.test.host' => $request->host]);
config(['database.connections.test.port' => $request->port]); config(['database.connections.test.port' => $request->port]);
config(['database.connections.test.database' => $request->name]); config(['database.connections.test.database' => $request->name]);
config(['database.connections.test.username' => $request->username]); config(['database.connections.test.username' => $request->username]);
config(['database.connections.test.password' => $request->password]); config(['database.connections.test.password' => $request->password]);
// Test connection // Test connection
\DB::connection('test')->getPdo(); \DB::connection('test')->getPdo();
} catch (PDOException $e) { } catch (PDOException $e) {
throw new HttpException(500, $e->getMessage()); 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 // Store setup wizard progress
Setting::forceCreate([ Setting::forceCreate([
'name' => 'setup_wizard_database', 'name' => 'setup_wizard_database',
'value' => 1, '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) public function store_stripe_credentials(StoreStripeCredentialsRequest $request)
{ {
// Check setup status if (!app()->runningUnitTests()) {
if ($this->get_setup_status()) abort(410, 'Gone');
// Create stripe instance // Create stripe instance
$stripe = Stripe::make($request->secret, '2020-03-02'); $stripe = Stripe::make($request->secret, '2020-03-02');
// Try to get stripe account details try {
try { // Try to get stripe account details
$stripe->account()->details(); $stripe->account()->details();
} catch (UnauthorizedException $e) {
throw new HttpException(401, $e->getMessage()); } catch (UnauthorizedException $e) {
throw new HttpException(401, $e->getMessage());
}
} }
// Get options // Set settings
collect([ collect([
[ [
'name' => 'stripe_currency', 'name' => 'stripe_currency',
@@ -154,18 +159,21 @@ class SetupWizardController extends Controller
]); ]);
}); });
// Set stripe credentials to .env if (!app()->runningUnitTests()) {
setEnvironmentValue([
'CASHIER_CURRENCY' => $request->currency,
'STRIPE_KEY' => $request->key,
'STRIPE_SECRET' => $request->secret,
'STRIPE_WEBHOOK_SECRET' => $request->webhookSecret,
]);
// Clear cache // Set stripe credentials to .env
Artisan::call('config:cache'); 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) public function store_stripe_billings(StoreStripeBillingRequest $request)
{ {
// Check setup status
if ($this->get_setup_status()) abort(410, 'Gone');
// Get options // Get options
collect([ collect([
[ [
@@ -220,10 +225,11 @@ class SetupWizardController extends Controller
]); ]);
}); });
// Clear cache if (!app()->runningUnitTests()) {
Artisan::call('config:cache'); 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) public function store_stripe_plans(StoreStripePlansRequest $request)
{ {
// Check setup status
if ($this->get_setup_status()) abort(410, 'Gone');
foreach ($request->input('plans') as $plan) { foreach ($request->input('plans') as $plan) {
$this->stripe->createPlan($plan); $this->stripe->createPlan($plan);
} }
@@ -249,78 +252,66 @@ class SetupWizardController extends Controller
*/ */
public function store_environment_setup(StoreEnvironmentSetupRequest $request) public function store_environment_setup(StoreEnvironmentSetupRequest $request)
{ {
// Check setup status if (!app()->runningUnitTests()) {
if ($this->get_setup_status()) abort(410, 'Gone');
$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([ 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([ return response('Done', 204);
'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);
} }
/** /**
@@ -330,24 +321,6 @@ class SetupWizardController extends Controller
*/ */
public function store_app_settings(StoreAppSetupRequest $request) 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 // Get options
collect([ collect([
[ [
@@ -360,15 +333,15 @@ class SetupWizardController extends Controller
], ],
[ [
'name' => 'app_logo', 'name' => 'app_logo',
'value' => $request->hasFile('logo') ? $logo : null, 'value' => store_system_image($request, 'logo'),
], ],
[ [
'name' => 'app_logo_horizontal', 'name' => 'app_logo_horizontal',
'value' => $request->hasFile('logo_horizontal') ? $logo_horizontal : null, 'value' => store_system_image($request, 'logo_horizontal'),
], ],
[ [
'name' => 'app_favicon', 'name' => 'app_favicon',
'value' => $request->hasFile('favicon') ? $favicon : null, 'value' => store_system_image($request, 'favicon'),
], ],
[ [
'name' => 'google_analytics', 'name' => 'google_analytics',
@@ -388,7 +361,7 @@ class SetupWizardController extends Controller
], ],
[ [
'name' => 'storage_default', 'name' => 'storage_default',
'value' => $request->defaultStorage ? $request->defaultStorage : 5, 'value' => $request->defaultStorage ?? 5,
], ],
])->each(function ($col) { ])->each(function ($col) {
Setting::forceCreate([ Setting::forceCreate([
@@ -397,11 +370,13 @@ class SetupWizardController extends Controller
]); ]);
}); });
setEnvironmentValue([ if (!app()->runningUnitTests()) {
'APP_NAME' => Str::camel($request->title), 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) public function create_admin_account(Request $request)
{ {
// Check setup status
if ($this->get_setup_status()) abort(410, 'Gone');
// Validate request // Validate request
// TODO: validator do requestu
$request->validate([ $request->validate([
'email' => 'required|string|email|unique:users', 'email' => 'required|string|email|unique:users',
'password' => 'required|string|min:6|confirmed', 'password' => 'required|string|min:6|confirmed',
@@ -425,15 +398,8 @@ class SetupWizardController extends Controller
'avatar' => 'sometimes|file', 'avatar' => 'sometimes|file',
]); ]);
// Store avatar
if ($request->hasFile('avatar')) {
$avatar = store_avatar($request->file('avatar'));
}
// Create user // Create user
$user = User::forceCreate([ $user = User::forceCreate([
'avatar' => $request->hasFile('avatar') ? $avatar : null,
'name' => $request->name,
'role' => 'admin', 'role' => 'admin',
'email' => $request->email, 'email' => $request->email,
'password' => Hash::make($request->password), 'password' => Hash::make($request->password),
@@ -442,8 +408,9 @@ class SetupWizardController extends Controller
$user $user
->settings() ->settings()
->create([ ->create([
'user_id' => $user->id,
'storage_capacity' => get_setting('storage_default'), 'storage_capacity' => get_setting('storage_default'),
'avatar' => store_avatar($request, 'avatar'),
'name' => $request->name,
]); ]);
collect([ collect([
@@ -466,72 +433,36 @@ class SetupWizardController extends Controller
]); ]);
}); });
// Retrieve access token // Set up application
$response = Route::dispatch(self::make_login_request($request)); $this->setup->seed_default_pages();
$this->setup->seed_default_settings($request->license);
// Send access token to user if request is successful // Login account
if ($response->isSuccessful()) { 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; return response('Something went wrong', 500);
}
/**
* 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());
} }
/** /**
* Get setup wizard status * Get setup wizard status
* *
* @return |null * @return false |null
*/ */
private function get_setup_status() private function check_setup_status()
{ {
try { try {
// Check database connections // Check database connections
DB::getPdo(); DB::getPdo();
// Get setup_wizard status // 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) { } catch (PDOException $e) {

View File

@@ -51,9 +51,7 @@ class SettingController extends Controller
Setting::updateOrCreate([ Setting::updateOrCreate([
'name' => $request->name 'name' => $request->name
], [ ], [
'value' => store_system_image( 'value' => store_system_image($request, $request->name)
$request->file($request->name)
)
]); ]);
return response('Done', 204); return response('Done', 204);

View File

@@ -88,7 +88,7 @@ class AccountController extends Controller
$user $user
->settings() ->settings()
->update([ ->update([
'avatar' => store_avatar($request->file('avatar')) 'avatar' => store_avatar($request, 'avatar')
]); ]);
return response('Saved!', 204); return response('Saved!', 204);

View File

@@ -224,11 +224,18 @@ function is_editor($shared)
/** /**
* Store user avatar to storage * Store user avatar to storage
* *
* @param $image * @param $request
* @param $name
* @return string * @return string
*/ */
function store_avatar($image) function store_avatar($request, $name)
{ {
if (! $request->hasFile($name)) {
return null;
}
$image = $request->file($name);
// Store avatar // Store avatar
$image_path = Str::random(16) . '-' . $image->getClientOriginalName(); $image_path = Str::random(16) . '-' . $image->getClientOriginalName();
@@ -248,11 +255,18 @@ function store_avatar($image)
/** /**
* Store system image * Store system image
* *
* @param $image * @param $request
* @param $name
* @return string * @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 // Store avatar
$filename = Str::random(8) . '-' . str_replace(' ', '', $image->getClientOriginalName()); $filename = Str::random(8) . '-' . str_replace(' ', '', $image->getClientOriginalName());

View File

@@ -27,6 +27,7 @@ class StoreAppSetupRequest extends FormRequest
'title' => 'required|string', 'title' => 'required|string',
'description' => 'required|string', 'description' => 'required|string',
'logo' => 'sometimes|file', 'logo' => 'sometimes|file',
'logo_horizontal' => 'sometimes|file',
'favicon' => 'sometimes|file', 'favicon' => 'sometimes|file',
'contactMail' => 'required|email', 'contactMail' => 'required|email',
'googleAnalytics' => 'sometimes|string', 'googleAnalytics' => 'sometimes|string',

View File

@@ -10,7 +10,7 @@ class Setting extends Model
use HasFactory; use HasFactory;
protected $fillable = [ protected $fillable = [
'value', 'value', 'name'
]; ];
public $timestamps = false; public $timestamps = false;

View File

@@ -2,12 +2,10 @@
use App\Http\Controllers\General\SetupWizardController; use App\Http\Controllers\General\SetupWizardController;
// TODO: testy
Route::post('/purchase-code', [SetupWizardController::class, 'verify_purchase_code']); Route::post('/purchase-code', [SetupWizardController::class, 'verify_purchase_code']);
Route::post('/database', [SetupWizardController::class, 'setup_database']); Route::post('/database', [SetupWizardController::class, 'setup_database']);
Route::post('/stripe-credentials', [SetupWizardController::class, 'store_stripe_credentials']); Route::post('/stripe-credentials', [SetupWizardController::class, 'store_stripe_credentials']);
Route::post('/stripe-billings', [SetupWizardController::class, 'store_stripe_billings']); Route::post('/stripe-billings', [SetupWizardController::class, 'store_stripe_billings']);
Route::post('/stripe-plans', [SetupWizardController::class, 'store_stripe_plans']); Route::post('/stripe-plans', [SetupWizardController::class, 'store_stripe_plans']);
Route::post('/environment-setup', [SetupWizardController::class, 'store_environment_setup']); Route::post('/environment-setup', [SetupWizardController::class, 'store_environment_setup']);
Route::post('/app-setup', [SetupWizardController::class, 'store_app_settings']); Route::post('/app-setup', [SetupWizardController::class, 'store_app_settings']);
Route::post('/admin-setup', [SetupWizardController::class, 'create_admin_account']);

View File

@@ -3,10 +3,12 @@
use App\Http\Controllers\Admin\InvoiceController; use App\Http\Controllers\Admin\InvoiceController;
use App\Http\Controllers\AppFunctionsController; use App\Http\Controllers\AppFunctionsController;
use App\Http\Controllers\FileAccessController; use App\Http\Controllers\FileAccessController;
use App\Http\Controllers\General\SetupWizardController;
use App\Http\Controllers\Sharing\FileSharingController; use App\Http\Controllers\Sharing\FileSharingController;
use App\Http\Controllers\WebhookController; use App\Http\Controllers\WebhookController;
Route::post('/stripe/webhook', [WebhookController::class, 'handleWebhook']); Route::post('/stripe/webhook', [WebhookController::class, 'handleWebhook']);
Route::post('/admin-setup', [SetupWizardController::class, 'create_admin_account']);
// App public files // App public files
// TODO: testy // TODO: testy

View File

@@ -2,18 +2,44 @@
namespace Tests\Feature; namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase; use App\Models\Setting;
use Illuminate\Foundation\Testing\WithFaker; 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; use Tests\TestCase;
class SetupWizardTest extends TestCase class SetupWizardTest extends TestCase
{ {
use DatabaseMigrations;
/** /**
* @test * @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() 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() 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() 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() 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 * @test
*/ */
public function it_store_app_settings() 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() 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',
]);
} }
} }