/** * Tests that a list can be chosen with a property path selector. */ public function testPropertyPathList() { $rule = $this->rulesExpressionManager->createRule(); $rule->addAction('rules_variable_add', ContextConfig::create()->setValue('type', 'string')->setValue('value', '')->provideAs('variable_added', 'result')); $loop = $this->rulesExpressionManager->createInstance('rules_loop', ['list' => 'node.field_text']); $loop->addAction('rules_data_set', ContextConfig::create()->map('data', 'result')->setValue('value', '{{result}} {{list_item}}')->process('value', 'rules_tokens')); $rule->addExpressionObject($loop); // Create a fake field for the fake node for testing. $list_definition = $this->typedDataManager->createListDataDefinition('string'); $field_text = new FieldItemList($list_definition); $field_text->setValue(['Hello', 'world', 'this', 'is', 'the', 'loop']); $node = $this->prophesizeEntity(NodeInterface::class); $node->get('field_text')->willReturn($field_text); // We cannot use EntityDataDefinitionInterface here because the context // system in core violates the interface and relies on the actuoal class. // @see https://www.drupal.org/node/2660216 $node_definition = $this->prophesize(EntityDataDefinition::class); $node_definition->getPropertyDefinition("field_text")->willReturn($list_definition); $context_definition = $this->getContextDefinitionFor('entity:node', $node_definition); $component = RulesComponent::create($rule)->addContextDefinition('node', $context_definition)->provideContext('result')->setContextValue('node', $node->reveal()); $violations = $component->checkIntegrity(); $this->assertEquals(0, iterator_count($violations)); $result = $component->execute(); $this->assertEquals(' Hello world this is the loop', $result['result']); }
/** * @covers ::equals */ public function testEqualsEmptyItems() { /** @var \Drupal\Core\Field\FieldItemBase $fv */ $first_field_item = $this->getMockForAbstractClass('Drupal\\Core\\Field\\FieldItemBase', [], '', FALSE); $first_field_item->setValue(['0' => 1, '1' => 2]); $second_field_item = $this->getMockForAbstractClass('Drupal\\Core\\Field\\FieldItemBase', [], '', FALSE); $second_field_item->setValue(['1' => 2, '0' => 1]); $empty_field_item = $this->getMockForAbstractClass('Drupal\\Core\\Field\\FieldItemBase', [], '', FALSE); // Mock the field type manager and place it in the container. $field_type_manager = $this->getMock('Drupal\\Core\\Field\\FieldTypePluginManagerInterface'); $container = new ContainerBuilder(); $container->set('plugin.manager.field.field_type', $field_type_manager); \Drupal::setContainer($container); $field_storage_definition = $this->getMock('Drupal\\Core\\Field\\FieldStorageDefinitionInterface'); $field_storage_definition->expects($this->any())->method('getColumns')->willReturn([0 => '0', 1 => '1']); $field_definition = $this->getMock('Drupal\\Core\\Field\\FieldDefinitionInterface'); $field_definition->expects($this->any())->method('getFieldStorageDefinition')->willReturn($field_storage_definition); $field_list_a = new FieldItemList($field_definition); $field_list_b = new FieldItemList($field_definition); // Set up the mocking necessary for creating field items. $field_type_manager->expects($this->any())->method('createFieldItem')->willReturnOnConsecutiveCalls($first_field_item, $second_field_item, $empty_field_item, $empty_field_item); // Set the field item values. $field_list_a->setValue($first_field_item); $field_list_b->setValue($second_field_item); $field_list_a->appendItem($empty_field_item); // Field list A has an empty item. $this->assertEquals(FALSE, $field_list_a->equals($field_list_b)); // Field lists A and B have empty items. $field_list_b->appendItem($empty_field_item); $this->assertEquals(TRUE, $field_list_a->equals($field_list_b)); // Field list B has an empty item. $field_list_a->filterEmptyItems(); $this->assertEquals(FALSE, $field_list_a->equals($field_list_b)); // Neither field lists A and B have empty items. $field_list_b->filterEmptyItems(); $this->assertEquals(TRUE, $field_list_a->equals($field_list_b)); }