fixes conflicts

This commit is contained in:
Godfrey M 2023-08-15 09:28:42 -07:00
commit d1efca2ae1
96 changed files with 468 additions and 4571 deletions

View file

@ -20,10 +20,8 @@ on:
pipeline:
- name: Setup
cmd: |
cp -v .env.example .env
# This is simply to allow passing the guard in TestCase@setUp()
# https://chipperci.com/docs/builds/env
touch .env.testing
cp -v .env.testing.example .env
cp -v .env.testing.example .env.testing
composer install --no-interaction --prefer-dist --optimize-autoloader
- name: Generate Key
@ -36,15 +34,15 @@ pipeline:
- name: Run Migrations
cmd: |
# php artisan migrate --force
php artisan migrate --force
- name: PHPUnit Unit Tests
cmd: |
# php artisan test --testsuite Unit
php artisan test --testsuite Unit
- name: PHPUnit Feature Tests
cmd: |
# php artisan test --testsuite Feature
php artisan test --testsuite Feature
# - name: Browser Tests
# cmd: |

View file

@ -262,6 +262,10 @@ class LdapSync extends Command
if($ldap_result_dept != null){
$user->department_id = $department->id;
}
if($ldap_result_location != null){
$user->location_id = $location ? $location->id : null;
}
if($ldap_result_manager != null){
if($item['manager'] != null) {
// Check Cache first

View file

@ -131,7 +131,8 @@ class AccessoriesController extends Controller
// Check if the asset exists
if (is_null($accessory_to_clone = Accessory::find($accessoryId))) {
// Redirect to the asset management page
return redirect()->route('accessory.index')->with('error', trans('admin/accessories/message.does_not_exist'));
return redirect()->route('accessories.index')
->with('error', trans('admin/accessories/message.does_not_exist', ['id' => $accessoryId]));
}
$accessory = clone $accessory_to_clone;

View file

@ -590,7 +590,7 @@ class ReportsController extends Controller
$executionTime = microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'];
\Log::debug('Added headers: '.$executionTime);
$assets = \App\Models\Company::scopeCompanyables(Asset::select('assets.*'))->with(
$assets = Asset::select('assets.*')->with(
'location', 'assetstatus', 'company', 'defaultLoc', 'assignedTo',
'model.category', 'model.manufacturer', 'supplier');

View file

@ -0,0 +1,67 @@
<?php
namespace App\Http\Livewire;
use Livewire\Component;
class CategoryEditForm extends Component
{
public $defaultEulaText;
public $eulaText;
public $originalSendCheckInEmailValue;
public $requireAcceptance;
public $sendCheckInEmail;
public $useDefaultEula;
public function mount()
{
$this->originalSendCheckInEmailValue = $this->sendCheckInEmail;
if ($this->eulaText || $this->useDefaultEula) {
$this->sendCheckInEmail = 1;
}
}
public function render()
{
return view('livewire.category-edit-form');
}
public function updated($property, $value)
{
if (! in_array($property, ['eulaText', 'useDefaultEula'])) {
return;
}
$this->sendCheckInEmail = $this->eulaText || $this->useDefaultEula ? 1 : $this->originalSendCheckInEmailValue;
}
public function getShouldDisplayEmailMessageProperty(): bool
{
return $this->eulaText || $this->useDefaultEula;
}
public function getEmailMessageProperty(): string
{
if ($this->useDefaultEula) {
return trans('admin/categories/general.email_will_be_sent_due_to_global_eula');
}
return trans('admin/categories/general.email_will_be_sent_due_to_category_eula');
}
public function getEulaTextDisabledProperty()
{
return (bool)$this->useDefaultEula;
}
public function getSendCheckInEmailDisabledProperty()
{
return $this->eulaText || $this->useDefaultEula;
}
}

View file

@ -215,6 +215,7 @@ class Importer extends Component
'manufacturer' => trans('general.manufacturer'),
'order_number' => trans('general.order_number'),
'image' => trans('general.importer.image_filename'),
'asset_eol_date' => trans('admin/hardware/form.eol_date'),
/**
* Checkout fields:
* Assets can be checked out to other assets, people, or locations, but we currently

View file

@ -25,6 +25,7 @@ return [
'mailgun' => [
'domain' => env('MAILGUN_DOMAIN'),
'secret' => env('MAILGUN_SECRET'),
'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'),
],
'mandrill' => [

View file

@ -432,4 +432,13 @@ class UserFactory extends Factory
];
});
}
public function canViewReports()
{
return $this->state(function () {
return [
'permissions' => '{"reports.view":"1"}',
];
});
}
}

View file

@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class ChangeWebhookSettingsVariableType extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('settings', function (Blueprint $table) {
$table->text('webhook_endpoint')->change();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('settings', function (Blueprint $table) {
$table->varchar('webhook_endpoint')->change();
});
}
}

46
package-lock.json generated
View file

@ -1565,9 +1565,9 @@
}
},
"@types/eslint": {
"version": "8.44.0",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz",
"integrity": "sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==",
"version": "8.44.2",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz",
"integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==",
"requires": {
"@types/estree": "*",
"@types/json-schema": "*"
@ -15962,9 +15962,9 @@
}
},
"jspdf-autotable": {
"version": "3.5.25",
"resolved": "https://registry.npmjs.org/jspdf-autotable/-/jspdf-autotable-3.5.25.tgz",
"integrity": "sha512-BIbDd/cilRbVm5PmR+ZonolSqRtm0AvZDpTz+rrWed7BnFj5mqF7x7lkxDAMzPudLapktHUk6cxipcvUzal8cg=="
"version": "3.5.31",
"resolved": "https://registry.npmjs.org/jspdf-autotable/-/jspdf-autotable-3.5.31.tgz",
"integrity": "sha512-Lc1KuLGDQWW/5t57Z/+c2E94XQV3jV2QVU3xMRiwvcm/nMx79aCkpPCsxLzJZVFneZvz4XoA8+egQR1QajYiWw=="
},
"junk": {
"version": "3.1.0",
@ -19705,9 +19705,9 @@
}
},
"webpack": {
"version": "5.88.1",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz",
"integrity": "sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==",
"version": "5.88.2",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz",
"integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==",
"requires": {
"@types/eslint-scope": "^3.7.3",
"@types/estree": "^1.0.0",
@ -19736,22 +19736,22 @@
},
"dependencies": {
"@jridgewell/resolve-uri": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
"integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w=="
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
"integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA=="
},
"@jridgewell/sourcemap-codec": {
"version": "1.4.14",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
"integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
"version": "1.4.15",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
"integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
},
"@jridgewell/trace-mapping": {
"version": "0.3.18",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
"integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
"version": "0.3.19",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz",
"integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==",
"requires": {
"@jridgewell/resolve-uri": "3.1.0",
"@jridgewell/sourcemap-codec": "1.4.14"
"@jridgewell/resolve-uri": "^3.1.0",
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"@types/json-schema": {
@ -19788,9 +19788,9 @@
}
},
"terser": {
"version": "5.18.2",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.18.2.tgz",
"integrity": "sha512-Ah19JS86ypbJzTzvUCX7KOsEIhDaRONungA4aYBjEP3JZRf4ocuDzTg4QWZnPn9DEMiMYGJPiSOy7aykoCc70w==",
"version": "5.19.2",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz",
"integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==",
"requires": {
"@jridgewell/source-map": "^0.3.3",
"acorn": "^8.8.2",

View file

@ -44,7 +44,7 @@
"jquery-ui": "^1.13.2",
"jquery-ui-bundle": "^1.12.1",
"jquery.iframe-transport": "^1.0.0",
"jspdf-autotable": "^3.5.24",
"jspdf-autotable": "^3.5.30",
"less": "^4.1.2",
"less-loader": "^5.0",
"list.js": "^1.5.0",
@ -54,6 +54,6 @@
"tableexport.jquery.plugin": "1.28.0",
"tether": "^1.4.0",
"vue-resource": "^1.5.2",
"webpack": "^5.87.0"
"webpack": "^5.88.2"
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -18,7 +18,7 @@
"/css/dist/skins/skin-green.css": "/css/dist/skins/skin-green.css?id=0a82a6ae6bb4e58fe62d162c4fb50397",
"/css/dist/skins/skin-contrast.css": "/css/dist/skins/skin-contrast.css?id=da6c7997d9de2f8329142399f0ce50da",
"/css/dist/skins/skin-red.css": "/css/dist/skins/skin-red.css?id=44bf834f2110504a793dadec132a5898",
"/css/dist/all.css": "/css/dist/all.css?id=ae5d0ce9886bbe4ad4b021c6be19ec36",
"/css/dist/all.css": "/css/dist/all.css?id=8b29a53b11e372ceb332b1a2f7026632",
"/css/dist/signature-pad.css": "/css/dist/signature-pad.css?id=6a89d3cd901305e66ced1cf5f13147f7",
"/css/dist/signature-pad.min.css": "/css/dist/signature-pad.min.css?id=6a89d3cd901305e66ced1cf5f13147f7",
"/css/webfonts/fa-brands-400.ttf": "/css/webfonts/fa-brands-400.ttf?id=e2e2b1797606a266ed55549f5bb5a179",
@ -29,9 +29,9 @@
"/css/webfonts/fa-solid-900.woff2": "/css/webfonts/fa-solid-900.woff2?id=eea38615e7b5dbbaf88c263f2230cc32",
"/css/webfonts/fa-v4compatibility.ttf": "/css/webfonts/fa-v4compatibility.ttf?id=6ebbf5afc34f54463abc2b81ca637364",
"/css/webfonts/fa-v4compatibility.woff2": "/css/webfonts/fa-v4compatibility.woff2?id=67b8a78b7e80e805cfa4ee0421895ba4",
"/css/dist/bootstrap-table.css": "/css/dist/bootstrap-table.css?id=f5935cf8eaf9c1f71da0c9245d730471",
"/css/dist/bootstrap-table.css": "/css/dist/bootstrap-table.css?id=281bcfe26549412d128f695234961081",
"/js/build/vendor.js": "/js/build/vendor.js?id=3592e07ae9a6d1805a4ea3bd3c034aef",
"/js/dist/bootstrap-table.js": "/js/dist/bootstrap-table.js?id=40e2dc8b5b29e244bb545f78e2a3242b",
"/js/dist/bootstrap-table.js": "/js/dist/bootstrap-table.js?id=df78f0c4cc93c29c02a41144590f6350",
"/js/dist/all.js": "/js/dist/all.js?id=ba07d399f23b294f7c4983030b757423",
"/css/dist/skins/skin-green.min.css": "/css/dist/skins/skin-green.min.css?id=0a82a6ae6bb4e58fe62d162c4fb50397",
"/css/dist/skins/skin-green-dark.min.css": "/css/dist/skins/skin-green-dark.min.css?id=e36e83c2aa3c3afdbb8ebe2c0309e91d",

View file

@ -8,6 +8,8 @@ return array(
'clone' => 'Clone Category',
'create' => 'Create Category',
'edit' => 'Edit Category',
'email_will_be_sent_due_to_global_eula' => 'An email will be sent to the user because the global EULA is being used.',
'email_will_be_sent_due_to_category_eula' => 'An email will be sent to the user because a EULA is set for this category.',
'eula_text' => 'Category EULA',
'eula_text_help' => 'This field allows you to customize your EULAs for specific types of assets. If you only have one EULA for all of your assets, you can check the box below to use the primary default.',
'name' => 'Category Name',

View file

@ -23,59 +23,13 @@
</div>
</div>
<!-- EULA text -->
<div class="form-group {{ $errors->has('eula_text') ? 'error' : '' }}">
<label for="eula_text" class="col-md-3 control-label">{{ trans('admin/categories/general.eula_text') }}</label>
<div class="col-md-7">
{{ Form::textarea('eula_text', old('eula_text', $item->eula_text), array('class' => 'form-control', 'aria-label'=>'eula_text')) }}
<p class="help-block">{!! trans('admin/categories/general.eula_text_help') !!} </p>
<p class="help-block">{!! trans('admin/settings/general.eula_markdown') !!} </p>
{!! $errors->first('eula_text', '<span class="alert-msg" aria-hidden="true">:message</span>') !!}
</div>
</div>
<!-- Use default checkbox -->
<div class="form-group">
<div class="col-md-9 col-md-offset-3">
@if ($snipeSettings->default_eula_text!='')
<label class="form-control">
{{ Form::checkbox('use_default_eula', '1', old('use_default_eula', $item->use_default_eula), ['aria-label'=>'use_default_eula']) }}
<span>{!! trans('admin/categories/general.use_default_eula') !!}</span>
</label>
@else
<label class="form-control form-control--disabled">
{{ Form::checkbox('use_default_eula', '0', old('use_default_eula'), ['class'=>'disabled','disabled' => 'disabled', 'aria-label'=>'use_default_eula']) }}
<span>{!! trans('admin/categories/general.use_default_eula_disabled') !!}</span>
</label>
@endif
</div>
</div>
<!-- Require Acceptance -->
<div class="form-group">
<div class="col-md-9 col-md-offset-3">
<label class="form-control">
{{ Form::checkbox('require_acceptance', '1', old('require_acceptance', $item->require_acceptance), ['aria-label'=>'require_acceptance']) }}
{{ trans('admin/categories/general.require_acceptance') }}
</label>
</div>
</div>
<!-- Email on Checkin -->
<div class="form-group">
<div class="col-md-9 col-md-offset-3">
<label class="form-control">
{{ Form::checkbox('checkin_email', '1', old('checkin_email', $item->checkin_email), ['aria-label'=>'checkin_email']) }}
{{ trans('admin/categories/general.checkin_email') }}
</label>
</div>
</div>
<livewire:category-edit-form
:default-eula-text="$snipeSettings->default_eula_text"
:eula-text="old('eula_text', $item->eula_text)"
:require-acceptance="old('require_acceptance', $item->require_acceptance)"
:send-check-in-email="old('checkin_email', $item->checkin_email)"
:use-default-eula="old('use_default_eula', $item->use_default_eula)"
/>
@include ('partials.forms.edit.image-upload', ['image_path' => app('categories_upload_path')])

View file

@ -973,7 +973,12 @@
$(function () {
$('[data-tooltip="true"]').tooltip();
// Invoke Bootstrap 3's tooltip
$('[data-tooltip="true"]').tooltip({
container: 'body',
animation: true,
});
$('[data-toggle="popover"]').popover();
$('.select2 span').addClass('needsclick');
$('.select2 span').removeAttr('title');

View file

@ -0,0 +1,61 @@
<div>
<!-- EULA text -->
<div class="form-group {{ $errors->has('eula_text') ? 'error' : '' }}">
<label for="eula_text" class="col-md-3 control-label">{{ trans('admin/categories/general.eula_text') }}</label>
<div class="col-md-7">
{{ Form::textarea('eula_text', null, ['wire:model' => 'eulaText', 'class' => 'form-control', 'aria-label'=>'eula_text', 'disabled' => $this->eulaTextDisabled]) }}
<p class="help-block">{!! trans('admin/categories/general.eula_text_help') !!} </p>
<p class="help-block">{!! trans('admin/settings/general.eula_markdown') !!} </p>
{!! $errors->first('eula_text', '<span class="alert-msg" aria-hidden="true">:message</span>') !!}
</div>
@if ($this->eulaTextDisabled)
<input type="hidden" name="eula_text" wire:model="eulaText" />
@endif
</div>
<!-- Use default checkbox -->
<div class="form-group">
<div class="col-md-9 col-md-offset-3">
@if ($defaultEulaText!='')
<label class="form-control">
{{ Form::checkbox('use_default_eula', '1', null, ['wire:model' => 'useDefaultEula', 'aria-label'=>'use_default_eula']) }}
<span>{!! trans('admin/categories/general.use_default_eula') !!}</span>
</label>
@else
<label class="form-control form-control--disabled">
{{ Form::checkbox('use_default_eula', '0', null, ['wire:model' => 'useDefaultEula', 'class'=>'disabled','disabled' => 'disabled', 'aria-label'=>'use_default_eula']) }}
<span>{!! trans('admin/categories/general.use_default_eula_disabled') !!}</span>
</label>
@endif
</div>
</div>
<!-- Require Acceptance -->
<div class="form-group">
<div class="col-md-9 col-md-offset-3">
<label class="form-control">
{{ Form::checkbox('require_acceptance', '1', null, ['wire:model' => 'requireAcceptance', 'aria-label'=>'require_acceptance']) }}
{{ trans('admin/categories/general.require_acceptance') }}
</label>
</div>
</div>
<!-- Email on Checkin -->
<div class="form-group">
<div class="col-md-9 col-md-offset-3">
<label class="form-control">
{{ Form::checkbox('checkin_email', '1', null, ['wire:model' => 'sendCheckInEmail', 'aria-label'=>'checkin_email', 'disabled' => $this->sendCheckInEmailDisabled]) }}
{{ trans('admin/categories/general.checkin_email') }}
</label>
@if ($this->shouldDisplayEmailMessage)
<div class="callout callout-info">
<i class="far fa-envelope"></i>
<span>{{ $this->emailMessage }}</span>
</div>
@endif
@if ($this->sendCheckInEmailDisabled)
<input type="hidden" name="checkin_email" wire:model="sendCheckInEmail" />
@endif
</div>
</div>
</div>

View file

@ -85,3 +85,12 @@
</div>
@endforeach
@endif
<script nonce="{{ csrf_token() }}">
// We have to re-call the tooltip since this is pulled in after the DOM has loaded
$('[data-tooltip="true"]').tooltip({
container: 'body',
animation: true,
});
</script>

View file

@ -48,7 +48,7 @@
<th data-searchable="true" data-sortable="true" data-field="cost" class="text-right" data-footer-formatter="sumFormatter">{{ trans('admin/asset_maintenances/form.cost') }}</th>
<th data-sortable="true" data-field="location" data-formatter="deployedLocationFormatter" data-visible="false">{{ trans('general.location') }}</th>
<th data-sortable="true" data-field="rtd_location" data-formatter="deployedLocationFormatter" data-visible="false">{{ trans('admin/hardware/form.default_location') }}</th>
<th data-searchable="true" data-sortable="true" data-field="is_warranty" data-formatter="trueFalseformatter">{{ trans('admin/asset_maintenances/table.is_warranty') }}</th>
<th data-searchable="true" data-sortable="true" data-field="is_warranty" data-formatter="trueFalseFormatter">{{ trans('admin/asset_maintenances/table.is_warranty') }}</th>
<th data-searchable="true" data-sortable="true" data-field="user_id" data-formatter="usersLinkObjFormatter">{{ trans('general.admin') }}</th>
<th data-searchable="true" data-sortable="true" data-field="notes" data-visible="false">{{ trans('admin/asset_maintenances/form.notes') }}</th>
</tr>

View file

@ -0,0 +1,105 @@
<?php
namespace Tests\Feature\Livewire;
use App\Http\Livewire\CategoryEditForm;
use Livewire\Livewire;
use Tests\TestCase;
class CategoryEditFormTest extends TestCase
{
public function testTheComponentCanRender()
{
Livewire::test(CategoryEditForm::class)->assertStatus(200);
}
public function testSendEmailCheckboxIsCheckedOnLoadWhenSendEmailIsExistingSetting()
{
Livewire::test(CategoryEditForm::class, [
'sendCheckInEmail' => true,
'eulaText' => '',
'useDefaultEula' => false,
])->assertSet('sendCheckInEmail', true);
}
public function testSendEmailCheckboxIsCheckedOnLoadWhenCategoryEulaSet()
{
Livewire::test(CategoryEditForm::class, [
'sendCheckInEmail' => false,
'eulaText' => 'Some Content',
'useDefaultEula' => false,
])->assertSet('sendCheckInEmail', true);
}
public function testSendEmailCheckboxIsCheckedOnLoadWhenUsingDefaultEula()
{
Livewire::test(CategoryEditForm::class, [
'sendCheckInEmail' => false,
'eulaText' => '',
'useDefaultEula' => true,
])->assertSet('sendCheckInEmail', true);
}
public function testSendEmailCheckBoxIsUncheckedOnLoadWhenSendEmailIsFalseNoCategoryEulaSetAndNotUsingDefaultEula()
{
Livewire::test(CategoryEditForm::class, [
'sendCheckInEmail' => false,
'eulaText' => '',
'useDefaultEula' => false,
])->assertSet('sendCheckInEmail', false);
}
public function testSendEmailCheckboxIsCheckedWhenCategoryEulaEntered()
{
Livewire::test(CategoryEditForm::class, [
'sendCheckInEmail' => false,
'useDefaultEula' => false,
])->assertSet('sendCheckInEmail', false)
->set('eulaText', 'Some Content')
->assertSet('sendCheckInEmail', true);
}
public function testSendEmailCheckboxCheckedAndDisabledAndEulaTextDisabledWhenUseDefaultEulaSelected()
{
Livewire::test(CategoryEditForm::class, [
'sendCheckInEmail' => false,
'useDefaultEula' => false,
])->assertSet('sendCheckInEmail', false)
->set('useDefaultEula', true)
->assertSet('sendCheckInEmail', true)
->assertSet('eulaTextDisabled', true)
->assertSet('sendCheckInEmailDisabled', true);
}
public function testSendEmailCheckboxEnabledAndSetToOriginalValueWhenNoCategoryEulaAndNotUsingGlobalEula()
{
Livewire::test(CategoryEditForm::class, [
'eulaText' => 'Some Content',
'sendCheckInEmail' => false,
'useDefaultEula' => true,
])
->set('useDefaultEula', false)
->set('eulaText', '')
->assertSet('sendCheckInEmail', false)
->assertSet('sendCheckInEmailDisabled', false);
Livewire::test(CategoryEditForm::class, [
'eulaText' => 'Some Content',
'sendCheckInEmail' => true,
'useDefaultEula' => true,
])
->set('useDefaultEula', false)
->set('eulaText', '')
->assertSet('sendCheckInEmail', true)
->assertSet('sendCheckInEmailDisabled', false);
}
public function testEulaFieldEnabledOnLoadWhenNotUsingDefaultEula()
{
Livewire::test(CategoryEditForm::class, [
'sendCheckInEmail' => false,
'eulaText' => '',
'useDefaultEula' => false,
])->assertSet('eulaTextDisabled', false);
}
}

View file

@ -0,0 +1,110 @@
<?php
namespace Tests\Feature\Reports;
use App\Models\Asset;
use App\Models\Company;
use App\Models\User;
use Illuminate\Testing\TestResponse;
use League\Csv\Reader;
use PHPUnit\Framework\Assert;
use Tests\Support\InteractsWithSettings;
use Tests\TestCase;
class CustomReportTest extends TestCase
{
use InteractsWithSettings;
protected function setUp(): void
{
parent::setUp();
TestResponse::macro(
'assertSeeTextInStreamedResponse',
function (string $needle) {
Assert::assertTrue(
collect(Reader::createFromString($this->streamedContent())->getRecords())
->pluck(0)
->contains($needle)
);
return $this;
}
);
TestResponse::macro(
'assertDontSeeTextInStreamedResponse',
function (string $needle) {
Assert::assertFalse(
collect(Reader::createFromString($this->streamedContent())->getRecords())
->pluck(0)
->contains($needle)
);
return $this;
}
);
}
public function testCustomAssetReport()
{
Asset::factory()->create(['name' => 'Asset A']);
Asset::factory()->create(['name' => 'Asset B']);
$this->actingAs(User::factory()->canViewReports()->create())
->post('reports/custom', [
'asset_name' => '1',
'asset_tag' => '1',
'serial' => '1',
])->assertOk()
->assertHeader('content-type', 'text/csv; charset=UTF-8')
->assertSeeTextInStreamedResponse('Asset A')
->assertSeeTextInStreamedResponse('Asset B');
}
public function testCustomAssetReportAdheresToCompanyScoping()
{
[$companyA, $companyB] = Company::factory()->count(2)->create();
Asset::factory()->for($companyA)->create(['name' => 'Asset A']);
Asset::factory()->for($companyB)->create(['name' => 'Asset B']);
$superUser = $companyA->users()->save(User::factory()->superuser()->make());
$userInCompanyA = $companyA->users()->save(User::factory()->canViewReports()->make());
$userInCompanyB = $companyB->users()->save(User::factory()->canViewReports()->make());
$this->settings->disableMultipleFullCompanySupport();
$this->actingAs($superUser)
->post('reports/custom', ['asset_name' => '1', 'asset_tag' => '1', 'serial' => '1'])
->assertSeeTextInStreamedResponse('Asset A')
->assertSeeTextInStreamedResponse('Asset B');
$this->actingAs($userInCompanyA)
->post('reports/custom', ['asset_name' => '1', 'asset_tag' => '1', 'serial' => '1'])
->assertSeeTextInStreamedResponse('Asset A')
->assertSeeTextInStreamedResponse('Asset B');
$this->actingAs($userInCompanyB)
->post('reports/custom', ['asset_name' => '1', 'asset_tag' => '1', 'serial' => '1'])
->assertSeeTextInStreamedResponse('Asset A')
->assertSeeTextInStreamedResponse('Asset B');
$this->settings->enableMultipleFullCompanySupport();
$this->actingAs($superUser)
->post('reports/custom', ['asset_name' => '1', 'asset_tag' => '1', 'serial' => '1'])
->assertSeeTextInStreamedResponse('Asset A')
->assertSeeTextInStreamedResponse('Asset B');
$this->actingAs($userInCompanyA)
->post('reports/custom', ['asset_name' => '1', 'asset_tag' => '1', 'serial' => '1'])
->assertSeeTextInStreamedResponse('Asset A')
->assertDontSeeTextInStreamedResponse('Asset B');
$this->actingAs($userInCompanyB)
->post('reports/custom', ['asset_name' => '1', 'asset_tag' => '1', 'serial' => '1'])
->assertDontSeeTextInStreamedResponse('Asset A')
->assertSeeTextInStreamedResponse('Asset B');
}
}

View file

@ -24,7 +24,10 @@ trait CustomTestMacros
function (Model $model, string $property = 'name') use ($guardAgainstNullProperty) {
$guardAgainstNullProperty($model, $property);
Assert::assertTrue(collect($this['rows'])->pluck($property)->contains($model->{$property}));
Assert::assertTrue(
collect($this['rows'])->pluck($property)->contains(e($model->{$property})),
"Response did not contain the expected value: {$model->{$property}}"
);
return $this;
}
@ -35,7 +38,10 @@ trait CustomTestMacros
function (Model $model, string $property = 'name') use ($guardAgainstNullProperty) {
$guardAgainstNullProperty($model, $property);
Assert::assertFalse(collect($this['rows'])->pluck($property)->contains($model->{$property}));
Assert::assertFalse(
collect($this['rows'])->pluck($property)->contains(e($model->{$property})),
"Response contained unexpected value: {$model->{$property}}"
);
return $this;
}
@ -46,7 +52,10 @@ trait CustomTestMacros
function (Model $model, string $property = 'id') use ($guardAgainstNullProperty) {
$guardAgainstNullProperty($model, $property);
Assert::assertTrue(collect($this->json('results'))->pluck('id')->contains($model->{$property}));
Assert::assertTrue(
collect($this->json('results'))->pluck('id')->contains(e($model->{$property})),
"Response did not contain the expected value: {$model->{$property}}"
);
return $this;
}
@ -57,7 +66,10 @@ trait CustomTestMacros
function (Model $model, string $property = 'id') use ($guardAgainstNullProperty) {
$guardAgainstNullProperty($model, $property);
Assert::assertFalse(collect($this->json('results'))->pluck('id')->contains($model->{$property}));
Assert::assertFalse(
collect($this->json('results'))->pluck('id')->contains(e($model->{$property})),
"Response contained unexpected value: {$model->{$property}}"
);
return $this;
}

View file

@ -1,3 +0,0 @@
<?php
// Here you can initialize variables that will be available to your tests

View file

@ -1,3 +0,0 @@
<?php
// This is global bootstrap for autoloading

View file

@ -1,26 +0,0 @@
Item Name,Purchase Date,Purchase Cost,Location,Company,Order Number,Category,Requestable,Quantity
Walter Carter,09/01/2006,20.89,metus. Vivamus,Macromedia,J935H60W,Customer Relations,False,278
Hayes Delgado,06/15/2011,82.33,conubia,Macromedia,R444V77O,Advertising,No,374
Cairo Franks,02/17/2004,91.82,Suspendisse eleifend.,Sibelius,B562M80I,Accounting,True,86
Kasimir Best,04/26/2009,63.50,ipsum cursus vestibulum.,Adobe,T496S42R,Payroll,False,374
Rajah Garcia,07/23/2014,41.44,Nunc laoreet lectus,Sibelius,H299H99S,Customer Relations,No,514
Damon Pearson,08/22/2010,11.16,luctus,Microsoft,K403K24X,Finances,False,596
Jin Buckley,10/07/2005,15.36,euismod,Borland,U911L77O,Sales and Marketing,False,462
Barrett Simon,04/06/2013,54.85,ipsum nunc,Sibelius,R642D18D,Tech Support,Yes,297
Reece Hayden,05/12/2017,43.76,et nunc. Quisque,Lavasoft,R389I62U,Finances,1,500
Honorato Greene,07/04/2007,67.66,interdum. Curabitur,Google,P231H53Z,Accounting,1,38
Kennan Levine,12/09/2007,47.84,sociis,Lavasoft,K271S85U,Legal Department,1,268
Chadwick Ryan,03/23/2011,49.92,fermentum,Finale,S458L71D,Quality Assurance,Yes,579
Abraham Wynn,11/17/2009,32.19,Vestibulum,Lavasoft,Q317N85T,Quality Assurance,Yes,84
Tyrone Vazquez,05/02/2014,93.61,"feugiat nec, diam.",Apple Systems,X530P10G,Public Relations,No,6
Lester Holmes,11/20/2016,8.18,non magna.,Cakewalk,M377B05F,Research and Development,True,538
Ryder Stafford,08/06/2014,65.77,consectetuer rhoncus. Nullam,Lavasoft,R754A44P,Finances,False,428
Dylan Guy,09/26/2012,45.14,"a,",Chami,G531X03G,Tech Support,1,502
Igor Salinas,10/14/2009,90.90,viverra. Donec,Borland,V076X60Y,Asset Management,False,532
Xavier Mason,12/11/2004,89.76,mus. Proin,Sibelius,V002M54F,Tech Support,False,306
Kane Mcintyre,05/22/2011,7.79,"erat,",Cakewalk,B393H89J,Quality Assurance,1,256
Wade Silva,10/10/2010,78.71,Sed et libero.,Lavasoft,D573N25A,Customer Service,1,87
Brock Lowery,11/01/2012,22.07,"dolor,",Macromedia,H112I50Y,Human Resources,1,587
Gil Bright,07/30/2009,70.11,"id,",Sibelius,J429A36Y,Sales and Marketing,1,212
Raja Brewer,02/03/2015,42.75,"id,",Apple Systems,R567P48B,Asset Management,1,338
Malachi Conner,11/14/2008,71.79,Mauris,Yahoo,D522O37S,Tech Support,Yes,447
1 Item Name Purchase Date Purchase Cost Location Company Order Number Category Requestable Quantity
2 Walter Carter 09/01/2006 20.89 metus. Vivamus Macromedia J935H60W Customer Relations False 278
3 Hayes Delgado 06/15/2011 82.33 conubia Macromedia R444V77O Advertising No 374
4 Cairo Franks 02/17/2004 91.82 Suspendisse eleifend. Sibelius B562M80I Accounting True 86
5 Kasimir Best 04/26/2009 63.50 ipsum cursus vestibulum. Adobe T496S42R Payroll False 374
6 Rajah Garcia 07/23/2014 41.44 Nunc laoreet lectus Sibelius H299H99S Customer Relations No 514
7 Damon Pearson 08/22/2010 11.16 luctus Microsoft K403K24X Finances False 596
8 Jin Buckley 10/07/2005 15.36 euismod Borland U911L77O Sales and Marketing False 462
9 Barrett Simon 04/06/2013 54.85 ipsum nunc Sibelius R642D18D Tech Support Yes 297
10 Reece Hayden 05/12/2017 43.76 et nunc. Quisque Lavasoft R389I62U Finances 1 500
11 Honorato Greene 07/04/2007 67.66 interdum. Curabitur Google P231H53Z Accounting 1 38
12 Kennan Levine 12/09/2007 47.84 sociis Lavasoft K271S85U Legal Department 1 268
13 Chadwick Ryan 03/23/2011 49.92 fermentum Finale S458L71D Quality Assurance Yes 579
14 Abraham Wynn 11/17/2009 32.19 Vestibulum Lavasoft Q317N85T Quality Assurance Yes 84
15 Tyrone Vazquez 05/02/2014 93.61 feugiat nec, diam. Apple Systems X530P10G Public Relations No 6
16 Lester Holmes 11/20/2016 8.18 non magna. Cakewalk M377B05F Research and Development True 538
17 Ryder Stafford 08/06/2014 65.77 consectetuer rhoncus. Nullam Lavasoft R754A44P Finances False 428
18 Dylan Guy 09/26/2012 45.14 a, Chami G531X03G Tech Support 1 502
19 Igor Salinas 10/14/2009 90.90 viverra. Donec Borland V076X60Y Asset Management False 532
20 Xavier Mason 12/11/2004 89.76 mus. Proin Sibelius V002M54F Tech Support False 306
21 Kane Mcintyre 05/22/2011 7.79 erat, Cakewalk B393H89J Quality Assurance 1 256
22 Wade Silva 10/10/2010 78.71 Sed et libero. Lavasoft D573N25A Customer Service 1 87
23 Brock Lowery 11/01/2012 22.07 dolor, Macromedia H112I50Y Human Resources 1 587
24 Gil Bright 07/30/2009 70.11 id, Sibelius J429A36Y Sales and Marketing 1 212
25 Raja Brewer 02/03/2015 42.75 id, Apple Systems R567P48B Asset Management 1 338
26 Malachi Conner 11/14/2008 71.79 Mauris Yahoo D522O37S Tech Support Yes 447

View file

@ -1,25 +0,0 @@
Name,Email,Username,item Name,item Category,Model name,Manufacturer,Model Number,Serial number,Asset Tag,Location,Notes,Purchase Date,Purchase Cost,Company,Status,Warranty,Supplier
Bonnie Nelson,bnelson0@cdbaby.com,bnelson0,eget nunc donec quis,quam,massa id,Linkbridge,6377018600094472,27aa8378-b0f4-4289-84a4-405da95c6147,970882174-8,Daping,"Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.",2016-04-05,289.59,Alpha,Undeployable,14,Blogspan
Judith Ferguson,jferguson1@state.tx.us,jferguson1,mi in porttitor,justo,congue diam id,Flipstorm,5.02043359569189E+018,4bc7fc90-5a97-412f-8eed-77ecacc643fc,544574073-0,Cirangga Kidul,,2016-03-08,763.46,,Undeployable,12,Oyope
Mildred Gibson,mgibson2@wiley.com,mgibson2,morbi quis tortor id,nunc nisl duis,convallis tortor risus,Lajo,374622546776765,2837ab20-8f0d-4935-8a52-226392f2b1b0,710141467-2,Shekou,In congue. Etiam justo. Etiam pretium iaculis justo.,2015-08-09,233.57,Konklab,Lost,,
Brandon Lee,blee3@quantcast.com,blee3,amet cursus id turpis,sed,in faucibus orci,Zoomlounge,3549618015236095,18d6e6a4-d362-4de9-beb4-7f62fb93de6f,103538064-1,Leksand,Integer ac leo. Pellentesque ultrices mattis odio. Donec vitae nisi.,2015-10-11,,,Pending Diagnostics,,
Betty Powell,bpowell4@tuttocitta.it,bpowell4,ipsum praesent,condimentum curabitur,et ultrices,Kazu,3567082842822626,f9b473c6-c810-42f2-8335-27ce468889a8,118753405-6,Dresi Wetan,,2015-06-16,324.8,,Ready to Deploy,,
Anthony Wheeler,awheeler5@cocolog-nifty.com,awheeler5,dictumst maecenas ut,sem praesent,accumsan felis,Layo,30052522651756,4751495c-cee0-4961-b788-94a545b5643e,998233705-X,Dante Delgado,,2016-04-16,261.79,,Archived,15,Ntag
Dennis Reynolds,dreynolds6@ustream.tv,dreynolds6,libero nam,risus,interdum mauris,Twiyo,3585438057660291,17b3cf8d-fead-46f5-a8b0-49906bb90a00,177687256-8,Pingle,"Proin interdum mauris non ligula pellentesque ultrices. Phasellus id sapien in sapien iaculis congue. Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.",2015-05-24,,,Pending Diagnostics,,
Andrea Arnold,aarnold7@cbc.ca,aarnold7,mauris morbi non,ante vel,sapien dignissim,Cogibox,3548511052883500,7a6a2fdb-160c-4d91-8e05-a0337a90d9db,129556040-2,Zhuli,Duis aliquam convallis nunc. Proin at turpis a pede posuere nonummy. Integer non velit.,2015-09-15,434.86,,Archived,14,Kwilith
Anna Butler,abutler8@wikia.com,abutler8,eleifend pede libero,sapien a libero,et ultrices posuere cubilia,Flipbug,6.75911579996746E+017,c1a57909-3b2e-47fe-ab2f-843401b2a7de,117517007-0,Niopanda,"Maecenas tristique, est et tempus semper, est quam pharetra magna, ac consequat metus sapien ut nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris viverra diam vitae quam. Suspendisse potenti.",2016-04-13,89.53,,Archived,15,Linkbridge
Mark Bennett,mbennett9@diigo.com,mbennett9,convallis nulla neque,eu sapien,duis mattis egestas metus aenean,Centimia,378342677410961,07540238-fb3c-4c8a-8e11-d43883ee4268,007968217-0,Zoumaling,,2015-07-04,,,Lost,,
Emily Wheeler,ewheelera@google.de,ewheelera,in felis,leo odio,quam sapien varius,Roombo,201954480670574,527b2445-2c67-4f76-912f-6ec42400a584,441402118-9,Lutsk,Suspendisse potenti. In eleifend quam a odio. In hac habitasse platea dictumst.,2016-05-18,,Bitwolf,Lost,36,Wikizz
Wanda Fox,wfoxb@virginia.edu,wfoxb,vel ipsum praesent,potenti nullam porttitor,augue vestibulum rutrum rutrum neque,Yakijo,3567636803247485,,863829558-8,Pravdinsk,"Aenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh.",2015-11-10,,,Lost,14,Linkbridge
,,,odio elementum,posuere cubilia curae,ante vel ipsum praesent blandit,Oyope,3529462300753736,9a863968-180e-451d-a723-dc85e2d5d8ff,742114860-4,Panay,Pellentesque at nulla. Suspendisse potenti. Cras in purus eu magna vulputate luctus.,2016-03-20,881.4,,,30,Tagcat
Janet Grant,jgrantd@cpanel.net,jgrantd,viverra diam vitae,semper sapien,dapibus dolor vel,Flashset,3559785746335392,e287bb64-ff4f-434c-88ab-210ad433c77b,927820758-6,Achiaman,,2016-03-05,675.3,,Archived,22,Meevee
Antonio Larson,alarsone@tripod.com,alarsone,felis sed interdum venenatis,id lobortis,dui proin,Chatterbridge,4070995882635,90bcab28-ffd4-48c9-ba5d-c2eeb1400698,789757925-5,Oemanu,Phasellus sit amet erat. Nulla tempus. Vivamus in felis eu sapien cursus vestibulum.,2015-07-25,,,Ready to Deploy,30,Shuffledrive
Lois Powell,lpowellf@com.com,lpowellf,id consequat,justo nec,odio porttitor id consequat in,Skipstorm,36309149183447,08e440f7-bd0b-47a7-a577-4a3ce3c7dfe7,202652281-2,Qiaolin,"Proin interdum mauris non ligula pellentesque ultrices. Phasellus id sapien in sapien iaculis congue. Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.",2015-08-13,446.22,,Lost,,
Mildred Allen,malleng@com.com,malleng,porta volutpat quam pede,in hac habitasse,donec vitae nisi nam,Devpulse,3543783295297294,5f900903-0ffe-4405-b5ad-aa4aa59d911c,210119288-8,Accha,"Nam ultrices, libero non mattis pulvinar, nulla pede ullamcorper augue, a suscipit nulla elit ac nulla. Sed vel enim sit amet nunc viverra dapibus. Nulla suscipit ligula in lacus.",2015-12-24,923.9,,Lost,20,Quamba
Clarence Austin,caustinh@bigcartel.com,caustinh,libero nam dui proin,aliquet at feugiat,eget tincidunt eget tempus,Photobug,201967051902986,bde85740-f103-4b49-a691-a60c7f6859a8,022102715-7,Kerkrade,In hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus.,2016-03-29,,,Undeployable,22,Browsedrive
Walter Chavez,wchavezi@blogs.com,wchavezi,sociis natoque penatibus,vel est,at diam nam,Photofeed,3533016005480310,bf4a2a92-6f29-4d24-be90-8126d4dcbd64,610672722-8,Villa Regina,,2016-05-13,442.51,,Archived,28,Tekfly
Marie Elliott,melliottj@constantcontact.com,melliottj,sed tristique in,rutrum,luctus et ultrices,Riffpath,4547299861035,9a02817e-de79-4850-a212-84c9ae3dd1a2,898880851-7,Tibro,Integer ac leo. Pellentesque ultrices mattis odio. Donec vitae nisi.,2015-09-10,906.39,,Undeployable,,
,,,dui luctus rutrum,sapien ut nunc,dictumst morbi vestibulum,Aivee,4405382067928809,514aca2a-9080-4c49-8695-7ba4c78edc65,466008300-4,Menglie,Duis consequat dui nec nisi volutpat eleifend. Donec ut dolor. Morbi vel lectus in quam fringilla rhoncus.,2015-12-21,151.27,,,,
,,,ut massa volutpat,sed,quis odio consequat varius integer,Abatz,3537252931689981,b99208e2-b8d8-4f7a-8a06-366a27733b97,313295582-5,Solidaridad,"Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.",2016-02-15,211.07,,,,
Benjamin Ford,bfordm@woothemes.com,bfordm,habitasse platea dictumst,primis in faucibus,quam a odio in,Blogtag,5018304036665243,c8680b36-a13c-427f-a6a1-1b9b351eb129,552327520-4,Sorinomo,In quis justo. Maecenas rhoncus aliquam lacus. Morbi quis tortor id nulla ultrices aliquet.,2015-11-25,112.11,,Ready to Deploy,18,Quatz
Timothy Warren,twarrenn@printfriendly.com,twarrenn,leo pellentesque ultrices,vestibulum,in sapien iaculis congue vivamus,Brightdog,30355105682126,6c1e7556-063f-4c71-87ce-e46b06e8c238,446504693-6,Tamel,"Nam ultrices, libero non mattis pulvinar, nulla pede ullamcorper augue, a suscipit nulla elit ac nulla. Sed vel enim sit amet nunc viverra dapibus. Nulla suscipit ligula in lacus.",2015-08-19,221.03,,Undeployable,26,Mydeo
1 Name Email Username item Name item Category Model name Manufacturer Model Number Serial number Asset Tag Location Notes Purchase Date Purchase Cost Company Status Warranty Supplier
2 Bonnie Nelson bnelson0@cdbaby.com bnelson0 eget nunc donec quis quam massa id Linkbridge 6377018600094472 27aa8378-b0f4-4289-84a4-405da95c6147 970882174-8 Daping Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est. 2016-04-05 289.59 Alpha Undeployable 14 Blogspan
3 Judith Ferguson jferguson1@state.tx.us jferguson1 mi in porttitor justo congue diam id Flipstorm 5.02043359569189E+018 4bc7fc90-5a97-412f-8eed-77ecacc643fc 544574073-0 Cirangga Kidul 2016-03-08 763.46 Undeployable 12 Oyope
4 Mildred Gibson mgibson2@wiley.com mgibson2 morbi quis tortor id nunc nisl duis convallis tortor risus Lajo 374622546776765 2837ab20-8f0d-4935-8a52-226392f2b1b0 710141467-2 Shekou In congue. Etiam justo. Etiam pretium iaculis justo. 2015-08-09 233.57 Konklab Lost
5 Brandon Lee blee3@quantcast.com blee3 amet cursus id turpis sed in faucibus orci Zoomlounge 3549618015236095 18d6e6a4-d362-4de9-beb4-7f62fb93de6f 103538064-1 Leksand Integer ac leo. Pellentesque ultrices mattis odio. Donec vitae nisi. 2015-10-11 Pending Diagnostics
6 Betty Powell bpowell4@tuttocitta.it bpowell4 ipsum praesent condimentum curabitur et ultrices Kazu 3567082842822626 f9b473c6-c810-42f2-8335-27ce468889a8 118753405-6 Dresi Wetan 2015-06-16 324.8 Ready to Deploy
7 Anthony Wheeler awheeler5@cocolog-nifty.com awheeler5 dictumst maecenas ut sem praesent accumsan felis Layo 30052522651756 4751495c-cee0-4961-b788-94a545b5643e 998233705-X Dante Delgado 2016-04-16 261.79 Archived 15 Ntag
8 Dennis Reynolds dreynolds6@ustream.tv dreynolds6 libero nam risus interdum mauris Twiyo 3585438057660291 17b3cf8d-fead-46f5-a8b0-49906bb90a00 177687256-8 Pingle Proin interdum mauris non ligula pellentesque ultrices. Phasellus id sapien in sapien iaculis congue. Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl. 2015-05-24 Pending Diagnostics
9 Andrea Arnold aarnold7@cbc.ca aarnold7 mauris morbi non ante vel sapien dignissim Cogibox 3548511052883500 7a6a2fdb-160c-4d91-8e05-a0337a90d9db 129556040-2 Zhuli Duis aliquam convallis nunc. Proin at turpis a pede posuere nonummy. Integer non velit. 2015-09-15 434.86 Archived 14 Kwilith
10 Anna Butler abutler8@wikia.com abutler8 eleifend pede libero sapien a libero et ultrices posuere cubilia Flipbug 6.75911579996746E+017 c1a57909-3b2e-47fe-ab2f-843401b2a7de 117517007-0 Niopanda Maecenas tristique, est et tempus semper, est quam pharetra magna, ac consequat metus sapien ut nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris viverra diam vitae quam. Suspendisse potenti. 2016-04-13 89.53 Archived 15 Linkbridge
11 Mark Bennett mbennett9@diigo.com mbennett9 convallis nulla neque eu sapien duis mattis egestas metus aenean Centimia 378342677410961 07540238-fb3c-4c8a-8e11-d43883ee4268 007968217-0 Zoumaling 2015-07-04 Lost
12 Emily Wheeler ewheelera@google.de ewheelera in felis leo odio quam sapien varius Roombo 201954480670574 527b2445-2c67-4f76-912f-6ec42400a584 441402118-9 Luts’k Suspendisse potenti. In eleifend quam a odio. In hac habitasse platea dictumst. 2016-05-18 Bitwolf Lost 36 Wikizz
13 Wanda Fox wfoxb@virginia.edu wfoxb vel ipsum praesent potenti nullam porttitor augue vestibulum rutrum rutrum neque Yakijo 3567636803247485 863829558-8 Pravdinsk Aenean fermentum. Donec ut mauris eget massa tempor convallis. Nulla neque libero, convallis eget, eleifend luctus, ultricies eu, nibh. 2015-11-10 Lost 14 Linkbridge
14 odio elementum posuere cubilia curae ante vel ipsum praesent blandit Oyope 3529462300753736 9a863968-180e-451d-a723-dc85e2d5d8ff 742114860-4 Panay Pellentesque at nulla. Suspendisse potenti. Cras in purus eu magna vulputate luctus. 2016-03-20 881.4 30 Tagcat
15 Janet Grant jgrantd@cpanel.net jgrantd viverra diam vitae semper sapien dapibus dolor vel Flashset 3559785746335392 e287bb64-ff4f-434c-88ab-210ad433c77b 927820758-6 Achiaman 2016-03-05 675.3 Archived 22 Meevee
16 Antonio Larson alarsone@tripod.com alarsone felis sed interdum venenatis id lobortis dui proin Chatterbridge 4070995882635 90bcab28-ffd4-48c9-ba5d-c2eeb1400698 789757925-5 Oemanu Phasellus sit amet erat. Nulla tempus. Vivamus in felis eu sapien cursus vestibulum. 2015-07-25 Ready to Deploy 30 Shuffledrive
17 Lois Powell lpowellf@com.com lpowellf id consequat justo nec odio porttitor id consequat in Skipstorm 36309149183447 08e440f7-bd0b-47a7-a577-4a3ce3c7dfe7 202652281-2 Qiaolin Proin interdum mauris non ligula pellentesque ultrices. Phasellus id sapien in sapien iaculis congue. Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl. 2015-08-13 446.22 Lost
18 Mildred Allen malleng@com.com malleng porta volutpat quam pede in hac habitasse donec vitae nisi nam Devpulse 3543783295297294 5f900903-0ffe-4405-b5ad-aa4aa59d911c 210119288-8 Accha Nam ultrices, libero non mattis pulvinar, nulla pede ullamcorper augue, a suscipit nulla elit ac nulla. Sed vel enim sit amet nunc viverra dapibus. Nulla suscipit ligula in lacus. 2015-12-24 923.9 Lost 20 Quamba
19 Clarence Austin caustinh@bigcartel.com caustinh libero nam dui proin aliquet at feugiat eget tincidunt eget tempus Photobug 201967051902986 bde85740-f103-4b49-a691-a60c7f6859a8 022102715-7 Kerkrade In hac habitasse platea dictumst. Etiam faucibus cursus urna. Ut tellus. 2016-03-29 Undeployable 22 Browsedrive
20 Walter Chavez wchavezi@blogs.com wchavezi sociis natoque penatibus vel est at diam nam Photofeed 3533016005480310 bf4a2a92-6f29-4d24-be90-8126d4dcbd64 610672722-8 Villa Regina 2016-05-13 442.51 Archived 28 Tekfly
21 Marie Elliott melliottj@constantcontact.com melliottj sed tristique in rutrum luctus et ultrices Riffpath 4547299861035 9a02817e-de79-4850-a212-84c9ae3dd1a2 898880851-7 Tibro Integer ac leo. Pellentesque ultrices mattis odio. Donec vitae nisi. 2015-09-10 906.39 Undeployable
22 dui luctus rutrum sapien ut nunc dictumst morbi vestibulum Aivee 4405382067928809 514aca2a-9080-4c49-8695-7ba4c78edc65 466008300-4 Menglie Duis consequat dui nec nisi volutpat eleifend. Donec ut dolor. Morbi vel lectus in quam fringilla rhoncus. 2015-12-21 151.27
23 ut massa volutpat sed quis odio consequat varius integer Abatz 3537252931689981 b99208e2-b8d8-4f7a-8a06-366a27733b97 313295582-5 Solidaridad Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. 2016-02-15 211.07
24 Benjamin Ford bfordm@woothemes.com bfordm habitasse platea dictumst primis in faucibus quam a odio in Blogtag 5018304036665243 c8680b36-a13c-427f-a6a1-1b9b351eb129 552327520-4 Sorinomo In quis justo. Maecenas rhoncus aliquam lacus. Morbi quis tortor id nulla ultrices aliquet. 2015-11-25 112.11 Ready to Deploy 18 Quatz
25 Timothy Warren twarrenn@printfriendly.com twarrenn leo pellentesque ultrices vestibulum in sapien iaculis congue vivamus Brightdog 30355105682126 6c1e7556-063f-4c71-87ce-e46b06e8c238 446504693-6 Tamel Nam ultrices, libero non mattis pulvinar, nulla pede ullamcorper augue, a suscipit nulla elit ac nulla. Sed vel enim sit amet nunc viverra dapibus. Nulla suscipit ligula in lacus. 2015-08-19 221.03 Undeployable 26 Mydeo

View file

@ -1,25 +0,0 @@
Item Name,Purchase Date,Purchase Cost,Location,Company,Order Number,Category,Requestable,Quantity
eget,01/03/2011,85.91,mauris blandit mattis.,Lycos,T295T06V,Triamterene/Hydrochlorothiazide,No,322
Morbi,10/24/2016,87.42,iaculis,Lavasoft,W787T62Q,Ranitidine HCl,1,374
arcu.,09/22/2007,48.34,ornare,Google,N961E50A,Amoxicillin,False,252
nec,08/16/2009,8.71,lectus,Apple Systems,X624N14C,Lantus Solostar,1,30
Nam,03/30/2017,24.07,"a,",Macromedia,N618A20S,Hydrocodone/APAP,True,551
Nullam,12/16/2003,73.23,"Donec est mauris,",Yahoo,B386I67L,Fluticasone Propionate,No,395
erat,08/03/2010,17.49,Proin,Borland,G606H92I,Amlodipine Besylate,1,297
purus,10/12/2004,63.52,tellus justo sit,Chami,R660Z45O,Omeprazole (Rx),Yes,557
dignissim,11/10/2010,77.94,nibh vulputate mauris,Lavasoft,G230Z67X,Risperidone,1,47
Nam,01/25/2015,64.33,taciti sociosqu ad,Microsoft,B613L84C,Suboxone,No,310
Nunc,04/13/2017,81.02,nec orci.,Borland,O367N55N,Fluoxetine HCl,No,404
Phasellus,12/23/2005,70.67,"quis, tristique ac,",Borland,K941C02T,Alendronate Sodium,0,590
Nulla,07/21/2017,99.04,augue malesuada malesuada.,Lycos,D663L90H,Allopurinol,No,48
at,10/31/2007,58.42,"dolor sit amet,",Lavasoft,Y229E62I,Simvastatin,No,181
Sed,04/14/2011,48.86,"lectus convallis est,",Cakewalk,T666E70K,Fluconazole,True,169
quis,01/08/2014,55.64,"varius orci,",Lycos,T767G07U,Advair Diskus,False,264
viverra.,01/07/2013,93.48,"cursus et, magna.",Sibelius,T276L44H,Loestrin 24 Fe,No,293
Sed,03/20/2008,64.75,arcu. Sed,Cakewalk,A933E55V,Pantoprazole Sodium,No,407
iaculis,07/17/2015,56.74,nec,Borland,N568F73C,Venlafaxine HCl ER,No,115
leo.,12/09/2012,96.88,Aenean,Altavista,H283Z42U,Cephalexin,True,208
leo.,04/24/2007,40.87,tincidunt adipiscing. Mauris,Lycos,T054Q83U,Lyrica,0,486
pede.,09/29/2010,19.64,nec enim. Nunc,Chami,L842O70A,Simvastatin,Yes,214
massa,05/18/2015,18.43,nisi magna sed,Adobe,V029Q52K,Meloxicam,0,131
urna,10/22/2014,7.41,ac,Sibelius,Z708U15X,Flovent HFA,Yes,15
1 Item Name Purchase Date Purchase Cost Location Company Order Number Category Requestable Quantity
2 eget 01/03/2011 85.91 mauris blandit mattis. Lycos T295T06V Triamterene/Hydrochlorothiazide No 322
3 Morbi 10/24/2016 87.42 iaculis Lavasoft W787T62Q Ranitidine HCl 1 374
4 arcu. 09/22/2007 48.34 ornare Google N961E50A Amoxicillin False 252
5 nec 08/16/2009 8.71 lectus Apple Systems X624N14C Lantus Solostar 1 30
6 Nam 03/30/2017 24.07 a, Macromedia N618A20S Hydrocodone/APAP True 551
7 Nullam 12/16/2003 73.23 Donec est mauris, Yahoo B386I67L Fluticasone Propionate No 395
8 erat 08/03/2010 17.49 Proin Borland G606H92I Amlodipine Besylate 1 297
9 purus 10/12/2004 63.52 tellus justo sit Chami R660Z45O Omeprazole (Rx) Yes 557
10 dignissim 11/10/2010 77.94 nibh vulputate mauris Lavasoft G230Z67X Risperidone 1 47
11 Nam 01/25/2015 64.33 taciti sociosqu ad Microsoft B613L84C Suboxone No 310
12 Nunc 04/13/2017 81.02 nec orci. Borland O367N55N Fluoxetine HCl No 404
13 Phasellus 12/23/2005 70.67 quis, tristique ac, Borland K941C02T Alendronate Sodium 0 590
14 Nulla 07/21/2017 99.04 augue malesuada malesuada. Lycos D663L90H Allopurinol No 48
15 at 10/31/2007 58.42 dolor sit amet, Lavasoft Y229E62I Simvastatin No 181
16 Sed 04/14/2011 48.86 lectus convallis est, Cakewalk T666E70K Fluconazole True 169
17 quis 01/08/2014 55.64 varius orci, Lycos T767G07U Advair Diskus False 264
18 viverra. 01/07/2013 93.48 cursus et, magna. Sibelius T276L44H Loestrin 24 Fe No 293
19 Sed 03/20/2008 64.75 arcu. Sed Cakewalk A933E55V Pantoprazole Sodium No 407
20 iaculis 07/17/2015 56.74 nec Borland N568F73C Venlafaxine HCl ER No 115
21 leo. 12/09/2012 96.88 Aenean Altavista H283Z42U Cephalexin True 208
22 leo. 04/24/2007 40.87 tincidunt adipiscing. Mauris Lycos T054Q83U Lyrica 0 486
23 pede. 09/29/2010 19.64 nec enim. Nunc Chami L842O70A Simvastatin Yes 214
24 massa 05/18/2015 18.43 nisi magna sed Adobe V029Q52K Meloxicam 0 131
25 urna 10/22/2014 7.41 ac Sibelius Z708U15X Flovent HFA Yes 15

View file

@ -1,11 +0,0 @@
# `functional-travis` enviromodules:
class_name: FunctionalTester
modules:
config:
# add framework module here
Laravel5:
environment_file: .env.testing-ci
Db:
dsn: 'mysql:host=localhost;dbname=snipeit_unit'
user: 'travis'
password: ''

View file

@ -1,19 +0,0 @@
# Codeception Test Suite Configuration
# suite for acceptance tests.
# perform tests in browser using the Selenium-like tools.
# powered by Mink (http://mink.behat.org).
# (tip: that's what your customer will see).
# (tip: test your ajax and javascript by one of Mink drivers).
# RUN `build` COMMAND AFTER ADDING/REMOVING MODULES.
class_name: AcceptanceTester
modules:
config:
WebDriver:
url: 'http://localhost:8000'
browser: 'phantomjs'
Laravel5:
part: ORM
environment_file: .env

View file

@ -1,18 +0,0 @@
# Codeception Test Suite Configuration
# suite for acceptance tests.
# perform tests in browser using the Selenium-like tools.
# powered by Mink (http://mink.behat.org).
# (tip: that's what your customer will see).
# (tip: test your ajax and javascript by one of Mink drivers).
# RUN `build` COMMAND AFTER ADDING/REMOVING MODULES.
class_name: AcceptanceTester
modules:
enabled:
- WebDriver:
url: http://localhost:8000
browser: phantomjs
- \Helper\Acceptance
- Laravel5:
part: ORM

View file

@ -1,2 +0,0 @@
*
!.gitignore

View file

@ -1,37 +0,0 @@
<?php
/**
* Inherited Methods
* @method void wantToTest($text)
* @method void wantTo($text)
* @method void execute($callable)
* @method void expectTo($prediction)
* @method void expect($prediction)
* @method void amGoingTo($argumentation)
* @method void am($role)
* @method void lookForwardTo($achieveValue)
* @method void comment($description)
* @method \Codeception\Lib\Friend haveFriend($name, $actorClass = NULL)
*
* @SuppressWarnings(PHPMD)
*/
class AcceptanceTester extends \Codeception\Actor
{
use _generated\AcceptanceTesterActions;
/**
* Define custom actions here
*/
public static function test_login($I)
{
// if snapshot exists - skipping login
//if ($I->loadSessionSnapshot('login')) return;
// logging in
$I->amOnPage('/login');
$I->fillField('username', 'snipe');
$I->fillField('password', 'password');
$I->click('Login');
//$I->saveSessionSnapshot('login');
}
}

View file

@ -1,58 +0,0 @@
<?php
/**
* Inherited Methods
* @method void wantToTest($text)
* @method void wantTo($text)
* @method void execute($callable)
* @method void expectTo($prediction)
* @method void expect($prediction)
* @method void amGoingTo($argumentation)
* @method void am($role)
* @method void lookForwardTo($achieveValue)
* @method void comment($description)
* @method \Codeception\Lib\Friend haveFriend($name, $actorClass = NULL)
*
* @SuppressWarnings(PHPMD)
*/
class ApiTester extends \Codeception\Actor
{
use _generated\ApiTesterActions;
/**
* Define custom actions here
*/
public function getToken(App\Models\User $user)
{
$client_repository = new \Laravel\Passport\ClientRepository();
$client = $client_repository->createPersonalAccessClient($user->id, 'Codeception API Test Client',
'http://localhost/');
\Illuminate\Support\Facades\DB::table('oauth_personal_access_clients')->insert([
'client_id' => $client->id,
'created_at' => new DateTime,
'updated_at' => new DateTime,
]);
$user->permissions = json_encode(['superuser' => true]);
$user->save();
$token = $user->createToken('CodeceptionAPItestToken')->accessToken;
return $token;
}
/**
* Remove Timestamps from transformed array
* This fixes false negatives when comparing json due to timestamp second rounding issues
* @param array $array Array returned from the transformer
* @return array Transformed item striped of created_at and updated_at
*/
public function removeTimeStamps($array)
{
unset($array['created_at']);
unset($array['updated_at']);
return $array;
}
}

View file

@ -1,151 +0,0 @@
<?php
use App\Models\Accessory;
use App\Models\Asset;
use App\Models\AssetModel;
use App\Models\Category;
use App\Models\Company;
use App\Models\Component;
use App\Models\Consumable;
use App\Models\Depreciation;
use App\Models\Location;
use App\Models\Manufacturer;
use App\Models\Statuslabel;
use App\Models\Supplier;
use App\Models\User;
/**
* Inherited Methods
* @method void wantToTest($text)
* @method void wantTo($text)
* @method void execute($callable)
* @method void expectTo($prediction)
* @method void expect($prediction)
* @method void amGoingTo($argumentation)
* @method void am($role)
* @method void lookForwardTo($achieveValue)
* @method void comment($description)
* @method \Codeception\Lib\Friend haveFriend($name, $actorClass = NULL)
*
* @SuppressWarnings(PHPMD)
*/
class FunctionalTester extends \Codeception\Actor
{
use _generated\FunctionalTesterActions;
/**
* Define custom actions here
*/
public function getCompanyId()
{
return Company::inRandomOrder()->first()->id;
}
public function getCategoryId()
{
return Category::inRandomOrder()->first()->id;
}
public function getManufacturerId()
{
return Manufacturer::inRandomOrder()->first()->id;
}
public function getLocationId()
{
return Location::inRandomOrder()->first()->id;
}
/**
* @return mixed Random Accessory Id
*/
public function getAccessoryId()
{
return Accessory::inRandomOrder()->first()->id;
}
/**
* @return mixed Random Asset Model Id;
*/
public function getModelId()
{
return AssetModel::inRandomOrder()->first()->id;
}
/**
* @return mixed Id of Empty Asset Model
*/
public function getEmptyModelId()
{
return AssetModel::doesntHave('assets')->first()->id;
}
/**
* @return mixed Id of random status
*/
public function getStatusId()
{
return StatusLabel::inRandomOrder()->first()->id;
}
/**
* Id of random user
* @return mixed
*/
public function getUserId()
{
return User::inRandomOrder()->first()->id;
}
/**
* @return mixed Id of random supplier
*/
public function getSupplierId()
{
return Supplier::inRandomOrder()->first()->id;
}
/**
* @return mixed Id of Random Asset
*/
public function getAssetId()
{
return Asset::inRandomOrder()->first()->id;
}
/**
* An Empty category
* @return mixed Id of Empty Category
*/
public function getEmptyCategoryId()
{
return Category::where('category_type', 'asset')->doesntHave('models')->first()->id;
}
/**
* A random component id for testing
* @return mixed Id of random component
*/
public function getComponentId()
{
return Component::inRandomOrder()->first()->id;
}
/**
* A random consumable Id for testing
* @return mixed
*/
public function getConsumableId()
{
return Consumable::inRandomOrder()->first()->id;
}
/**
* Return a random depreciation id for tests.
* @return mixed
*/
public function getDepreciationId()
{
return Depreciation::inRandomOrder()->first()->id;
}
}

View file

@ -1,10 +0,0 @@
<?php
namespace Helper;
// here you can define custom actions
// all public methods declared in helper class will be available in $I
class Acceptance extends \Codeception\Module
{
}

View file

@ -1,17 +0,0 @@
<?php
namespace Helper;
use Illuminate\Support\Facades\Artisan;
// here you can define custom actions
// all public methods declared in helper class will be available in $I
class Api extends \Codeception\Module
{
public function setupDatabase()
{
Artisan::call('migrate');
Artisan::call('db:seed');
}
}

View file

@ -1,10 +0,0 @@
<?php
namespace Helper;
// here you can define custom actions
// all public methods declared in helper class will be available in $I
class Functional extends \Codeception\Module
{
}

View file

@ -1,133 +0,0 @@
<?php
/**
* A helper class for Codeception (http://codeception.com/) that allows automated HTML5 Validation
* using the Nu Html Checker (http://validator.github.io/validator/) during acceptance testing.
* It uses local binaries and can therefore be run offline.
*
*
* Requirements:
* =============
*
* - Codeception with WebDriver set up (PhpBrowser doesn't work)
* - java is installed locally
* - The vnu.jar is installed locally (download the .zip from https://github.com/validator/validator/releases,
* it contains the .jar file)
*
*
* Installation:
* =============
*
* - Copy this file to _support/Helper/ in the codeception directory
* - Merge the following configuration to acceptance.suite.yml:
*
* modules:
* enabled:
* - \Helper\HTMLValidator
* config:
* \Helper\HTMLValidator:
* javaPath: /usr/bin/java
* vnuPath: /usr/local/bin/vnu.jar
*
*
*
* Usage:
* ======
*
* Validate the HTML of the current page:
* $I->validateHTML();
*
* Validate the HTML of the current page, but ignore errors containing the string "Ignoreit":
* $I->validateHTML(["Ignoreme"]);
*
*
*
* @license http://www.opensource.org/licenses/mit-license.html MIT License
* @author Tobias Hößl <tobias@hoessl.eu>
*/
namespace Helper;
use Codeception\TestCase;
class HTMLValidator extends \Codeception\Module
{
/**
* @param string $html
* @return array
* @throws \Exception
*/
private function validateByVNU($html)
{
$javaPath = $this->_getConfig('javaPath');
if (! $javaPath) {
$javaPath = 'java';
}
$vnuPath = $this->_getConfig('vnuPath');
if (! $vnuPath) {
$vnuPath = '/usr/local/bin/vnu.jar';
}
$filename = DIRECTORY_SEPARATOR.'tmp'.DIRECTORY_SEPARATOR.uniqid('html-validate').'.html';
file_put_contents($filename, $html);
exec($javaPath.' -Xss1024k -jar '.$vnuPath.' --format json '.$filename.' 2>&1', $return);
$data = json_decode($return[0], true);
if (! $data || ! isset($data['messages']) || ! is_array($data['messages'])) {
throw new \Exception('Invalid data returned from validation service: '.$return);
}
return $data['messages'];
}
/**
* @return string
* @throws \Codeception\Exception\ModuleException
* @throws \Exception
*/
private function getPageSource()
{
if (! $this->hasModule('WebDriver')) {
throw new \Exception('This validator needs WebDriver to work');
}
/** @var \Codeception\Module\WebDriver $webdriver */
$webdriver = $this->getModule('WebDriver');
return $webdriver->webDriver->getPageSource();
}
/**
* @param string[] $ignoreMessages
*/
public function validateHTML($ignoreMessages = [])
{
$source = $this->getPageSource();
try {
$messages = $this->validateByVNU($source);
} catch (\Exception $e) {
$this->fail($e->getMessage());
return;
}
$failMessages = [];
$lines = explode("\n", $source);
foreach ($messages as $message) {
if ($message['type'] == 'error') {
$formattedMsg = '- Line '.$message['lastLine'].', column '.$message['lastColumn'].': '.
$message['message']."\n > ".$lines[$message['lastLine'] - 1];
$ignoring = false;
foreach ($ignoreMessages as $ignoreMessage) {
if (mb_stripos($formattedMsg, $ignoreMessage) !== false) {
$ignoring = true;
}
}
if (! $ignoring) {
$failMessages[] = $formattedMsg;
}
}
}
if (count($failMessages) > 0) {
\PHPUnit_Framework_Assert::fail('Invalid HTML: '."\n".implode("\n", $failMessages));
}
}
}

View file

@ -1,10 +0,0 @@
<?php
namespace Helper;
// here you can define custom actions
// all public methods declared in helper class will be available in $I
class Unit extends \Codeception\Module
{
}

View file

@ -1,25 +0,0 @@
<?php
/**
* Inherited Methods
* @method void wantToTest($text)
* @method void wantTo($text)
* @method void execute($callable)
* @method void expectTo($prediction)
* @method void expect($prediction)
* @method void amGoingTo($argumentation)
* @method void am($role)
* @method void lookForwardTo($achieveValue)
* @method void comment($description)
* @method \Codeception\Lib\Friend haveFriend($name, $actorClass = NULL)
*
* @SuppressWarnings(PHPMD)
*/
class UnitTester extends \Codeception\Actor
{
use _generated\UnitTesterActions;
/**
* Define custom actions here
*/
}

View file

@ -1,18 +0,0 @@
# Codeception Test Suite Configuration
# suite for acceptance tests.
# perform tests in browser using the Selenium-like tools.
# powered by Mink (http://mink.behat.org).
# (tip: that's what your customer will see).
# (tip: test your ajax and javascript by one of Mink drivers).
# RUN `build` COMMAND AFTER ADDING/REMOVING MODULES.
class_name: AcceptanceTester
modules:
enabled:
- WebDriver:
url: 'https://snipe-it.local:8890'
browser: 'firefox'
- \Helper\Acceptance
- Laravel5:
part: ORM

View file

@ -1,25 +0,0 @@
<?php
$I = new AcceptanceTester($scenario);
AcceptanceTester::test_login($I);
$I->am('logged in user');
$I->wantTo('ensure that the accessories listing page loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage('/accessories');
$I->waitForElement('.table', 5); // secs
$I->seeNumberOfElements('table[name="accessories"] tr', [5, 30]);
$I->seeInTitle('Accessories');
$I->see('Accessories');
$I->seeInPageSource('accessories/create');
$I->dontSee('Accessories', '.page-header');
$I->see('Accessories', 'h1.pull-left');
/* Create Form */
$I->wantTo('ensure that the create accessories form loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->click(['link' => 'Create New']);
$I->amOnPage('/accessories/create');
$I->dontSee('Create Accessory', '.page-header');
$I->see('Create Accessory', 'h1.pull-left');
$I->dontSee('&lt;span class=&quot;');

View file

@ -1,24 +0,0 @@
<?php
$I = new AcceptanceTester($scenario);
AcceptanceTester::test_login($I);
$I->am('logged in user');
$I->wantTo('ensure that assets page loads without errors');
$I->amGoingTo('go to the assets listing page');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage('/hardware');
$I->waitForElement('.table', 5); // secs
$I->seeNumberOfElements('table[name="assets"] tr', [5, 50]);
$I->seeInTitle('Assets');
$I->see('Assets');
$I->seeInPageSource('hardware/create');
$I->dontSee('Assets', '.page-header');
$I->see('Assets', 'h1.pull-left');
/* Create Form */
$I->wantTo('ensure that the create assets form loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage('/hardware/create');
$I->dontSee('Create Asset', '.page-header');
$I->see('Create Asset', 'h1.pull-left');
$I->dontSee('&lt;span class=&quot;');

View file

@ -1,33 +0,0 @@
<?php
class AssetsCest
{
public function _before(AcceptanceTester $I)
{
AcceptanceTester::test_login($I);
}
public function listAssets(AcceptanceTester $I)
{
$I->am('logged in user');
$I->wantTo('ensure that assets page loads without errors');
$I->amGoingTo('go to the assets listing page');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage('/hardware');
$I->waitForElement('.table', 20); // secs
$I->seeNumberOfElements('table[name="assets"] tr', [5, 50]);
$I->seeInTitle(trans('general.assets'));
$I->see(trans('general.assets'));
$I->seeInPageSource('hardware/create');
$I->see(trans('general.assets'), 'h1.pull-left');
}
public function createAsset(AcceptanceTester $I)
{
$I->wantTo('ensure that the create assets form loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage('/hardware/create');
$I->dontSee('Create Asset', '.page-header');
$I->see('Create Asset', 'h1.pull-left');
}
}

View file

@ -1,24 +0,0 @@
<?php
$I = new AcceptanceTester($scenario);
AcceptanceTester::test_login($I);
$I->am('logged in user');
$I->wantTo('ensure that the categories listing page loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage('/categories');
$I->waitForElement('.table', 5); // secs
$I->seeNumberOfElements('table[name="categories"] tr', [5, 30]);
$I->seeInTitle('Categories');
$I->see('Categories');
$I->seeInPageSource('/categories/create');
$I->dontSee('Categories', '.page-header');
$I->see('Categories', 'h1.pull-left');
/* Create Form */
$I->wantTo('ensure that the create category form loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->click(['link' => 'Create New']);
$I->amOnPage('/categories/create');
$I->dontSee('Create Category', '.page-header');
$I->see('Create Category', 'h1.pull-left');
$I->dontSee('&lt;span class=&quot;');

View file

@ -1,25 +0,0 @@
<?php
$I = new AcceptanceTester($scenario);
AcceptanceTester::test_login($I);
$I->am('logged in user');
$I->wantTo('ensure that the company listing page loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage('/companies');
$I->waitForElement('.table', 5); // secs
$I->seeNumberOfElements('table[name="companies"] tr', [5, 30]);
$I->seeInTitle('Companies');
$I->see('Companies');
$I->seeInPageSource('companies/create');
$I->dontSee('Companies', '.page-header');
$I->see('Companies', 'h1.pull-left');
/* Create Form */
$I->wantTo('ensure that the create company form loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->click(['link' => 'Create New']);
$I->amOnPage('/companies/create');
$I->dontSee('Create Company', '.page-header');
$I->see('Create Company', 'h1.pull-left');
$I->dontSee('&lt;span class=&quot;');

View file

@ -1,24 +0,0 @@
<?php
$I = new AcceptanceTester($scenario);
AcceptanceTester::test_login($I);
$I->am('logged in user');
$I->wantTo('ensure that the consumables listing page loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage('/consumables');
$I->waitForElement('.table', 5); // secs
$I->seeNumberOfElements('table[name="consumables"] tr', [5, 30]);
$I->seeInTitle('Consumables');
$I->see('Consumables');
$I->seeInPageSource('/consumables/create');
$I->dontSee('Consumables', '.page-header');
$I->see('Consumables', 'h1.pull-left');
/* Create Form */
$I->wantTo('ensure that the create consumables form loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->click(['link' => 'Create New']);
$I->amOnPage('/consumables/create');
$I->dontSee('Create Consumable', '.page-header');
$I->see('Create Consumable', 'h1.pull-left');
$I->dontSee('&lt;span class=&quot;');

View file

@ -1,14 +0,0 @@
<?php
$I = new AcceptanceTester($scenario);
AcceptanceTester::test_login($I);
$I->am('logged in user');
$I->wantTo('ensure that the custom fields page loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage('/fields');
$I->seeInTitle('Custom Fields');
$I->see('Custom Fields');
$I->seeInPageSource('/fields/create');
$I->dontSee('Custom Fields', '.page-header');
$I->dontSee('Fieldsets', '.page-header');
$I->see('Manage Custom Fields', 'h1.pull-left');

View file

@ -1,25 +0,0 @@
<?php
$I = new AcceptanceTester($scenario);
AcceptanceTester::test_login($I);
$I->am('logged in user');
$I->wantTo('ensure that the department listing page loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage('/departments');
$I->waitForElement('.table', 5); // secs
$I->seeNumberOfElements('table[name="departments"] tr', [5, 30]);
$I->seeInTitle('Departments');
$I->see('Departments');
$I->seeInPageSource('departments/create');
$I->dontSee('Departments', '.page-header');
$I->see('Departments', 'h1.pull-left');
/* Create Form */
$I->wantTo('ensure that the create department form loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->click(['link' => 'Create New']);
$I->amOnPage('/department/create');
$I->dontSee('Create Department', '.page-header');
$I->see('Create Department', 'h1.pull-left');
$I->dontSee('&lt;span class=&quot;');

View file

@ -1,25 +0,0 @@
<?php
$I = new AcceptanceTester($scenario);
AcceptanceTester::test_login($I);
$I->am('logged in user');
$I->wantTo('ensure that depreciations page loads without errors');
$I->amGoingTo('go to the depreciations listing page');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage('/depreciations');
$I->seeInTitle('Depreciations');
$I->waitForElement('.table', 5); // secs
$I->seeNumberOfElements('table[name="depreciations"] tbody tr', [1, 5]);
$I->seeInPageSource('/depreciations/create');
$I->dontSee('Depreciations', '.page-header');
$I->see('Depreciations', 'h1.pull-left');
/* Create Form */
$I->wantTo('ensure that the create depreciation form loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->click(['link' => 'Create New']);
$I->amOnPage('/depreciations/create');
$I->seeInTitle('Create Depreciation');
$I->dontSee('Create Depreciation', '.page-header');
$I->see('Create Depreciation', 'h1.pull-left');
$I->dontSee('&lt;span class=&quot;');

View file

@ -1,24 +0,0 @@
<?php
$I = new AcceptanceTester($scenario);
AcceptanceTester::test_login($I);
$I->am('logged in user');
$I->wantTo('ensure that the locations listing page loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage('/locations');
$I->waitForElement('.table', 5); // secs
$I->seeNumberOfElements('tr', [5, 30]);
$I->seeInTitle('Locations');
$I->see('Locations');
$I->seeInPageSource('/locations/create');
$I->dontSee('Locations', '.page-header');
$I->see('Locations', 'h1.pull-left');
/* Create Form */
$I->wantTo('ensure that the create location form loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->click(['link' => 'Create New']);
$I->amOnPage('/locations/create');
$I->dontSee('Create Location', '.page-header');
$I->see('Create Location', 'h1.pull-left');
$I->dontSee('&lt;span class=&quot;');

View file

@ -1,18 +0,0 @@
<?php
class LoginCest
{
public function _before(AcceptanceTester $I)
{
}
// tests
public function tryToLogin(AcceptanceTester $I)
{
$I->wantTo('sign in');
$I->amOnPage('/login');
$I->see(trans('auth/general.login_prompt'));
$I->seeElement('input[type=text]');
$I->seeElement('input[type=password]');
}
}

View file

@ -1,23 +0,0 @@
<?php
$I = new AcceptanceTester($scenario);
AcceptanceTester::test_login($I);
$I->am('logged in user');
$I->wantTo('ensure that the manufacturers listing page loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage('/manufacturers');
$I->seeNumberOfElements('table[name="manufacturers"] tr', [5, 30]);
$I->see('Manufacturers');
$I->seeInTitle('Manufacturers');
$I->seeInPageSource('manufacturers/create');
$I->dontSee('Manufacturers', '.page-header');
$I->see('Manufacturers', 'h1.pull-left');
/* Create Form */
$I->wantTo('ensure that the create manufacturer form loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->click(['link' => 'Create New']);
$I->amOnPage('/manufacturers/create');
$I->dontSee('Create Manufacturer', '.page-header');
$I->see('Create Manufacturer', 'h1.pull-left');
$I->dontSee('&lt;span class=&quot;');

View file

@ -1,24 +0,0 @@
<?php
$I = new AcceptanceTester($scenario);
AcceptanceTester::test_login($I);
$I->am('logged in user');
$I->wantTo('ensure the status labels listing page loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage('/statuslabels');
$I->waitForElement('.table', 5); // secs
$I->seeNumberOfElements('tr', [1, 30]);
$I->seeInTitle('Status Labels');
$I->see('Status Labels');
$I->seeInPageSource('statuslabels/create');
$I->dontSee('Status Labels', '.page-header');
$I->see('Status Labels', 'h1.pull-left');
/* Create Form */
$I->wantTo('ensure the create status labels form loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->click(['link' => 'Create New']);
$I->amOnPage('/statuslabels/create');
$I->dontSee('Create Status Label', '.page-header');
$I->see('Create Status Label', 'h1.pull-left');
$I->dontSee('&lt;span class=&quot;');

View file

@ -1,24 +0,0 @@
<?php
$I = new AcceptanceTester($scenario);
AcceptanceTester::test_login($I);
$I->am('logged in user');
$I->wantTo('ensure that the suppliers listing page loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage('/suppliers');
$I->waitForElement('.table', 5); // secs
$I->seeNumberOfElements('table[name="suppliers"] tr', [5, 25]);
$I->seeInTitle('Suppliers');
$I->see('Suppliers');
$I->seeInPageSource('suppliers/create');
$I->dontSee('Suppliers', '.page-header');
$I->see('Suppliers', 'h1.pull-left');
/* Create Form */
$I->wantTo('ensure the create supplier form loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->click(['link' => 'Create New']);
$I->amOnPage('/suppliers/create');
$I->dontSee('Create Supplier', '.page-header');
$I->see('Create Supplier', 'h1.pull-left');
$I->dontSee('&lt;span class=&quot;');

View file

@ -1,63 +0,0 @@
<?php
$I = new AcceptanceTester($scenario);
AcceptanceTester::test_login($I);
$I->am('logged in user');
$I->wantTo('ensure that the users listing page loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage('/users');
//$I->waitForJS("return $.active == 0;", 60);
$I->waitForElement('.table', 5); // secs
//$I->seeNumberOfElements('tr', [1,10]);
$I->seeInTitle('Users');
$I->see('Users');
$I->seeInPageSource('users/create');
$I->dontSee('Users', '.page-header');
$I->see('Users', 'h1.pull-left');
$I->seeLink('Create New'); // matches <a href="/logout">Logout</a>
/* Create form */
$I->am('logged in admin');
$I->wantTo('ensure that you get errors when you submit an incomplete form');
$I->lookForwardTo('seeing errors display');
$I->click(['link' => 'Create New']);
$I->amOnPage('users/create');
$I->dontSee('Create User', '.page-header');
$I->see('Create User', 'h1.pull-left');
/* Submit form and expect errors */
$I->click(['name' => 'email']);
$I->submitForm('#userForm', [
'email' => 'me@example.com',
]);
$I->seeElement('.alert-danger');
$I->dontSeeInSource('&lt;br&gt;&lt;');
/* Submit form and expect errors */
$I->click(['name' => 'email']);
$I->click(['name' => 'username']);
$I->submitForm('#userForm', [
'email' => Helper::generateRandomString(15).'@example.com',
'first_name' => 'Joe',
'last_name' => 'Smith',
'username' => Helper::generateRandomString(15),
]);
$I->seeElement('.alert-danger');
$I->dontSeeInSource('&lt;br&gt;&lt;');
/* Submit form and expect success */
$I->wantTo('submit the form successfully');
$I->click(['name' => 'email']);
$I->fillField(['name' => 'email'], Helper::generateRandomString(15).'@example.com');
$I->fillField(['name' => 'first_name'], 'Joe');
$I->fillField(['name' => 'last_name'], 'Smith');
$I->click(['name' => 'username']);
$I->fillField(['name' => 'username'], Helper::generateRandomString(15));
$I->click(['name' => 'password']);
$I->fillField(['name' => 'password'], 'password');
$I->click(['name' => 'password_confirmation']);
$I->fillField(['name' => 'password_confirmation'], 'password');
$I->click('Save');
$I->seeElement('.alert-success');
$I->dontSeeInSource('&lt;br&gt;&lt;');

View file

@ -1,3 +0,0 @@
<?php
// Here you can initialize variables that will be available to your tests

View file

@ -1,14 +0,0 @@
class_name: ApiTester
modules:
enabled:
- \Helper\Api
- REST:
url: /api/v1
depends: Laravel5
timeout: 10
- Asserts
config:
- Laravel5:
environment_file: .env.tests
disable_middleware: true
cleanup: true

View file

@ -1,155 +0,0 @@
<?php
use App\Helpers\Helper;
use App\Http\Transformers\AccessoriesTransformer;
use App\Models\Accessory;
use App\Models\Setting;
use Illuminate\Support\Facades\Auth;
class ApiAccessoriesCest
{
protected $user;
protected $timeFormat;
public function _before(ApiTester $I)
{
$this->user = \App\Models\User::find(1);
$I->haveHttpHeader('Accept', 'application/json');
$I->amBearerAuthenticated($I->getToken($this->user));
}
/** @test */
public function indexAccessories(ApiTester $I)
{
$I->wantTo('Get a list of accessories');
// call
$I->sendGET('/accessories?limit=10');
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse(), true);
// sample verify
$accessory = App\Models\Accessory::orderByDesc('created_at')->take(10)->get()->shuffle()->first();
$I->seeResponseContainsJson($I->removeTimestamps((new AccessoriesTransformer)->transformAccessory($accessory)));
}
/** @test */
public function createAccessory(ApiTester $I, $scenario)
{
$I->wantTo('Create a new accessory');
$temp_accessory = \App\Models\Accessory::factory()->appleBtKeyboard()->make([
'name' => 'Test Accessory Name',
'company_id' => 2,
]);
// setup
$data = [
'category_id' => $temp_accessory->category_id,
'company_id' => $temp_accessory->company->id,
'location_id' => $temp_accessory->location_id,
'name' => $temp_accessory->name,
'order_number' => $temp_accessory->order_number,
'purchase_cost' => $temp_accessory->purchase_cost,
'purchase_date' => $temp_accessory->purchase_date,
'model_number' => $temp_accessory->model_number,
'manufacturer_id' => $temp_accessory->manufacturer_id,
'supplier_id' => $temp_accessory->supplier_id,
'qty' => $temp_accessory->qty,
];
// create
$I->sendPOST('/accessories', $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
}
// Put is routed to the same method in the controller
// DO we actually need to test both?
/** @test */
public function updateAccessoryWithPatch(ApiTester $I, $scenario)
{
$I->wantTo('Update an accessory with PATCH');
// create
$accessory = \App\Models\Accessory::factory()->appleBtKeyboard()->create([
'name' => 'Original Accessory Name',
'company_id' => 2,
'location_id' => 3,
]);
$I->assertInstanceOf(\App\Models\Accessory::class, $accessory);
$temp_accessory = \App\Models\Accessory::factory()->microsoftMouse()->make([
'company_id' => 3,
'name' => 'updated accessory name',
'location_id' => 1,
]);
$data = [
'category_id' => $temp_accessory->category_id,
'company_id' => $temp_accessory->company->id,
'location_id' => $temp_accessory->location_id,
'name' => $temp_accessory->name,
'order_number' => $temp_accessory->order_number,
'purchase_cost' => $temp_accessory->purchase_cost,
'purchase_date' => $temp_accessory->purchase_date,
'model_number' => $temp_accessory->model_number,
'manufacturer_id' => $temp_accessory->manufacturer_id,
'supplier_id' => $temp_accessory->supplier_id,
'image' => $temp_accessory->image,
'qty' => $temp_accessory->qty,
];
$I->assertNotEquals($accessory->name, $data['name']);
// update
$I->sendPATCH('/accessories/'.$accessory->id, $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/accessories/message.update.success'), $response->messages);
$I->assertEquals($accessory->id, $response->payload->id); // accessory id does not change
$I->assertEquals($temp_accessory->company_id, $response->payload->company_id); // company_id updated
$I->assertEquals($temp_accessory->name, $response->payload->name); // accessory name updated
$I->assertEquals($temp_accessory->location_id, $response->payload->location_id); // accessory location_id updated
$temp_accessory->created_at = Carbon::parse($response->payload->created_at);
$temp_accessory->updated_at = Carbon::parse($response->payload->updated_at);
$temp_accessory->id = $accessory->id;
// verify
$I->sendGET('/accessories/'.$accessory->id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$I->seeResponseContainsJson((new AccessoriesTransformer)->transformAccessory($temp_accessory));
}
/** @test */
public function deleteAccessoryTest(ApiTester $I, $scenario)
{
$I->wantTo('Delete an accessory');
// create
$accessory = \App\Models\Accessory::factory()->appleBtKeyboard()->create([
'name' => 'Soon to be deleted',
]);
$I->assertInstanceOf(\App\Models\Accessory::class, $accessory);
// delete
$I->sendDELETE('/accessories/'.$accessory->id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/accessories/message.delete.success'), $response->messages);
// verify, expect a 200
$I->sendGET('/accessories/'.$accessory->id);
$I->seeResponseCodeIs(200);
$I->seeResponseIsJson();
}
}

View file

@ -1,168 +0,0 @@
<?php
use App\Helpers\Helper;
use App\Http\Transformers\AssetsTransformer;
use App\Models\Asset;
use App\Models\Setting;
use Illuminate\Support\Facades\Auth;
class ApiAssetsCest
{
protected $faker;
protected $user;
protected $timeFormat;
public function _before(ApiTester $I)
{
$this->faker = \Faker\Factory::create();
$this->user = \App\Models\User::find(1);
Setting::getSettings()->time_display_format = 'H:i';
$I->amBearerAuthenticated($I->getToken($this->user));
}
/** @test */
public function indexAssets(ApiTester $I)
{
$I->wantTo('Get a list of assets');
// call
$I->sendGET('/hardware?limit=20&sort=id&order=desc');
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
// FIXME: This is disabled because the statuslabel join is doing something weird in Api/AssetsController@index
// However, it's hiding other real test errors in other parts of the code, so disabling this for now until we can fix.
// $response = json_decode($I->grabResponse(), true);
// sample verify
// $asset = Asset::orderByDesc('id')->take(20)->get()->first();
//
// $I->seeResponseContainsJson($I->removeTimestamps((new AssetsTransformer)->transformAsset($asset)));
}
/** @test */
public function createAsset(ApiTester $I, $scenario)
{
$I->wantTo('Create a new asset');
$temp_asset = \App\Models\Asset::factory()->laptopMbp()->make([
'asset_tag' => 'Test Asset Tag',
'company_id' => 2,
]);
// setup
$data = [
'asset_tag' => $temp_asset->asset_tag,
'assigned_to' => $temp_asset->assigned_to,
'company_id' => $temp_asset->company->id,
'image' => $temp_asset->image,
'model_id' => $temp_asset->model_id,
'name' => $temp_asset->name,
'notes' => $temp_asset->notes,
'purchase_cost' => $temp_asset->purchase_cost,
'purchase_date' => $temp_asset->purchase_date,
'rtd_location_id' => $temp_asset->rtd_location_id,
'serial' => $temp_asset->serial,
'status_id' => $temp_asset->status_id,
'supplier_id' => $temp_asset->supplier_id,
'warranty_months' => $temp_asset->warranty_months,
];
// create
$I->sendPOST('/hardware', $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
}
/** @test */
public function updateAssetWithPatch(ApiTester $I, $scenario)
{
$I->wantTo('Update an asset with PATCH');
// create
$asset = \App\Models\Asset::factory()->laptopMbp()->create([
'company_id' => 2,
'rtd_location_id' => 3,
]);
$I->assertInstanceOf(\App\Models\Asset::class, $asset);
$temp_asset = \App\Models\Asset::factory()->laptopAir()->make([
'company_id' => 3,
'name' => 'updated asset name',
'rtd_location_id' => 1,
]);
$data = [
'asset_tag' => $temp_asset->asset_tag,
'assigned_to' => $temp_asset->assigned_to,
'company_id' => $temp_asset->company->id,
'image' => $temp_asset->image,
'model_id' => $temp_asset->model_id,
'name' => $temp_asset->name,
'notes' => $temp_asset->notes,
'order_number' => $temp_asset->order_number,
'purchase_cost' => $temp_asset->purchase_cost,
'purchase_date' => $temp_asset->purchase_date->format('Y-m-d'),
'rtd_location_id' => $temp_asset->rtd_location_id,
'serial' => $temp_asset->serial,
'status_id' => $temp_asset->status_id,
'supplier_id' => $temp_asset->supplier_id,
'warranty_months' => $temp_asset->warranty_months,
];
$I->assertNotEquals($asset->name, $data['name']);
// update
$I->sendPATCH('/hardware/'.$asset->id, $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
// dd($response);
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/hardware/message.update.success'), $response->messages);
$I->assertEquals($asset->id, $response->payload->id); // asset id does not change
$I->assertEquals($temp_asset->asset_tag, $response->payload->asset_tag); // asset tag updated
$I->assertEquals($temp_asset->name, $response->payload->name); // asset name updated
$I->assertEquals($temp_asset->rtd_location_id, $response->payload->rtd_location_id); // asset rtd_location_id updated
$temp_asset->created_at = Carbon::parse($response->payload->created_at);
$temp_asset->updated_at = Carbon::parse($response->payload->updated_at);
$temp_asset->id = $asset->id;
$temp_asset->location_id = $response->payload->rtd_location_id;
// verify
$I->sendGET('/hardware/'.$asset->id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$I->seeResponseContainsJson((new AssetsTransformer)->transformAsset($temp_asset));
}
/** @test */
public function deleteAssetTest(ApiTester $I, $scenario)
{
$I->wantTo('Delete an asset');
// create
$asset = \App\Models\Asset::factory()->laptopMbp()->create();
$I->assertInstanceOf(\App\Models\Asset::class, $asset);
// delete
$I->sendDELETE('/hardware/'.$asset->id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/hardware/message.delete.success'), $response->messages);
// verify, expect a 200
$I->sendGET('/hardware/'.$asset->id);
$I->seeResponseCodeIs(200);
$I->seeResponseIsJson();
// Make sure we're soft deleted.
$response = json_decode($I->grabResponse());
$I->assertNotNull($response->deleted_at);
}
}

View file

@ -1,141 +0,0 @@
<?php
use App\Helpers\Helper;
use App\Http\Transformers\CategoriesTransformer;
use App\Models\Category;
use App\Models\Setting;
use Illuminate\Support\Facades\Auth;
class ApiCategoriesCest
{
protected $user;
protected $timeFormat;
public function _before(ApiTester $I)
{
$this->user = \App\Models\User::find(1);
$I->haveHttpHeader('Accept', 'application/json');
$I->amBearerAuthenticated($I->getToken($this->user));
}
/** @test */
public function indexCategorys(ApiTester $I)
{
$I->wantTo('Get a list of categories');
// call
$I->sendGET('/categories?order_by=id&limit=10');
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse(), true);
// sample verify
$category = App\Models\Category::withCount('assets as assets_count', 'accessories as accessories_count', 'consumables as consumables_count', 'components as components_count', 'licenses as licenses_count')
->orderByDesc('created_at')->take(10)->get()->shuffle()->first();
$I->seeResponseContainsJson($I->removeTimestamps((new CategoriesTransformer)->transformCategory($category)));
}
/** @test */
public function createCategory(ApiTester $I, $scenario)
{
$I->wantTo('Create a new category');
$temp_category = \App\Models\Category::factory()->assetLaptopCategory()->make([
'name' => 'Test Category Tag',
]);
// setup
$data = [
'category_type' => $temp_category->category_type,
'checkin_email' => $temp_category->checkin_email,
'eula_text' => $temp_category->eula_text,
'name' => $temp_category->name,
'require_acceptance' => $temp_category->require_acceptance,
'use_default_eula' => $temp_category->use_default_eula,
];
// create
$I->sendPOST('/categories', $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
}
// Put is routed to the same method in the controller
// DO we actually need to test both?
/** @test */
public function updateCategoryWithPatch(ApiTester $I, $scenario)
{
$I->wantTo('Update an category with PATCH');
// create
$category = \App\Models\Category::factory()->assetLaptopCategory()
->create([
'name' => 'Original Category Name',
]);
$I->assertInstanceOf(\App\Models\Category::class, $category);
$temp_category = \App\Models\Category::factory()->accessoryMouseCategory()->make([
'name' => 'updated category name',
]);
$data = [
'category_type' => $temp_category->category_type,
'checkin_email' => $temp_category->checkin_email,
'eula_text' => $temp_category->eula_text,
'name' => $temp_category->name,
'require_acceptance' => $temp_category->require_acceptance,
'use_default_eula' => $temp_category->use_default_eula,
];
$I->assertNotEquals($category->name, $data['name']);
// update
$I->sendPATCH('/categories/'.$category->id, $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/categories/message.update.success'), $response->messages);
$I->assertEquals($category->id, $response->payload->id); // category id does not change
$I->assertEquals($temp_category->name, $response->payload->name); // category name updated
// Some manual copying to compare against
$temp_category->created_at = Carbon::parse($response->payload->created_at);
$temp_category->updated_at = Carbon::parse($response->payload->updated_at);
$temp_category->id = $category->id;
// verify
$I->sendGET('/categories/'.$category->id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$I->seeResponseContainsJson((new CategoriesTransformer)->transformCategory($temp_category));
}
/** @test */
public function deleteCategoryTest(ApiTester $I, $scenario)
{
$I->wantTo('Delete an category');
// create
$category = \App\Models\Category::factory()->assetLaptopCategory()->create([
'name' => 'Soon to be deleted',
]);
$I->assertInstanceOf(\App\Models\Category::class, $category);
// delete
$I->sendDELETE('/categories/'.$category->id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/categories/message.delete.success'), $response->messages);
// verify, expect a 200
$I->sendGET('/categories/'.$category->id);
$I->seeResponseCodeIs(200);
$I->seeResponseIsJson();
}
}

View file

@ -1,147 +0,0 @@
<?php
use App\Exceptions\CheckoutNotAllowed;
use App\Helpers\Helper;
use App\Models\Asset;
use App\Models\Setting;
use App\Models\Statuslabel;
use Illuminate\Support\Facades\Auth;
class ApiCheckoutAssetsCest
{
protected $faker;
protected $user;
protected $timeFormat;
public function _before(ApiTester $I)
{
$this->user = \App\Models\User::find(1);
$I->amBearerAuthenticated($I->getToken($this->user));
}
/** @test */
public function checkoutAssetToUser(ApiTester $I)
{
$I->wantTo('Check out an asset to a user');
//Grab an asset from the database that isn't checked out.
$asset = Asset::whereNull('assigned_to')->first();
$targetUser = \App\Models\User::factory()->create();
$data = [
'assigned_user' => $targetUser->id,
'note' => 'This is a test checkout note',
'expected_checkin' => '2018-05-24',
'name' => 'Updated Asset Name',
'checkout_to_type' => 'user',
];
$I->sendPOST("/hardware/{$asset->id}/checkout", $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/hardware/message.checkout.success'), $response->messages);
// Confirm results.
$I->sendGET("/hardware/{$asset->id}");
$I->seeResponseContainsJson([
'assigned_to' => [
'id' => $targetUser->id,
'type' => 'user',
],
'name' => 'Updated Asset Name',
'expected_checkin' => Helper::getFormattedDateObject('2018-05-24', 'date'),
]);
}
/** @test */
public function checkoutAssetToAsset(ApiTester $I)
{
$I->wantTo('Check out an asset to an asset');
//Grab an asset from the database that isn't checked out.
$asset = Asset::whereNull('assigned_to')
->where('model_id', 8)
->where('status_id', Statuslabel::deployable()->first()->id)
->first(); // We need to make sure that this is an asset/model that doesn't require acceptance
$targetAsset = \App\Models\Asset::factory()->desktopMacpro()->create([
'name' => 'Test Asset For Checkout to',
]);
$data = [
'assigned_asset' => $targetAsset->id,
'checkout_to_type' => 'asset',
];
$I->sendPOST("/hardware/{$asset->id}/checkout", $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/hardware/message.checkout.success'), $response->messages);
// Confirm results.
$I->sendGET("/hardware/{$asset->id}");
$I->seeResponseContainsJson([
'assigned_to' => [
'id' => $targetAsset->id,
'type' => 'asset',
],
]);
}
/** @test */
public function checkoutAssetToLocation(ApiTester $I)
{
$I->wantTo('Check out an asset to an asset');
//Grab an asset from the database that isn't checked out.
$asset = Asset::whereNull('assigned_to')
->where('model_id', 8)
->where('status_id', Statuslabel::deployable()->first()->id)
->first(); // We need to make sure that this is an asset/model that doesn't require acceptance
$targetLocation = \App\Models\Location::factory()->create([
'name' => 'Test Location for Checkout',
]);
$data = [
'assigned_location' => $targetLocation->id,
'checkout_to_type' => 'location',
];
$I->sendPOST("/hardware/{$asset->id}/checkout", $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/hardware/message.checkout.success'), $response->messages);
// Confirm results.
$I->sendGET("/hardware/{$asset->id}");
$I->seeResponseContainsJson([
'assigned_to' => [
'id' => $targetLocation->id,
'type' => 'location',
],
]);
}
/** @test */
public function checkinAsset(ApiTester $I)
{
$I->wantTo('Checkin an asset that is currently checked out');
$asset = Asset::whereNotNull('assigned_to')->first();
$I->sendPOST("/hardware/{$asset->id}/checkin", [
'note' => 'Checkin Note',
]);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/hardware/message.checkin.success'), $response->messages);
// Verify
$I->sendGET("/hardware/{$asset->id}");
$I->seeResponseContainsJson([
'assigned_to' => null,
]);
}
}

View file

@ -1,132 +0,0 @@
<?php
use App\Helpers\Helper;
use App\Http\Transformers\CompaniesTransformer;
use App\Models\Company;
use App\Models\Setting;
use Illuminate\Support\Facades\Auth;
class ApiCompaniesCest
{
protected $user;
protected $timeFormat;
public function _before(ApiTester $I)
{
$this->user = \App\Models\User::find(1);
$I->haveHttpHeader('Accept', 'application/json');
$I->amBearerAuthenticated($I->getToken($this->user));
}
/** @test */
public function indexCompanys(ApiTester $I)
{
$I->wantTo('Get a list of companies');
// call
$I->sendGET('/companies?order_by=id&limit=10');
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse(), true);
// dd($response);
// sample verify
$company = App\Models\Company::withCount('assets as assets_count', 'licenses as licenses_count', 'accessories as accessories_count', 'consumables as consumables_count', 'components as components_count', 'users as users_count')
->orderByDesc('created_at')->take(10)->get()->shuffle()->first();
$I->seeResponseContainsJson($I->removeTimestamps((new CompaniesTransformer)->transformCompany($company)));
}
/** @test */
public function createCompany(ApiTester $I, $scenario)
{
$I->wantTo('Create a new company');
$temp_company = \App\Models\Company::factory()->make([
'name' => 'Test Company Tag',
]);
// setup
$data = [
'name' => $temp_company->name,
];
// create
$I->sendPOST('/companies', $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
}
// Put is routed to the same method in the controller
// DO we actually need to test both?
/** @test */
public function updateCompanyWithPatch(ApiTester $I, $scenario)
{
$I->wantTo('Update an company with PATCH');
// create
$company = \App\Models\Company::factory()->create([
'name' => 'Original Company Name',
]);
$I->assertInstanceOf(\App\Models\Company::class, $company);
$temp_company = \App\Models\Company::factory()->make([
'name' => 'updated company name',
]);
$data = [
'name' => $temp_company->name,
];
$I->assertNotEquals($company->name, $data['name']);
// update
$I->sendPATCH('/companies/'.$company->id, $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/companies/message.update.success'), $response->messages);
$I->assertEquals($company->id, $response->payload->id); // company id does not change
$I->assertEquals($temp_company->name, $response->payload->name); // company name updated
// Some manual copying to compare against
$temp_company->created_at = Carbon::parse($response->payload->created_at->datetime);
$temp_company->updated_at = Carbon::parse($response->payload->updated_at->datetime);
$temp_company->id = $company->id;
// verify
$I->sendGET('/companies/'.$company->id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$I->seeResponseContainsJson((new CompaniesTransformer)->transformCompany($temp_company));
}
/** @test */
public function deleteCompanyTest(ApiTester $I, $scenario)
{
$I->wantTo('Delete an company');
// create
$company = \App\Models\Company::factory()->create([
'name' => 'Soon to be deleted',
]);
$I->assertInstanceOf(\App\Models\Company::class, $company);
// delete
$I->sendDELETE('/companies/'.$company->id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/companies/message.delete.success'), $response->messages);
// verify, expect a 200
$I->sendGET('/companies/'.$company->id);
$I->seeResponseCodeIs(200);
$I->seeResponseIsJson();
}
}

View file

@ -1,80 +0,0 @@
<?php
class ApiComponentsAssetsCest
{
protected $faker;
protected $user;
// public function _before(ApiTester $I)
// {
// $this->faker = \Faker\Factory::create();
// $this->user = \App\Models\User::find(1);
// $I->amBearerAuthenticated($I->getToken($this->user));
// }
// // /** @test */
// // public function indexComponentsAssets(ApiTester $I)
// // {
// // $I->wantTo('Get a list of assets related to a component');
// // // generate component
// // $component = factory(\App\Models\Component::class)
// // ->create(['user_id' => $this->user->id, 'qty' => 20]);
// // // generate assets and associate component
// // $assets = factory(\App\Models\Asset::class, 2)
// // ->create(['user_id' => $this->user->id])
// // ->each(function ($asset) use ($component) {
// // $component->assets()->attach($component->id, [
// // 'component_id' => $component->id,
// // 'user_id' => $this->user->id,
// // 'created_at' => date('Y-m-d H:i:s'),
// // 'assigned_qty' => 2,
// // 'asset_id' => $asset->id
// // ]);
// // });
// // // verify
// // $I->sendGET('/components/' . $component->id . '/assets/');
// // $I->seeResponseIsJson();
// // $I->seeResponseCodeIs(200);
// // $response = json_decode($I->grabResponse());
// // $I->assertEquals(2, $response->total);
// // $I->assertInstanceOf(\Illuminate\Database\Eloquent\Collection::class, $assets);
// // $I->seeResponseContainsJson(['rows' => [
// // 0 => [
// // 'name' => $assets[0]->name,
// // 'id' => $assets[0]->id,
// // 'created_at' => $assets[0]->created_at->format('Y-m-d'),
// // ],
// // 1 => [
// // 'name' => $assets[1]->name,
// // 'id' => $assets[1]->id,
// // 'created_at' => $assets[1]->created_at->format('Y-m-d'),
// // ],
// // ]
// // ]);
// // }
// // /** @test */
// // public function expectEmptyResponseWithoutAssociatedAssets(ApiTester $I, $scenario)
// // {
// // $I->wantTo('See an empty response when there are no associated assets to a component');
// // $component = factory(\App\Models\Component::class)
// // ->create(['user_id' => $this->user->id, 'qty' => 20]);
// // $I->sendGET('/components/' . $component->id . '/assets');
// // $I->seeResponseCodeIs(200);
// // $I->seeResponseIsJson();
// // $response = json_decode($I->grabResponse());
// // $I->assertEquals(0, $response->total);
// // $I->assertEquals([], $response->rows);
// // $I->seeResponseContainsJson(['total' => 0, 'rows' => []]);
// // }
}

View file

@ -1,156 +0,0 @@
<?php
use App\Helpers\Helper;
use App\Http\Transformers\ComponentsTransformer;
use App\Models\Component;
use App\Models\Setting;
use Illuminate\Support\Facades\Auth;
class ApiComponentsCest
{
protected $user;
protected $timeFormat;
public function _before(ApiTester $I)
{
$this->user = \App\Models\User::find(1);
$I->haveHttpHeader('Accept', 'application/json');
$I->amBearerAuthenticated($I->getToken($this->user));
}
/** @test */
public function indexComponents(ApiTester $I)
{
$I->wantTo('Get a list of components');
// call
$I->sendGET('/components?limit=10');
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse(), true);
// sample verify
$component = App\Models\Component::orderByDesc('created_at')->take(10)->get()->shuffle()->first();
$I->seeResponseContainsJson($I->removeTimestamps((new ComponentsTransformer)->transformComponent($component)));
}
/** @test */
public function createComponent(ApiTester $I, $scenario)
{
$I->wantTo('Create a new component');
$temp_component = \App\Models\Component::factory()->ramCrucial4()->make([
'name' => 'Test Component Name',
'company_id' => 2,
]);
// setup
$data = [
'category_id' => $temp_component->category_id,
'company_id' => $temp_component->company->id,
'location_id' => $temp_component->location_id,
'manufacturer_id' => $temp_component->manufacturer_id,
'model_number' => $temp_component->model_number,
'name' => $temp_component->name,
'order_number' => $temp_component->order_number,
'purchase_cost' => $temp_component->purchase_cost,
'purchase_date' => $temp_component->purchase_date,
'qty' => $temp_component->qty,
'serial' => $temp_component->serial,
];
// create
$I->sendPOST('/components', $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
}
// Put is routed to the same method in the controller
// DO we actually need to test both?
/** @test */
public function updateComponentWithPatch(ApiTester $I, $scenario)
{
$I->wantTo('Update an component with PATCH');
// create
$component = \App\Models\Component::factory()->ramCrucial4()->create([
'name' => 'Original Component Name',
'company_id' => 2,
'location_id' => 3,
]);
$I->assertInstanceOf(\App\Models\Component::class, $component);
$temp_component = \App\Models\Component::factory()->ssdCrucial240()->make([
'company_id' => 3,
'name' => 'updated component name',
'location_id' => 1,
]);
$data = [
'category_id' => $temp_component->category_id,
'company_id' => $temp_component->company->id,
'location_id' => $temp_component->location_id,
'min_amt' => $temp_component->min_amt,
'name' => $temp_component->name,
'order_number' => $temp_component->order_number,
'purchase_cost' => $temp_component->purchase_cost,
'purchase_date' => $temp_component->purchase_date,
'qty' => $temp_component->qty,
'serial' => $temp_component->serial,
];
$I->assertNotEquals($component->name, $data['name']);
// update
$I->sendPATCH('/components/'.$component->id, $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/components/message.update.success'), $response->messages);
$I->assertEquals($component->id, $response->payload->id); // component id does not change
$I->assertEquals($temp_component->company_id, $response->payload->company_id); // company_id updated
$I->assertEquals($temp_component->name, $response->payload->name); // component name updated
$I->assertEquals($temp_component->location_id, $response->payload->location_id); // component location_id updated
$temp_component->created_at = Carbon::parse($response->payload->created_at);
$temp_component->updated_at = Carbon::parse($response->payload->updated_at);
$temp_component->id = $component->id;
// verify
$I->sendGET('/components/'.$component->id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$I->seeResponseContainsJson((new ComponentsTransformer)->transformComponent($temp_component));
}
/** @test */
public function deleteComponentTest(ApiTester $I, $scenario)
{
$I->wantTo('Delete an component');
// create
$component = \App\Models\Component::factory()->ramCrucial4()->create([
'name' => 'Soon to be deleted',
]);
$I->assertInstanceOf(\App\Models\Component::class, $component);
// delete
$I->sendDELETE('/components/'.$component->id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
// dd($response);
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/components/message.delete.success'), $response->messages);
// verify, expect a 200
$I->sendGET('/components/'.$component->id);
$I->seeResponseCodeIs(200);
$I->seeResponseIsJson();
}
}

View file

@ -1,155 +0,0 @@
<?php
use App\Helpers\Helper;
use App\Http\Transformers\ConsumablesTransformer;
use App\Models\Consumable;
use App\Models\Setting;
use Illuminate\Support\Facades\Auth;
class ApiConsumablesCest
{
protected $user;
protected $timeFormat;
public function _before(ApiTester $I)
{
$this->user = \App\Models\User::find(1);
$I->haveHttpHeader('Accept', 'application/json');
$I->amBearerAuthenticated($I->getToken($this->user));
}
/** @test */
public function indexConsumables(ApiTester $I)
{
$I->wantTo('Get a list of consumables');
// call
$I->sendGET('/consumables?limit=10');
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse(), true);
// sample verify
$consumable = App\Models\Consumable::orderByDesc('created_at')->take(10)->get()->shuffle()->first();
$I->seeResponseContainsJson($I->removeTimestamps((new ConsumablesTransformer)->transformConsumable($consumable)));
}
/** @test */
public function createConsumable(ApiTester $I, $scenario)
{
$I->wantTo('Create a new consumable');
$temp_consumable = \App\Models\Consumable::factory()->ink()->make([
'name' => 'Test Consumable Name',
'company_id' => 2,
]);
// setup
$data = [
'category_id' => $temp_consumable->category_id,
'company_id' => $temp_consumable->company->id,
'location_id' => $temp_consumable->location_id,
'manufacturer_id' => $temp_consumable->manufacturer_id,
'name' => $temp_consumable->name,
'order_number' => $temp_consumable->order_number,
'purchase_cost' => $temp_consumable->purchase_cost,
'purchase_date' => $temp_consumable->purchase_date,
'qty' => $temp_consumable->qty,
'model_number' => $temp_consumable->model_number,
];
// create
$I->sendPOST('/consumables', $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
}
// Put is routed to the same method in the controller
// DO we actually need to test both?
/** @test */
public function updateConsumableWithPatch(ApiTester $I, $scenario)
{
$I->wantTo('Update an consumable with PATCH');
// create
$consumable = \App\Models\Consumable::factory()->ink()->create([
'name' => 'Original Consumable Name',
'company_id' => 2,
'location_id' => 3,
]);
$I->assertInstanceOf(\App\Models\Consumable::class, $consumable);
$temp_consumable = \App\Models\Consumable::factory()->cardstock()->make([
'company_id' => 3,
'name' => 'updated consumable name',
'location_id' => 1,
]);
$data = [
'category_id' => $temp_consumable->category_id,
'company_id' => $temp_consumable->company->id,
'item_no' => $temp_consumable->item_no,
'location_id' => $temp_consumable->location_id,
'name' => $temp_consumable->name,
'order_number' => $temp_consumable->order_number,
'purchase_cost' => $temp_consumable->purchase_cost,
'purchase_date' => $temp_consumable->purchase_date,
'model_number' => $temp_consumable->model_number,
'manufacturer_id' => $temp_consumable->manufacturer_id,
'supplier_id' => $temp_consumable->supplier_id,
'qty' => $temp_consumable->qty,
];
$I->assertNotEquals($consumable->name, $data['name']);
// update
$I->sendPATCH('/consumables/'.$consumable->id, $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/consumables/message.update.success'), $response->messages);
$I->assertEquals($consumable->id, $response->payload->id); // consumable id does not change
$I->assertEquals($temp_consumable->company_id, $response->payload->company_id); // company_id updated
$I->assertEquals($temp_consumable->name, $response->payload->name); // consumable name updated
$I->assertEquals($temp_consumable->location_id, $response->payload->location_id); // consumable location_id updated
$temp_consumable->created_at = Carbon::parse($response->payload->created_at);
$temp_consumable->updated_at = Carbon::parse($response->payload->updated_at);
$temp_consumable->id = $consumable->id;
// verify
$I->sendGET('/consumables/'.$consumable->id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$I->seeResponseContainsJson((new ConsumablesTransformer)->transformConsumable($temp_consumable));
}
/** @test */
public function deleteConsumableTest(ApiTester $I, $scenario)
{
$I->wantTo('Delete an consumable');
// create
$consumable = \App\Models\Consumable::factory()->ink()->create([
'name' => 'Soon to be deleted',
]);
$I->assertInstanceOf(\App\Models\Consumable::class, $consumable);
// delete
$I->sendDELETE('/consumables/'.$consumable->id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/consumables/message.delete.success'), $response->messages);
// verify, expect a 200
$I->sendGET('/consumables/'.$consumable->id);
$I->seeResponseCodeIs(200);
$I->seeResponseIsJson();
}
}

View file

@ -1,185 +0,0 @@
<?php
use App\Http\Transformers\LicenseSeatsTransformer;
use App\Models\Asset;
use App\Models\License;
use App\Models\LicenseSeat;
use App\Models\User;
class ApiLicenseSeatsCest
{
protected $license;
protected $timeFormat;
public function _before(ApiTester $I)
{
$this->user = \App\Models\User::find(1);
$I->haveHttpHeader('Accept', 'application/json');
$I->amBearerAuthenticated($I->getToken($this->user));
}
/** @test */
public function indexLicenseSeats(ApiTester $I)
{
$I->wantTo('Get a list of license seats for a specific license');
// call
$I->sendGET('/licenses/1/seats?limit=10&order=desc');
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
// sample verify
$licenseSeats = App\Models\LicenseSeat::where('license_id', 1)
->orderBy('id', 'desc')->take(10)->get();
// pick a random seat
$licenseSeat = $licenseSeats->random();
// need the index in the original list so that the "name" field is determined correctly
$licenseSeatNumber = 0;
foreach ($licenseSeats as $index=>$seat) {
if ($licenseSeat === $seat) {
$licenseSeatNumber = $index + 1;
}
}
$I->seeResponseContainsJson($I->removeTimestamps((new LicenseSeatsTransformer)->transformLicenseSeat($licenseSeat, $licenseSeatNumber)));
}
/** @test */
public function showLicenseSeat(ApiTester $I)
{
$I->wantTo('Get a license seat');
// call
$I->sendGET('/licenses/1/seats/10');
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
// sample verify
$licenseSeat = App\Models\LicenseSeat::findOrFail(10);
$I->seeResponseContainsJson($I->removeTimestamps((new LicenseSeatsTransformer)->transformLicenseSeat($licenseSeat)));
}
/** @test */
public function checkoutLicenseSeatToUser(ApiTester $I)
{
$I->wantTo('Checkout a license seat to a user');
$user = App\Models\User::all()->random();
$licenseSeat = App\Models\LicenseSeat::all()->random();
$endpoint = '/licenses/'.$licenseSeat->license_id.'/seats/'.$licenseSeat->id;
$data = [
'assigned_to' => $user->id,
'note' => 'Test Checkout to User via API',
];
// update
$I->sendPATCH($endpoint, $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/licenses/message.update.success'), $response->messages);
$I->assertEquals($licenseSeat->license_id, $response->payload->license_id); // license id does not change
$I->assertEquals($licenseSeat->id, $response->payload->id); // license seat id does not change
// verify
$licenseSeat = $licenseSeat->fresh();
$I->sendGET($endpoint);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$I->seeResponseContainsJson($I->removeTimestamps((new LicenseSeatsTransformer)->transformLicenseSeat($licenseSeat)));
// verify that the last logged action is a checkout
$I->sendGET('/reports/activity?item_type=license&limit=1&item_id='.$licenseSeat->license_id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$I->seeResponseContainsJson([
'action_type' => 'checkout',
]);
}
/** @test */
public function checkoutLicenseSeatToAsset(ApiTester $I)
{
$I->wantTo('Checkout a license seat to an asset');
$asset = App\Models\Asset::all()->random();
$licenseSeat = App\Models\LicenseSeat::all()->random();
$endpoint = '/licenses/'.$licenseSeat->license_id.'/seats/'.$licenseSeat->id;
$data = [
'asset_id' => $asset->id,
'note' => 'Test Checkout to Asset via API',
];
// update
$I->sendPATCH($endpoint, $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/licenses/message.update.success'), $response->messages);
$I->assertEquals($licenseSeat->license_id, $response->payload->license_id); // license id does not change
$I->assertEquals($licenseSeat->id, $response->payload->id); // license seat id does not change
// verify
$licenseSeat = $licenseSeat->fresh();
$I->sendGET($endpoint);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$I->seeResponseContainsJson($I->removeTimestamps((new LicenseSeatsTransformer)->transformLicenseSeat($licenseSeat)));
// verify that the last logged action is a checkout
$I->sendGET('/reports/activity?item_type=license&limit=1&item_id='.$licenseSeat->license_id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$I->seeResponseContainsJson([
'action_type' => 'checkout',
]);
}
/** @test */
public function checkoutLicenseSeatToUserAndAsset(ApiTester $I)
{
$I->wantTo('Checkout a license seat to a user AND an asset');
$asset = App\Models\Asset::all()->random();
$user = App\Models\User::all()->random();
$licenseSeat = App\Models\LicenseSeat::all()->random();
$endpoint = '/licenses/'.$licenseSeat->license_id.'/seats/'.$licenseSeat->id;
$data = [
'asset_id' => $asset->id,
'assigned_to' => $user->id,
'note' => 'Test Checkout to User and Asset via API',
];
// update
$I->sendPATCH($endpoint, $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/licenses/message.update.success'), $response->messages);
$I->assertEquals($licenseSeat->license_id, $response->payload->license_id); // license id does not change
$I->assertEquals($licenseSeat->id, $response->payload->id); // license seat id does not change
// verify
$licenseSeat = $licenseSeat->fresh();
$I->sendGET($endpoint);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$I->seeResponseContainsJson($I->removeTimestamps((new LicenseSeatsTransformer)->transformLicenseSeat($licenseSeat)));
// verify that the last logged action is a checkout
$I->sendGET('/reports/activity?item_type=license&limit=1&item_id='.$licenseSeat->license_id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$I->seeResponseContainsJson([
'action_type' => 'checkout',
]);
}
}

View file

@ -1,194 +0,0 @@
<?php
use App\Helpers\Helper;
use App\Http\Transformers\LicensesTransformer;
use App\Models\License;
use App\Models\Setting;
use Illuminate\Support\Facades\Auth;
class ApiLicensesCest
{
protected $license;
protected $timeFormat;
public function _before(ApiTester $I)
{
$this->user = \App\Models\User::find(1);
$I->haveHttpHeader('Accept', 'application/json');
$I->amBearerAuthenticated($I->getToken($this->user));
}
/** @test */
public function indexLicenses(ApiTester $I)
{
$I->wantTo('Get a list of licenses');
// call
$I->sendGET('/licenses?limit=10&sort=created_at');
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse(), true);
// sample verify
$license = App\Models\License::orderByDesc('created_at')
->withCount('freeSeats as free_seats_count')
->take(10)->get()->shuffle()->first();
$I->seeResponseContainsJson($I->removeTimestamps((new LicensesTransformer)->transformLicense($license)));
}
/** @test */
public function createLicense(ApiTester $I, $scenario)
{
$I->wantTo('Create a new license');
$temp_license = \App\Models\License::factory()->acrobat()->make([
'name' => 'Test License Name',
'depreciation_id' => 3,
'company_id' => 2,
]);
// setup
$data = [
'company_id' => $temp_license->company_id,
'depreciation_id' => $temp_license->depreciation_id,
'expiration_date' => $temp_license->expiration_date,
'license_email' => $temp_license->license_email,
'license_name' => $temp_license->license_name,
'maintained' => $temp_license->maintained,
'manufacturer_id' => $temp_license->manufacturer_id,
'name' => $temp_license->name,
'notes' => $temp_license->notes,
'order_number' => $temp_license->order_number,
'purchase_cost' => $temp_license->purchase_cost,
'purchase_date' => $temp_license->purchase_date,
'purchase_order' => $temp_license->purchase_order,
'reassignable' => $temp_license->reassignable,
'seats' => $temp_license->seats,
'serial' => $temp_license->serial,
'supplier_id' => $temp_license->supplier_id,
'termination_date' => $temp_license->termination_date,
];
// create
$I->sendPOST('/licenses', $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
}
// Put is routed to the same method in the controller
// DO we actually need to test both?
/** @test */
public function updateLicenseWithPatch(ApiTester $I, $scenario)
{
$I->wantTo('Update a license with PATCH');
// create
$license = \App\Models\License::factory()->acrobat()->create([
'name' => 'Original License Name',
'depreciation_id' => 3,
'company_id' => 2,
]);
$I->assertInstanceOf(\App\Models\License::class, $license);
$temp_license = \App\Models\License::factory()->office()->make([
'company_id' => 3,
'depreciation_id' => 2,
]);
$data = [
'company_id' => $temp_license->company_id,
'depreciation_id' => $temp_license->depreciation_id,
'expiration_date' => $temp_license->expiration_date,
'license_email' => $temp_license->license_email,
'license_name' => $temp_license->license_name,
'maintained' => $temp_license->maintained,
'manufacturer_id' => $temp_license->manufacturer_id,
'name' => $temp_license->name,
'notes' => $temp_license->notes,
'order_number' => $temp_license->order_number,
'purchase_cost' => $temp_license->purchase_cost,
'purchase_date' => $temp_license->purchase_date,
'purchase_order' => $temp_license->purchase_order,
'reassignable' => $temp_license->reassignable,
'seats' => $temp_license->seats,
'serial' => $temp_license->serial,
'supplier_id' => $temp_license->supplier_id,
'category_id' => $temp_license->category_id,
'termination_date' => $temp_license->termination_date,
];
// We aren't checking anyhting out in this test, so this fakes the withCount() that happens on a normal db fetch.
$temp_license->free_seats_count = $temp_license->seats;
$I->assertNotEquals($license->name, $data['name']);
// update
$I->sendPATCH('/licenses/'.$license->id, $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/licenses/message.update.success'), $response->messages);
$I->assertEquals($license->id, $response->payload->id); // license id does not change
$I->assertEquals($temp_license->name, $response->payload->name); // license name
$temp_license->created_at = Carbon::parse($response->payload->created_at);
$temp_license->updated_at = Carbon::parse($response->payload->updated_at);
$temp_license->id = $license->id;
// verify
$I->sendGET('/licenses/'.$license->id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$I->seeResponseContainsJson((new LicensesTransformer)->transformLicense($temp_license));
}
/** @test */
public function deleteLicenseWithUsersTest(ApiTester $I, $scenario)
{
$I->wantTo('Ensure a license with seats checked out cannot be deleted');
// create
$license = \App\Models\License::factory()->acrobat()->create([
'name' => 'Soon to be deleted',
]);
$licenseSeat = $license->freeSeat();
$licenseSeat->assigned_to = $this->user->id;
$licenseSeat->save();
$I->assertInstanceOf(\App\Models\License::class, $license);
// delete
$I->sendDELETE('/licenses/'.$license->id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('error', $response->status);
$I->assertEquals(trans('admin/licenses/message.assoc_users'), $response->messages);
}
/** @test */
public function deleteLicenseTest(ApiTester $I, $scenario)
{
$I->wantTo('Delete an license');
// create
$license = \App\Models\License::factory()->acrobat()->create([
'name' => 'Soon to be deleted',
]);
$I->assertInstanceOf(\App\Models\License::class, $license);
// delete
$I->sendDELETE('/licenses/'.$license->id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/licenses/message.delete.success'), $response->messages);
// verify, expect a 200
$I->sendGET('/licenses/'.$license->id);
$I->seeResponseCodeIs(200);
$I->seeResponseIsJson();
}
}

View file

@ -1,154 +0,0 @@
<?php
use App\Helpers\Helper;
use App\Http\Transformers\LocationsTransformer;
use App\Models\Location;
use App\Models\Setting;
use Illuminate\Support\Facades\Auth;
class ApiLocationsCest
{
protected $user;
protected $timeFormat;
public function _before(ApiTester $I)
{
$this->user = \App\Models\User::find(1);
$I->haveHttpHeader('Accept', 'application/json');
$I->amBearerAuthenticated($I->getToken($this->user));
}
/** @test */
public function indexLocations(ApiTester $I)
{
$I->wantTo('Get a list of locations');
// call
$I->sendGET('/locations?limit=10');
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse(), true);
// sample verify
$location = App\Models\Location::orderByDesc('created_at')
->withCount('assignedAssets as assigned_assets_count', 'assets as assets_count', 'users as users_count')
->take(10)->get()->shuffle()->first();
$I->seeResponseContainsJson($I->removeTimestamps((new LocationsTransformer)->transformLocation($location)));
}
/** @test */
public function createLocation(ApiTester $I, $scenario)
{
$I->wantTo('Create a new location');
$temp_location = \App\Models\Location::factory()->make([
'name' => 'Test Location Tag',
]);
// setup
$data = [
'name' => $temp_location->name,
'image' => $temp_location->image,
'address' => $temp_location->address,
'address2' => $temp_location->address2,
'city' => $temp_location->city,
'state' => $temp_location->state,
'country' => $temp_location->country,
'zip' => $temp_location->zip,
'parent_id' => $temp_location->parent_id,
'parent_id' => $temp_location->parent_id,
'manager_id' => $temp_location->manager_id,
'currency' => $temp_location->currency,
];
// create
$I->sendPOST('/locations', $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
}
// Put is routed to the same method in the controller
// DO we actually need to test both?
/** @test */
public function updateLocationWithPatch(ApiTester $I, $scenario)
{
$I->wantTo('Update an location with PATCH');
// create
$location = \App\Models\Location::factory()->create([
'name' => 'Original Location Name',
]);
$I->assertInstanceOf(\App\Models\Location::class, $location);
$temp_location = \App\Models\Location::factory()->make([
'name' => 'updated location name',
]);
$data = [
'name' => $temp_location->name,
'image' => $temp_location->image,
'address' => $temp_location->address,
'address2' => $temp_location->address2,
'city' => $temp_location->city,
'state' => $temp_location->state,
'country' => $temp_location->country,
'zip' => $temp_location->zip,
'parent_id' => $temp_location->parent_id,
'parent_id' => $temp_location->parent_id,
'manager_id' => $temp_location->manager_id,
'currency' => $temp_location->currency,
];
$I->assertNotEquals($location->name, $data['name']);
// update
$I->sendPATCH('/locations/'.$location->id, $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/locations/message.update.success'), $response->messages);
$I->assertEquals($location->id, $response->payload->id); // location id does not change
$I->assertEquals($temp_location->name, $response->payload->name); // location name updated
// Some necessary manual copying
$temp_location->created_at = Carbon::parse($response->payload->created_at->datetime);
$temp_location->updated_at = Carbon::parse($response->payload->updated_at->datetime);
$temp_location->id = $location->id;
// verify
$I->sendGET('/locations/'.$location->id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$I->seeResponseContainsJson((new LocationsTransformer)->transformLocation($temp_location));
}
/** @test */
public function deleteLocationTest(ApiTester $I, $scenario)
{
$I->wantTo('Delete an location');
// create
$location = \App\Models\Location::factory()->create([
'name' => 'Soon to be deleted',
]);
$I->assertInstanceOf(\App\Models\Location::class, $location);
// delete
$I->sendDELETE('/locations/'.$location->id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/locations/message.delete.success'), $response->messages);
// verify, expect a 200
$I->sendGET('/locations/'.$location->id);
$I->seeResponseCodeIs(200);
$I->seeResponseIsJson();
}
}

View file

@ -1,142 +0,0 @@
<?php
use App\Helpers\Helper;
use App\Http\Transformers\ManufacturersTransformer;
use App\Models\Manufacturer;
use App\Models\Setting;
use Illuminate\Support\Facades\Auth;
class ApiManufacturersCest
{
protected $user;
protected $timeFormat;
public function _before(ApiTester $I)
{
$this->user = \App\Models\User::find(1);
$I->haveHttpHeader('Accept', 'application/json');
$I->amBearerAuthenticated($I->getToken($this->user));
}
/** @test */
public function indexManufacturers(ApiTester $I)
{
$I->wantTo('Get a list of manufacturers');
// call
$I->sendGET('/manufacturers?order_by=id&limit=10');
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse(), true);
// sample verify
$manufacturer = App\Models\Manufacturer::withCount('assets as assets_count', 'accessories as accessories_count', 'consumables as consumables_count', 'licenses as licenses_count')
->orderByDesc('created_at')->take(10)->get()->shuffle()->first();
$I->seeResponseContainsJson($I->removeTimestamps((new ManufacturersTransformer)->transformManufacturer($manufacturer)));
}
/** @test */
public function createManufacturer(ApiTester $I, $scenario)
{
$I->wantTo('Create a new manufacturer');
$temp_manufacturer = \App\Models\Manufacturer::factory()->apple()->make([
'name' => 'Test Manufacturer Tag',
]);
// setup
$data = [
'image' => $temp_manufacturer->image,
'name' => $temp_manufacturer->name,
'support_email' => $temp_manufacturer->support_email,
'support_phone' => $temp_manufacturer->support_phone,
'support_url' => $temp_manufacturer->support_url,
'url' => $temp_manufacturer->url,
];
// create
$I->sendPOST('/manufacturers', $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
}
// Put is routed to the same method in the controller
// DO we actually need to test both?
/** @test */
public function updateManufacturerWithPatch(ApiTester $I, $scenario)
{
$I->wantTo('Update an manufacturer with PATCH');
// create
$manufacturer = \App\Models\Manufacturer::factory()->apple()
->create([
'name' => 'Original Manufacturer Name',
]);
$I->assertInstanceOf(\App\Models\Manufacturer::class, $manufacturer);
$temp_manufacturer = \App\Models\Manufacturer::factory()->dell()->make([
'name' => 'updated manufacturer name',
]);
$data = [
'image' => $temp_manufacturer->image,
'name' => $temp_manufacturer->name,
'support_email' => $temp_manufacturer->support_email,
'support_phone' => $temp_manufacturer->support_phone,
'support_url' => $temp_manufacturer->support_url,
'url' => $temp_manufacturer->url,
];
$I->assertNotEquals($manufacturer->name, $data['name']);
// update
$I->sendPATCH('/manufacturers/'.$manufacturer->id, $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/manufacturers/message.update.success'), $response->messages);
$I->assertEquals($manufacturer->id, $response->payload->id); // manufacturer id does not change
$I->assertEquals($temp_manufacturer->name, $response->payload->name); // manufacturer name updated
// Some manual copying to compare against
$temp_manufacturer->created_at = Carbon::parse($response->payload->created_at);
$temp_manufacturer->updated_at = Carbon::parse($response->payload->updated_at);
$temp_manufacturer->id = $manufacturer->id;
// verify
$I->sendGET('/manufacturers/'.$manufacturer->id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$I->seeResponseContainsJson((new ManufacturersTransformer)->transformManufacturer($temp_manufacturer));
}
/** @test */
public function deleteManufacturerTest(ApiTester $I, $scenario)
{
$I->wantTo('Delete an manufacturer');
// create
$manufacturer = \App\Models\Manufacturer::factory()->apple()->create([
'name' => 'Soon to be deleted',
]);
$I->assertInstanceOf(\App\Models\Manufacturer::class, $manufacturer);
// delete
$I->sendDELETE('/manufacturers/'.$manufacturer->id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/manufacturers/message.delete.success'), $response->messages);
// verify, expect a 200
$I->sendGET('/manufacturers/'.$manufacturer->id);
$I->seeResponseCodeIs(200);
$I->seeResponseIsJson();
}
}

View file

@ -1,145 +0,0 @@
<?php
use App\Helpers\Helper;
use App\Http\Transformers\AssetModelsTransformer;
use App\Models\AssetModel;
use App\Models\Setting;
use Illuminate\Support\Facades\Auth;
class ApiModelsCest
{
protected $user;
protected $timeFormat;
public function _before(ApiTester $I)
{
$this->user = \App\Models\User::find(1);
$I->haveHttpHeader('Accept', 'application/json');
$I->amBearerAuthenticated($I->getToken($this->user));
}
/** @test */
public function indexAssetModels(ApiTester $I)
{
$I->wantTo('Get a list of assetmodels');
// call
$I->sendGET('/models?limit=10');
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse(), true);
$assetmodel = App\Models\AssetModel::orderByDesc('created_at')
->withCount('assets as assets_count')->take(10)->get()->shuffle()->first();
$I->seeResponseContainsJson($I->removeTimestamps((new AssetModelsTransformer)->transformAssetModel($assetmodel)));
}
/** @test */
public function createAssetModel(ApiTester $I, $scenario)
{
$I->wantTo('Create a new assetmodel');
$temp_assetmodel = \App\Models\AssetModel::factory()->mbp13Model()->make([
'name' => 'Test AssetModel Tag',
]);
// setup
$data = [
'category_id' => $temp_assetmodel->category_id,
'depreciation_id' => $temp_assetmodel->depreciation_id,
'eol' => $temp_assetmodel->eol,
'image' => $temp_assetmodel->image,
'manufacturer_id' => $temp_assetmodel->manufacturer_id,
'model_number' => $temp_assetmodel->model_number,
'name' => $temp_assetmodel->name,
'notes' => $temp_assetmodel->notes,
];
// create
$I->sendPOST('/models', $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
}
// Put is routed to the same method in the controller
// DO we actually need to test both?
/** @test */
public function updateAssetModelWithPatch(ApiTester $I, $scenario)
{
$I->wantTo('Update an assetmodel with PATCH');
// create
$assetmodel = \App\Models\AssetModel::factory()->mbp13Model()->create([
'name' => 'Original AssetModel Name',
]);
$I->assertInstanceOf(\App\Models\AssetModel::class, $assetmodel);
$temp_assetmodel = \App\Models\AssetModel::factory()->polycomcxModel()->make([
'name' => 'updated AssetModel name',
'fieldset_id' => 2,
]);
$data = [
'category_id' => $temp_assetmodel->category_id,
'depreciation_id' => $temp_assetmodel->depreciation_id,
'eol' => $temp_assetmodel->eol,
'image' => $temp_assetmodel->image,
'manufacturer_id' => $temp_assetmodel->manufacturer_id,
'model_number' => $temp_assetmodel->model_number,
'name' => $temp_assetmodel->name,
'notes' => $temp_assetmodel->notes,
'fieldset' => $temp_assetmodel->fieldset->id,
];
$I->assertNotEquals($assetmodel->name, $data['name']);
// update
$I->sendPATCH('/models/'.$assetmodel->id, $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/models/message.update.success'), $response->messages);
$I->assertEquals($assetmodel->id, $response->payload->id); // assetmodel id does not change
$I->assertEquals($temp_assetmodel->name, $response->payload->name); // assetmodel name updated
// Some necessary manual copying
$temp_assetmodel->created_at = Carbon::parse($response->payload->created_at);
$temp_assetmodel->updated_at = Carbon::parse($response->payload->updated_at);
$temp_assetmodel->id = $assetmodel->id;
// verify
$I->sendGET('/models/'.$assetmodel->id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$I->seeResponseContainsJson((new AssetModelsTransformer)->transformAssetModel($temp_assetmodel));
}
/** @test */
public function deleteAssetModelTest(ApiTester $I, $scenario)
{
$I->wantTo('Delete an assetmodel');
// create
$assetmodel = \App\Models\AssetModel::factory()->mbp13Model()->create([
'name' => 'Soon to be deleted',
]);
$I->assertInstanceOf(\App\Models\AssetModel::class, $assetmodel);
// delete
$I->sendDELETE('/models/'.$assetmodel->id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/models/message.delete.success'), $response->messages);
// verify, expect a 200
$I->sendGET('/models/'.$assetmodel->id);
$I->seeResponseCodeIs(200);
$I->seeResponseIsJson();
}
}

View file

@ -1,142 +0,0 @@
<?php
use App\Helpers\Helper;
use App\Http\Transformers\StatuslabelsTransformer;
use App\Models\Setting;
use App\Models\Statuslabel;
use Illuminate\Support\Facades\Auth;
class ApiStatusLabelsCest
{
protected $user;
protected $timeFormat;
public function _before(ApiTester $I)
{
$this->user = \App\Models\User::find(1);
$I->haveHttpHeader('Accept', 'application/json');
$I->amBearerAuthenticated($I->getToken($this->user));
}
/** @test */
public function indexStatuslabels(ApiTester $I)
{
$I->wantTo('Get a list of statuslabels');
// call
$I->sendGET('/statuslabels?limit=10');
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse(), true);
// sample verify
$statuslabel = App\Models\Statuslabel::orderByDesc('created_at')
->withCount('assets as assets_count')
->take(10)->get()->shuffle()->first();
$I->seeResponseContainsJson($I->removeTimestamps((new StatuslabelsTransformer)->transformStatuslabel($statuslabel)));
}
/** @test */
public function createStatuslabel(ApiTester $I, $scenario)
{
$I->wantTo('Create a new statuslabel');
$temp_statuslabel = \App\Models\Statuslabel::factory()->make([
'name' => 'Test Statuslabel Tag',
]);
// setup
$data = [
'name' => $temp_statuslabel->name,
'archived' => $temp_statuslabel->archived,
'deployable' => $temp_statuslabel->deployable,
'notes' => $temp_statuslabel->notes,
'pending' => $temp_statuslabel->pending,
'type' => 'deployable',
];
// create
$I->sendPOST('/statuslabels', $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
}
// Put is routed to the same method in the controller
// DO we actually need to test both?
/** @test */
public function updateStatuslabelWithPatch(ApiTester $I, $scenario)
{
$I->wantTo('Update an statuslabel with PATCH');
// create
$statuslabel = \App\Models\Statuslabel::factory()->rtd()->create([
'name' => 'Original Statuslabel Name',
]);
$I->assertInstanceOf(\App\Models\Statuslabel::class, $statuslabel);
$temp_statuslabel = \App\Models\Statuslabel::factory()->pending()->make([
'name' => 'updated statuslabel name',
'type' => 'pending',
]);
$data = [
'name' => $temp_statuslabel->name,
'archived' => $temp_statuslabel->archived,
'deployable' => $temp_statuslabel->deployable,
'notes' => $temp_statuslabel->notes,
'pending' => $temp_statuslabel->pending,
'type' => $temp_statuslabel->type,
];
$I->assertNotEquals($statuslabel->name, $data['name']);
// update
$I->sendPATCH('/statuslabels/'.$statuslabel->id, $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
// dd($response);
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/statuslabels/message.update.success'), $response->messages);
$I->assertEquals($statuslabel->id, $response->payload->id); // statuslabel id does not change
$I->assertEquals($temp_statuslabel->name, $response->payload->name); // statuslabel name updated
// Some manual copying to compare against
$temp_statuslabel->created_at = Carbon::parse($response->payload->created_at);
$temp_statuslabel->updated_at = Carbon::parse($response->payload->updated_at);
$temp_statuslabel->id = $statuslabel->id;
// verify
$I->sendGET('/statuslabels/'.$statuslabel->id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$I->seeResponseContainsJson((new StatuslabelsTransformer)->transformStatuslabel($temp_statuslabel));
}
/** @test */
public function deleteStatuslabelTest(ApiTester $I, $scenario)
{
$I->wantTo('Delete an statuslabel');
// create
$statuslabel = \App\Models\Statuslabel::factory()->create([
'name' => 'Soon to be deleted',
]);
$I->assertInstanceOf(\App\Models\Statuslabel::class, $statuslabel);
// delete
$I->sendDELETE('/statuslabels/'.$statuslabel->id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/statuslabels/message.delete.success'), $response->messages);
// verify, expect a 200
$I->sendGET('/statuslabels/'.$statuslabel->id);
$I->seeResponseCodeIs(200);
$I->seeResponseIsJson();
}
}

View file

@ -1,205 +0,0 @@
<?php
use App\Helpers\Helper;
use App\Http\Transformers\UsersTransformer;
use App\Models\Group;
use App\Models\Setting;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
class ApiUsersCest
{
protected $user;
protected $timeFormat;
public function _before(ApiTester $I)
{
$this->user = \App\Models\User::find(1);
$I->haveHttpHeader('Accept', 'application/json');
$I->amBearerAuthenticated($I->getToken($this->user));
}
/** @test */
public function indexUsers(ApiTester $I)
{
$I->wantTo('Get a list of users');
// call
$I->sendGET('/users?limit=10&sort=created_at');
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse(), true);
// sample verify
$user = App\Models\User::orderByDesc('created_at')
->withCount('assets as assets_count', 'licenses as licenses_count', 'accessories as accessories_count', 'consumables as consumables_count')
->take(10)->get()->shuffle()->first();
$I->seeResponseContainsJson($I->removeTimestamps((new UsersTransformer)->transformUser($user)));
}
/** @test */
public function createUser(ApiTester $I, $scenario)
{
$I->wantTo('Create a new user');
$temp_user = \App\Models\User::factory()->make([
'name' => 'Test User Name',
]);
Group::factory()->count(2)->create();
$groups = Group::pluck('id');
// setup
$data = [
'activated' => $temp_user->activated,
'address' => $temp_user->address,
'city' => $temp_user->city,
'company_id' => $temp_user->company_id,
'country' => $temp_user->country,
'department_id' => $temp_user->department_id,
'email' => $temp_user->email,
'employee_num' => $temp_user->employee_num,
'first_name' => $temp_user->first_name,
'jobtitle' => $temp_user->jobtitle,
'last_name' => $temp_user->last_name,
'locale' => $temp_user->locale,
'location_id' => $temp_user->location_id,
'notes' => $temp_user->notes,
'manager_id' => $temp_user->manager_id,
'password' => $temp_user->password,
'password_confirmation' => $temp_user->password,
'phone' => $temp_user->phone,
'state' => $temp_user->state,
'username' => $temp_user->username,
'zip' => $temp_user->zip,
'groups' => $groups,
];
// create
$I->sendPOST('/users', $data);
$I->seeResponseIsJson();
$user = User::where('username', $temp_user->username)->first();
$I->assertEquals($groups, $user->groups()->pluck('id'));
$I->seeResponseCodeIs(200);
}
// Put is routed to the same method in the controller
// DO we actually need to test both?
/** @test */
public function updateUserWithPatch(ApiTester $I, $scenario)
{
$I->wantTo('Update an user with PATCH');
// create
$user = \App\Models\User::factory()->create([
'first_name' => 'Original User Name',
'company_id' => 2,
'location_id' => 3,
]);
$I->assertInstanceOf(\App\Models\User::class, $user);
$temp_user = \App\Models\User::factory()->make([
'company_id' => 3,
'first_name' => 'updated user name',
'location_id' => 1,
]);
Group::factory()->count(2)->create();
$groups = Group::pluck('id');
$data = [
'activated' => $temp_user->activated,
'address' => $temp_user->address,
'city' => $temp_user->city,
'company_id' => $temp_user->company_id,
'country' => $temp_user->country,
'department_id' => $temp_user->department_id,
'email' => $temp_user->email,
'employee_num' => $temp_user->employee_num,
'first_name' => $temp_user->first_name,
'groups' => $groups,
'jobtitle' => $temp_user->jobtitle,
'last_name' => $temp_user->last_name,
'locale' => $temp_user->locale,
'location_id' => $temp_user->location_id,
'notes' => $temp_user->notes,
'manager_id' => $temp_user->manager_id,
'password' => $temp_user->password,
'phone' => $temp_user->phone,
'state' => $temp_user->state,
'username' => $temp_user->username,
'zip' => $temp_user->zip,
];
$I->assertNotEquals($user->first_name, $data['first_name']);
// update
$I->sendPATCH('/users/'.$user->id, $data);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/users/message.success.update'), $response->messages);
$I->assertEquals($user->id, $response->payload->id); // user id does not change
$I->assertEquals($temp_user->company_id, $response->payload->company->id); // company_id updated
$I->assertEquals($temp_user->first_name, $response->payload->first_name); // user name updated
$I->assertEquals($temp_user->location_id, $response->payload->location->id); // user location_id updated
$newUser = User::where('username', $temp_user->username)->first();
$I->assertEquals($groups, $newUser->groups()->pluck('id'));
$temp_user->created_at = Carbon::parse($response->payload->created_at->datetime);
$temp_user->updated_at = Carbon::parse($response->payload->updated_at->datetime);
$temp_user->id = $user->id;
// verify
$I->sendGET('/users/'.$user->id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$I->seeResponseContainsJson((new UsersTransformer)->transformUser($temp_user));
}
/** @test */
public function deleteUserTest(ApiTester $I, $scenario)
{
$I->wantTo('Delete an user');
// create
$user = \App\Models\User::factory()->create([
'first_name' => 'Soon to be deleted',
]);
$I->assertInstanceOf(\App\Models\User::class, $user);
// delete
$I->sendDELETE('/users/'.$user->id);
$I->seeResponseIsJson();
$I->seeResponseCodeIs(200);
$response = json_decode($I->grabResponse());
// dd($response);
$I->assertEquals('success', $response->status);
$I->assertEquals(trans('admin/users/message.success.delete'), $response->messages);
// verify, expect a 200
$I->sendGET('/users/'.$user->id);
$I->seeResponseCodeIs(200);
$I->seeResponseIsJson();
}
/** @test */
public function fetchUserAssetsTest(ApiTester $I, $scenario)
{
$I->wantTo('Fetch assets for a user');
$user = User::has('assets')->first();
$asset = $user->assets->shuffle()->first();
$I->sendGET("/users/{$user->id}/assets");
$response = json_decode($I->grabResponse());
$I->seeResponseCodeIs(200);
$I->seeResponseIsJson();
// Just test a random one.
$I->seeResponseContainsJson([
'asset_tag' => $asset->asset_tag,
]);
}
}

View file

@ -1,3 +0,0 @@
<?php
// Here you can initialize variables that will be available to your tests

View file

@ -1,19 +0,0 @@
# Codeception Test Suite Configuration
#
# Suite for functional (integration) tests
# Emulate web requests and make application process them
# Include one of framework modules (Symfony2, Yii2, Laravel5) to use it
class_name: FunctionalTester
modules:
enabled:
# add framework module here
- \Helper\Functional
- Laravel5:
environment_file: .env.tests
cleanup: true
- REST:
depends: Laravel5
groups:
func1: tests/functional/func-part-1.txt
func2: tests/functional/func-part-2.txt

View file

@ -1,84 +0,0 @@
<?php
class AccessoriesCest
{
public function _before(FunctionalTester $I)
{
$I->amOnPage('/login');
$I->fillField('username', 'admin');
$I->fillField('password', 'password');
$I->click('Login');
$I->seeAuthentication();
}
// tests
public function loadsFormWithoutErrors(FunctionalTester $I)
{
$I->wantTo('ensure that the create accessories form loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage('/accessories/create');
$I->seeResponseCodeIs(200);
$I->dontSee('Create Accessory', '.page-header');
$I->see('Create Accessory', 'h1.pull-left');
}
public function failsEmptyValidation(FunctionalTester $I)
{
$I->wantTo('Test Validation Fails with blank elements');
$I->amOnPage('/accessories/create');
$I->seeResponseCodeIs(200);
$I->click('Save');
$I->seeElement('.alert-danger');
$I->see('The name field is required.', '.alert-msg');
$I->see('The category id field is required.', '.alert-msg');
$I->see('The qty field is required.', '.alert-msg');
}
public function failsShortValidation(FunctionalTester $I)
{
$I->wantTo('Test Validation Fails with short name');
$I->amOnPage('/accessories/create');
$I->seeResponseCodeIs(200);
$I->fillField('name', 't2');
$I->fillField('qty', '-15');
$I->fillField('min_amt', '-15');
$I->click('Save');
$I->seeElement('.alert-danger');
$I->see('The name must be at least 3 characters', '.alert-msg');
$I->see('The category id field is required', '.alert-msg');
$I->see('The qty must be at least 1', '.alert-msg');
$I->see('The min amt must be at least 0', '.alert-msg');
}
public function passesCorrectValidation(FunctionalTester $I)
{
$accessory = \App\Models\Accessory::factory()->appleBtKeyboard()->make();
$values = [
'category_id' => $accessory->category_id,
'location_id' => $accessory->location_id,
'manufacturer_id' => $accessory->manufacturer_id,
'min_amt' => $accessory->min_amt,
'name' => 'Test Accessory',
'order_number' => $accessory->order_number,
'purchase_date' => '2016-01-01',
'qty' => $accessory->qty,
];
$I->wantTo('Test Validation Succeeds');
$I->amOnPage('/accessories/create');
$I->seeResponseCodeIs(200);
$I->submitForm('form#create-form', $values);
$I->seeRecord('accessories', $values);
$I->dontSee('&lt;span class=&quot;');
$I->seeElement('.alert-success');
}
public function allowsDelete(FunctionalTester $I)
{
$I->wantTo('Ensure I can delete an accessory');
$I->sendDelete(route('accessories.destroy', $I->getAccessoryId()), ['_token' => csrf_token()]);
$I->seeResponseCodeIs(200);
}
}

View file

@ -1,63 +0,0 @@
<?php
class AssetModelsCest
{
public function _before(FunctionalTester $I)
{
$I->amOnPage('/login');
$I->fillField('username', 'admin');
$I->fillField('password', 'password');
$I->click('Login');
}
// tests
public function tryToTest(FunctionalTester $I)
{
$I->wantTo('Test Asset Model Creation');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage(route('models.create'));
$I->seeInTitle('Create Asset Model');
$I->see('Create Asset Model', 'h1.pull-left');
}
public function failsEmptyValidation(FunctionalTester $I)
{
$I->wantTo('Test Validation Fails with blank elements');
$I->amOnPage(route('models.create'));
$I->click('Save');
$I->seeElement('.alert-danger');
$I->see('The name field is required.', '.alert-msg');
$I->see('The manufacturer id field is required.', '.alert-msg');
$I->see('The category id field is required.', '.alert-msg');
}
public function passesCorrectValidation(FunctionalTester $I)
{
$model = \App\Models\AssetModel::factory()->mbp13Model()->make(['name'=>'Test Model']);
$values = [
'category_id' => $model->category_id,
'depreciation_id' => $model->depreciation_id,
'eol' => $model->eol,
'manufacturer_id' => $model->manufacturer_id,
'model_number' => $model->model_number,
'name' => $model->name,
'notes' => $model->notes,
];
$I->wantTo('Test Validation Succeeds');
$I->amOnPage(route('models.create'));
$I->submitForm('form#create-form', $values);
$I->seeRecord('models', $values);
$I->dontSee('&lt;span class=&quot;');
$I->seeElement('.alert-success');
}
public function allowsDelete(FunctionalTester $I)
{
$I->wantTo('Ensure I can delete an asset model');
$model = \App\Models\AssetModel::factory()->mbp13Model()->create(['name' => 'Test Model']);
$I->sendDelete(route('models.destroy', $model->id), ['_token' => csrf_token()]);
$I->seeResponseCodeIs(200);
}
}

View file

@ -1,94 +0,0 @@
<?php
class AssetsCest
{
public function _before(FunctionalTester $I)
{
$I->amOnPage('/login');
$I->fillField('username', 'admin');
$I->fillField('password', 'password');
$I->click('Login');
}
// tests
public function tryToTest(FunctionalTester $I)
{
$I->wantTo('ensure that the create assets form loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage(route('hardware.create'));
$I->dontSee('Create Asset', '.page-header');
$I->see('Create Asset', 'h1.pull-left');
}
public function failsEmptyValidation(FunctionalTester $I)
{
$I->wantTo('Test Validation Fails with blank elements');
$I->amOnPage(route('hardware.create'));
// Settings factory can enable auto prefixes, which generate a random asset id. Lets clear it out for the sake of this test.
$I->fillField('#asset_tag', '');
$I->click('Save');
$I->see('The asset tag field is required.', '.alert-msg');
$I->see('The model id field is required.', '.alert-msg');
$I->see('The status id field is required.', '.alert-msg');
}
public function passesCreateAndCheckout(FunctionalTester $I)
{
$asset = \App\Models\Asset::factory()->laptopMbp()->make([
'asset_tag'=>'test tag',
'name'=> 'test asset',
'company_id'=>1,
'warranty_months'=>15,
]);
$userId = $I->getUserId();
$values = [
'asset_tags[1]' => $asset->asset_tag,
'assigned_user' => $userId,
'company_id' => $asset->company_id,
'model_id' => $asset->model_id,
'name' => $asset->name,
'notes' => $asset->notes,
'order_number' => $asset->order_number,
'purchase_cost' => $asset->purchase_cost,
'purchase_date' => '2016-01-01',
'requestable' => $asset->requestable,
'rtd_location_id' => $asset->rtd_location_id,
'serials[1]' => $asset->serial,
'status_id' => $asset->status_id,
'supplier_id' => $asset->supplier_id,
'warranty_months' => $asset->warranty_months,
];
$seenValues = [
'asset_tag' => $asset->asset_tag,
'assigned_to' => $userId,
'assigned_type' => \App\Models\User::class,
'company_id' => $asset->company_id,
'model_id' => $asset->model_id,
'name' => $asset->name,
'notes' => $asset->notes,
'order_number' => $asset->order_number,
'purchase_cost' => $asset->purchase_cost,
'purchase_date' => '2016-01-01',
'requestable' => $asset->requestable,
'rtd_location_id' => $asset->rtd_location_id,
'serial' => $asset->serial,
'status_id' => $asset->status_id,
'supplier_id' => $asset->supplier_id,
'warranty_months' => $asset->warranty_months,
];
$I->wantTo('Test Validation Succeeds');
$I->amOnPage(route('hardware.create'));
$I->submitForm('form#create-form', $values);
$I->seeRecord('assets', $seenValues);
$I->seeResponseCodeIs(200);
}
public function allowsDelete(FunctionalTester $I)
{
$I->wantTo('Ensure I can delete an asset');
$I->sendDelete(route('hardware.destroy', $I->getAssetId()), ['_token' => csrf_token()]);
$I->seeResponseCodeIs(200);
}
}

View file

@ -1,66 +0,0 @@
<?php
class CategoriesCest
{
public function _before(FunctionalTester $I)
{
$I->amOnPage('/login');
$I->fillField('username', 'admin');
$I->fillField('password', 'password');
$I->click('Login');
}
public function _after(FunctionalTester $I)
{
}
// tests
public function tryToTest(FunctionalTester $I)
{
$I->wantTo('Test Category Creation');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage(route('categories.create'));
$I->seeInTitle('Create Category');
$I->see('Create Category', 'h1.pull-left');
}
public function failsEmptyValidation(FunctionalTester $I)
{
$I->wantTo('Test Validation Fails with blank elements');
$I->amOnPage(route('categories.create'));
$I->click('Save');
$I->seeElement('.alert-danger');
$I->see('The name field is required.', '.alert-msg');
$I->see('The category type field is required.', '.alert-msg');
}
public function passesCorrectValidation(FunctionalTester $I)
{
$category = \App\Models\Category::factory()->assetLaptopCategory()->make([
'name' => 'Test Category',
]);
$values = [
'category_type' => $category->category_type,
'checkin_email' => $category->checkin_email,
'eula_text' => $category->eula_text,
'name' => $category->name,
'require_acceptance' => $category->require_acceptance,
];
$I->wantTo('Test Validation Succeeds');
$I->amOnPage(route('categories.create'));
$I->submitForm('form#create-form', $values);
$I->seeRecord('categories', $values);
$I->dontSee('&lt;span class=&quot;');
$I->seeElement('.alert-success');
}
public function allowsDelete(FunctionalTester $I)
{
$I->wantTo('Ensure I can delete a category');
$category = \App\Models\Category::factory()->assetLaptopCategory()->create([
'name'=>'Deletable Test Category',
]);
$I->sendDelete(route('categories.destroy', $category->id), ['_token' => csrf_token()]);
$I->seeResponseCodeIs(200);
}
}

View file

@ -1,46 +0,0 @@
<?php
class CompaniesCest
{
public function _before(FunctionalTester $I)
{
$I->amOnPage('/login');
$I->fillField('username', 'admin');
$I->fillField('password', 'password');
$I->click('Login');
}
// tests
public function tryToTest(FunctionalTester $I)
{
$I->wantTo('Test Company Creation');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage(route('companies.create'));
$I->seeInTitle('Create Company');
$I->see('Create Company', 'h1.pull-left');
}
public function failsEmptyValidation(FunctionalTester $I)
{
$I->wantTo('Test Validation Fails with blank elements');
$I->amOnPage(route('companies.create'));
$I->click('Save');
$I->seeElement('.alert-danger');
$I->see('The name field is required.', '.alert-msg');
}
public function passesCorrectValidation(FunctionalTester $I)
{
$company = \App\Models\Company::factory()->make();
$values = [
'name' => $company->name,
];
$I->wantTo('Test Validation Succeeds');
$I->amOnPage(route('companies.create'));
$I->fillField('name', 'TestCompany');
$I->submitForm('form#create-form', $values);
$I->seeRecord('companies', $values);
$I->dontSee('&lt;span class=&quot;');
$I->seeElement('.alert-success');
}
}

View file

@ -1,79 +0,0 @@
<?php
class ComponentsCest
{
public function _before(FunctionalTester $I)
{
$I->amOnPage('/login');
$I->fillField('username', 'admin');
$I->fillField('password', 'password');
$I->click('Login');
}
// tests
public function tryToTest(FunctionalTester $I)
{
$I->wantTo('ensure that the create components form loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage(route('components.create'));
$I->dontSee('Create Component', '.page-header');
$I->see('Create Component', 'h1.pull-left');
}
public function failsEmptyValidation(FunctionalTester $I)
{
$I->wantTo('Test Validation Fails with blank elements');
$I->amOnPage(route('components.create'));
$I->click('Save');
$I->seeElement('.alert-danger');
$I->see('The name field is required.', '.alert-msg');
$I->see('The category id field is required.', '.alert-msg');
$I->see('The qty field is required.', '.alert-msg');
}
public function failsShortValidation(FunctionalTester $I)
{
$I->wantTo('Test Validation Fails with short name');
$I->amOnPage(route('components.create'));
$I->fillField('name', 't2');
$I->fillField('qty', '-15');
$I->fillField('min_amt', '-15');
$I->click('Save');
$I->seeElement('.alert-danger');
$I->see('The name must be at least 3 characters', '.alert-msg');
$I->see('The qty must be at least 1', '.alert-msg');
}
public function passesCorrectValidation(FunctionalTester $I)
{
$component = \App\Models\Component::factory()->ramCrucial4()->make([
'name' => 'Test Component',
'serial' => '3523-235325-1350235',
]);
$values = [
'category_id' => $component->category_id,
'company_id' => $component->company_id,
'location_id' => $component->location_id,
'min_amt' => $component->min_amt,
'name' => $component->name,
'order_number' => $component->order_number,
'purchase_cost' => $component->purchase_cost,
'purchase_date' => '2016-01-01',
'qty' => $component->qty,
'serial' => $component->serial,
];
$I->wantTo('Test Validation Succeeds');
$I->amOnPage(route('components.create'));
$I->submitForm('form#create-form', $values);
$I->seeRecord('components', $values);
$I->dontSee('&lt;span class=&quot;');
$I->seeElement('.alert-success');
}
public function allowsDelete(FunctionalTester $I)
{
$I->wantTo('Ensure I can delete a component');
$I->sendDelete(route('components.destroy', $I->getComponentId()), ['_token' => csrf_token()]);
$I->seeResponseCodeIs(200);
}
}

View file

@ -1,81 +0,0 @@
<?php
class ConsumablesCest
{
public function _before(FunctionalTester $I)
{
$I->amOnPage('/login');
$I->fillField('username', 'admin');
$I->fillField('password', 'password');
$I->click('Login');
}
// tests
public function tryToTest(FunctionalTester $I)
{
$I->wantTo('ensure that the create consumables form loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage(route('consumables.create'));
$I->dontSee('Create Consumable', '.page-header');
$I->see('Create Consumable', 'h1.pull-left');
}
public function failsEmptyValidation(FunctionalTester $I)
{
$I->wantTo('Test Validation Fails with blank elements');
$I->amOnPage(route('consumables.create'));
$I->click('Save');
$I->seeElement('.alert-danger');
$I->see('The name field is required.', '.alert-msg');
$I->see('The category id field is required.', '.alert-msg');
$I->see('The qty field is required.', '.alert-msg');
}
public function failsShortValidation(FunctionalTester $I)
{
$I->wantTo('Test Validation Fails with short name');
$I->amOnPage(route('consumables.create'));
$I->fillField('name', 't2');
$I->fillField('qty', '-15');
$I->fillField('min_amt', '-15');
$I->click('Save');
$I->seeElement('.alert-danger');
$I->see('The name must be at least 3 characters', '.alert-msg');
$I->see('The qty must be at least 0', '.alert-msg');
$I->see('The min amt must be at least 0', '.alert-msg');
}
public function passesCorrectValidation(FunctionalTester $I)
{
$consumable = \App\Models\Consumable::factory()->cardstock()->make([
'name' => 'Test Consumable',
'model_number' => 23520,
]);
// dd($consumable);
$values = [
'category_id' => $consumable->category_id,
'company_id' => $consumable->company_id,
'item_no' => $consumable->item_no,
'manufacturer_id' => $consumable->manufacturer_id,
'min_amt' => $consumable->min_amt,
'model_number' => $consumable->model_number,
'name' => $consumable->name,
'order_number' => $consumable->order_number,
'purchase_cost' => $consumable->purchase_cost,
'purchase_date' => '2016-01-01',
'qty' => $consumable->qty,
];
$I->wantTo('Test Validation Succeeds');
$I->amOnPage(route('consumables.create'));
$I->submitForm('form#create-form', $values);
$I->seeRecord('consumables', $values);
$I->seeElement('.alert-success');
}
public function allowsDelete(FunctionalTester $I)
{
$I->wantTo('Ensure I can delete a consumable');
$I->sendDelete(route('consumables.destroy', $I->getConsumableId()), ['_token' => csrf_token()]);
$I->seeResponseCodeIs(200);
}
}

View file

@ -1,66 +0,0 @@
<?php
class DepreciationsCest
{
public function _before(FunctionalTester $I)
{
$I->amOnPage('/login');
$I->fillField('username', 'admin');
$I->fillField('password', 'password');
$I->click('Login');
}
// tests
public function tryToTest(FunctionalTester $I)
{
$I->wantTo('Test Depreciation Creation');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage(route('depreciations.create'));
$I->seeInTitle('Create Depreciation');
$I->dontSee('Create Depreciation', '.page-header');
$I->see('Create Depreciation', 'h1.pull-left');
}
public function failsEmptyValidation(FunctionalTester $I)
{
$I->wantTo('Test Validation Fails with blank elements');
$I->amOnPage(route('depreciations.create'));
$I->click('Save');
$I->seeElement('.alert-danger');
$I->see('The name field is required.', '.alert-msg');
$I->see('The months field is required.', '.alert-msg');
}
public function failsShortValidation(FunctionalTester $I)
{
$I->wantTo('Test Validation Fails with short name');
$I->amOnPage(route('depreciations.create'));
$I->fillField('name', 't2');
$I->click('Save');
$I->seeElement('.alert-danger');
$I->see('The name must be at least 3 characters', '.alert-msg');
}
public function passesCorrectValidation(FunctionalTester $I)
{
$depreciation = \App\Models\Depreciation::factory()->computer()->make([
'name'=>'Test Depreciation',
]);
$values = [
'name' => $depreciation->name,
'months' => $depreciation->months,
];
$I->wantTo('Test Validation Succeeds');
$I->amOnPage(route('depreciations.create'));
$I->submitForm('form#create-form', $values);
$I->seeRecord('depreciations', $values);
$I->seeElement('.alert-success');
}
public function allowsDelete(FunctionalTester $I)
{
$I->wantTo('Ensure I can delete a depreciation');
$I->sendDelete(route('depreciations.destroy', $I->getDepreciationId()), ['_token' => csrf_token()]);
$I->seeResponseCodeIs(200);
}
}

View file

@ -1,74 +0,0 @@
<?php
use App\Models\Group;
class GroupsCest
{
public function _before(FunctionalTester $I)
{
$I->amOnPage('/login');
$I->fillField('username', 'admin');
$I->fillField('password', 'password');
$I->click('Login');
}
// tests
public function loadsFormWithoutErrors(FunctionalTester $I)
{
$I->wantTo('ensure that the create groups form loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage(route('groups.create'));
$I->seeResponseCodeIs(200);
$I->dontSee('Create New Group', '.page-header');
$I->see('Create New Group', 'h1.pull-left');
}
public function failsEmptyValidation(FunctionalTester $I)
{
$I->wantTo('Test Validation Fails with blank elements');
$I->amOnPage(route('groups.create'));
$I->seeResponseCodeIs(200);
$I->click('Save');
$I->seeElement('.alert-danger');
$I->see('The name field is required.', '.alert-msg');
}
public function failsShortValidation(FunctionalTester $I)
{
$I->wantTo('Test Validation Fails with short name');
$I->amOnPage(route('groups.create'));
$I->seeResponseCodeIs(200);
$I->fillField('name', 't');
$I->click('Save');
$I->seeElement('.alert-danger');
$I->see('The name must be at least 2 characters', '.alert-msg');
}
public function passesCorrectValidation(FunctionalTester $I)
{
$I->wantTo('Test Validation Succeeds');
$I->amOnPage(route('groups.create'));
$I->seeResponseCodeIs(200);
$I->fillField('name', 'TestGroup');
$I->click('Save');
$I->dontSee('&lt;span class=&quot;');
$I->seeElement('.alert-success');
}
public function allowsDelete(FunctionalTester $I, $scenario)
{
$I->wantTo('Ensure I can delete a group');
// create a group
$I->amOnPage(route('groups.create'));
$I->seeResponseCodeIs(200);
$I->fillField('name', 'TestGroup');
$I->click('Save');
$I->dontSee('&lt;span class=&quot;');
$I->seeElement('.alert-success');
$I->sendDelete(route('groups.destroy', Group::whereName('TestGroup')->doesntHave('users')->first()->id));
$I->seeResponseCodeIs(200);
$I->seeElement('.alert-success');
$I->seeResponseCodeIs(200);
}
}

View file

@ -1,88 +0,0 @@
<?php
use App\Models\License;
class LicensesCest
{
public function _before(FunctionalTester $I)
{
$I->amOnPage('/login');
$I->fillField('username', 'admin');
$I->fillField('password', 'password');
$I->click('Login');
}
// tests
public function tryToTest(FunctionalTester $I)
{
$I->wantTo('ensure that the create licenses form loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage(route('licenses.create'));
$I->dontSee('Create License', '.page-header');
$I->see('Create License', 'h1.pull-left');
}
public function failsEmptyValidation(FunctionalTester $I)
{
$I->wantTo('Test Validation Fails with blank elements');
$I->amOnPage(route('licenses.create'));
$I->click('Save');
$I->seeElement('.alert-danger');
$I->see('The name field is required.', '.alert-msg');
$I->see('The seats field is required.', '.alert-msg');
$I->see('The category id field is required.', '.alert-msg');
}
public function failsShortValidation(FunctionalTester $I)
{
$I->wantTo('Test Validation Fails with short name');
$I->amOnPage(route('licenses.create'));
$I->fillField('name', 't2');
$I->fillField('seats', '-15');
$I->click('Save');
$I->seeElement('.alert-danger');
$I->see('The name must be at least 3 characters', '.alert-msg');
$I->see('The seats must be at least 1', '.alert-msg');
}
public function passesCorrectValidation(FunctionalTester $I)
{
$license = \App\Models\License::factory()->photoshop()->make([
'name' => 'Test License',
'company_id' => 3,
]);
$values = [
'company_id' => $license->company_id,
'expiration_date' => '2018-01-01',
'license_email' => $license->license_email,
'license_name' => $license->license_name,
'maintained' => true,
'manufacturer_id' => $license->manufacturer_id,
'category_id' => $license->category_id,
'name' => $license->name,
'notes' => $license->notes,
'order_number' => $license->order_number,
'purchase_cost' => $license->purchase_cost,
'purchase_date' => '2016-01-01',
'purchase_order' => $license->purchase_order,
'reassignable' => true,
'seats' => $license->seats,
'serial' => $license->serial,
'termination_date' => '2020-01-01',
];
$I->wantTo('Test Validation Succeeds');
$I->amOnPage(route('licenses.create'));
$I->submitForm('form#create-form', $values);
$I->seeRecord('licenses', $values);
$I->dontSee('&lt;span class=&quot;');
$I->seeElement('.alert-success');
}
public function allowsDelete(FunctionalTester $I)
{
$I->wantTo('Ensure I can delete a license');
$I->sendDelete(route('licenses.destroy', License::doesntHave('assignedUsers')->first()->id), ['_token' => csrf_token()]);
$I->seeResponseCodeIs(200);
}
}

View file

@ -1,74 +0,0 @@
<?php
use App\Models\Location;
class LocationsCest
{
public function _before(FunctionalTester $I)
{
// logging in
$I->amOnPage('/login');
$I->fillField('username', 'admin');
$I->fillField('password', 'password');
$I->click('Login');
}
// tests
public function tryToTest(FunctionalTester $I)
{
/* Create Form */
$I->wantTo('Test Location Creation');
$I->lookForwardTo('Finding no Failures');
$I->amOnPage(route('locations.create'));
$I->dontSee('Create Location', '.page-header');
$I->see('Create Location', 'h1.pull-left');
}
public function failsEmptyValidation(FunctionalTester $I)
{
$I->wantTo('Test Validation Fails with blank elements');
$I->amOnPage(route('locations.create'));
$I->click('Save');
$I->seeElement('.alert-danger');
$I->see('The name field is required.', '.alert-msg');
}
public function failsShortValidation(FunctionalTester $I)
{
$I->wantTo('Test Validation Fails with short values');
$I->amOnPage(route('locations.create'));
$I->fillField('name', 't');
$I->click('Save');
$I->seeElement('.alert-danger');
$I->see('The name must be at least 2 characters', '.alert-msg');
}
public function passesCorrectValidation(FunctionalTester $I)
{
$location = \App\Models\Location::factory()->make();
$values = [
'name' => $location->name,
'parent_id' => $I->getLocationId(),
'currency' => $location->currency,
'address' => $location->address,
'address2' => $location->address2,
'city' => $location->city,
'state' => $location->state,
'country' => $location->country,
'zip' => $location->zip,
];
$I->wantTo('Test Validation Succeeds');
$I->amOnPage(route('locations.create'));
$I->submitForm('form#create-form', $values);
$I->seeRecord('locations', $values);
$I->seeElement('.alert-success');
}
public function allowsDelete(FunctionalTester $I)
{
$I->wantTo('Ensure I can delete a location');
$location = \App\Models\Location::factory()->create();
$I->sendDelete(route('locations.destroy', $location->id), ['_token' => csrf_token()]);
$I->seeResponseCodeIs(200);
}
}

View file

@ -1,66 +0,0 @@
<?php
use App\Models\Manufacturer;
class ManufacturersCest
{
public function _before(FunctionalTester $I)
{
$I->amOnPage('/login');
$I->fillField('username', 'admin');
$I->fillField('password', 'password');
$I->click('Login');
}
// tests
public function tryToTest(FunctionalTester $I)
{
$I->wantTo('Test Manufacturer Creation');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage(route('manufacturers.create'));
$I->seeInTitle('Create Manufacturer');
$I->see('Create Manufacturer', 'h1.pull-left');
}
public function failsEmptyValidation(FunctionalTester $I)
{
$I->wantTo('Test Validation Fails with blank elements');
$I->amOnPage(route('manufacturers.create'));
$I->click('Save');
$I->seeElement('.alert-danger');
$I->see('The name field is required.', '.alert-msg');
}
public function failsShortValidation(FunctionalTester $I)
{
$I->wantTo('Test Validation Fails with short name');
$I->amOnPage(route('manufacturers.create'));
$I->fillField('name', 't');
$I->click('Save');
$I->seeElement('.alert-danger');
$I->see('The name must be at least 2 characters', '.alert-msg');
}
public function passesCorrectValidation(FunctionalTester $I)
{
$manufacturer = \App\Models\Manufacturer::factory()->microsoft()->make([
'name' => 'Test Manufacturer',
]);
$values = [
'name' => $manufacturer->name,
];
$I->wantTo('Test Validation Succeeds');
$I->amOnPage(route('manufacturers.create'));
$I->submitForm('form#create-form', $values);
$I->seeRecord('manufacturers', $values);
$I->seeElement('.alert-success');
}
public function allowsDelete(FunctionalTester $I)
{
$I->wantTo('Ensure I can delete a manufacturer');
$manufacturerId = \App\Models\Manufacturer::factory()->microsoft()->create(['name' => 'Deletable Test Manufacturer'])->id;
$I->sendDelete(route('manufacturers.destroy', $manufacturerId), ['_token' => csrf_token()]);
$I->seeResponseCodeIs(200);
}
}

View file

@ -1,67 +0,0 @@
<?php
use App\Models\Statuslabel;
class StatusLabelsCest
{
public function _before(FunctionalTester $I)
{
$I->amOnPage('/login');
$I->fillField('username', 'admin');
$I->fillField('password', 'password');
$I->click('Login');
}
// tests
public function tryToTest(FunctionalTester $I)
{
$I->wantTo('ensure that the create statuslabels form loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage(route('statuslabels.create'));
$I->dontSee('Create Status Label', '.page-header');
$I->see('Create Status Label', 'h1.pull-left');
}
public function failsEmptyValidation(FunctionalTester $I)
{
$I->wantTo('Test Validation Fails with blank elements');
$I->amOnPage(route('statuslabels.create'));
$I->click('Save');
$I->seeElement('.alert-danger');
$I->see('The name field is required.', '.alert-msg');
}
public function passesCorrectValidation(FunctionalTester $I)
{
$status = \App\Models\Statuslabel::factory()->pending()->make();
$submitValues = [
'name' => 'Testing Status',
'statuslabel_types' => 'pending',
'color' => '#b46262',
'notes' => $status->notes,
'show_in_nav' => true,
];
$recordValues = [
'name' => 'Testing Status',
'pending' => $status->pending,
'deployable' => $status->archived,
'archived' => $status->deployable,
'color' => '#b46262',
'notes' => $status->notes,
'show_in_nav' => true,
];
$I->wantTo('Test Validation Succeeds');
$I->amOnPage(route('statuslabels.create'));
$I->submitForm('form#create-form', $submitValues);
$I->seeRecord('status_labels', $recordValues);
$I->seeElement('.alert-success');
}
public function allowsDelete(FunctionalTester $I)
{
$I->wantTo('Ensure I can delete a Status Label');
$I->sendDelete(route('statuslabels.destroy', Statuslabel::doesntHave('assets')->first()->id), ['_token' => csrf_token()]);
$I->seeResponseCodeIs(200);
}
}

View file

@ -1,65 +0,0 @@
<?php
class SuppliersCest
{
public function _before(FunctionalTester $I)
{
$I->amOnPage('/login');
$I->fillField('username', 'admin');
$I->fillField('password', 'password');
$I->click('Login');
}
// tests
public function tryToTest(FunctionalTester $I)
{
$I->wantTo('ensure that the create settings/suppliers form loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage(route('suppliers.create'));
$I->dontSee('Create Supplier', '.page-header');
$I->see('Create Supplier', 'h1.pull-left');
}
public function failsEmptyValidation(FunctionalTester $I)
{
$I->wantTo('Test Validation Fails with blank elements');
$I->amOnPage(route('suppliers.create'));
$I->click('Save');
$I->seeElement('.alert-danger');
$I->see('The name field is required.', '.alert-msg');
}
public function passesCorrectValidation(FunctionalTester $I)
{
$supplier = \App\Models\Supplier::factory()->make();
$values = [
'name' => $supplier->name,
'address' => $supplier->address,
'address2' => $supplier->address2,
'city' => $supplier->city,
'state' => $supplier->state,
'zip' => $supplier->zip,
'country' => $supplier->country,
'contact' => $supplier->contact,
'phone' => $supplier->phone,
'fax' => $supplier->fax,
'email' => $supplier->email,
'url' => $supplier->url,
'notes' => $supplier->notes,
];
$I->wantTo('Test Validation Succeeds');
$I->amOnPage(route('suppliers.create'));
$I->submitForm('form#create-form', $values);
$I->seeRecord('suppliers', $values);
$I->seeElement('.alert-success');
}
public function allowsDelete(FunctionalTester $I)
{
$I->wantTo('Ensure I can delete a supplier');
$supplier = \App\Models\Supplier::factory()->create();
$I->sendDelete(route('suppliers.destroy', $supplier->id), ['_token' => csrf_token()]);
$I->seeResponseCodeIs(200);
}
}

View file

@ -1,98 +0,0 @@
<?php
use App\Models\User;
class UsersCest
{
public function _before(FunctionalTester $I)
{
$I->amOnPage('/login');
$I->fillField('username', 'admin');
$I->fillField('password', 'password');
$I->click('Login');
}
// tests
public function tryToTest(FunctionalTester $I)
{
$I->wantTo('ensure that the create users form loads without errors');
$I->lookForwardTo('seeing it load without errors');
$I->amOnPage(route('users.create'));
$I->dontSee('Create User', '.page-header');
$I->see('Create User', 'h1.pull-left');
}
public function failsEmptyValidation(FunctionalTester $I)
{
$I->wantTo('Test Validation Fails with blank elements');
$I->amOnPage(route('users.create'));
$I->click('Save');
$I->seeElement('.alert-danger');
$I->see('The first name field is required.', '.alert-msg');
$I->see('The username field is required unless ldap import is in 1.', '.alert-msg');
$I->see('The password field is required.', '.alert-msg');
}
public function failsShortValidation(FunctionalTester $I)
{
$I->wantTo('Test Validation Fails with short name');
$I->amOnPage(route('users.create'));
$I->fillField('first_name', 't2');
$I->fillField('last_name', 't2');
$I->fillField('username', 'a');
$I->fillField('password', '12345');
$I->click('Save');
$I->seeElement('.alert-danger');
$I->see('The password must be at least 8 characters', '.alert-msg');
}
public function passesCorrectValidation(FunctionalTester $I)
{
$user = \App\Models\User::factory()->make();
$submitValues = [
'first_name' => $user->first_name,
'last_name' => $user->last_name,
'username' => $user->username,
'password' => $user->password,
'password_confirmation' => $user->password,
'email' => $user->email,
'company_id' => $user->company_id,
'locale' => $user->locale,
'employee_num' => $user->employee_num,
'jobtitle' => $user->jobtitle,
'manager_id' => $user->manager_id,
'location_id' => $user->location_id,
'phone' => $user->phone,
'activated' => true,
'notes' => $user->notes,
];
$storedValues = [
'first_name' => $user->first_name,
'last_name' => $user->last_name,
'username' => $user->username,
'email' => $user->email,
'company_id' => $user->company_id,
'locale' => $user->locale,
'employee_num' => $user->employee_num,
'jobtitle' => $user->jobtitle,
'manager_id' => $user->manager_id,
'location_id' => $user->location_id,
'phone' => $user->phone,
'activated' => true,
'notes' => $user->notes,
];
$I->amOnPage(route('users.create'));
$I->wantTo('Test Validation Succeeds');
$I->submitForm('form#userForm', $submitValues);
$I->seeRecord('users', $storedValues);
$I->seeElement('.alert-success');
}
public function allowsDelete(FunctionalTester $I)
{
$user = \App\Models\User::factory()->create();
$I->wantTo('Ensure I can delete a user');
$I->sendDelete(route('users.destroy', $user->id), ['_token' => csrf_token()]);
$I->seeResponseCodeIs(200);
}
}

View file

@ -1,3 +0,0 @@
<?php
// Here you can initialize variables that will be available to your tests

View file

@ -1,8 +0,0 @@
tests/functional/AccessoriesCest.php
tests/functional/AssetModelsCest.php
tests/functional/AssetsCest.php
tests/functional/CategoriesCest.php
tests/functional/CompaniesCest.php
tests/functional/ComponentsCest.php
tests/functional/ConsumablesCest.php
tests/functional/DepreciationsCest.php

View file

@ -1,7 +0,0 @@
tests/functional/GroupsCest.php
tests/functional/LicensesCest.php
tests/functional/LocationsCest.php
tests/functional/ManufacturersCest.php
tests/functional/StatusLabelsCest.php
tests/functional/SuppliersCest.php
tests/functional/UsersCest.php

View file

@ -1,10 +0,0 @@
# Codeception Test Suite Configuration
# suite for unit (internal) tests.
class_name: UnitTester
modules:
enabled:
- \Helper\Unit
- Asserts
- Laravel5:
environment_file: .env.unit-tests