MDL-69068 behat: New step to support singular generators

This commit is contained in:
Andrew Nicols
2020-07-15 15:27:31 +08:00
parent 8e619076cb
commit 5018c4e4db
6 changed files with 91 additions and 9 deletions
+47 -6
View File
@@ -39,99 +39,119 @@ defined('MOODLE_INTERNAL') || die();
class behat_core_generator extends behat_generator_base {
protected function get_creatable_entities(): array {
return [
$entities = [
'users' => [
'singular' => 'user',
'datagenerator' => 'user',
'required' => ['username'],
],
'categories' => [
'singular' => 'category',
'datagenerator' => 'category',
'required' => ['idnumber'],
'switchids' => ['category' => 'parent'],
],
'courses' => [
'singular' => 'course',
'datagenerator' => 'course',
'required' => ['shortname'],
'switchids' => ['category' => 'category'],
],
'groups' => [
'singular' => 'group',
'datagenerator' => 'group',
'required' => ['idnumber', 'course'],
'switchids' => ['course' => 'courseid'],
],
'groupings' => [
'singular' => 'grouping',
'datagenerator' => 'grouping',
'required' => ['idnumber', 'course'],
'switchids' => ['course' => 'courseid'],
],
'course enrolments' => [
'singular' => 'course enrolment',
'datagenerator' => 'enrol_user',
'required' => ['user', 'course', 'role'],
'switchids' => ['user' => 'userid', 'course' => 'courseid', 'role' => 'roleid'],
],
'custom field categories' => [
'singular' => 'custom field category',
'datagenerator' => 'custom_field_category',
'required' => ['name', 'component', 'area', 'itemid'],
'switchids' => [],
],
'custom fields' => [
'singular' => 'custom field',
'datagenerator' => 'custom_field',
'required' => ['name', 'category', 'type', 'shortname'],
'switchids' => [],
],
'permission overrides' => [
'singular' => 'permission override',
'datagenerator' => 'permission_override',
'required' => ['capability', 'permission', 'role', 'contextlevel', 'reference'],
'switchids' => ['role' => 'roleid'],
],
'system role assigns' => [
'singular' => 'system role assignment',
'datagenerator' => 'system_role_assign',
'required' => ['user', 'role'],
'switchids' => ['user' => 'userid', 'role' => 'roleid'],
],
'role assigns' => [
'singular' => 'role assignment',
'datagenerator' => 'role_assign',
'required' => ['user', 'role', 'contextlevel', 'reference'],
'switchids' => ['user' => 'userid', 'role' => 'roleid'],
],
'activities' => [
'singular' => 'activity',
'datagenerator' => 'activity',
'required' => ['activity', 'idnumber', 'course'],
'switchids' => ['course' => 'course', 'gradecategory' => 'gradecat', 'grouping' => 'groupingid'],
],
'blocks' => [
'singular' => 'block',
'datagenerator' => 'block_instance',
'required' => ['blockname', 'contextlevel', 'reference'],
],
'group members' => [
'singular' => 'group member',
'datagenerator' => 'group_member',
'required' => ['user', 'group'],
'switchids' => ['user' => 'userid', 'group' => 'groupid'],
],
'grouping groups' => [
'singular' => 'grouping group',
'datagenerator' => 'grouping_group',
'required' => ['grouping', 'group'],
'switchids' => ['grouping' => 'groupingid', 'group' => 'groupid'],
],
'cohorts' => [
'singular' => 'cohort',
'datagenerator' => 'cohort',
'required' => ['idnumber'],
],
'cohort members' => [
'singular' => 'cohort member',
'datagenerator' => 'cohort_member',
'required' => ['user', 'cohort'],
'switchids' => ['user' => 'userid', 'cohort' => 'cohortid'],
],
'roles' => [
'singular' => 'role',
'datagenerator' => 'role',
'required' => ['shortname'],
],
'grade categories' => [
'singular' => 'grade category',
'datagenerator' => 'grade_category',
'required' => ['fullname', 'course'],
'switchids' => ['course' => 'courseid', 'gradecategory' => 'parent'],
],
'grade items' => [
'singular' => 'grade item',
'datagenerator' => 'grade_item',
'required' => ['course'],
'switchids' => [
@@ -142,30 +162,36 @@ class behat_core_generator extends behat_generator_base {
],
],
'grade outcomes' => [
'singular' => 'grade outcome',
'datagenerator' => 'grade_outcome',
'required' => ['shortname', 'scale'],
'switchids' => ['course' => 'courseid', 'gradecategory' => 'categoryid', 'scale' => 'scaleid'],
],
'scales' => [
'singular' => 'scale',
'datagenerator' => 'scale',
'required' => ['name', 'scale'],
'switchids' => ['course' => 'courseid'],
],
'question categories' => [
'singular' => 'question category',
'datagenerator' => 'question_category',
'required' => ['name', 'contextlevel', 'reference'],
'switchids' => ['questioncategory' => 'parent'],
],
'questions' => [
'singular' => 'question',
'datagenerator' => 'question',
'required' => ['qtype', 'questioncategory', 'name'],
'switchids' => ['questioncategory' => 'category', 'user' => 'createdby'],
],
'tags' => [
'singular' => 'tag',
'datagenerator' => 'tag',
'required' => ['name'],
],
'events' => [
'singular' => 'event',
'datagenerator' => 'event',
'required' => ['name', 'eventtype'],
'switchids' => [
@@ -175,68 +201,83 @@ class behat_core_generator extends behat_generator_base {
],
],
'message contacts' => [
'singular' => 'message contact',
'datagenerator' => 'message_contacts',
'required' => ['user', 'contact'],
'switchids' => ['user' => 'userid', 'contact' => 'contactid'],
],
'private messages' => [
'singular' => 'private message',
'datagenerator' => 'private_messages',
'required' => ['user', 'contact', 'message'],
'switchids' => ['user' => 'userid', 'contact' => 'contactid'],
],
'favourite conversations' => [
'singular' => 'favourite conversation',
'datagenerator' => 'favourite_conversations',
'required' => ['user', 'contact'],
'switchids' => ['user' => 'userid', 'contact' => 'contactid'],
],
'group messages' => [
'singular' => 'group message',
'datagenerator' => 'group_messages',
'required' => ['user', 'group', 'message'],
'switchids' => ['user' => 'userid', 'group' => 'groupid'],
],
'muted group conversations' => [
'singular' => 'muted group conversation',
'datagenerator' => 'mute_group_conversations',
'required' => ['user', 'group', 'course'],
'switchids' => ['user' => 'userid', 'group' => 'groupid', 'course' => 'courseid'],
],
'muted private conversations' => [
'singular' => 'muted private conversation',
'datagenerator' => 'mute_private_conversations',
'required' => ['user', 'contact'],
'switchids' => ['user' => 'userid', 'contact' => 'contactid'],
],
'language customisations' => [
'singular' => 'language customisation',
'datagenerator' => 'customlang',
'required' => ['component', 'stringid', 'value'],
],
'analytics model' => [
'analytics models' => [
'singular' => 'analytics model',
'datagenerator' => 'analytics_model',
'required' => ['target', 'indicators', 'timesplitting', 'enabled'],
],
'user preferences' => [
'singular' => 'user preference',
'datagenerator' => 'user_preferences',
'required' => array('user', 'preference', 'value'),
'switchids' => array('user' => 'userid')
'switchids' => array('user' => 'userid'),
],
'contentbank content' => [
'contentbank contents' => [
'singular' => 'contentbank content',
'datagenerator' => 'contentbank_content',
'required' => array('contextlevel', 'reference', 'contenttype', 'user', 'contentname'),
'switchids' => array('user' => 'userid')
],
'badge external backpack' => [
'badge external backpacks' => [
'singular' => 'badge external backpack',
'datagenerator' => 'badge_external_backpack',
'required' => ['backpackapiurl', 'backpackweburl', 'apiversion']
],
'setup backpack connected' => [
'setup backpacks connected' => [
'singular' => 'setup backpack connected',
'datagenerator' => 'setup_backpack_connected',
'required' => ['user', 'externalbackpack'],
'switchids' => ['user' => 'userid', 'externalbackpack' => 'externalbackpackid']
],
'last access times' => [
'singular' => 'last access time',
'datagenerator' => 'last_access_times',
'required' => ['user', 'course', 'lastaccess'],
'switchids' => ['user' => 'userid', 'course' => 'courseid'],
],
];
return $entities;
}
/**
+21 -2
View File
@@ -171,13 +171,23 @@ abstract class behat_generator_base {
*
* @param string $generatortype The name of the entity to create.
* @param TableNode $data from the step.
* @param bool $singular Whether there is only one record and it is pivotted
*/
public function generate_items(string $generatortype, TableNode $data) {
public function generate_items(string $generatortype, TableNode $data, bool $singular = false) {
// Now that we need them require the data generators.
require_once(__DIR__ . '/../../testing/generator/lib.php');
$elements = $this->get_creatable_entities();
foreach ($elements as $key => $configuration) {
if (array_key_exists('singular', $configuration)) {
$singularverb = $configuration['singular'];
unset($configuration['singular']);
unset($elements[$key]['singular']);
$elements[$singularverb] = $configuration;
}
}
if (!isset($elements[$generatortype])) {
throw new PendingException($this->name_for_errors($generatortype) .
' is not a known type of entity that can be generated.');
@@ -193,8 +203,17 @@ abstract class behat_generator_base {
$generatortype = $entityinfo['datagenerator'];
foreach ($data->getHash() as $elementdata) {
if ($singular) {
// There is only one record to generate, and the table has been pivotted.
// The rows each represent a single field.
$rows = [$data->getRowsHash()];
} else {
// There are multiple records to generate.
// The rows represent an item to create.
$rows = $data->getHash();
}
foreach ($rows as $elementdata) {
// Check if all the required fields are there.
foreach ($entityinfo['required'] as $requiredfield) {
if (!isset($elementdata[$requiredfield])) {
+19 -1
View File
@@ -75,7 +75,7 @@ class behat_data_generators extends behat_base {
];
/**
* Creates the specified element.
* Creates the specified elements.
*
* See the class comment for an overview.
*
@@ -92,6 +92,24 @@ class behat_data_generators extends behat_base {
$this->get_instance_for_component($component)->generate_items($entity, $data);
}
/**
* Creates the specified element.
*
* See the class comment for an overview.
*
* @Given the following :entitytype exists:
*
* @param string $entitytype The name of the type entity to add
* @param TableNode $data
*/
public function the_following_entity_exists($entitytype, TableNode $data) {
if (isset($this->movedentitytypes[$entitytype])) {
$entitytype = $this->movedentitytypes[$entitytype];
}
list($component, $entity) = $this->parse_entity_type($entitytype);
$this->get_instance_for_component($component)->generate_items($entity, $data, true);
}
/**
* Parse a full entity type like 'users' or 'mod_forum > subscription'.
*
@@ -41,6 +41,7 @@ class behat_quizaccess_seb_generator extends behat_generator_base {
protected function get_creatable_entities(): array {
return [
'seb templates' => [
'singular' => 'seb template',
'datagenerator' => 'template',
'required' => ['name'],
],
@@ -37,11 +37,13 @@ class behat_mod_quiz_generator extends behat_generator_base {
protected function get_creatable_entities(): array {
return [
'group overrides' => [
'singular' => 'group override',
'datagenerator' => 'override',
'required' => ['quiz', 'group'],
'switchids' => ['quiz' => 'quiz', 'group' => 'groupid'],
],
'user overrides' => [
'singular' => 'user override',
'datagenerator' => 'override',
'required' => ['quiz', 'user'],
'switchids' => ['quiz' => 'quiz', 'user' => 'userid'],
@@ -36,6 +36,7 @@ class behat_core_question_generator extends behat_generator_base {
// are generated by behat_core_generator.
return [
'Tags' => [
'singular' => 'Tag',
'datagenerator' => 'question_tag',
'required' => ['question', 'tag'],
'switchids' => ['question' => 'questionid'],