diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..29553ab --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,32 @@ +--- +name: Bug report +about: Create a report to help me improve Gapfill +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/workflows/moodle-ci.yml b/.github/workflows/moodle-ci.yml new file mode 100644 index 0000000..a85790b --- /dev/null +++ b/.github/workflows/moodle-ci.yml @@ -0,0 +1,114 @@ +name: Moodle plugin CI +on: [push, pull_request] + +jobs: + test: + runs-on: 'ubuntu-latest' + services: + postgres: + image: postgres:13 + env: + POSTGRES_USER: 'postgres' + POSTGRES_HOST_AUTH_METHOD: 'trust' + ports: + - 5432:5432 + options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 3 + mariadb: + image: mariadb:10 + env: + MYSQL_USER: 'root' + MYSQL_ALLOW_EMPTY_PASSWORD: "true" + MYSQL_CHARACTER_SET_SERVER: "utf8mb4" + MYSQL_COLLATION_SERVER: "utf8mb4_unicode_ci" + + ports: + - 3306:3306 + options: --health-cmd="mysqladmin ping" --health-interval 10s --health-timeout 5s --health-retries 3 + + strategy: + fail-fast: false + matrix: + include: + - php: '8.1' + moodle-branch: 'MOODLE_404_STABLE' + database: 'mariadb' + # - php: '8.1' + # moodle-branch: 'master' + # database: 'pgsql' + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + path: plugin + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + extensions: ${{ matrix.extensions }} + ini-values: max_input_vars=5000 + # none to use phpdbg fallback. Specify pcov (Moodle 3.10 and up) or xdebug to use them instead. + coverage: none + + - name: Deploy moodle-plugin-ci + run: | + composer create-project -n --no-dev --prefer-dist moodlehq/moodle-plugin-ci ci ^3 + # Add dirs to $PATH + echo $(cd ci/bin; pwd) >> $GITHUB_PATH + echo $(cd ci/vendor/bin; pwd) >> $GITHUB_PATH + # PHPUnit depends on en_AU.UTF-8 locale + sudo locale-gen en_AU.UTF-8 + + - name: Install Moodle + # Need explicit IP to stop mysql client fail on attempt to use unix socket. + run: moodle-plugin-ci install --plugin ./plugin --db-host=127.0.0.1 + env: + DB: ${{ matrix.database }} + MOODLE_BRANCH: ${{ matrix.moodle-branch }} + IGNORE_PATHS: 'templates/local/mobile' + + - name: PHP Lint + if: ${{ always() }} + run: moodle-plugin-ci phplint + + - name: PHP Copy/Paste Detector + continue-on-error: true # This step will show errors but will not fail + if: ${{ always() }} + run: moodle-plugin-ci phpcpd + + - name: PHP Mess Detector + continue-on-error: true # This step will show errors but will not fail + if: ${{ always() }} + run: moodle-plugin-ci phpmd + + - name: Moodle Code Checker + if: ${{ always() }} + run: moodle-plugin-ci codechecker --max-warnings 0 + + - name: Moodle PHPDoc Checker + if: ${{ always() }} + run: moodle-plugin-ci phpdoc + + - name: Validating + if: ${{ always() }} + run: moodle-plugin-ci validate + + - name: Check upgrade savepoints + if: ${{ always() }} + run: moodle-plugin-ci savepoints + + - name: Mustache Lint + if: ${{ always() }} + run: moodle-plugin-ci mustache + + - name: Grunt + if: ${{ matrix.moodle-branch == 'master' }} + run: moodle-plugin-ci grunt + + - name: PHPUnit tests + if: ${{ always() }} + run: moodle-plugin-ci phpunit + + - name: Behat features + if: ${{ always() }} + run: moodle-plugin-ci behat --profile chrome diff --git a/classes/helper.php b/classes/helper.php index 7d2ea8a..d7e9b63 100644 --- a/classes/helper.php +++ b/classes/helper.php @@ -40,7 +40,7 @@ public static function bulk_tag_questions($fromform) { $questions = $DB->get_records_sql($sql, $params); foreach ($questions as $question) { - if (!$fromform->replacetags) { + if (!$fromform->replacetags) { $existingtags = \core_tag_tag::get_item_tags('core_question', 'question', $question->id); foreach ($existingtags as $tag) { $tags[] = $tag->get_display_name(); @@ -50,7 +50,7 @@ public static function bulk_tag_questions($fromform) { } } - } + } diff --git a/classes/output/form/bulk_tags_form.php b/classes/output/form/bulk_tags_form.php index 466459e..7a67f35 100644 --- a/classes/output/form/bulk_tags_form.php +++ b/classes/output/form/bulk_tags_form.php @@ -38,7 +38,7 @@ class bulk_tags_form extends \moodleform { protected function definition() { $mform = $this->_form; - // Add hidden form fields + // Add hidden form fields. $mform->addElement('hidden', 'tagsquestionsselected'); $mform->setType('tagsquestionsselected', PARAM_TEXT); $mform->addElement('hidden', 'returnurl'); @@ -48,7 +48,6 @@ protected function definition() { $mform->addElement('hidden', 'courseid'); $mform->setType('courseid', PARAM_INT); - $mform->addElement( 'tags', 'formtags', @@ -56,7 +55,7 @@ protected function definition() { [ 'itemtype' => 'question', 'component' => 'core_question', - 'default' => 'bicycle' + 'default' => 'bicycle', ] ); $mform->addElement('advcheckbox', 'replacetags', get_string('replacetags', 'qbank_bulktags')); @@ -92,8 +91,7 @@ public function set_data($data) { */ public function validation($data, $files) { if (count($data['formtags']) < 1) { - // return ['formtags' => get_string('error:no_tags_selected', 'qbank_bulktags')]; - return ['formtags' => 'Nothing selected']; + return ['formtags' => get_string('error:no_tags_selected', 'qbank_bulktags')]; } else { return []; } diff --git a/classes/plugin_feature.php b/classes/plugin_feature.php index 2ae82ef..fd30073 100644 --- a/classes/plugin_feature.php +++ b/classes/plugin_feature.php @@ -16,7 +16,6 @@ namespace qbank_bulktags; use core_question\local\bank\plugin_features_base; -use core_question\local\bank\bulk_action_base; /** * Class columns is the entrypoint for the columns. diff --git a/tests/helper_test.php b/tests/helper_test.php new file mode 100644 index 0000000..03b430d --- /dev/null +++ b/tests/helper_test.php @@ -0,0 +1,79 @@ +. + +namespace qbank_bulktags\tests; + +defined('MOODLE_INTERNAL') || die(); + +use qbank_bulktags\helper; +use advanced_testcase; + +/** + * Test class for the helper class. + */ +class helper_test extends advanced_testcase { + /** + * Summary of question1 + * @var $question1 \stdClass + */ + public $question1; + + /** + * Summary of question2 + * @var $question2 \stdClass + */ + public $question2; + public function setUp(): void { + $category = $this->getDataGenerator()->create_category(); + $course = $this->getDataGenerator()->create_course(['category' => $category->id]); + $coursecontext = \context_course::instance($course->id); + $generator = $this->getDataGenerator()->get_plugin_generator('core_question'); + $qcat = $generator->create_question_category(['contextid' => $coursecontext->id]); + $this->question1 = $generator->create_question('multichoice', null, ['category' => $qcat->id]); + $this->question2 = $generator->create_question('multichoice', null, ['category' => $qcat->id]); + } + + public function test_process_question_ids(): void { + $this->resetAfterTest(); + $rawquestions = (object)[ + 'q' . $this->question1->id => "1", + 'q' . $this->question2->id => "1", + ]; + [$questionids, $questionlist] = helper::process_question_ids($rawquestions); + $this->assertTrue(count($questionids) == 2); + $this->assertTrue(count(explode(',', $questionlist)) == 2); + } + public function test_bulk_tag_questions(): void { + $this->resetAfterTest(); + $existingtags = \core_tag_tag::get_item_tags('core_question', 'question', $this->question1->id); + $this->assertEmpty($existingtags); + $existingtags = \core_tag_tag::get_item_tags('core_question', 'question', $this->question2->id); + $this->assertEmpty($existingtags); + + $fromform = (object) [ + 'tags' => ['tag1', 'tag2'], + 'tagsquestionsselected' => implode(",", [$this->question1->id, $this->question2->id]), + 'formtags' => ['foo', 'bar'], + 'replacetags' => 0, + ]; + helper::bulk_tag_questions($fromform); + $updatedtags = \core_tag_tag::get_item_tags('core_question', 'question', $this->question1->id); + $this->assertNotEmpty($updatedtags); + + $updatedtags = \core_tag_tag::get_item_tags('core_question', 'question', $this->question2->id); + $this->assertNotEmpty($updatedtags); + } +}