moodle_rest-1.0.1/tests/src/Kernel/FunctionsServiceTest.php

tests/src/Kernel/FunctionsServiceTest.php
<?php

namespace Drupal\Tests\moodle_rest\Kernel;

use Drupal\moodle_rest\Services\MoodleRest;
use Drupal\moodle_rest\Services\MoodleRestException;
use Drupal\KernelTests\KernelTestBase;
use Drupal\Tests\moodle_rest\Kernel\Fixtures\MoodleFixturesTrait;
use Psr\Log\LoggerInterface;

/**
 * Test REST functions.
 *
 * @group moodle_rest
 */
class FunctionsServiceTest extends KernelTestBase {

  use MoodleFixturesTrait;

  /**
   * {@inheritdoc}
   */
  protected static $modules = ['moodle_rest'];

  /**
   * Test site info and related functions only call api once.
   *
   * @dataProvider provideTestSiteInfo
   */
  public function testSiteInfo(array $result): void {
    // Use default REST client from container.
    $rest = $this->createMock(MoodleRest::class);
    $rest->expects($this->once())
      ->method('requestFunction')
      ->with('core_webservice_get_site_info')
      ->willReturn($result);
    $this->container->set('moodle_rest.rest_ws', $rest);

    $rest_functions = $this->container->get('moodle_rest.rest_functions');
    $this->assertEquals($result, $rest_functions->getSiteInfo());
    $this->assertEquals($result['version'], $rest_functions->getSiteInfoVersion());
    $this->assertEquals($result['release'], $rest_functions->getSiteInfoRelease());
    $this->assertEquals($result['functions'], $rest_functions->getSiteInfoFunctions());
  }

  /**
   * Test handling exceptions in siteInfo field methods.
   */
  public function testSiteInfoExceptions(): void {
    $rest = $this->createMock(MoodleRest::class);
    $rest->expects($this->any())
      ->method('requestFunction')
      ->will($this->throwException(new MoodleRestException('', 500)));
    $this->container->set('moodle_rest.rest_ws', $rest);
    $rest_functions = $this->container->get('moodle_rest.rest_functions');

    $this->assertEquals('error', $rest_functions->getSiteInfoVersion());
    $this->assertEquals('error', $rest_functions->getSiteInfoRelease());
    $this->assertEquals('', $rest_functions->getSiteInfoUsername());
    $this->assertEquals('', $rest_functions->getSiteInfoSitename());
    $this->assertEquals([], $rest_functions->getSiteInfoFunctions());

    $rest = $this->createMock(MoodleRest::class);
    $rest->expects($this->any())
      ->method('requestFunction')
      ->will($this->throwException(new MoodleRestException('', 403, NULL, ['errorcode' => 'accessexception'])));
    $rest_functions->setRestClient($rest);

    $this->assertEquals('unknown', $rest_functions->getSiteInfoVersion());
    $this->assertEquals('unknown', $rest_functions->getSiteInfoRelease());
    $this->assertEquals('', $rest_functions->getSiteInfoUsername());
    $this->assertEquals('', $rest_functions->getSiteInfoSitename());
    $this->assertEquals([], $rest_functions->getSiteInfoFunctions());
  }

  /**
   * Test swapping the rest client.
   */
  public function testSwitchRestClient(): void {
    // Use default REST client from container.
    $rest = $this->createMock(MoodleRest::class);
    $rest->expects($this->once())
      ->method('requestFunction')
      ->with('core_webservice_get_site_info')
      ->willReturn(['original_result']);
    $this->container->set('moodle_rest.rest_ws', $rest);

    $rest_functions = $this->container->get('moodle_rest.rest_functions');
    $this->assertEquals(['original_result'], $rest_functions->getSiteInfo());

    $rest = $this->createMock(MoodleRest::class);
    $rest->expects($this->once())
      ->method('requestFunction')
      ->with('core_webservice_get_site_info')
      ->willReturn(['new_result']);
    $rest_functions->setRestClient($rest);
    $this->assertEquals(['new_result'], $rest_functions->getSiteInfo());
  }

  /**
   * Test get courses.
   *
   * @covers ::getCourses
   *
   * @dataProvider provideGetCourses
   */
  public function testGetCourses(array $result): void {
    // Use default REST client from container.
    $rest = $this->createMock(MoodleRest::class);
    $rest->expects($this->once())
      ->method('requestFunction')
      ->with('core_course_get_courses')
      ->willReturn($result);
    $this->container->set('moodle_rest.rest_ws', $rest);

    $rest_functions = $this->container->get('moodle_rest.rest_functions');
    $this->assertEquals($result, $rest_functions->getCourses());
  }

  /**
   * Test get core_courses_courses by field.
   *
   * @covers ::getCourses
   *
   * @dataProvider provideGetCoursesByField
   */
  public function testGetCoursesByField(array $result): void {
    // Use default REST client from container.
    $rest = $this->createMock(MoodleRest::class);
    $rest->expects($this->once())
      ->method('requestFunction')
      ->with('core_course_get_courses_by_field')
      ->willReturn($result);
    $this->container->set('moodle_rest.rest_ws', $rest);

    $courses = $result['courses'];
    $rest_functions = $this->container->get('moodle_rest.rest_functions');
    $this->assertEquals($courses, $rest_functions->getCoursesByField());
  }

