Merge remote-tracking branch 'origin/develop'

This commit is contained in:
snipe 2024-03-21 18:03:19 +00:00
commit a6a0bfacc2
52 changed files with 59 additions and 157 deletions

View file

@ -661,7 +661,17 @@ class UsersController extends Controller
$user = User::find($request->get('id')); $user = User::find($request->get('id'));
$user->two_factor_secret = null; $user->two_factor_secret = null;
$user->two_factor_enrolled = 0; $user->two_factor_enrolled = 0;
$user->save(); $user->saveQuietly();
// Log the reset
$logaction = new Actionlog();
$logaction->target_type = User::class;
$logaction->target_id = $user->id;
$logaction->item_type = User::class;
$logaction->item_id = $user->id;
$logaction->created_at = date('Y-m-d H:i:s');
$logaction->user_id = Auth::user()->id;
$logaction->logaction('2FA reset');
return response()->json(['message' => trans('admin/settings/general.two_factor_reset_success')], 200); return response()->json(['message' => trans('admin/settings/general.two_factor_reset_success')], 200);
} catch (\Exception $e) { } catch (\Exception $e) {

View file

@ -102,6 +102,10 @@ class AssetsController extends Controller
{ {
$this->authorize(Asset::class); $this->authorize(Asset::class);
// There are a lot more rules to add here but prevents
// errors around `asset_tags` not being present below.
$this->validate($request, ['asset_tags' => ['required', 'array']]);
// Handle asset tags - there could be one, or potentially many. // Handle asset tags - there could be one, or potentially many.
// This is only necessary on create, not update, since bulk editing is handled // This is only necessary on create, not update, since bulk editing is handled
// differently // differently

View file

@ -260,7 +260,7 @@ class CustomFieldsController extends Controller
$field->name = trim(e($request->get("name"))); $field->name = trim(e($request->get("name")));
$field->element = e($request->get("element")); $field->element = e($request->get("element"));
$field->field_values = e($request->get("field_values")); $field->field_values = $request->get("field_values");
$field->user_id = Auth::id(); $field->user_id = Auth::id();
$field->help_text = $request->get("help_text"); $field->help_text = $request->get("help_text");
$field->show_in_email = $show_in_email; $field->show_in_email = $show_in_email;

View file

@ -42,6 +42,10 @@ class ActionlogPresenter extends Presenter
// User related icons // User related icons
if ($this->itemType() == 'user') { if ($this->itemType() == 'user') {
if ($this->actionType()=='2fa reset') {
return 'fa-solid fa-mobile-screen';
}
if ($this->actionType()=='create new') { if ($this->actionType()=='create new') {
return 'fa-solid fa-user-plus'; return 'fa-solid fa-user-plus';
} }
@ -61,6 +65,7 @@ class ActionlogPresenter extends Presenter
if ($this->actionType()=='update') { if ($this->actionType()=='update') {
return 'fa-solid fa-user-pen'; return 'fa-solid fa-user-pen';
} }
return 'fa-solid fa-user'; return 'fa-solid fa-user';
} }

View file

@ -261,7 +261,7 @@ return [
'two_factor_enrollment' => 'Two-Factor Enrollment', 'two_factor_enrollment' => 'Two-Factor Enrollment',
'two_factor_enabled_text' => 'Enable Two Factor', 'two_factor_enabled_text' => 'Enable Two Factor',
'two_factor_reset' => 'Reset Two-Factor Secret', 'two_factor_reset' => 'Reset Two-Factor Secret',
'two_factor_reset_help' => 'This will force the user to enroll their device with Google Authenticator again. This can be useful if their currently enrolled device is lost or stolen. ', 'two_factor_reset_help' => 'This will force the user to enroll their device with their authenticator app again. This can be useful if their currently enrolled device is lost or stolen. ',
'two_factor_reset_success' => 'Two factor device successfully reset', 'two_factor_reset_success' => 'Two factor device successfully reset',
'two_factor_reset_error' => 'Two factor device reset failed', 'two_factor_reset_error' => 'Two factor device reset failed',
'two_factor_enabled_warning' => 'Enabling two-factor if it is not currently enabled will immediately force you to authenticate with a Google Auth enrolled device. You will have the ability to enroll your device if one is not currently enrolled.', 'two_factor_enabled_warning' => 'Enabling two-factor if it is not currently enabled will immediately force you to authenticate with a Google Auth enrolled device. You will have the ability to enroll your device if one is not currently enrolled.',

View file

@ -1,6 +1,7 @@
<?php <?php
return [ return [
'2FA_reset' => '2FA reset',
'accessories' => 'Accessories', 'accessories' => 'Accessories',
'activated' => 'Activated', 'activated' => 'Activated',
'accepted_date' => 'Date Accepted', 'accepted_date' => 'Date Accepted',

View file

@ -9,7 +9,7 @@
<!-- Listbox --> <!-- Listbox -->
@if ($field->element=='listbox') @if ($field->element=='listbox')
{{ Form::select($field->db_column_name(), $field->formatFieldValuesAsArray(), {{ Form::select($field->db_column_name(), $field->formatFieldValuesAsArray(),
Request::old($field->db_column_name(),(isset($item) ? Helper::gracefulDecrypt($field, htmlspecialchars($item->{$field->db_column_name()}, ENT_QUOTES)) : $field->defaultValue($model->id))), ['class'=>'format select2 form-control']) }} Request::old($field->db_column_name(),(isset($item) ? Helper::gracefulDecrypt($field, $item->{$field->db_column_name()}) : $field->defaultValue($model->id))), ['class'=>'format select2 form-control']) }}
@elseif ($field->element=='textarea') @elseif ($field->element=='textarea')
<textarea class="col-md-6 form-control" id="{{ $field->db_column_name() }}" name="{{ $field->db_column_name() }}">{{ Request::old($field->db_column_name(),(isset($item) ? Helper::gracefulDecrypt($field, $item->{$field->db_column_name()}) : $field->defaultValue($model->id))) }}</textarea> <textarea class="col-md-6 form-control" id="{{ $field->db_column_name() }}" name="{{ $field->db_column_name() }}">{{ Request::old($field->db_column_name(),(isset($item) ? Helper::gracefulDecrypt($field, $item->{$field->db_column_name()}) : $field->defaultValue($model->id))) }}</textarea>

View file

@ -25,7 +25,7 @@
<!-- Listbox --> <!-- Listbox -->
@if ($field->element=='listbox') @if ($field->element=='listbox')
{{ Form::select($field->db_column_name(), $field->formatFieldValuesAsArray(), {{ Form::select($field->db_column_name(), $field->formatFieldValuesAsArray(),
Request::old($field->db_column_name(),(isset($item) ? Helper::gracefulDecrypt($field, htmlspecialchars($item->{$field->db_column_name()}, ENT_QUOTES)) : $field->defaultValue($model->id))), ['class'=>'format select2 form-control']) }} Request::old($field->db_column_name(),(isset($item) ? Helper::gracefulDecrypt($field, $item->{$field->db_column_name()}) : $field->defaultValue($model->id))), ['class'=>'format select2 form-control']) }}
@elseif ($field->element=='textarea') @elseif ($field->element=='textarea')
@if($field->is_unique) @if($field->is_unique)

View file

@ -499,6 +499,7 @@
</div> </div>
@endif @endif
@if ((Auth::user()->isSuperUser()) && ($user->two_factor_active_and_enrolled()) && ($snipeSettings->two_factor_enabled!='0') && ($snipeSettings->two_factor_enabled!=''))
<!-- Reset Two Factor --> <!-- Reset Two Factor -->
<div class="form-group"> <div class="form-group">
<div class="col-md-8 col-md-offset-3 two_factor_resetrow"> <div class="col-md-8 col-md-offset-3 two_factor_resetrow">
@ -513,6 +514,8 @@
</div> </div>
@endif @endif
@endif
<!-- Groups --> <!-- Groups -->
<div class="form-group{{ $errors->has('groups') ? ' has-error' : '' }}"> <div class="form-group{{ $errors->has('groups') ? ' has-error' : '' }}">
<label class="col-md-3 control-label" for="groups[]"> {{ trans('general.groups') }}</label> <label class="col-md-3 control-label" for="groups[]"> {{ trans('general.groups') }}</label>
@ -702,7 +705,7 @@ $(document).ready(function() {
$("#two_factor_resetrow").removeClass('success'); $("#two_factor_resetrow").removeClass('success');
$("#two_factor_resetrow").removeClass('danger'); $("#two_factor_resetrow").removeClass('danger');
$("#two_factor_resetstatus").html(''); $("#two_factor_resetstatus").html('');
$("#two_factor_reseticon").html('<i class="fas fa-spinner spin"></i>'); $("#two_factor_reseticon").html('<i class="fas fa-spinner spin"></i> ');
$.ajax({ $.ajax({
url: '{{ route('api.users.two_factor_reset', ['id'=> $user->id]) }}', url: '{{ route('api.users.two_factor_reset', ['id'=> $user->id]) }}',
type: 'POST', type: 'POST',
@ -715,13 +718,12 @@ $(document).ready(function() {
success: function (data) { success: function (data) {
$("#two_factor_reseticon").html(''); $("#two_factor_reseticon").html('');
$("#two_factor_resetstatus").html('<i class="fas fa-check text-success"></i>' + data.message); $("#two_factor_resetstatus").html('<span class="text-success"><i class="fas fa-check"></i> ' + data.message + '</span>');
}, },
error: function (data) { error: function (data) {
$("#two_factor_reseticon").html(''); $("#two_factor_reseticon").html('');
$("#two_factor_reseticon").html('<i class="fas fa-exclamation-triangle text-danger"></i>'); $("#two_factor_resetstatus").html('<span class="text-danger"><i class="fas fa-exclamation-triangle text-danger"></i> ' + data.message + '</span>');
$('#two_factor_resetstatus').text(data.message);
} }

View file

@ -597,7 +597,7 @@
</div> </div>
</div> </div>
@if ((Auth::user()->isSuperUser()) && ($snipeSettings->two_factor_enabled!='0') && ($snipeSettings->two_factor_enabled!='')) @if ((Auth::user()->isSuperUser()) && ($user->two_factor_active_and_enrolled()) && ($snipeSettings->two_factor_enabled!='0') && ($snipeSettings->two_factor_enabled!=''))
<!-- 2FA reset --> <!-- 2FA reset -->
<div class="row"> <div class="row">

View file

@ -7,13 +7,10 @@ use App\Models\Actionlog;
use App\Models\User; use App\Models\User;
use App\Notifications\CheckoutAccessoryNotification; use App\Notifications\CheckoutAccessoryNotification;
use Illuminate\Support\Facades\Notification; use Illuminate\Support\Facades\Notification;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class AccessoryCheckoutTest extends TestCase class AccessoryCheckoutTest extends TestCase
{ {
use InteractsWithSettings;
public function testCheckingOutAccessoryRequiresCorrectPermission() public function testCheckingOutAccessoryRequiresCorrectPermission()
{ {
$this->actingAsForApi(User::factory()->create()) $this->actingAsForApi(User::factory()->create())

View file

@ -11,13 +11,10 @@ use App\Models\Statuslabel;
use App\Models\User; use App\Models\User;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Event; use Illuminate\Support\Facades\Event;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class AssetCheckinTest extends TestCase class AssetCheckinTest extends TestCase
{ {
use InteractsWithSettings;
public function testCheckingInAssetRequiresCorrectPermission() public function testCheckingInAssetRequiresCorrectPermission()
{ {
$this->actingAsForApi(User::factory()->create()) $this->actingAsForApi(User::factory()->create())

View file

@ -6,13 +6,10 @@ use App\Models\Asset;
use App\Models\Company; use App\Models\Company;
use App\Models\User; use App\Models\User;
use Illuminate\Testing\Fluent\AssertableJson; use Illuminate\Testing\Fluent\AssertableJson;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class AssetIndexTest extends TestCase class AssetIndexTest extends TestCase
{ {
use InteractsWithSettings;
public function testAssetIndexReturnsExpectedAssets() public function testAssetIndexReturnsExpectedAssets()
{ {
Asset::factory()->count(3)->create(); Asset::factory()->count(3)->create();

View file

@ -9,15 +9,11 @@ use App\Models\Location;
use App\Models\Statuslabel; use App\Models\Statuslabel;
use App\Models\Supplier; use App\Models\Supplier;
use App\Models\User; use App\Models\User;
use Carbon\Carbon;
use Illuminate\Testing\Fluent\AssertableJson; use Illuminate\Testing\Fluent\AssertableJson;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class AssetStoreTest extends TestCase class AssetStoreTest extends TestCase
{ {
use InteractsWithSettings;
public function testRequiresPermissionToCreateAsset() public function testRequiresPermissionToCreateAsset()
{ {
$this->actingAsForApi(User::factory()->create()) $this->actingAsForApi(User::factory()->create())

View file

@ -5,13 +5,10 @@ namespace Tests\Feature\Api\Assets;
use App\Models\Asset; use App\Models\Asset;
use App\Models\Company; use App\Models\Company;
use App\Models\User; use App\Models\User;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class AssetsForSelectListTest extends TestCase class AssetsForSelectListTest extends TestCase
{ {
use InteractsWithSettings;
public function testAssetsCanBeSearchedForByAssetTag() public function testAssetsCanBeSearchedForByAssetTag()
{ {
Asset::factory()->create(['asset_tag' => '0001']); Asset::factory()->create(['asset_tag' => '0001']);

View file

@ -5,13 +5,10 @@ namespace Tests\Feature\Api\Assets;
use App\Models\Asset; use App\Models\Asset;
use App\Models\Company; use App\Models\Company;
use App\Models\User; use App\Models\User;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class RequestableAssetsTest extends TestCase class RequestableAssetsTest extends TestCase
{ {
use InteractsWithSettings;
public function testViewingRequestableAssetsRequiresCorrectPermission() public function testViewingRequestableAssetsRequiresCorrectPermission()
{ {
$this->actingAsForApi(User::factory()->create()) $this->actingAsForApi(User::factory()->create())

View file

@ -5,13 +5,10 @@ namespace Tests\Feature\Api\Components;
use App\Models\Company; use App\Models\Company;
use App\Models\Component; use App\Models\Component;
use App\Models\User; use App\Models\User;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class ComponentIndexTest extends TestCase class ComponentIndexTest extends TestCase
{ {
use InteractsWithSettings;
public function testComponentIndexAdheresToCompanyScoping() public function testComponentIndexAdheresToCompanyScoping()
{ {
[$companyA, $companyB] = Company::factory()->count(2)->create(); [$companyA, $companyB] = Company::factory()->count(2)->create();

View file

@ -7,13 +7,10 @@ use App\Models\Consumable;
use App\Models\User; use App\Models\User;
use App\Notifications\CheckoutConsumableNotification; use App\Notifications\CheckoutConsumableNotification;
use Illuminate\Support\Facades\Notification; use Illuminate\Support\Facades\Notification;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class ConsumableCheckoutTest extends TestCase class ConsumableCheckoutTest extends TestCase
{ {
use InteractsWithSettings;
public function testCheckingOutConsumableRequiresCorrectPermission() public function testCheckingOutConsumableRequiresCorrectPermission()
{ {
$this->actingAsForApi(User::factory()->create()) $this->actingAsForApi(User::factory()->create())

View file

@ -5,13 +5,10 @@ namespace Tests\Feature\Api\Consumables;
use App\Models\Company; use App\Models\Company;
use App\Models\Consumable; use App\Models\Consumable;
use App\Models\User; use App\Models\User;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class ConsumablesIndexTest extends TestCase class ConsumablesIndexTest extends TestCase
{ {
use InteractsWithSettings;
public function testConsumableIndexAdheresToCompanyScoping() public function testConsumableIndexAdheresToCompanyScoping()
{ {
[$companyA, $companyB] = Company::factory()->count(2)->create(); [$companyA, $companyB] = Company::factory()->count(2)->create();

View file

@ -5,15 +5,11 @@ namespace Tests\Feature\Api\Departments;
use App\Models\Company; use App\Models\Company;
use App\Models\Department; use App\Models\Department;
use App\Models\User; use App\Models\User;
use Illuminate\Routing\Route;
use Illuminate\Testing\Fluent\AssertableJson; use Illuminate\Testing\Fluent\AssertableJson;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class DepartmentIndexTest extends TestCase class DepartmentIndexTest extends TestCase
{ {
use InteractsWithSettings;
public function testViewingDepartmentIndexRequiresAuthentication() public function testViewingDepartmentIndexRequiresAuthentication()
{ {
$this->getJson(route('api.departments.index'))->assertRedirect(); $this->getJson(route('api.departments.index'))->assertRedirect();

View file

@ -4,13 +4,10 @@ namespace Tests\Feature\Api\Groups;
use App\Models\Group; use App\Models\Group;
use App\Models\User; use App\Models\User;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class GroupStoreTest extends TestCase class GroupStoreTest extends TestCase
{ {
use InteractsWithSettings;
public function testStoringGroupRequiresSuperAdminPermission() public function testStoringGroupRequiresSuperAdminPermission()
{ {
$this->actingAsForApi(User::factory()->create()) $this->actingAsForApi(User::factory()->create())

View file

@ -5,13 +5,10 @@ namespace Tests\Feature\Api\Licenses;
use App\Models\Company; use App\Models\Company;
use App\Models\License; use App\Models\License;
use App\Models\User; use App\Models\User;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class LicensesIndexTest extends TestCase class LicensesIndexTest extends TestCase
{ {
use InteractsWithSettings;
public function testLicensesIndexAdheresToCompanyScoping() public function testLicensesIndexAdheresToCompanyScoping()
{ {
[$companyA, $companyB] = Company::factory()->count(2)->create(); [$companyA, $companyB] = Company::factory()->count(2)->create();

View file

@ -5,13 +5,10 @@ namespace Tests\Feature\Api\Locations;
use App\Models\Location; use App\Models\Location;
use App\Models\User; use App\Models\User;
use Illuminate\Testing\Fluent\AssertableJson; use Illuminate\Testing\Fluent\AssertableJson;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class LocationsForSelectListTest extends TestCase class LocationsForSelectListTest extends TestCase
{ {
use InteractsWithSettings;
public function testGettingLocationListRequiresProperPermission() public function testGettingLocationListRequiresProperPermission()
{ {
$this->actingAsForApi(User::factory()->create()) $this->actingAsForApi(User::factory()->create())

View file

@ -3,13 +3,10 @@
namespace Tests\Feature\Api\Users; namespace Tests\Feature\Api\Users;
use App\Models\User; use App\Models\User;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class UpdateUserApiTest extends TestCase class UpdateUserApiTest extends TestCase
{ {
use InteractsWithSettings;
public function testApiUsersCanBeActivatedWithNumber() public function testApiUsersCanBeActivatedWithNumber()
{ {
$admin = User::factory()->superuser()->create(); $admin = User::factory()->superuser()->create();

View file

@ -6,13 +6,10 @@ use App\Models\Company;
use App\Models\User; use App\Models\User;
use Illuminate\Testing\Fluent\AssertableJson; use Illuminate\Testing\Fluent\AssertableJson;
use Laravel\Passport\Passport; use Laravel\Passport\Passport;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class UsersForSelectListTest extends TestCase class UsersForSelectListTest extends TestCase
{ {
use InteractsWithSettings;
public function testUsersAreReturned() public function testUsersAreReturned()
{ {
$users = User::factory()->superuser()->count(3)->create(); $users = User::factory()->superuser()->count(3)->create();

View file

@ -5,13 +5,10 @@ namespace Tests\Feature\Api\Users;
use App\Models\Company; use App\Models\Company;
use App\Models\User; use App\Models\User;
use Laravel\Passport\Passport; use Laravel\Passport\Passport;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class UsersSearchTest extends TestCase class UsersSearchTest extends TestCase
{ {
use InteractsWithSettings;
public function testCanSearchByUserFirstAndLastName() public function testCanSearchByUserFirstAndLastName()
{ {
User::factory()->create(['first_name' => 'Luke', 'last_name' => 'Skywalker']); User::factory()->create(['first_name' => 'Luke', 'last_name' => 'Skywalker']);

View file

@ -8,13 +8,10 @@ use App\Models\Group;
use App\Models\Location; use App\Models\Location;
use App\Models\User; use App\Models\User;
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Hash;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class UsersUpdateTest extends TestCase class UsersUpdateTest extends TestCase
{ {
use InteractsWithSettings;
public function testCanUpdateUserViaPatch() public function testCanUpdateUserViaPatch()
{ {
$admin = User::factory()->superuser()->create(); $admin = User::factory()->superuser()->create();

View file

@ -8,13 +8,10 @@ use App\Models\User;
use App\Notifications\CheckinAccessoryNotification; use App\Notifications\CheckinAccessoryNotification;
use Illuminate\Support\Facades\Event; use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Notification; use Illuminate\Support\Facades\Notification;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class AccessoryCheckinTest extends TestCase class AccessoryCheckinTest extends TestCase
{ {
use InteractsWithSettings;
public function testCheckingInAccessoryRequiresCorrectPermission() public function testCheckingInAccessoryRequiresCorrectPermission()
{ {
$accessory = Accessory::factory()->checkedOutToUser()->create(); $accessory = Accessory::factory()->checkedOutToUser()->create();

View file

@ -11,13 +11,10 @@ use App\Models\Statuslabel;
use App\Models\User; use App\Models\User;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Event; use Illuminate\Support\Facades\Event;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class AssetCheckinTest extends TestCase class AssetCheckinTest extends TestCase
{ {
use InteractsWithSettings;
public function testCheckingInAssetRequiresCorrectPermission() public function testCheckingInAssetRequiresCorrectPermission()
{ {
$this->actingAs(User::factory()->create()) $this->actingAs(User::factory()->create())

View file

@ -7,13 +7,10 @@ use App\Models\CheckoutAcceptance;
use App\Notifications\AcceptanceAssetAcceptedNotification; use App\Notifications\AcceptanceAssetAcceptedNotification;
use App\Notifications\AcceptanceAssetDeclinedNotification; use App\Notifications\AcceptanceAssetDeclinedNotification;
use Notification; use Notification;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class AccessoryAcceptanceTest extends TestCase class AccessoryAcceptanceTest extends TestCase
{ {
use InteractsWithSettings;
/** /**
* This can be absorbed into a bigger test * This can be absorbed into a bigger test
*/ */

View file

@ -7,13 +7,10 @@ use App\Models\Actionlog;
use App\Models\User; use App\Models\User;
use App\Notifications\CheckoutAccessoryNotification; use App\Notifications\CheckoutAccessoryNotification;
use Illuminate\Support\Facades\Notification; use Illuminate\Support\Facades\Notification;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class AccessoryCheckoutTest extends TestCase class AccessoryCheckoutTest extends TestCase
{ {
use InteractsWithSettings;
public function testCheckingOutAccessoryRequiresCorrectPermission() public function testCheckingOutAccessoryRequiresCorrectPermission()
{ {
$this->actingAs(User::factory()->create()) $this->actingAs(User::factory()->create())

View file

@ -7,13 +7,10 @@ use App\Models\Consumable;
use App\Models\User; use App\Models\User;
use App\Notifications\CheckoutConsumableNotification; use App\Notifications\CheckoutConsumableNotification;
use Illuminate\Support\Facades\Notification; use Illuminate\Support\Facades\Notification;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class ConsumableCheckoutTest extends TestCase class ConsumableCheckoutTest extends TestCase
{ {
use InteractsWithSettings;
public function testCheckingOutConsumableRequiresCorrectPermission() public function testCheckingOutConsumableRequiresCorrectPermission()
{ {
$this->actingAs(User::factory()->create()) $this->actingAs(User::factory()->create())

View file

@ -6,13 +6,10 @@ use App\Models\Asset;
use App\Models\License; use App\Models\License;
use App\Models\LicenseSeat; use App\Models\LicenseSeat;
use App\Models\User; use App\Models\User;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class LicenseCheckoutTest extends TestCase class LicenseCheckoutTest extends TestCase
{ {
use InteractsWithSettings;
public function testNotesAreStoredInActionLogOnCheckoutToAsset() public function testNotesAreStoredInActionLogOnCheckoutToAsset()
{ {
$admin = User::factory()->superuser()->create(); $admin = User::factory()->superuser()->create();

View file

@ -3,13 +3,10 @@
namespace Tests\Feature; namespace Tests\Feature;
use App\Models\User; use App\Models\User;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class DashboardTest extends TestCase class DashboardTest extends TestCase
{ {
use InteractsWithSettings;
public function testUsersWithoutAdminAccessAreRedirected() public function testUsersWithoutAdminAccessAreRedirected()
{ {
$this->actingAs(User::factory()->create()) $this->actingAs(User::factory()->create())

View file

@ -7,7 +7,6 @@ use App\Models\Asset;
use App\Models\User; use App\Models\User;
use App\Notifications\CheckinAssetNotification; use App\Notifications\CheckinAssetNotification;
use Illuminate\Support\Facades\Notification; use Illuminate\Support\Facades\Notification;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
/** /**
@ -15,8 +14,6 @@ use Tests\TestCase;
*/ */
class EmailNotificationsUponCheckinTest extends TestCase class EmailNotificationsUponCheckinTest extends TestCase
{ {
use InteractsWithSettings;
protected function setUp(): void protected function setUp(): void
{ {
parent::setUp(); parent::setUp();

View file

@ -14,7 +14,6 @@ use App\Notifications\CheckinAssetNotification;
use App\Notifications\CheckinLicenseSeatNotification; use App\Notifications\CheckinLicenseSeatNotification;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Notification; use Illuminate\Support\Facades\Notification;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
/** /**
@ -22,8 +21,6 @@ use Tests\TestCase;
*/ */
class SlackNotificationsUponCheckinTest extends TestCase class SlackNotificationsUponCheckinTest extends TestCase
{ {
use InteractsWithSettings;
protected function setUp(): void protected function setUp(): void
{ {
parent::setUp(); parent::setUp();

View file

@ -16,7 +16,6 @@ use App\Notifications\CheckoutConsumableNotification;
use App\Notifications\CheckoutLicenseSeatNotification; use App\Notifications\CheckoutLicenseSeatNotification;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Notification; use Illuminate\Support\Facades\Notification;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
/** /**
@ -24,8 +23,6 @@ use Tests\TestCase;
*/ */
class SlackNotificationsUponCheckoutTest extends TestCase class SlackNotificationsUponCheckoutTest extends TestCase
{ {
use InteractsWithSettings;
protected function setUp(): void protected function setUp(): void
{ {
parent::setUp(); parent::setUp();

View file

@ -8,14 +8,10 @@ use App\Models\User;
use Illuminate\Testing\TestResponse; use Illuminate\Testing\TestResponse;
use League\Csv\Reader; use League\Csv\Reader;
use PHPUnit\Framework\Assert; use PHPUnit\Framework\Assert;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class CustomReportTest extends TestCase class CustomReportTest extends TestCase
{ {
use InteractsWithSettings;
protected function setUp(): void protected function setUp(): void
{ {
parent::setUp(); parent::setUp();

View file

@ -3,13 +3,10 @@
namespace Tests\Feature\Users; namespace Tests\Feature\Users;
use App\Models\User; use App\Models\User;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class UpdateUserTest extends TestCase class UpdateUserTest extends TestCase
{ {
use InteractsWithSettings;
public function testUsersCanBeActivatedWithNumber() public function testUsersCanBeActivatedWithNumber()
{ {
$admin = User::factory()->superuser()->create(); $admin = User::factory()->superuser()->create();

View file

@ -4,7 +4,7 @@ namespace Tests\Support;
use App\Models\Setting; use App\Models\Setting;
trait InteractsWithSettings trait InitializesSettings
{ {
protected Settings $settings; protected Settings $settings;

View file

@ -9,7 +9,7 @@ use RuntimeException;
use Tests\Support\AssertsAgainstSlackNotifications; use Tests\Support\AssertsAgainstSlackNotifications;
use Tests\Support\CustomTestMacros; use Tests\Support\CustomTestMacros;
use Tests\Support\InteractsWithAuthentication; use Tests\Support\InteractsWithAuthentication;
use Tests\Support\InteractsWithSettings; use Tests\Support\InitializesSettings;
abstract class TestCase extends BaseTestCase abstract class TestCase extends BaseTestCase
{ {
@ -17,6 +17,7 @@ abstract class TestCase extends BaseTestCase
use CreatesApplication; use CreatesApplication;
use CustomTestMacros; use CustomTestMacros;
use InteractsWithAuthentication; use InteractsWithAuthentication;
use InitializesSettings;
use LazilyRefreshDatabase; use LazilyRefreshDatabase;
private array $globallyDisabledMiddleware = [ private array $globallyDisabledMiddleware = [
@ -25,20 +26,23 @@ abstract class TestCase extends BaseTestCase
protected function setUp(): void protected function setUp(): void
{ {
if (!file_exists(realpath(__DIR__ . '/../') . '/.env.testing')) { $this->guardAgainstMissingEnv();
throw new RuntimeException(
'.env.testing file does not exist. Aborting to avoid wiping your local database'
);
}
parent::setUp(); parent::setUp();
$this->registerCustomMacros();
$this->withoutMiddleware($this->globallyDisabledMiddleware); $this->withoutMiddleware($this->globallyDisabledMiddleware);
if (collect(class_uses_recursive($this))->contains(InteractsWithSettings::class)) {
$this->initializeSettings(); $this->initializeSettings();
} }
$this->registerCustomMacros(); private function guardAgainstMissingEnv(): void
{
if (!file_exists(realpath(__DIR__ . '/../') . '/.env.testing')) {
throw new RuntimeException(
'.env.testing file does not exist. Aborting to avoid wiping your local database.'
);
}
} }
} }

View file

@ -2,14 +2,10 @@
namespace Tests\Unit; namespace Tests\Unit;
use App\Models\AssetMaintenance; use App\Models\AssetMaintenance;
use Carbon\Carbon;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class AssetMaintenanceTest extends TestCase class AssetMaintenanceTest extends TestCase
{ {
use InteractsWithSettings;
public function testZerosOutWarrantyIfBlank() public function testZerosOutWarrantyIfBlank()
{ {
$c = new AssetMaintenance; $c = new AssetMaintenance;

View file

@ -4,13 +4,10 @@ namespace Tests\Unit;
use App\Models\Asset; use App\Models\Asset;
use App\Models\Category; use App\Models\Category;
use App\Models\AssetModel; use App\Models\AssetModel;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class AssetModelTest extends TestCase class AssetModelTest extends TestCase
{ {
use InteractsWithSettings;
public function testAnAssetModelContainsAssets() public function testAnAssetModelContainsAssets()
{ {
$category = Category::factory()->create([ $category = Category::factory()->create([

View file

@ -5,13 +5,10 @@ use App\Models\Asset;
use App\Models\AssetModel; use App\Models\AssetModel;
use App\Models\Category; use App\Models\Category;
use Carbon\Carbon; use Carbon\Carbon;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class AssetTest extends TestCase class AssetTest extends TestCase
{ {
use InteractsWithSettings;
public function testAutoIncrement() public function testAutoIncrement()
{ {
$this->settings->enableAutoIncrement(); $this->settings->enableAutoIncrement();

View file

@ -4,13 +4,10 @@ namespace Tests\Unit;
use App\Models\Category; use App\Models\Category;
use App\Models\AssetModel; use App\Models\AssetModel;
use App\Models\Asset; use App\Models\Asset;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class CategoryTest extends TestCase class CategoryTest extends TestCase
{ {
use InteractsWithSettings;
public function testFailsEmptyValidation() public function testFailsEmptyValidation()
{ {
// An Asset requires a name, a qty, and a category_id. // An Asset requires a name, a qty, and a category_id.

View file

@ -12,13 +12,10 @@ use App\Models\License;
use App\Models\LicenseSeat; use App\Models\LicenseSeat;
use App\Models\User; use App\Models\User;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class CompanyScopingTest extends TestCase class CompanyScopingTest extends TestCase
{ {
use InteractsWithSettings;
public function models(): array public function models(): array
{ {
return [ return [

View file

@ -5,13 +5,10 @@ use App\Models\Category;
use App\Models\Company; use App\Models\Company;
use App\Models\Component; use App\Models\Component;
use App\Models\Location; use App\Models\Location;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class ComponentTest extends TestCase class ComponentTest extends TestCase
{ {
use InteractsWithSettings;
public function testAComponentBelongsToACompany() public function testAComponentBelongsToACompany()
{ {
$component = Component::factory() $component = Component::factory()

View file

@ -5,13 +5,10 @@ use App\Models\Depreciation;
use App\Models\Category; use App\Models\Category;
use App\Models\License; use App\Models\License;
use App\Models\AssetModel; use App\Models\AssetModel;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class DepreciationTest extends TestCase class DepreciationTest extends TestCase
{ {
use InteractsWithSettings;
public function testADepreciationHasModels() public function testADepreciationHasModels()
{ {
$depreciation = Depreciation::factory()->create(); $depreciation = Depreciation::factory()->create();

View file

@ -3,8 +3,6 @@
namespace Tests\Unit; namespace Tests\Unit;
use App\Models\Ldap; use App\Models\Ldap;
use Exception;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
/** /**
@ -12,7 +10,6 @@ use Tests\TestCase;
*/ */
class LdapTest extends TestCase class LdapTest extends TestCase
{ {
use InteractsWithSettings;
use \phpmock\phpunit\PHPMock; use \phpmock\phpunit\PHPMock;
public function testConnect() public function testConnect()

View file

@ -4,13 +4,10 @@ namespace Tests\Unit\Models\Company;
use App\Models\Company; use App\Models\Company;
use App\Models\User; use App\Models\User;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class GetIdForCurrentUserTest extends TestCase class GetIdForCurrentUserTest extends TestCase
{ {
use InteractsWithSettings;
public function testReturnsProvidedValueWhenFullCompanySupportDisabled() public function testReturnsProvidedValueWhenFullCompanySupportDisabled()
{ {
$this->settings->disableMultipleFullCompanySupport(); $this->settings->disableMultipleFullCompanySupport();

View file

@ -8,13 +8,10 @@ use App\Models\Category;
use Carbon\Carbon; use Carbon\Carbon;
use App\Notifications\CheckoutAssetNotification; use App\Notifications\CheckoutAssetNotification;
use Illuminate\Support\Facades\Notification; use Illuminate\Support\Facades\Notification;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class NotificationTest extends TestCase class NotificationTest extends TestCase
{ {
use InteractsWithSettings;
public function testAUserIsEmailedIfTheyCheckoutAnAssetWithEULA() public function testAUserIsEmailedIfTheyCheckoutAnAssetWithEULA()
{ {
$admin = User::factory()->superuser()->create(); $admin = User::factory()->superuser()->create();

View file

@ -2,13 +2,10 @@
namespace Tests\Unit; namespace Tests\Unit;
use App\Models\SnipeModel; use App\Models\SnipeModel;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase; use Tests\TestCase;
class SnipeModelTest extends TestCase class SnipeModelTest extends TestCase
{ {
use InteractsWithSettings;
public function testSetsPurchaseDatesAppropriately() public function testSetsPurchaseDatesAppropriately()
{ {
$c = new SnipeModel; $c = new SnipeModel;