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/tests/helper_test.php b/tests/helper_test.php new file mode 100644 index 0000000..f7f0418 --- /dev/null +++ b/tests/helper_test.php @@ -0,0 +1,81 @@ +. + +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); + } +}