snipe-it/tests/unit/ImporterTest.php
Daniel Meltzer 5a84863873 Importer name/full name fixes. (#5072)
Fix a bug where "name" was used ambigously and mapping "item name" to
"name" would confuse the importer into thinking it should also be a user
name.  Now we default to "full name" for the users name, and "item name"
for the item name.  These are still both configurable through the custom
mapping.

Also update sample csvs and remove an outdated sample.
2018-02-21 16:42:36 -08:00

638 lines
24 KiB
PHP

<?php
use App\Importer\AccessoryImporter;
use App\Importer\AssetImporter;
use App\Importer\ConsumableImporter;
use App\Importer\LicenseImporter;
use App\Models\Accessory;
use App\Models\Asset;
use App\Models\AssetModel;
use App\Models\Category;
use App\Models\CustomField;
use App\Models\User;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Support\Facades\Hash;
class ImporterTest extends BaseTest
{
/**
* @var \UnitTester
*/
protected $tester;
public function testDefaultImportAssetWithCustomFields()
{
$this->signIn();
$csv = <<<'EOT'
Full Name,Email,Username,item Name,Category,Model name,Manufacturer,Model Number,Serial,Asset Tag,Location,Notes,Purchase Date,Purchase Cost,Company,Status,Warranty,Supplier,Weight
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,133289.59,Alpha,Undeployable,14,Blogspan,35
EOT;
$this->initializeCustomFields();
$this->import(new AssetImporter($csv));
$this->tester->seeRecord('users', [
'first_name' => 'Bonnie',
'last_name' => 'Nelson',
'email' => 'bnelson0@cdbaby.com',
]);
$this->tester->seeRecord('categories', [
'name' => 'quam'
]);
$this->tester->seeRecord('models', [
'name' => 'massa id',
'model_number' => 6377018600094472
]);
$this->tester->seeRecord('manufacturers', [
'name' => 'Linkbridge'
]);
$this->tester->seeRecord('locations', [
'name' => 'Daping'
]);
$this->tester->seeRecord('companies', [
'name' => 'Alpha'
]);
$this->tester->seeRecord('status_labels', [
'name' => 'Undeployable'
]);
$this->tester->seeRecord('suppliers', [
'name' => 'Blogspan'
]);
$this->tester->seeRecord('assets', [
'name' => 'eget nunc donec quis',
'serial' => '27aa8378-b0f4-4289-84a4-405da95c6147',
'asset_tag' => '970882174-8',
'notes' => "Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.",
'purchase_date' => '2016-04-05 00:00:01',
'purchase_cost' => 133289.59,
'warranty_months' => 14,
'_snipeit_weight_2' => 35
]);
}
public function testUpdateAssetIncludingCustomFields()
{
$this->signIn();
$csv = <<<'EOT'
Name,Email,Username,item Name,Category,Model name,Manufacturer,Model Number,Serial,Asset Tag,Location,Notes,Purchase Date,Purchase Cost,Company,Status,Warranty,Supplier,weight
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,133289.59,Alpha,Undeployable,14,Blogspan,95
EOT;
$this->initializeCustomFields();
$this->import(new AssetImporter($csv));
$updatedCSV = <<<'EOT'
item Name,Category,Model name,Manufacturer,Model Number,Serial,Asset Tag,Location,Notes,Purchase Date,Purchase Cost,Company,Status,Warranty,Supplier
A new name,some other category,Another Model,Linkbridge 32,356,67433477,970882174-8,New Location,I have no notes,2018-04-05,25.59,Another Company,Ready To Go,18,Not Creative
EOT;
$importer = new AssetImporter($updatedCSV);
$importer->setUserId(1)
->setUpdating(true)
->setUsernameFormat('firstname.lastname')
->import();
$this->tester->seeRecord('categories', [
'name' => 'some other category'
]);
$this->tester->seeRecord('models', [
'name' => 'Another Model',
'model_number' => 356
]);
$this->tester->seeRecord('manufacturers', [
'name' => 'Linkbridge 32'
]);
$this->tester->seeRecord('locations', [
'name' => 'New Location'
]);
$this->tester->seeRecord('companies', [
'name' => 'Another Company'
]);
$this->tester->seeRecord('status_labels', [
'name' => 'Ready To Go'
]);
$this->tester->seeRecord('suppliers', [
'name' => 'Not Creative'
]);
$this->tester->seeRecord('assets', [
'name' => 'A new name',
'serial' => '67433477',
'asset_tag' => '970882174-8',
'notes' => "I have no notes",
'purchase_date' => '2018-04-05 00:00:01',
'purchase_cost' => 25.59,
'warranty_months' => 18,
'_snipeit_weight_2' => 95
]);
}
public function testAssetModelNumber4359()
{
// As per bug #4359
// 1) Create model with blank model # and custom field.
// 2 ) Update custom fields with a csv not including model #
// 3 ) Not updated. NULL vs. empty issue.
$this->signIn();
$csv = <<<'EOT'
Name,Email,Username,item Name,Category,Model name,Manufacturer,Serial,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,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,133289.59,Alpha,Undeployable,14,Blogspan
EOT;
// Need to do this manually...
$customField = factory(App\Models\CustomField::class)->create(['name' => 'Weight']);
$customFieldSet = factory(App\Models\CustomFieldset::class)->create(['name' => 'Default']);
$customFieldSet->fields()->attach($customField, [
'required' => false,
'order' => 'asc']);
factory(App\Models\Category::class)->states('asset-laptop-category')->create([
'name' => 'quam'
]);
factory(App\Models\Manufacturer::class)->states('apple')->create([
'name' => 'Linkbridge'
]);
$am = factory(App\Models\AssetModel::class)->create([
'name' => 'massa id',
'fieldset_id' => $customFieldSet->id,
'category_id' => 1,
'manufacturer_id' => 1,
'model_number' => null
]);
$this->import(new AssetImporter($csv));
$updatedCSV = <<<'EOT'
Serial,Asset Tag,weight
67433477,970882174-8,115
EOT;
$importer = new AssetImporter($updatedCSV);
$importer->setUserId(1)
->setUpdating(true)
->setUsernameFormat('firstname.lastname')
->import();
$this->tester->seeRecord('assets', [
'asset_tag' => '970882174-8',
'_snipeit_weight_2' => 115
]);
}
public function initializeCustomFields()
{
$customField = factory(App\Models\CustomField::class)->create(['name' => 'Weight']);
$customFieldSet = factory(App\Models\CustomFieldset::class)->create(['name' => 'Default']);
$customFieldSet->fields()->attach($customField, [
'required' => false,
'order' => 'asc']);
$am = factory(App\Models\AssetModel::class)->create([
'name' => 'massa id',
'fieldset_id' => $customFieldSet->id
]);
}
public function testCustomMappingImport()
{
$this->signIn();
$csv = <<<'EOT'
Full Name,Email,Username,object name,Cat,Model name,Manufacturer,Model Number,Serial,Asset,Loc,Some Notes,Purchase Date,Purchase Cost,comp,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,133289.59,Alpha,Undeployable,14,Blogspan
EOT;
$customFieldMap = [
'asset_tag' => 'Asset',
'category' => 'Cat',
'company' => 'comp',
'item_name' => 'object name',
'expiration_date' => 'expiration date',
'location' => 'loc',
'notes' => 'Some Notes',
'asset_model' => "model name",
];
$this->import(new AssetImporter($csv), $customFieldMap);
// Did we create a user?
$this->tester->seeRecord('users', [
'first_name' => 'Bonnie',
'last_name' => 'Nelson',
'email' => 'bnelson0@cdbaby.com',
]);
// Grab the user record for use in asserting assigned_to
$createdUser = $this->tester->grabRecord('users', [
'first_name' => 'Bonnie',
'last_name' => 'Nelson',
'email' => 'bnelson0@cdbaby.com',
]);
$this->tester->seeRecord('categories', [
'name' => 'quam'
]);
$this->tester->seeRecord('models', [
'name' => 'massa id',
'model_number' => 6377018600094472
]);
$this->tester->seeRecord('manufacturers', [
'name' => 'Linkbridge'
]);
$this->tester->seeRecord('locations', [
'name' => 'Daping'
]);
$this->tester->seeRecord('companies', [
'name' => 'Alpha'
]);
$this->tester->seeRecord('status_labels', [
'name' => 'Undeployable'
]);
$this->tester->seeRecord('suppliers', [
'name' => 'Blogspan'
]);
$this->tester->seeRecord('assets', [
'name' => 'eget nunc donec quis',
'serial' => '27aa8378-b0f4-4289-84a4-405da95c6147',
'asset_tag' => '970882174-8',
'notes' => "Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.",
'purchase_date' => '2016-04-05 00:00:01',
'purchase_cost' => 133289.59,
'warranty_months' => 14,
'assigned_to' => $createdUser['id'],
'assigned_type' => User::class
]);
}
public function testDefaultAccessoryImport()
{
$csv = <<<'EOT'
Item Name,Purchase Date,Purchase Cost,Location,Company,Order Number,Category,Requestable,Quantity
Walter Carter,09/01/2006,,metus. Vivamus,Macromedia,J935H60W,Customers,False,278
EOT;
$this->import(new AccessoryImporter($csv));
$this->tester->seeRecord('accessories', [
'name' => 'Walter Carter',
'purchase_date' => '2006-09-01 00:00:01',
'order_number' => 'J935H60W',
'requestable' => 0,
'qty' => 278
]);
$this->tester->seeRecord('locations', [
'name' => 'metus. Vivamus'
]);
$this->tester->seeRecord('companies', [
'name' => 'Macromedia'
]);
$this->tester->seeRecord('categories', [
'name' => 'Customers'
]);
}
public function testDefaultAccessoryUpdate()
{
$csv = <<<'EOT'
Item Name,Purchase Date,Purchase Cost,Location,Company,Order Number,Category,Requestable,Quantity
Walter Carter,09/01/2006,,metus. Vivamus,Macromedia,J935H60W,Customers,False,278
EOT;
$this->import(new AccessoryImporter($csv));
$this->tester->seeNumRecords(1, 'accessories');
$updatedCSV = <<<'EOT'
Item Name,Purchase Date,Purchase Cost,Location,Company,Order Number,Category,Requestable,Quantity
Walter Carter,09/01/2015,350,metus. Vivamus,Macromedia,35GGH,Customers,True,12
EOT;
$importer = new AccessoryImporter($updatedCSV);
$importer->setUserId(1)
->setUpdating(true)
->import();
// At this point we should still only have one record.
$this->tester->seeNumRecords(1, 'accessories');
// But instead these.
$this->tester->seeRecord('accessories', [
'name' => 'Walter Carter',
'purchase_date' => '2015-09-01 00:00:01',
'order_number' => '35GGH',
'requestable' => 1,
'qty' => 12
]);
}
public function testCustomAccessoryImport()
{
$csv = <<<'EOT'
Name,Pur Date,Cost,Loc,Comp,Order Num,Cat,Request,Quan
Walter Carter,09/01/2006,,metus. Vivamus,Macromedia,J935H60W,Customers,False,278
EOT;
$customFieldMap = [
'category' => 'Cat',
'company' => 'Comp',
'item_name' => 'Name',
'location' => 'Loc',
'purchase_date' => 'Pur Date',
'purchase_cost' => "Cost",
'order_number' => 'Order Num',
'requestable' => 'Request',
'quantity' => 'Quan'
];
$this->import(new AccessoryImporter($csv), $customFieldMap);
// dd($this->tester->grabRecord('accessories'));
$this->tester->seeRecord('accessories', [
'name' => 'Walter Carter',
'purchase_date' => '2006-09-01 00:00:01',
'order_number' => 'J935H60W',
'requestable' => 0,
'qty' => 278
]);
$this->tester->seeRecord('locations', [
'name' => 'metus. Vivamus'
]);
$this->tester->seeRecord('companies', [
'name' => 'Macromedia'
]);
$this->tester->seeRecord('categories', [
'name' => 'Customers'
]);
}
public function testDefaultConsumableImport()
{
$csv = <<<'EOT'
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
EOT;
$this->import(new ConsumableImporter($csv));
$this->tester->seeRecord('consumables', [
'name' => 'eget',
'purchase_date' => '2011-01-03 00:00:01',
'purchase_cost' => 85.91,
'order_number' => 'T295T06V',
'requestable' => 0,
'qty' => 322
]);
$this->tester->seeRecord('locations', [
'name' => 'mauris blandit mattis.'
]);
$this->tester->seeRecord('companies', [
'name' => 'Lycos'
]);
$this->tester->seeRecord('categories', [
'name' => 'Triamterene/Hydrochlorothiazide'
]);
}
public function testDefaultConsumableUpdate()
{
$csv = <<<'EOT'
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
EOT;
$this->import(new ConsumableImporter($csv));
$this->tester->seeNumRecords(1, 'consumables');
$updatedCSV = <<<'EOT'
Item Name,Purchase Date,Purchase Cost,Location,Company,Order Number,Category,Requestable,Quantity
eget,12/05/2016,35.45,mauris blandit mattis.,Lycos,3666FF,New Cat,Yes,15
EOT;
$importer = new ConsumableImporter($updatedCSV);
$importer->setUserId(1)
->setUpdating(true)
->import();
// At this point we should still only have one record.
$this->tester->seeNumRecords(1, 'consumables');
// But instead these.
$this->tester->seeRecord('consumables', [
'name' => 'eget',
'purchase_date' => '2016-12-05 00:00:01',
'purchase_cost' => 35.45,
'order_number' => '3666FF',
'requestable' => 1,
'qty' => 15
]);
}
public function testCustomConsumableImport()
{
$csv = <<<'EOT'
Name,pur Date,Pur Cost,Loc,Comp,Order Num,Kat,Request,Quan
eget,01/03/2011,85.91,mauris blandit mattis.,Lycos,T295T06V,Triamterene/Hydrochlorothiazide,No,322
EOT;
$customFieldMap = [
'category' => 'Kat',
'company' => 'Comp',
'item_name' => 'Name',
'location' => 'Loc',
'purchase_date' => 'Pur date',
'purchase_cost' => "Pur Cost",
'order_number' => 'Order Num',
'requestable' => 'Request',
'quantity' => 'Quan'
];
$this->import(new ConsumableImporter($csv), $customFieldMap);
$this->tester->seeRecord('consumables', [
'name' => 'eget',
'purchase_date' => '2011-01-03 00:00:01',
'purchase_cost' => 85.91,
'order_number' => 'T295T06V',
'requestable' => 0,
'qty' => 322
]);
$this->tester->seeRecord('locations', [
'name' => 'mauris blandit mattis.'
]);
$this->tester->seeRecord('companies', [
'name' => 'Lycos'
]);
$this->tester->seeRecord('categories', [
'name' => 'Triamterene/Hydrochlorothiazide'
]);
}
public function testDefaultLicenseImport()
{
$this->signIn();
$csv = <<<'EOT'
Name,Email,Username,Item name,serial,manufacturer,purchase date,purchase cost,purchase order,order number,Licensed To Name,Licensed to Email,expiration date,maintained,reassignable,seats,company,supplier,notes
Helen Anderson,cspencer0@privacy.gov.au,cspencer0,Argentum Malachite Athletes Foot Relief,1aa5b0eb-79c5-40b2-8943-5472a6893c3c,"Beer, Leannon and Lubowitz",07/13/2012,$79.66,53008,386436062-5,Cynthia Spencer,cspencer0@gov.uk,01/27/2016,false,no,80,"Haag, Schmidt and Farrell","Hegmann, Mohr and Cremin",Sed ante. Vivamus tortor. Duis mattis egestas metus.
EOT;
$this->import(new LicenseImporter($csv));
// dd($this->tester->grabRecord('licenses'));
$this->tester->seeRecord('licenses', [
'name' => 'Argentum Malachite Athletes Foot Relief',
'purchase_date' => '2012-07-13 00:00:01',
'seats' => 80,
'license_email' => 'cspencer0@gov.uk',
'order_number' => '386436062-5',
'license_name' => 'Cynthia Spencer',
'expiration_date' => '2016-01-27',
'maintained' => 0,
'notes' => 'Sed ante. Vivamus tortor. Duis mattis egestas metus.',
'purchase_cost' => 79.66,
'purchase_order' => "53008",
'reassignable' => 0,
'serial' => '1aa5b0eb-79c5-40b2-8943-5472a6893c3c',
]);
$this->tester->seeRecord('manufacturers', [
'name' => 'Beer, Leannon and Lubowitz'
]);
$this->tester->seeRecord('suppliers', [
'name' => "Hegmann, Mohr and Cremin",
]);
$this->tester->seeRecord('companies', [
'name' => 'Haag, Schmidt and Farrell'
]);
$this->tester->seeNumRecords(80, 'license_seats');
}
public function testDefaultLicenseUpdate()
{
$csv = <<<'EOT'
Name,Email,Username,Item name,serial,manufacturer,purchase date,purchase cost,purchase order,order number,Licensed To Name,Licensed to Email,expiration date,maintained,reassignable,seats,company,supplier,notes
Helen Anderson,cspencer0@privacy.gov.au,cspencer0,Argentum Malachite Athletes Foot Relief,1aa5b0eb-79c5-40b2-8943-5472a6893c3c,"Beer, Leannon and Lubowitz",07/13/2012,$79.66,53008,386436062-5,Cynthia Spencer,cspencer0@gov.uk,01/27/2016,false,no,80,"Haag, Schmidt and Farrell","Hegmann, Mohr and Cremin",Sed ante. Vivamus tortor. Duis mattis egestas metus.
EOT;
$this->import(new LicenseImporter($csv));
$this->tester->seeNumRecords(1, 'licenses');
$updatedCSV = <<<'EOT'
Item name,serial,manufacturer,purchase date,purchase cost,purchase order,order number,Licensed To Name,Licensed to Email,expiration date,maintained,reassignable,seats,company,supplier,notes
Argentum Malachite Athletes Foot Relief,1aa5b0eb-79c5-40b2-8943-5472a6893c3c,"Beer, Leannon and Lubowitz",05/15/2019,$1865.34,63 ar,18334,A Legend,Legendary@gov.uk,04/27/2016,yes,true,64,"Haag, Schmidt and Farrell","Hegmann, Mohr and Cremin",Sed ante. Vivamus tortor. Duis mattis egestas metus.
EOT;
$importer = new LicenseImporter($updatedCSV);
$importer->setUserId(1)
->setUpdating(true)
->import();
// At this point we should still only have one record.
$this->tester->seeNumRecords(1, 'licenses');
// But instead these.
// dd($this->tester->grabRecord('licenses'));
$this->tester->seeRecord('licenses', [
'name' => 'Argentum Malachite Athletes Foot Relief',
'purchase_date' => '2019-05-15 00:00:01',
'seats' => 64,
'license_email' => 'Legendary@gov.uk',
'order_number' => '18334',
'license_name' => 'A Legend',
'expiration_date' => '2016-04-27',
'maintained' => 1,
'notes' => 'Sed ante. Vivamus tortor. Duis mattis egestas metus.',
'purchase_cost' => 1865.34,
'purchase_order' => "63 ar",
'reassignable' => 1,
'serial' => '1aa5b0eb-79c5-40b2-8943-5472a6893c3c',
]);
// License seats are soft deleted
$this->tester->seeNumRecords(64, 'license_seats', ['deleted_at' => null]);
}
public function testCustomLicenseImport()
{
$csv = <<<'EOT'
Name,Email,Username,Object name,serial num,manuf,pur date,pur cost,purc order,order num,Licensed To,Licensed Email,expire date,maint,reass,seat,comp,supplier,note
Helen Anderson,cspencer0@privacy.gov.au,cspencer0,Argentum Malachite Athletes Foot Relief,1aa5b0eb-79c5-40b2-8943-5472a6893c3c,"Beer, Leannon and Lubowitz",07/13/2012,$79.66,53008,386436062-5,Cynthia Spencer,cspencer0@gov.uk,01/27/2016,false,no,80,"Haag, Schmidt and Farrell","Hegmann, Mohr and Cremin",Sed ante. Vivamus tortor. Duis mattis egestas metus.
EOT;
$customFieldMap = [
'company' => 'Comp',
'expiration_date' => 'expire date',
'item_name' => 'Object Name',
'license_email' => 'licensed email',
'license_name' => 'licensed to',
'maintained' => 'maint',
'manufacturer' => 'manuf',
'notes' => 'note',
'order_number' => 'Order Num',
'purchase_cost' => "Pur Cost",
'purchase_date' => 'Pur date',
'purchase_order' => "Purc Order",
'quantity' => 'Quan',
'reassignable' => 'reass',
'requestable' => 'Request',
'seats' => 'seat',
'serial' => 'serial num',
];
$this->import(new LicenseImporter($csv), $customFieldMap);
// dd($this->tester->grabRecord('licenses'));
$this->tester->seeRecord('licenses', [
'name' => 'Argentum Malachite Athletes Foot Relief',
'purchase_date' => '2012-07-13 00:00:01',
'seats' => 80,
'license_email' => 'cspencer0@gov.uk',
'order_number' => '386436062-5',
'license_name' => 'Cynthia Spencer',
'expiration_date' => '2016-01-27',
'maintained' => 0,
'notes' => 'Sed ante. Vivamus tortor. Duis mattis egestas metus.',
'purchase_cost' => 79.66,
'purchase_order' => "53008",
'reassignable' => 0,
'serial' => '1aa5b0eb-79c5-40b2-8943-5472a6893c3c',
]);
$this->tester->seeRecord('manufacturers', [
'name' => 'Beer, Leannon and Lubowitz'
]);
$this->tester->seeRecord('suppliers', [
'name' => "Hegmann, Mohr and Cremin",
]);
$this->tester->seeRecord('companies', [
'name' => 'Haag, Schmidt and Farrell'
]);
$this->tester->seeNumRecords(80, 'license_seats');
}
private function import($importer, $mappings = null)
{
if ($mappings) {
$importer->setFieldMappings($mappings);
}
$importer->setUserId(1)
->setUpdating(false)
->setUsernameFormat('firstname.lastname')
->import();
}
}