diff --git a/lib/tests/behat/behat_forms.php b/lib/tests/behat/behat_forms.php index 2532f943175..25a1071f6a2 100644 --- a/lib/tests/behat/behat_forms.php +++ b/lib/tests/behat/behat_forms.php @@ -56,6 +56,26 @@ class behat_forms extends behat_base { $this->execute('behat_general::i_click_on', [$button, 'button']); } + /** + * Ensure a button exists. + * @Then the button :button exists + * @param string $button + */ + public function button_exists(string $button) { + $buttonnode = $this->find_button($button); + $this->ensure_node_is_visible($buttonnode); + } + + /** + * Ensure that a button does not exist. + * @Then the button :button does not exist + * @param string $button + */ + public function button_does_not_exist(string $button) { + $general = behat_context_helper::get('behat_general'); + $general->should_not_exist($button, 'button'); + } + /** * Press button with specified id|name|title|alt|value and switch to main window. * diff --git a/mod/forum/classes/local/renderers/discussion.php b/mod/forum/classes/local/renderers/discussion.php index 82ac80063a6..d7fa820325b 100644 --- a/mod/forum/classes/local/renderers/discussion.php +++ b/mod/forum/classes/local/renderers/discussion.php @@ -37,6 +37,7 @@ use mod_forum\local\factories\url as url_factory; use mod_forum\local\factories\vault as vault_factory; use mod_forum\local\managers\capability as capability_manager; use mod_forum\local\renderers\posts as posts_renderer; +use forum_portfolio_caller; use core\output\notification; use context; use context_module; @@ -52,6 +53,7 @@ use stdClass; use url_select; require_once($CFG->dirroot . '/mod/forum/lib.php'); +require_once($CFG->dirroot . '/mod/forum/locallib.php'); /** * Discussion renderer class. @@ -362,6 +364,15 @@ class discussion { require_once($CFG->libdir . '/portfoliolib.php'); $discussion = $this->discussion; + + // We use the portfolio caller to work out if user should be allowed to see this button. + $caller = new forum_portfolio_caller(['discussionid' => $discussion->get_id()]); + $caller->set_formats_from_button([]); + $caller->load_data(); + if (!$caller->check_permissions()) { + return null; + } + $button = new \portfolio_add_button(); $button->set_callback_options('forum_portfolio_caller', ['discussionid' => $discussion->get_id()], 'mod_forum'); $button = $button->to_html(PORTFOLIO_ADD_FULL_FORM, get_string('exportdiscussion', 'mod_forum')); diff --git a/mod/forum/tests/behat/portfolio_export.feature b/mod/forum/tests/behat/portfolio_export.feature new file mode 100644 index 00000000000..f6e60d27a5e --- /dev/null +++ b/mod/forum/tests/behat/portfolio_export.feature @@ -0,0 +1,44 @@ +@mod @mod_forum +Feature: Ensure only users with appropriate permissions can export forum discussions. + + Background: + Given the following "users" exist: + | username | firstname | lastname | email | + | teacher1 | Teacher | 1 | teacher1@example.com | + | student1 | Student | 1 | student1@example.com | + And the following "courses" exist: + | fullname | shortname | category | + | Course 1 | C1 | 0 | + And the following "course enrolments" exist: + | user | course | role | + | teacher1 | C1 | editingteacher | + | student1 | C1 | student | + @javascript + Scenario: A teacher can export discussions to a portfolio. + Given the following "activities" exist: + | activity | name | intro | course | idnumber | groupmode | + | forum | Test forum 1 | Test forum 2 | C1 | forum | 0 | + And I log in as "admin" + And the following config values are set as admin: + | enableportfolios | 1 | + And I navigate to "Plugins > Portfolios > Manage portfolios" in site administration + And I set portfolio instance "File download" to "Enabled and visible" + And I click on "Save" "button" + And I log out + And I log in as "student1" + And I am on "Course 1" course homepage + And I follow "Test forum 1" + And I add a new discussion to "Test forum 1" forum with: + | Subject | Discussion 1 | + | Message | Test post message | + And I reload the page + And I follow "Discussion 1" + And the button "Export whole discussion to portfolio" does not exist + And I log out + And I log in as "admin" + And I am on "Course 1" course homepage + And I follow "Test forum 1" + And I follow "Discussion 1" + And the button "Export whole discussion to portfolio" exists + And I press "Export whole discussion to portfolio" + Then I should see "Exporting to portfolio"