  /**
   * Test get core_course_get_courses_by_field arguments, exceptions & warnings.
   */
  public function testGetCoursesByFieldArguments(): void {

    // Request a single course id.
    // Then request courses and get an access denied on one.
    $rest = $this->createMock(MoodleRest::class);
    $rest->expects($this->any())
      ->method('requestFunction')
      ->withConsecutive(
        ['core_course_get_courses_by_field', ['field' => 'id', 'value' => 1]],
        [
          'core_course_get_courses_by_field', [
            'field' => 'ids',
            'value' => '1,2',
          ],
        ],
      )
      ->willReturnOnConsecutiveCalls(
        ['courses' => [['id' => 1]], 'warnings' => []],
        [
          'courses' => [
            ['id' => 1],
          ],
          'warnings' => [
            [
              'item' => 'course',
              'itemid' => 2,
              'warningcode' => '1',
              'message' => 'No access rights in course context',
            ],
          ],
        ],
      );
    $this->container->set('moodle_rest.rest_ws', $rest);
    $logger = $this->createMock(LoggerInterface::class);
    $logger->expects($this->once())
      ->method('warning');
    $this->container->set('logger.channel.moodle_rest', $logger);
    $rest_functions = $this->container->get('moodle_rest.rest_functions');
    $this->assertEquals([['id' => 1]], $rest_functions->getCoursesByField('id', 1));
    $this->assertEquals([['id' => 1]], $rest_functions->getCoursesByField('ids', '1,2'));

    // Send incorrect parameters get an exception.
    $rest = $this->createMock(MoodleRest::class);
    $rest->expects($this->once())
      ->method('requestFunction')
      ->will(
        $this->throwException(new MoodleRestException('Moodle exception', 400, NULL, [
          'exception' => 'invalid_parameter_exception',
          'errorcode' => 'invalidparameter',
          'message' => 'Invalid parameter value detected (Invalid field name)',
          'debuginfo' => 'Invalid field name',
        ]))
      );
    $rest_functions->setRestClient($rest);
    try {
      $rest_functions->getCoursesByField('invalid', 1);
    }
    catch (MoodleRestException $e) {
      $this->assertInstanceOf(MoodleRestException::class, $e);
      $this->assertEquals(400, $e->getCode());
      $this->assertEquals('invalid_parameter_exception', $e->getBody()['exception']);
    }
  }

  /**
   * Tests basic user functions.
   *
   * Very basic test against the requestFunction call.
   *
   * @covers ::createUsers
   * @covers ::updateUsers
   * @covers ::deleteUsers
   */
  public function testUserFunctions() {
    $create_users = [
      [
        'username' => 'user_example',
        'email' => 'user@example.com',
        'firstname' => 'user',
        'lastname' => 'example',
        'createpassword' => TRUE,
      ],
    ];
    $update_users = [
      'id' => 6,
      'password' => 'example',
    ];
    $delete_users = [3, 6];

    $rest = $this->createMock(MoodleRest::class);
    $rest->expects($this->any())
      ->method('requestFunction')
      ->withConsecutive(
        ['core_user_create_users', ['users' => $create_users]],
        ['core_user_update_users', ['users' => $update_users]],
        ['core_user_delete_users', ['userids' => $delete_users]],
      )
      ->willReturnOnConsecutiveCalls(
        [
          [
            'id' => '6',
            'username' => 'user_example',
          ],
        ],
        NULL,
        NULL
      );
    $this->container->set('moodle_rest.rest_ws', $rest);

    $rest_functions = $this->container->get('moodle_rest.rest_functions');
    $this->assertEquals(
      [['id' => '6', 'username' => 'user_example']],
      $rest_functions->createUsers($create_users)
    );
    $this->assertNull($rest_functions->updateUsers($update_users));
    $this->assertNull($rest_functions->deleteUsers($delete_users));
  }

  /**
   * Test get users.
   *
   * @covers ::getUsers
   *
   * @dataProvider provideGetUsers
   */
  public function testGetUsers(array $result): void {
    // Use default REST client from container.
    $rest = $this->createMock(MoodleRest::class);
    $rest->expects($this->once())
      ->method('requestFunction')
      ->with('core_user_get_users', [
        'criteria' => [
          ['key' => 'firstname', 'value' => 'Student'],
        ],
      ])
      ->willReturn($result);
    $this->container->set('moodle_rest.rest_ws', $rest);

    $rest_functions = $this->container->get('moodle_rest.rest_functions');
    $this->assertEquals($result['users'], $rest_functions->getUsers(['firstname' => 'Student']));
  }

  /**
   * Test get users by field.
   *
   * @covers ::getUsersByField
   *
   * @dataProvider provideGetUsersByField
   */
  public function testGetUsersByField(array $result): void {
    // Use default REST client from container.
    $rest = $this->createMock(MoodleRest::class);
    $rest->expects($this->once())
      ->method('requestFunction')
      ->with('core_user_get_users_by_field', [
        'field' => 'email',
        'values' => ['two@example.com'],
      ])
      ->willReturn($result);
    $this->container->set('moodle_rest.rest_ws', $rest);

    $rest_functions = $this->container->get('moodle_rest.rest_functions');
    $this->assertEquals($result, $rest_functions->getUsersByField('email', ['two@example.com']));
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc