Merge branch 'MDL-61402' of https://github.com/mkassaei/moodle
authorJake Dallimore <jake@moodle.com>
Tue, 20 Feb 2018 02:36:41 +0000 (10:36 +0800)
committerAndrew Nicols <andrew@nicols.co.uk>
Thu, 22 Feb 2018 00:30:53 +0000 (08:30 +0800)
25 files changed:
admin/settings/development.php
admin/tool/cohortroles/classes/api.php
cohort/lib.php
cohort/tests/externallib_test.php
enrol/lti/classes/task/sync_grades.php
lang/en/admin.php
lang/en/role.php
lib/classes/scss.php
lib/db/access.php
lib/outputlib.php
lib/questionlib.php
lib/tests/scss_test.php
mod/choice/lib.php
mod/choice/report.php
mod/choice/tests/behat/modify_choice.feature
question/amd/build/edit_tags.min.js
question/amd/src/edit_tags.js
question/behaviour/rendererbase.php
question/classes/bank/tags_action_column.php
question/classes/external.php
question/lib.php
question/type/edit_question_form.php
theme/boost/scss/moodle/forms.scss
theme/boost/tests/scss_test.php [new file with mode: 0644]
version.php

index 80a8047..e31a454 100644 (file)
@@ -14,6 +14,8 @@ if ($hassiteconfig) { // speedup for non-admins, add all caps used on this page
 
     $temp->add(new admin_setting_configcheckbox('dndallowtextandlinks', new lang_string('dndallowtextandlinks', 'admin'), new lang_string('configdndallowtextandlinks', 'admin'), 0));
 
+    $temp->add(new admin_setting_configexecutable('pathtosassc', new lang_string('pathtosassc', 'admin'), new lang_string('pathtosassc_help', 'admin'), null));
+
     $ADMIN->add('experimental', $temp);
 
     // "debugging" settingpage
index 8357e70..b3f0e54 100644 (file)
@@ -167,7 +167,7 @@ class api {
                 $params['roleid'] = $roleid;
                 $params['userid'] = $userid;
 
-                $sql = 'SELECT u.id AS userid, ra.id, ctx.id AS contextid
+                $sql = 'SELECT DISTINCT u.id AS userid, ra.id, ctx.id AS contextid
                           FROM {user} u
                           JOIN {cohort_members} cm ON u.id = cm.userid
                           JOIN {context} ctx ON u.id = ctx.instanceid AND ctx.contextlevel = :usercontext
index 5f257cd..f3c3a16 100644 (file)
@@ -500,6 +500,9 @@ function cohort_get_invisible_contexts() {
     $excludedcontexts = array();
     foreach ($records as $ctx) {
         context_helper::preload_from_record($ctx);
+        if (context::instance_by_id($ctx->id) == context_system::instance()) {
+            continue; // System context cohorts should be available and permissions already checked.
+        }
         if (!has_any_capability(array('moodle/cohort:manage', 'moodle/cohort:view'), context::instance_by_id($ctx->id))) {
             $excludedcontexts[] = $ctx->id;
         }
index 690d31a..85b2f02 100644 (file)
@@ -465,10 +465,13 @@ class core_cohort_externallib_testcase extends externallib_advanced_testcase {
         $user = $this->getDataGenerator()->create_user();
         $catuser = $this->getDataGenerator()->create_user();
         $catcreator = $this->getDataGenerator()->create_user();
+        $courseuser = $this->getDataGenerator()->create_user();
         $category = $this->getDataGenerator()->create_category();
         $othercategory = $this->getDataGenerator()->create_category();
+        $course = $this->getDataGenerator()->create_course();
         $syscontext = context_system::instance();
         $catcontext = context_coursecat::instance($category->id);
+        $coursecontext = context_course::instance($course->id);
 
         // Fetching default authenticated user role.
         $userroles = get_archetype_roles('user');
@@ -481,8 +484,10 @@ class core_cohort_externallib_testcase extends externallib_advanced_testcase {
         // Creating specific roles.
         $creatorrole = create_role('Creator role', 'creatorrole', 'creator role description');
         $userrole = create_role('User role', 'userrole', 'user role description');
+        $courserole = create_role('Course user role', 'courserole', 'course user role description');
 
         assign_capability('moodle/cohort:manage', CAP_ALLOW, $creatorrole, $syscontext->id);
+        assign_capability('moodle/cohort:view', CAP_ALLOW, $courserole, $syscontext->id);
 
         // Check for parameter $includes = 'parents'.
         role_assign($creatorrole, $creator->id, $syscontext->id);
@@ -490,9 +495,13 @@ class core_cohort_externallib_testcase extends externallib_advanced_testcase {
         role_assign($userrole, $user->id, $syscontext->id);
         role_assign($userrole, $catuser->id, $catcontext->id);
 
+        // Enrol user in the course.
+        $this->getDataGenerator()->enrol_user($courseuser->id, $course->id, 'courserole');
+
         $syscontext = array('contextid' => context_system::instance()->id);
         $catcontext = array('contextid' => context_coursecat::instance($category->id)->id);
         $othercatcontext = array('contextid' => context_coursecat::instance($othercategory->id)->id);
+        $coursecontext = array('contextid' => context_course::instance($course->id)->id);
 
         $cohort1 = $this->getDataGenerator()->create_cohort(array_merge($syscontext, array('name' => 'Cohortsearch 1')));
         $cohort2 = $this->getDataGenerator()->create_cohort(array_merge($catcontext, array('name' => 'Cohortsearch 2')));
@@ -543,6 +552,12 @@ class core_cohort_externallib_testcase extends externallib_advanced_testcase {
         $result = core_cohort_external::search_cohorts("Cohortsearch", $syscontext, 'all');
         $this->assertEquals(3, count($result['cohorts']));
 
+        // A user in the course context with the system cohort:view capability. Check that all the system cohorts are returned.
+        $this->setUser($courseuser);
+        $result = core_cohort_external::search_cohorts("Cohortsearch", $coursecontext, 'all');
+        $this->assertEquals(1, count($result['cohorts']));
+        $this->assertEquals('Cohortsearch 1', $result['cohorts'][$cohort1->id]->name);
+
         // Detect invalid parameter $includes.
         $this->setUser($creator);
         try {
index 944de37..f20802e 100644 (file)
@@ -154,8 +154,8 @@ class sync_grades extends \core\task\scheduled_task {
                             continue;
                         }
 
-                        // This can happen if the sync process has an unexpected error.
-                        if ($grade == $ltiuser->lastgrade) {
+                        // Check to see if the grade has changed.
+                        if (!grade_floats_different($grade, $ltiuser->lastgrade)) {
                             mtrace("Not sent - The grade $mtracecontent was not sent as the grades are the same.");
                             continue;
                         }
@@ -174,7 +174,7 @@ class sync_grades extends \core\task\scheduled_task {
                         }
 
                         if (strpos(strtolower($response), 'success') !== false) {
-                            $DB->set_field('enrol_lti_users', 'lastgrade', intval($grade), array('id' => $ltiuser->id));
+                            $DB->set_field('enrol_lti_users', 'lastgrade', grade_floatval($grade), array('id' => $ltiuser->id));
                             mtrace("Success - The grade '$floatgrade' $mtracecontent was sent.");
                             $sendcount = $sendcount + 1;
                         } else {
index 4a49dd7..eb6030d 100644 (file)
@@ -837,6 +837,8 @@ $string['pathtopsqldesc'] = 'This is only necessary to enter if you have more th
 $string['pathtopsqlinvalid'] = 'Invalid path to psql - either wrong path or not executable';
 $string['pathtopython'] = 'Path to Python';
 $string['pathtopythondesc'] = 'Path to your executable Python binary (both Python 2 and Python 3 are acceptable).';
+$string['pathtosassc'] = 'Path to SassC';
+$string['pathtosassc_help'] = 'Specifying the location of the SassC binary will switch the SASS compiler from Moodle\'s PHP implementation to SassC. See https://github.com/sass/sassc for more information.';
 $string['pcreunicodewarning'] = 'It is strongly recommended to use PCRE PHP extension that is compatible with Unicode characters.';
 $string['perfdebug'] = 'Performance info';
 $string['performance'] = 'Performance';
index cfc5699..957a504 100644 (file)
@@ -343,6 +343,8 @@ $string['question:useall'] = 'Use all questions';
 $string['question:usemine'] = 'Use your own questions';
 $string['question:viewall'] = 'View all questions';
 $string['question:viewmine'] = 'View your own questions';
+$string['question:tagall'] = 'Tag all questions';
+$string['question:tagmine'] = 'Tag your own questions';
 $string['rating:rate'] = 'Add ratings to items';
 $string['rating:view'] = 'View the total rating you received';
 $string['rating:viewany'] = 'View total ratings that anyone received';
index a8aa4a9..0b13e49 100644 (file)
@@ -98,6 +98,54 @@ class core_scss extends \Leafo\ScssPhp\Compiler {
         return $this->compile($content);
     }
 
+    /**
+     * Compile scss.
+     *
+     * Overrides ScssPHP's implementation, using the SassC compiler if it is available.
+     *
+     * @param string $code SCSS to compile.
+     * @param string $path Path to SCSS to compile.
+     *
+     * @return string The compiled CSS.
+     */
+    public function compile($code, $path = null) {
+        global $CFG;
+
+        $pathtosassc = trim($CFG->pathtosassc);
+
+        if (!empty($pathtosassc) && is_executable($pathtosassc) && !is_dir($pathtosassc)) {
+            $process = proc_open(
+                $pathtosassc . ' -I' . implode(':', $this->importPaths) . ' -s',
+                [
+                    ['pipe', 'r'], // Set the process stdin pipe to read mode.
+                    ['pipe', 'w'], // Set the process stdout pipe to write mode.
+                    ['pipe', 'w'] // Set the process stderr pipe to write mode.
+                ],
+                $pipes // Pipes become available in $pipes (pass by reference).
+            );
+            if (is_resource($process)) {
+                fwrite($pipes[0], $code); // Write the raw scss to the sassc process stdin.
+                fclose($pipes[0]);
+
+                $stdout = stream_get_contents($pipes[1]);
+                $stderr = stream_get_contents($pipes[2]);
+
+                fclose($pipes[1]);
+                fclose($pipes[2]);
+
+                // The proc_close function returns the process exit status. Anything other than 0 is bad.
+                if (proc_close($process) !== 0) {
+                    throw new coding_exception($stderr);
+                }
+
+                // Compiled CSS code will be available from stdout.
+                return $stdout;
+            }
+        }
+
+        return parent::compile($code, $path);
+    }
+
     /**
      * Compile child; returns a value to halt execution
      *
index 2efdccf..1652534 100644 (file)
@@ -1483,6 +1483,28 @@ $capabilities = array(
         )
     ),
 
+    // Controls whether the user can tag his own questions.
+    'moodle/question:tagmine' => array(
+        'captype' => 'write',
+        'contextlevel' => CONTEXT_COURSE,
+        'archetypes' => array(
+            'editingteacher' => CAP_ALLOW,
+            'manager' => CAP_ALLOW
+        ),
+        'clonepermissionsfrom' => 'moodle/question:editmine'
+    ),
+
+    // Controls whether the user can tag all questions.
+    'moodle/question:tagall' => array(
+        'captype' => 'write',
+        'contextlevel' => CONTEXT_COURSE,
+        'archetypes' => array(
+            'editingteacher' => CAP_ALLOW,
+            'manager' => CAP_ALLOW
+        ),
+        'clonepermissionsfrom' => 'moodle/question:editall'
+    ),
+
     'moodle/site:doclinks' => array(
         'captype' => 'read',
         'contextlevel' => CONTEXT_SYSTEM,
index e5a8514..00e9fff 100644 (file)
@@ -1475,7 +1475,7 @@ class theme_config {
             // Compile!
             $compiled = $compiler->to_css();
 
-        } catch (\Leafo\ScssPhp\Exception $e) {
+        } catch (\Exception $e) {
             $compiled = false;
             debugging('Error while compiling SCSS: ' . $e->getMessage(), DEBUG_DEVELOPER);
         }
index 904975f..98ef3c4 100644 (file)
@@ -1368,7 +1368,7 @@ function question_has_capability_on($question, $cap, $cachecat = -1) {
 
     // these are capabilities on existing questions capabilties are
     //set per category. Each of these has a mine and all version. Append 'mine' and 'all'
-    $question_questioncaps = array('edit', 'view', 'use', 'move');
+    $question_questioncaps = array('edit', 'view', 'use', 'move', 'tag');
     static $questions = array();
     static $categories = array();
     static $cachedcat = array();
index 80f3cb5..55e7cd9 100644 (file)
@@ -70,6 +70,61 @@ class core_scss_testcase extends advanced_testcase {
         ];
     }
 
+    /**
+     * Test cases for SassC compilation.
+     */
+    public function scss_compilation_provider() {
+        return [
+            'simple' => [
+                'scss' => '$font-stack: Helvetica, sans-serif;
+                           $primary-color: #333;
+
+                           body {
+                             font: 100% $font-stack;
+                             color: $primary-color;
+                           }',
+                'expected' => <<<CSS
+body {
+  font: 100% Helvetica, sans-serif;
+  color: #333; }
+
+CSS
+            ],
+            'nested' => [
+                'scss' => 'nav {
+                             ul {
+                               margin: 0;
+                               padding: 0;
+                               list-style: none;
+                             }
+
+                           li { display: inline-block; }
+
+                           a {
+                             display: block;
+                             padding: 6px 12px;
+                             text-decoration: none;
+                           }
+                         }',
+                'expected' => <<<CSS
+nav ul {
+  margin: 0;
+  padding: 0;
+  list-style: none; }
+
+nav li {
+  display: inline-block; }
+
+nav a {
+  display: block;
+  padding: 6px 12px;
+  text-decoration: none; }
+
+CSS
+            ]
+        ];
+    }
+
     /**
      * @dataProvider is_valid_file_provider
      */
@@ -78,4 +133,22 @@ class core_scss_testcase extends advanced_testcase {
         $pathvalid = phpunit_util::call_internal_method($scss, 'is_valid_file', [$path], \core_scss::class);
         $this->assertSame($valid, $pathvalid);
     }
-}
\ No newline at end of file
+
+    /**
+     * Test that we can use the SassC compiler if it's provided.
+     *
+     * @dataProvider scss_compilation_provider
+     * @param string $scss The raw scss to compile.
+     * @param string $expectedcss The expected CSS output.
+     */
+    public function test_scss_compilation_with_sassc($scss, $expectedcss) {
+        if (!defined('PHPUNIT_PATH_TO_SASSC')) {
+            $this->markTestSkipped('Path to SassC not provided');
+        }
+
+        $this->resetAfterTest();
+        set_config('pathtosassc', PHPUNIT_PATH_TO_SASSC);
+        $compiler = new core_scss();
+        $this->assertSame($compiler->compile($scss), $expectedcss);
+    }
+}
index 4e6eef0..bf548a0 100644 (file)
@@ -791,8 +791,9 @@ function choice_get_response_data($choice, $cm, $groupmode, $onlyactive) {
 
 /// First get all the users who have access here
 /// To start with we assume they are all "unanswered" then move them later
+    $extrafields = get_extra_user_fields($context);
     $allresponses[0] = get_enrolled_users($context, 'mod/choice:choose', $currentgroup,
-            user_picture::fields('u', array('idnumber')), null, 0, 0, $onlyactive);
+            user_picture::fields('u', $extrafields), null, 0, 0, $onlyactive);
 
 /// Get all the recorded responses for this choice
     $rawresponses = $DB->get_records('choice_answers', array('choiceid' => $choice->id));
index 8c0293b..9e187d5 100644 (file)
         }
         exit;
     }
-    // Always show those who haven't answered the question.
-    $choice->showunanswered = 1;
     $results = prepare_choice_show_results($choice, $course, $cm, $users);
     $renderer = $PAGE->get_renderer('mod_choice');
     echo $renderer->display_result($results, true);
index 6730174..da8754c 100644 (file)
@@ -26,7 +26,15 @@ Feature: Teacher can modify choices of the students
 
   @javascript
   Scenario: Delete students choice response as a teacher
-    When I log in as "student1"
+    When I log in as "teacher1"
+    And I am on "Course 1" course homepage
+    And I follow "Choice name"
+    And I navigate to "Edit settings" in current page administration
+    And I expand all fieldsets
+    And I set the field "Show column for unanswered" to "Yes"
+    And I press "Save and return to course"
+    And I log out
+    And I log in as "student1"
     And I am on "Course 1" course homepage
     And I choose "Option 1" from "Choice name" choice activity
     Then I should see "Your selection: Option 1"
@@ -44,7 +52,15 @@ Feature: Teacher can modify choices of the students
 
   @javascript
   Scenario: Teacher set answers of students who did not respond or change existing answers
-    When I log in as "student1"
+    When I log in as "teacher1"
+    And I am on "Course 1" course homepage
+    And I follow "Choice name"
+    And I navigate to "Edit settings" in current page administration
+    And I expand all fieldsets
+    And I set the field "Show column for unanswered" to "Yes"
+    And I press "Save and return to course"
+    And I log out
+    And I log in as "student1"
     And I am on "Course 1" course homepage
     And I choose "Option 1" from "Choice name" choice activity
     Then I should see "Your selection: Option 1"
index cf0aed5..cb3dc19 100644 (file)
Binary files a/question/amd/build/edit_tags.min.js and b/question/amd/build/edit_tags.min.js differ
index 83d5f9a..6bfabe0 100644 (file)
@@ -149,7 +149,7 @@ define([
             var currentTarget = $(e.currentTarget);
 
             var questionId = currentTarget.data('questionid'),
-                canEdit = !!currentTarget.data('canedit'),
+                canTag = !!currentTarget.data('cantag'),
                 contextId = currentTarget.data('contextid');
 
             // This code gets called each time the user clicks the tag link
@@ -180,7 +180,7 @@ define([
 
                 // Show or hide the save button depending on whether the user
                 // has the capability to edit the tags.
-                if (canEdit) {
+                if (canTag) {
                     modal.getRoot().find(QuestionSelectors.actions.save).show();
                 } else {
                     modal.getRoot().find(QuestionSelectors.actions.save).hide();
index c791866..416826a 100644 (file)
@@ -234,7 +234,7 @@ abstract class qbehaviour_renderer extends plugin_renderer_base {
             'id' => $qa->get_behaviour_field_name('submit'),
             'name' => $qa->get_behaviour_field_name('submit'),
             'value' => get_string('check', 'question'),
-            'class' => 'submit btn',
+            'class' => 'submit btn btn-default',
         );
         if ($options->readonly) {
             $attributes['disabled'] = 'disabled';
index 5f49808..7ff372b 100644 (file)
@@ -55,11 +55,11 @@ class tags_action_column extends action_column_base {
         if (\core_tag_tag::is_enabled('core_question', 'question') &&
                 question_has_capability_on($question, 'view')) {
 
-            $canedit = question_has_capability_on($question, 'edit');
+            $cantag = question_has_capability_on($question, 'tag');
             $category = $DB->get_record('question_categories', ['id' => $question->category], 'contextid');
             $url = $this->qbank->edit_question_url($question->id);
 
-            $this->print_tag_icon($question->id, $url, $canedit, $category->contextid);
+            $this->print_tag_icon($question->id, $url, $cantag, $category->contextid);
         }
     }
 
@@ -68,15 +68,15 @@ class tags_action_column extends action_column_base {
      *
      * @param int $id The question ID.
      * @param string $url Editing question url.
-     * @param bool $canedit Whether the user can edit questions or not.
+     * @param bool $cantag Whether the user can tag questions or not.
      * @param int $contextid Question category context ID.
      */
-    protected function print_tag_icon($id, $url, $canedit, $contextid) {
+    protected function print_tag_icon($id, $url, $cantag, $contextid) {
         global $OUTPUT;
 
         $params = [
             'data-action' => 'edittags',
-            'data-canedit' => $canedit,
+            'data-cantag' => $cantag,
             'data-contextid' => $contextid,
             'data-questionid' => $id
         ];
index 6210ff7..ecc4876 100644 (file)
@@ -151,15 +151,15 @@ class core_question_external extends external_api {
             $question = $DB->get_record('question', array('id' => $questionid));
 
             require_once($CFG->libdir . '/questionlib.php');
-            $canedit = question_has_capability_on($question, 'edit');
+            $cantag = question_has_capability_on($question, 'tag');
 
             require_once($CFG->dirroot . '/question/type/tags_form.php');
-            $mform = new \core_question\form\tags(null, null, 'post', '', null, $canedit, $data);
+            $mform = new \core_question\form\tags(null, null, 'post', '', null, $cantag, $data);
 
             if ($validateddata = $mform->get_data()) {
                 // Due to a mform bug, if there's no tags set on the tag element, it submits the name as the value.
                 // The only way to discover is checking if the tag element is an array.
-                if ($canedit) {
+                if ($cantag) {
                     if (is_array($validateddata->tags)) {
                         $categorycontext = context::instance_by_id($validateddata->contextid);
 
index 5c04b33..842e050 100644 (file)
@@ -58,8 +58,8 @@ function core_question_output_fragment_tags_form($args) {
             $toform->tags = core_tag_tag::get_item_tags_array('core_question', 'question', $question->id);
         }
 
-        $canedit = question_has_capability_on($question, 'edit');
-        $mform = new \core_question\form\tags(null, null, 'post', '', null, $canedit, $toform);
+        $cantag = question_has_capability_on($question, 'tag');
+        $mform = new \core_question\form\tags(null, null, 'post', '', null, $cantag, $toform);
         $mform->set_data($toform);
 
         return $mform->render();
index 0ac8c14..bdc48a9 100644 (file)
@@ -201,7 +201,8 @@ abstract class question_edit_form extends question_wizard_form {
         // Any questiontype specific fields.
         $this->definition_inner($mform);
 
-        if (core_tag_tag::is_enabled('core_question', 'question')) {
+        if (core_tag_tag::is_enabled('core_question', 'question')
+                && question_has_capability_on($this->question, 'tag')) {
             $mform->addElement('header', 'tagsheader', get_string('tags'));
         }
         $mform->addElement('tags', 'tags', get_string('tags'),
index 7d1c68f..2084c78 100644 (file)
@@ -153,12 +153,12 @@ div.backup-section + form,
 // I think this could be avoided (or at least tidied up) ifr
 // we used HTML5 input types like url, phone, email, number etc.
 /* rtl:ignore */
-.mform .fitem .felement input[name=email],
-.mform .fitem .felement input[name=email2],
-.mform .fitem .felement input[name=url],
-.mform .fitem .felement input[name=idnumber],
-.mform .fitem .felement input[name=phone1],
-.mform .fitem .felement input[name=phone2] {
+.mform .fitem .felement input[name="email"],
+.mform .fitem .felement input[name="email2"],
+.mform .fitem .felement input[name="url"],
+.mform .fitem .felement input[name="idnumber"],
+.mform .fitem .felement input[name="phone1"],
+.mform .fitem .felement input[name="phone2"] {
     text-align: left;
     direction: ltr;
 }
@@ -326,7 +326,7 @@ select[size],
 select[multiple] {
     overflow: auto;
 }
-select[size=1] {
+select[size="1"] {
     overflow: visible;
 }
 
diff --git a/theme/boost/tests/scss_test.php b/theme/boost/tests/scss_test.php
new file mode 100644 (file)
index 0000000..5b1fc8a
--- /dev/null
@@ -0,0 +1,50 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * This file contains the unittests for boost's scss compilation.
+ *
+ * @package   theme_boost
+ * @copyright 2018 Cameron Ball <cameron@cameron1729.xyz>
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Unit tests for scss compilation.
+ *
+ * @package   theme_boost
+ * @copyright 2016 onwards Ankit Agarwal
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class theme_boost_scss_testcase extends advanced_testcase {
+    /**
+     * Test that boost can be compiled using SassC (the defacto implemention).
+     */
+    public function test_scss_compilation_with_sassc() {
+        if (!defined('PHPUNIT_PATH_TO_SASSC')) {
+            $this->markTestSkipped('Path to SassC not provided');
+        }
+
+        $this->resetAfterTest();
+        set_config('pathtosassc', PHPUNIT_PATH_TO_SASSC);
+
+        $this->assertNotEmpty(
+            theme_config::load('boost')->get_css_content_debug('scss', null, null)
+        );
+    }
+}
index 2d56c34..a68eb10 100644 (file)
@@ -29,7 +29,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$version  = 2018021600.00;              // YYYYMMDD      = weekly release date of this DEV branch.
+$version  = 2018021600.01;              // YYYYMMDD      = weekly release date of this DEV branch.
                                         //         RR    = release increments - 00 in DEV branches.
                                         //           .XX = incremental changes.