Proyectos de Subversion Moodle

Rev

Rev 1 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
// This file is part of Moodle - http://moodle.org/
3
//
4
// Moodle is free software: you can redistribute it and/or modify
5
// it under the terms of the GNU General Public License as published by
6
// the Free Software Foundation, either version 3 of the License, or
7
// (at your option) any later version.
8
//
9
// Moodle is distributed in the hope that it will be useful,
10
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
// GNU General Public License for more details.
13
//
14
// You should have received a copy of the GNU General Public License
15
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
16
 
17
namespace mod_bigbluebuttonbn\external;
18
 
19
use core_external\external_api;
20
use mod_bigbluebuttonbn\instance;
21
use mod_bigbluebuttonbn\test\testcase_helper_trait;
22
use moodle_exception;
23
 
24
defined('MOODLE_INTERNAL') || die();
25
 
26
global $CFG;
27
require_once($CFG->dirroot . '/webservice/tests/helpers.php');
28
 
29
/**
30
 * Tests for the get_bigbluebuttons_by_courses class.
31
 *
32
 * @package    mod_bigbluebuttonbn
33
 * @category   test
34
 * @copyright  2021 - present, Blindside Networks Inc
35
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
36
 * @author    Laurent David (laurent@call-learning.fr)
37
 * @covers \mod_bigbluebuttonbn\external\get_bigbluebuttonbns_by_courses
38
 */
39
class get_bigbluebuttons_by_courses_test extends \externallib_advanced_testcase {
40
    use testcase_helper_trait;
41
 
42
    /**
43
     * Setup for test
44
     */
45
    public function setUp(): void {
46
        parent::setUp();
47
        $this->initialise_mock_server();
48
    }
49
 
50
    /**
51
     * Helper
52
     *
53
     * @param mixed ...$params
54
     * @return mixed
55
     */
56
    protected function get_bigbluebuttons_by_courses(...$params) {
57
        $returnvalue = get_bigbluebuttonbns_by_courses::execute(...$params);
58
 
59
        return external_api::clean_returnvalue(get_bigbluebuttonbns_by_courses::execute_returns(), $returnvalue);
60
    }
61
 
62
    /**
63
     * Test execute API CALL with no instance
64
     */
11 efrain 65
    public function test_execute_no_instance(): void {
1 efrain 66
        $this->resetAfterTest();
67
        $bbbactivities = $this->get_bigbluebuttons_by_courses([1234, 5678]);
68
 
69
        $this->assertIsArray($bbbactivities);
70
        $this->assertArrayHasKey('bigbluebuttonbns', $bbbactivities);
71
        $this->assertArrayHasKey('warnings', $bbbactivities);
72
        $this->assertEmpty($bbbactivities['bigbluebuttonbns']);
73
    }
74
 
75
    /**
76
     * Test execute API CALL without login
77
     */
11 efrain 78
    public function test_execute_without_login(): void {
1 efrain 79
        $this->resetAfterTest();
80
 
81
        $course = $this->getDataGenerator()->create_course();
82
        $record = $this->getDataGenerator()->create_module('bigbluebuttonbn', ['course' => $course->id]);
83
        $instance = instance::get_from_instanceid($record->id);
84
 
85
        $this->expectException(moodle_exception::class);
86
        $this->get_bigbluebuttons_by_courses($instance->get_cm_id());
87
    }
88
 
89
    /**
90
     * Test execute API CALL with invalid login
91
     */
11 efrain 92
    public function test_execute_with_invalid_login(): void {
1 efrain 93
        $this->resetAfterTest();
94
 
95
        $generator = $this->getDataGenerator();
96
        $course = $generator->create_course();
97
        $record = $generator->create_module('bigbluebuttonbn', ['course' => $course->id]);
98
        $instance = instance::get_from_instanceid($record->id);
99
 
100
        $user = $generator->create_user();
101
        $this->setUser($user);
102
 
103
        $this->expectException(moodle_exception::class);
104
        $this->get_bigbluebuttons_by_courses($instance->get_cm_id());
105
    }
106
 
107
    /**
108
     * Test get bbbactivities
109
     */
11 efrain 110
    public function test_execute_with_valid_login(): void {
1 efrain 111
        $this->resetAfterTest(true);
112
        $generator = $this->getDataGenerator();
113
 
114
        // Create a user.
115
        $user = $generator->create_user();
116
 
117
        // Create courses to add the modules.
118
        $course1 = $generator->create_course();
119
        $course2 = $generator->create_course();
120
 
121
        $bbbs = [];
122
        // First bbb activity.
123
        $bbbs[] = $generator->create_module('bigbluebuttonbn', ['course' => $course1->id]);
124
 
125
        // Second bbb activity.
126
        $bbbs[] = $generator->create_module('bigbluebuttonbn', ['course' => $course2->id]);
127
 
128
        $generator->enrol_user($user->id, $course1->id, null, 'manual');
129
        $generator->enrol_user($user->id, $course2->id, null, 'manual');
130
        // Set to the user.
131
        self::setUser($user);
132
 
133
        // Call the external function passing course ids.
134
        $bbbactivities = $this->get_bigbluebuttons_by_courses([$course1->id, $course2->id]);
135
        $this->assert_same_bbb_activities($bbbs, $bbbactivities['bigbluebuttonbns']);
136
 
137
        // Call the external function without passing course id.
138
        $bbbactivities = $this->get_bigbluebuttons_by_courses();
139
        $this->assert_same_bbb_activities($bbbs, $bbbactivities['bigbluebuttonbns']);
140
 
141
        // Unenrol user from second course and alter expected bbb activity.
142
        $enrol = enrol_get_plugin('manual');
143
        $enrolinstances = enrol_get_instances($course2->id, true);
144
        foreach ($enrolinstances as $courseenrolinstance) {
145
            if ($courseenrolinstance->enrol == "manual") {
146
                $instance2 = $courseenrolinstance;
147
                break;
148
            }
149
        }
150
        $enrol->unenrol_user($instance2, $user->id);
151
 
152
        // Call the external function without passing course id.
153
        $bbbactivities = $this->get_bigbluebuttons_by_courses();
154
        $this->assertCount(1, $bbbactivities['bigbluebuttonbns']);
155
        $this->assertEquals($bbbs[0]->id, $bbbactivities['bigbluebuttonbns'][0]['id']);
156
 
157
        // Call for the second course we unenrolled the user from.
158
        $bbbactivities = $this->get_bigbluebuttons_by_courses([$course2->id]);
159
        $this->assertCount(0, $bbbactivities['bigbluebuttonbns']);
160
    }
161
 
162
    /**
163
     * Check if the two arrays containing the activities are the same.
164
     *
165
     * @param mixed $expected
166
     * @param mixed $actual
167
     */
168
    protected function assert_same_bbb_activities($expected, $actual) {
169
        $this->assertCount(count($expected), $actual);
170
        $getids = function($bbb) {
171
            return is_array($bbb) ? $bbb['id'] : $bbb->id;
172
        };
173
        $expectedids = array_map($getids, $expected);
174
        $actualid = array_map($getids, $actual);
175
        sort($expectedids);
176
        sort($actualid);
177
        $this->assertEquals($expectedids, $actualid);
178
    }
179
}
180