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
if ($request->hasFile('avatar')) {
$avatar = store_avatar($request->file('avatar'));
$avatar = store_avatar($request, 'avatar');
}
// Create user

View File

@@ -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) {

View File

@@ -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);

View File

@@ -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);

View File

@@ -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());

View File

@@ -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',

View File

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

View File

@@ -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']);
Route::post('/app-setup', [SetupWizardController::class, 'store_app_settings']);

View File

@@ -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

View File

@@ -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',
]);
}
}