farm-2.x-dev/modules/quick/planting/tests/Kernel/QuickPlantingTest.php
modules/quick/planting/tests/Kernel/QuickPlantingTest.php
<?php namespace Drupal\Tests\farm_quick_planting\Kernel; use Drupal\asset\Entity\Asset; use Drupal\taxonomy\Entity\Term; use Drupal\Tests\farm_quick\Kernel\QuickFormTestBase; /** * Tests for farmOS planting quick form. * * @group farm */ class QuickPlantingTest extends QuickFormTestBase { /** * Quick form ID. * * @var string */ protected $quickFormId = 'planting'; /** * {@inheritdoc} */ protected static $modules = [ 'farm_harvest', 'farm_land', 'farm_plant', 'farm_plant_type', 'farm_quantity_standard', 'farm_quick_planting', 'farm_season', 'farm_seeding', 'farm_transplanting', 'farm_unit', ]; /** * {@inheritdoc} */ protected function setUp(): void { parent::setUp(); $this->installConfig([ 'farm_harvest', 'farm_land', 'farm_plant', 'farm_quantity_standard', 'farm_seeding', 'farm_transplanting', 'system', ]); } /** * Test simple planting quick form submission. */ public function testQuickPlantingSimple() { // Create a season and crop to reference. $season = Term::create([ 'name' => '2022', 'vid' => 'season', ]); $season->save(); $crop = Term::create([ 'name' => 'Rice', 'vid' => 'plant_type', ]); $crop->save(); // Submit the planting quick form. $this->submitQuickForm([ 'seasons' => [['target_id' => $season->id()]], 'crops' => [[['target_id' => $crop->id()]]], 'crop_count' => 1, 'log_types' => [], ]); // Confirm that one asset was created. $assets = $this->assetStorage->loadMultiple(); $this->assertCount(1, $assets); // Check that the asset's fields were populated correctly. $asset = $assets[1]; $this->assertEquals('plant', $asset->bundle()); $this->assertEquals('2022 Rice', $asset->label()); $this->assertEquals('active', $asset->get('status')->value); $this->assertEquals($season->id(), $asset->get('season')->referencedEntities()[0]->id()); $this->assertEquals($crop->id(), $asset->get('plant_type')->referencedEntities()[0]->id()); // Test with multiple crops. $crop1 = Term::create([ 'name' => 'Winter rye', 'vid' => 'plant_type', ]); $crop1->save(); $crop2 = Term::create([ 'name' => 'Vetch', 'vid' => 'plant_type', ]); $crop2->save(); // Submit the planting quick form. $this->submitQuickForm([ 'seasons' => [['target_id' => $season->id()]], 'crops' => [ [['target_id' => $crop1->id()]], [['target_id' => $crop2->id()]], ], 'crop_count' => 2, 'log_types' => [], ]); // Confirm that a second asset was created. $assets = $this->assetStorage->loadMultiple(); $this->assertCount(2, $assets); // Check that the asset has multiple crops and is named correctly. $asset = $assets[2]; $this->assertEquals('2022 Winter rye, Vetch', $asset->label()); $this->assertEquals($crop1->id(), $asset->get('plant_type')->referencedEntities()[0]->id()); $this->assertEquals($crop2->id(), $asset->get('plant_type')->referencedEntities()[1]->id()); // Test overriding the plant name. $custom_name = 'Rice of the 2022 season'; $this->submitQuickForm([ 'seasons' => [['target_id' => $season->id()]], 'crops' => [ [['target_id' => $crop->id()]], ], 'crop_count' => 1, 'log_types' => [], 'custom_name' => TRUE, 'name' => $custom_name, ]); // Confirm that a third asset was created. $assets = $this->assetStorage->loadMultiple(); $this->assertCount(3, $assets); // Check that the asset name was overridden. $asset = $assets[3]; $this->assertEquals($custom_name, $asset->label()); } /** * Test planting with logs. */ public function testQuickPlantingLogs() { // Create a season, crop, and two land assets to reference. $season = Term::create([ 'name' => '2022', 'vid' => 'season', ]); $season->save(); $crop = Term::create([ 'name' => 'Lettuce', 'vid' => 'plant_type', ]); $crop->save(); $land1 = Asset::create([ 'name' => 'Field A', 'type' => 'land', 'land_type' => 'field', 'is_fixed' => TRUE, 'is_location' => TRUE, 'status' => 'active', ]); $land1->save(); $land2 = Asset::create([ 'name' => 'Field B', 'type' => 'land', 'land_type' => 'field', 'is_fixed' => TRUE, 'is_location' => TRUE, 'status' => 'active', ]); $land2->save(); // Programmatically submit the planting quick form. $this->submitQuickForm([ 'seasons' => [['target_id' => $season->id()]], 'crops' => [[['target_id' => $crop->id()]]], 'crop_count' => 1, 'log_types' => [ 'seeding' => 'seeding', ], 'seeding' => [ 'type' => 'seeding', 'date' => [ 'date' => '2022-05-15', 'time' => '00:00:00', ], 'location' => $land1->label(), 'quantity' => [ 'measure' => 'weight', 'value' => '10.01', 'units' => 'kg', ], 'notes' => [ 'value' => 'Lorem ipsum', 'format' => 'default', ], 'done' => TRUE, ], ]); // Load assets and logs. $assets = $this->assetStorage->loadMultiple(); $logs = $this->logStorage->loadMultiple(); // Confirm that three assets (land + plant) and one log exists. $this->assertCount(3, $assets); $this->assertCount(1, $logs); // Check that the asset name includes the seeding location. $asset = $assets[3]; $this->assertEquals('2022 Field A Lettuce', $asset->label()); // Check that the seeding log's fields were populated correctly. $log = $logs[1]; $this->assertEquals('seeding', $log->bundle()); $this->assertEquals('Seed ' . $asset->label(), $log->label()); $this->assertEquals(strtotime('2022-05-15'), $log->get('timestamp')->value); $this->assertEquals($asset->id(), $log->get('asset')->referencedEntities()[0]->id()); $this->assertEquals($land1->id(), $log->get('location')->referencedEntities()[0]->id()); $this->assertEquals('weight', $log->get('quantity')->referencedEntities()[0]->get('measure')->value); $this->assertEquals('10.01', $log->get('quantity')->referencedEntities()[0]->get('value')[0]->get('decimal')->getValue()); $this->assertEquals('kg', $log->get('quantity')->referencedEntities()[0]->get('units')->referencedEntities()[0]->get('name')->value); $this->assertEquals('Lorem ipsum', $log->get('notes')->value); $this->assertEquals('done', $log->get('status')->value); // Test creating multiple logs. $this->submitQuickForm([ 'seasons' => [['target_id' => $season->id()]], 'crops' => [[['target_id' => $crop->id()]]], 'crop_count' => 1, 'log_types' => [ 'seeding' => 'seeding', 'transplanting' => 'transplanting', 'harvest' => 'harvest', ], 'seeding' => [ 'type' => 'seeding', 'date' => [ 'date' => '2022-05-15', 'time' => '00:00:00', ], 'location' => $land1->label(), 'notes' => [], 'done' => TRUE, ], 'transplanting' => [ 'type' => 'transplanting', 'date' => [ 'date' => '2022-06-15', 'time' => '00:00:00', ], 'location' => $land2->label(), 'notes' => [], 'done' => FALSE, ], 'harvest' => [ 'type' => 'harvest', 'date' => [ 'date' => '2022-07-15', 'time' => '00:00:00', ], 'notes' => [], 'done' => FALSE, ], ]); // Confirm that another asset and 3 more logs were created. $assets = $this->assetStorage->loadMultiple(); $logs = $this->logStorage->loadMultiple(); $this->assertCount(4, $assets); $this->assertCount(4, $logs); // Check that the asset name includes the transplanting location. $asset = $assets[4]; $this->assertEquals('2022 Field B Lettuce', $asset->label()); // Check that the transplanting and harvest logs are pending. $log = $logs[3]; $this->assertEquals('pending', $log->get('status')->value); $log = $logs[4]; $this->assertEquals('pending', $log->get('status')->value); } }