View source
<?php
namespace Drupal\Tests\farm_location\Kernel;
use Drupal\asset\Entity\Asset;
use Drupal\farm_geo\Traits\WktTrait;
use Drupal\KernelTests\KernelTestBase;
use Drupal\log\Entity\Log;
use Drupal\Tests\farm_test\Kernel\FarmEntityCacheTestTrait;
class LocationTest extends KernelTestBase {
use FarmEntityCacheTestTrait;
use WktTrait;
protected $wktGenerator;
protected $assetLocation;
protected $logLocation;
protected $polygons = [];
protected $locations = [];
protected static $modules = [
'asset',
'geofield',
'log',
'farm_field',
'farm_location',
'farm_location_test',
'farm_log',
'state_machine',
'user',
];
protected function setUp() : void {
parent::setUp();
$this->wktGenerator = \Drupal::service('geofield.wkt_generator');
$this->assetLocation = \Drupal::service('asset.location');
$this->logLocation = \Drupal::service('log.location');
$this
->installEntitySchema('asset');
$this
->installEntitySchema('log');
$this
->installEntitySchema('user');
$this
->installConfig([
'farm_location_test',
]);
for ($i = 0; $i < 3; $i++) {
$segments = rand(3, 7);
$this->polygons[] = $this
->reduceWkt($this->wktGenerator
->wktGeneratePolygon(NULL, $segments));
}
for ($i = 0; $i < 3; $i++) {
$location = Asset::create([
'type' => 'location',
'name' => $this
->randomMachineName(),
'status' => 'active',
'intrinsic_geometry' => $this->polygons[$i],
'is_fixed' => TRUE,
]);
$location
->save();
$this->locations[] = $location;
}
}
public function testPopulateLogGeometry() {
$log = Log::create([
'type' => 'movement',
'status' => 'pending',
'location' => [
'target_id' => $this->locations[0]
->id(),
],
]);
$log
->save();
$this
->assertEquals($this->locations[0]
->get('intrinsic_geometry')->value, $log
->get('geometry')->value, 'Empty geometry is populated from location.');
$log->location = [
[
'target_id' => $this->locations[0]
->id(),
],
[
'target_id' => $this->locations[1]
->id(),
],
];
$log->geometry->value = '';
$log
->save();
$combined = $this
->combineWkt([
$this->polygons[0],
$this->polygons[1],
]);
$this
->assertEquals($combined, $log
->get('geometry')->value, 'Geometries from multiple locations are combined.');
$log->location = [
'target_id' => $this->locations[1]
->id(),
];
$log
->save();
$this
->assertEquals($this->locations[1]
->get('intrinsic_geometry')->value, $log
->get('geometry')->value, 'Geometry is updated when locations are changed.');
$log->geometry->value = $this->polygons[2];
$log
->save();
$this
->assertEquals($this->polygons[2], $log
->get('geometry')->value, 'Custom geometry can be saved.');
$log->location = [
'target_id' => $this->locations[0]
->id(),
];
$log
->save();
$this
->assertEquals($this->polygons[2], $log
->get('geometry')->value, 'Custom geometry is not overwritten when locations change.');
}
public function testAssetLocation() {
$asset = Asset::create([
'type' => 'object',
'name' => $this
->randomMachineName(),
'status' => 'active',
]);
$asset
->save();
$this
->populateEntityTestCache($asset);
$this
->assertFalse($this->assetLocation
->hasLocation($asset), 'New assets do not have location.');
$this
->assertFalse($this->assetLocation
->hasGeometry($asset), 'New assets do not have geometry.');
$this
->assertEntityTestCache($asset, TRUE);
$first_log = Log::create([
'type' => 'movement',
'status' => 'done',
'asset' => [
'target_id' => $asset
->id(),
],
'location' => [
'target_id' => $this->locations[0]
->id(),
],
'is_movement' => TRUE,
]);
$first_log
->save();
$this
->assertTrue($this->assetLocation
->hasLocation($asset), 'Asset with movement log has location.');
$this
->assertTrue($this->assetLocation
->hasGeometry($asset), 'Asset with movement log has geometry.');
$this
->assertEquals($this->logLocation
->getLocation($first_log), $this->assetLocation
->getLocation($asset), 'Asset with movement log has same location as log.');
$this
->assertEquals($this->logLocation
->getGeometry($first_log), $this->assetLocation
->getGeometry($asset), 'Asset with movement log has same geometry as log.');
$this
->assertEntityTestCache($asset, FALSE);
$this
->populateEntityTestCache($asset);
$first_log->location = [
'target_id' => $this->locations[1]
->id(),
];
$first_log
->save();
$this
->assertEquals($this->logLocation
->getLocation($first_log), $this->assetLocation
->getLocation($asset), 'Asset with changed movement log has same location as log.');
$this
->assertEquals($this->logLocation
->getGeometry($first_log), $this->assetLocation
->getGeometry($asset), 'Asset with changed movement log has same geometry as log.');
$this
->assertEntityTestCache($asset, FALSE);
$this
->populateEntityTestCache($asset);
$second_log = Log::create([
'type' => 'movement',
'status' => 'pending',
'asset' => [
'target_id' => $asset
->id(),
],
'location' => [
'target_id' => $this->locations[2]
->id(),
],
'is_movement' => TRUE,
]);
$second_log
->save();
$this
->assertEquals($this->logLocation
->getLocation($first_log), $this->assetLocation
->getLocation($asset), 'Asset with pending movement log has original location');
$this
->assertEquals($this->logLocation
->getGeometry($first_log), $this->assetLocation
->getGeometry($asset), 'Asset with pending movement log has original geometry.');
$this
->assertEntityTestCache($asset, TRUE);
$second_log->status = 'done';
$second_log
->save();
$this
->assertEquals($this->logLocation
->getLocation($second_log), $this->assetLocation
->getLocation($asset), 'Asset with second movement log has new location');
$this
->assertEquals($this->logLocation
->getGeometry($second_log), $this->assetLocation
->getGeometry($asset), 'Asset with second movement log has new geometry.');
$this
->assertEntityTestCache($asset, FALSE);
$this
->populateEntityTestCache($asset);
$third_log = Log::create([
'type' => 'movement',
'timestamp' => \Drupal::time()
->getRequestTime() + 86400,
'status' => 'done',
'asset' => [
'target_id' => $asset
->id(),
],
'location' => [
'target_id' => $this->locations[0]
->id(),
],
'is_movement' => TRUE,
]);
$third_log
->save();
$this
->assertEquals($this->logLocation
->getLocation($second_log), $this->assetLocation
->getLocation($asset), 'Asset with future movement log has current location');
$this
->assertEquals($this->logLocation
->getGeometry($second_log), $this->assetLocation
->getGeometry($asset), 'Asset with future movement log has current geometry.');
$this
->assertEntityTestCache($asset, TRUE);
$fourth_log = Log::create([
'type' => 'movement',
'status' => 'done',
'asset' => [
'target_id' => $asset
->id(),
],
'is_movement' => TRUE,
]);
$fourth_log
->save();
$this
->assertFalse($this->assetLocation
->hasLocation($asset), 'Asset location can be unset.');
$this
->assertFalse($this->assetLocation
->hasGeometry($asset), 'Asset geometry can be unset.');
$this
->assertEntityTestCache($asset, FALSE);
$this
->populateEntityTestCache($asset);
$fourth_log
->delete();
$this
->assertEquals($this->logLocation
->getLocation($second_log), $this->assetLocation
->getLocation($asset), 'When a movement log is deleted, the previous location is used.');
$this
->assertEquals($this->logLocation
->getGeometry($second_log), $this->assetLocation
->getGeometry($asset), 'When a movement log is deleted, the previous locations geometry is used. .');
$this
->assertEntityTestCache($asset, FALSE);
}
public function testFixedAssetLocation() {
$asset = Asset::create([
'type' => 'object',
'name' => $this
->randomMachineName(),
'status' => 'active',
'is_fixed' => TRUE,
]);
$asset
->save();
$this
->assertFalse($this->assetLocation
->hasGeometry($asset), 'New assets do not have geometry.');
$this->assetLocation
->setIntrinsicGeometry($asset, $this->polygons[0]);
$asset
->save();
$this
->assertTrue($this->assetLocation
->hasGeometry($asset), 'Assets with intrinsic geometry have geometry.');
$this
->assertEquals($this->polygons[0], $this->assetLocation
->getGeometry($asset), 'Asset intrinsic geometry is asset geometry.');
$log = Log::create([
'type' => 'movement',
'status' => 'done',
'asset' => [
'target_id' => $asset
->id(),
],
'location' => [
'target_id' => $this->locations[0]
->id(),
],
'is_movement' => TRUE,
]);
$log
->save();
$this
->assertEquals([], $this->assetLocation
->getLocation($asset), 'Movement logs of a fixed asset do not affect location.');
$this
->assertEquals($this->polygons[0], $this->assetLocation
->getGeometry($asset), 'Movement logs of a fixed asset do not affect geometry.');
$asset->is_fixed = FALSE;
$asset
->save();
$this
->assertEquals($this->logLocation
->getLocation($log), $this->assetLocation
->getLocation($asset), 'Movement logs of a not fixed asset do affect location.');
$this
->assertEquals($this->logLocation
->getGeometry($log), $this->assetLocation
->getGeometry($asset), 'Movement logs of a not fixed asset do affect geometry.');
}
public function testLocationAssets() {
$this
->assertEmpty($this->assetLocation
->getAssetsByLocation([
$this->locations[0],
$this->locations[1],
]));
$first_asset = Asset::create([
'type' => 'object',
'name' => $this
->randomMachineName(),
'status' => 'active',
]);
$first_asset
->save();
$first_log = Log::create([
'type' => 'movement',
'status' => 'done',
'asset' => [
'target_id' => $first_asset
->id(),
],
'location' => [
'target_id' => $this->locations[0]
->id(),
],
'is_movement' => TRUE,
]);
$first_log
->save();
$this
->assertEquals(1, count($this->assetLocation
->getAssetsByLocation([
$this->locations[0],
])));
$this
->assertEmpty($this->assetLocation
->getAssetsByLocation([
$this->locations[1],
]));
$this
->assertEquals(1, count($this->assetLocation
->getAssetsByLocation([
$this->locations[0],
$this->locations[1],
])));
$second_asset = Asset::create([
'type' => 'object',
'name' => $this
->randomMachineName(),
'status' => 'active',
]);
$second_asset
->save();
$second_log = Log::create([
'type' => 'movement',
'status' => 'done',
'asset' => [
'target_id' => $second_asset
->id(),
],
'location' => [
'target_id' => $this->locations[1]
->id(),
],
'is_movement' => TRUE,
]);
$second_log
->save();
$this
->assertEquals(1, count($this->assetLocation
->getAssetsByLocation([
$this->locations[0],
])));
$this
->assertEquals(1, count($this->assetLocation
->getAssetsByLocation([
$this->locations[1],
])));
$this
->assertEquals(2, count($this->assetLocation
->getAssetsByLocation([
$this->locations[0],
$this->locations[1],
])));
$third_log = Log::create([
'type' => 'movement',
'status' => 'done',
'asset' => [
[
'target_id' => $first_asset
->id(),
],
[
'target_id' => $second_asset
->id(),
],
],
'location' => [
'target_id' => $this->locations[0]
->id(),
],
'is_movement' => TRUE,
]);
$third_log
->save();
$this
->assertEquals(2, count($this->assetLocation
->getAssetsByLocation([
$this->locations[0],
])));
$this
->assertEmpty($this->assetLocation
->getAssetsByLocation([
$this->locations[1],
]));
$this
->assertEquals(2, count($this->assetLocation
->getAssetsByLocation([
$this->locations[0],
$this->locations[1],
])));
$fourth_log = Log::create([
'type' => 'movement',
'status' => 'done',
'asset' => [
[
'target_id' => $first_asset
->id(),
],
],
'location' => [
'target_id' => $this->locations[1]
->id(),
],
'is_movement' => TRUE,
]);
$fourth_log
->save();
$this
->assertEquals(1, count($this->assetLocation
->getAssetsByLocation([
$this->locations[0],
])));
$this
->assertEquals(1, count($this->assetLocation
->getAssetsByLocation([
$this->locations[1],
])));
$this
->assertEquals(2, count($this->assetLocation
->getAssetsByLocation([
$this->locations[0],
$this->locations[1],
])));
$fifth_log = Log::create([
'type' => 'movement',
'status' => 'done',
'asset' => [
[
'target_id' => $first_asset
->id(),
],
],
'location' => [
[
'target_id' => $this->locations[0]
->id(),
],
[
'target_id' => $this->locations[1]
->id(),
],
],
'is_movement' => TRUE,
]);
$fifth_log
->save();
$this
->assertEquals(2, count($this->assetLocation
->getAssetsByLocation([
$this->locations[0],
])));
$this
->assertEquals(1, count($this->assetLocation
->getAssetsByLocation([
$this->locations[1],
])));
$this
->assertEquals(2, count($this->assetLocation
->getAssetsByLocation([
$this->locations[0],
$this->locations[1],
])));
}
}