From b08d4ea2edff719d2f900f0c1fa8595bcdc2e5cf Mon Sep 17 00:00:00 2001 From: Noel De Martin Date: Thu, 12 May 2022 15:42:10 +0200 Subject: [PATCH] MDL-74220 data: Implement behat generators --- mod/data/tests/behat/view_entries.feature | 39 +++-- .../generator/behat_mod_data_generator.php | 136 ++++++++++++++++++ 2 files changed, 153 insertions(+), 22 deletions(-) create mode 100644 mod/data/tests/generator/behat_mod_data_generator.php diff --git a/mod/data/tests/behat/view_entries.feature b/mod/data/tests/behat/view_entries.feature index 95b4a939642..852b3ce7035 100644 --- a/mod/data/tests/behat/view_entries.feature +++ b/mod/data/tests/behat/view_entries.feature @@ -24,32 +24,27 @@ Feature: Users can view and search database entries And the following "activities" exist: | activity | name | intro | course | idnumber | | data | Test database name | Database intro | C1 | data1 | - And I log in as "teacher1" - And I am on "Course 1" course homepage - And I add a "Text input" field to "Test database name" database and I fill the form with: - | Field name | Test field name | - | Field description | Test field description | - And I add a "Text input" field to "Test database name" database and I fill the form with: - | Field name | Test field 2 name | - | Field description | Test field 2 description | - # To generate the default templates. - And I follow "Templates" - And I log out + And the following "mod_data > fields" exist: + | database | type | name | description | + | data1 | text | Test field name | Test field description | + | data1 | text | Test field 2 name | Test field 2 description | + And the following "mod_data > templates" exist: + | database | name | + | data1 | singletemplate | + | data1 | listtemplate | + | data1 | addtemplate | + | data1 | asearchtemplate | + | data1 | rsstemplate | Scenario: Students can add view, list and search entries - Given I log in as "student1" + Given the following "mod_data > entries" exist: + | database | Test field name | Test field 2 name | + | data1 | Student entry 1 | | + | data1 | Student entry 2 | | + | data1 | Student entry 3 | | + When I log in as "student1" And I am on "Course 1" course homepage And I follow "Test database name" - And I add an entry to "Test database name" database with: - | Test field name | Student entry 1 | - And I press "Save and add another" - And I add an entry to "Test database name" database with: - | Test field name | Student entry 2 | - And I press "Save and add another" - And I add an entry to "Test database name" database with: - | Test field name | Student entry 3 | - And I press "Save and view" - And I follow "Test database name" Then I should see "Student entry 1" And I should see "Student entry 2" And I should see "Student entry 3" diff --git a/mod/data/tests/generator/behat_mod_data_generator.php b/mod/data/tests/generator/behat_mod_data_generator.php new file mode 100644 index 00000000000..1ae6097238d --- /dev/null +++ b/mod/data/tests/generator/behat_mod_data_generator.php @@ -0,0 +1,136 @@ +. + +/** + * Behat data generator for mod_data. + * + * @package mod_data + * @category test + * @copyright 2022 Noel De Martin + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class behat_mod_data_generator extends behat_generator_base { + + /** + * Get a list of the entities that Behat can create using the generator step. + * + * @return array + */ + protected function get_creatable_entities(): array { + return [ + 'entries' => [ + 'singular' => 'entry', + 'datagenerator' => 'entry', + 'required' => ['database'], + 'switchids' => ['database' => 'databaseid'], + ], + 'fields' => [ + 'singular' => 'field', + 'datagenerator' => 'field', + 'required' => ['database', 'type', 'name'], + 'switchids' => ['database' => 'databaseid'], + ], + 'templates' => [ + 'singular' => 'template', + 'datagenerator' => 'template', + 'required' => ['database', 'name'], + 'switchids' => ['database' => 'databaseid'], + ], + ]; + } + + /** + * Get the database id using an activity idnumber. + * + * @param string $idnumber + * @return int The database id + */ + protected function get_database_id(string $idnumber): int { + $cm = $this->get_cm_by_activity_name('data', $idnumber); + + return $cm->instance; + } + + /** + * Add an entry. + * + * @param array $data Entry data. + */ + public function process_entry(array $data): void { + global $DB; + + $database = $DB->get_record('data', ['id' => $data['databaseid']], '*', MUST_EXIST); + + unset($data['databaseid']); + + $data = array_reduce(array_keys($data), function ($fields, $fieldname) use ($data, $database) { + global $DB; + + $field = $DB->get_record('data_fields', ['name' => $fieldname, 'dataid' => $database->id], 'id', MUST_EXIST); + + $fields[$field->id] = $data[$fieldname]; + + return $fields; + }, []); + + $this->get_data_generator()->create_entry($database, $data); + } + + /** + * Add a field. + * + * @param array $data Field data. + */ + public function process_field(array $data): void { + global $DB; + + $database = $DB->get_record('data', ['id' => $data['databaseid']], '*', MUST_EXIST); + + unset($data['databaseid']); + + $this->get_data_generator()->create_field((object) $data, $database); + } + + /** + * Add a template. + * + * @param array $data Template data. + */ + public function process_template(array $data): void { + global $DB; + + $database = $DB->get_record('data', ['id' => $data['databaseid']], '*', MUST_EXIST); + + if (empty($data['content'])) { + data_generate_default_template($database, $data['name']); + } else { + $newdata = new stdClass(); + $newdata->id = $database->id; + $newdata->{$data['name']} = $data['content']; + $DB->update_record('data', $newdata); + } + } + + /** + * Get the module data generator. + * + * @return mod_data_generator Database data generator. + */ + protected function get_data_generator(): mod_data_generator { + return $this->componentdatagenerator; + } + +}