Skip to content
Snippets Groups Projects
InstanceActionTest.php 7.34 KiB
Newer Older
  • Learn to ignore specific revisions
  • François Agneray's avatar
    François Agneray committed
    <?php
    
    /*
     * This file is part of Anis Server.
     *
     * (c) Laboratoire d'Astrophysique de Marseille / CNRS
     *
     * For the full copyright and license information, please view the LICENSE
     * file that was distributed with this source code.
     */
    declare(strict_types=1);
    
    namespace App\Tests\Action;
    
    use PHPUnit\Framework\TestCase;
    use Nyholm\Psr7\ServerRequest;
    use Nyholm\Psr7\Response;
    use Slim\Exception\HttpNotFoundException;
    use Slim\Exception\HttpBadRequestException;
    use Doctrine\ORM\EntityManager;
    use App\Entity\Instance;
    
    final class InstanceActionTest extends TestCase
    {
        private $action;
        private $entityManager;
    
        protected function setUp(): void
        {
            $this->entityManager = $this->createMock(EntityManager::class);
            $this->action = new \App\Action\InstanceAction($this->entityManager);
        }
    
        public function testOptionsHttpMethod(): void
        {
            $request = $this->getRequest('OPTIONS');
            $response = ($this->action)($request, new Response(), array());
            $this->assertSame($response->getHeaderLine('Access-Control-Allow-Methods'), 'GET, PUT, DELETE, OPTIONS');
        }
    
        public function testInstanceIsNotFound(): void
        {
            $this->expectException(HttpNotFoundException::class);
            $this->expectExceptionMessage('Instance with name aspic is not found');
            $request = $this->getRequest('GET');
            $response = ($this->action)($request, new Response(), array('name' => 'aspic'));
            $this->assertEquals(404, (int) $response->getStatusCode());
        }
    
        public function testGetAnInstanceByName(): void
        {
    
            $instance = $this->getInstanceMock();
    
    François Agneray's avatar
    François Agneray committed
            $instance->expects($this->once())->method('jsonSerialize');
            $this->entityManager->method('find')->willReturn($instance);
    
            $request = $this->getRequest('GET');
            ($this->action)($request, new Response(), array('name' => 'aspic'));
        }
    
        public function testEditAnInstanceEmptyLabelField(): void
        {
    
            $instance = $this->getInstanceMock();
    
    François Agneray's avatar
    François Agneray committed
            $this->entityManager->method('find')->willReturn($instance);
    
            $this->expectException(HttpBadRequestException::class);
            $this->expectExceptionMessage('Param label needed to edit the instance');
            $request = $this->getRequest('PUT')->withParsedBody(array());
            $response = ($this->action)($request, new Response(), array('name' => 'aspic'));
            $this->assertEquals(400, (int) $response->getStatusCode());
        }
    
        public function testEditAnInstance(): void
        {
    
            $instance = $this->getInstanceMock();
    
    François Agneray's avatar
    François Agneray committed
            $this->entityManager->method('find')->willReturn($instance);
    
            $this->entityManager->expects($this->once())->method('flush');
    
            $fields = array(
    
    François Agneray's avatar
    François Agneray committed
                'name' => 'aspic',
                'label' => 'Aspic',
                'description' => 'Test',
    
                'scientific_manager' => 'M. Durand',
                'instrument' => 'Multiple',
                'wavelength_domain' => 'Visible imaging',
    
    François Agneray's avatar
    François Agneray committed
                'display' => 10,
    
                'data_path' => '/DEFAULT',
    
                'files_path' => '/INSTANCE_FILES',
    
    François Agneray's avatar
    François Agneray committed
                'public' => true,
    
    François Agneray's avatar
    François Agneray committed
                'portal_logo' => '',
                'design_color' => '#7AC29A',
                'design_background_color' => '#FFFFFF',
                'design_logo' => 'logo.png',
                'design_favicon' => 'favicon.ico',
    
    François Agneray's avatar
    François Agneray committed
                'navbar_background_color' => '#F8F9FA',
                'navbar_border_bottom_color' => '#DEE2E6',
                'navbar_color_href' => '#000000',
    
    François Agneray's avatar
    François Agneray committed
                'navbar_font_family' => 'auto',
                'navbar_sign_in_btn_color' => '#28A745',
                'navbar_user_btn_color' => '#7AC29A',
    
    François Agneray's avatar
    François Agneray committed
                'footer_background_color' => '#F8F9FA',
                'footer_border_top_color' => '#DEE2E6',
                'footer_text_color' => '#000000',
    
                'footer_logos' => null,
    
                'family_border_color' => '#DFDFDF',
                'family_header_background_color' => '#F7F7F7',
                'family_title_color' => '#007BFF',
                'family_title_bold' => false,
    
                'family_background_color' => '#FFFFFF',
    
                'family_color' => '#212529',
    
                'progress_bar_title' => 'Dataset search',
    
    François Agneray's avatar
    François Agneray committed
                'progress_bar_title_color' => '#000000',
    
                'progress_bar_subtitle' => 'Select a dataset, add criteria, select output columns and display the result.',
    
    François Agneray's avatar
    François Agneray committed
                'progress_bar_subtitle_color' => '#6C757D',
    
                'progress_bar_step_dataset_title' => 'Dataset selection',
                'progress_bar_step_criteria_title' => 'Search criteria',
                'progress_bar_step_output_title' => 'Output columns',
                'progress_bar_step_result_title' => 'Result table',
    
                'progress_bar_color' => '#E9ECEF',
                'progress_bar_active_color' => '#7AC29A',
                'progress_bar_circle_color' => '#FFFFFF',
    
    François Agneray's avatar
    François Agneray committed
                'progress_bar_circle_icon_color' => '#CCCCCC',
                'progress_bar_circle_icon_active_color' => '#FFFFFF',
    
                'progress_bar_text_color' => '#91B2BF',
    
    François Agneray's avatar
    François Agneray committed
                'result_header_background_color' => '#E9ECEF',
                'result_header_text_color' => '#000000',
                'result_header_btn_color' => '#007BFF',
                'result_header_btn_hover_color' => '#0069D9',
                'result_header_btn_text_color' => '#FFFFFF',
    
    François Agneray's avatar
    François Agneray committed
                'result_datatable_bordered' => true,
                'result_datatable_border_color' => '#DEE2E6',
                'result_datatable_header_background_color' => '#FFFFFF',
                'result_datatable_header_text_color' => '#000000',
                'result_datatable_rows_background_color' => '#FFFFFF',
                'result_datatable_rows_text_color' => '#000000',
                'result_datatable_sorted_color' => '#C5C5C5',
                'result_datatable_sorted_active_color' => '#000000',
                'result_datatable_link_color' => '#007BFF',
                'result_datatable_link_hover_color' => '#0056B3',
                'result_datatable_rows_selected_color' => '#7AC29A',
    
                'samp_enabled' => true,
    
    François Agneray's avatar
    François Agneray committed
                'back_to_portal' => true,
    
    François Agneray's avatar
    François Agneray committed
                'user_menu_enabled' => true,
    
    François Agneray's avatar
    François Agneray committed
                'search_by_criteria_allowed' => true,
                'search_by_criteria_label' => 'Search',
                'search_multiple_allowed' => false,
                'search_multiple_label' => 'Search multiple',
                'search_multiple_all_datasets_selected' => false,
                'documentation_allowed' => false,
                'documentation_label' => ''
    
    François Agneray's avatar
    François Agneray committed
            );
    
            $request = $this->getRequest('PUT')->withParsedBody($fields);
            ($this->action)($request, new Response(), array('name' => 'aspic'));
        }
    
        public function testDeleteAnInstance(): void
        {
    
            $instance = $this->getInstanceMock();
    
    François Agneray's avatar
    François Agneray committed
            $instance->method('getName')->willReturn('aspic');
            $this->entityManager->method('find')->willReturn($instance);
    
            $request = $this->getRequest('DELETE');
            $response = ($this->action)($request, new Response(), array('name' => 'aspic'));
            $this->assertSame(
                json_encode(array('message' => 'Instance with name aspic is removed!')),
                (string) $response->getBody()
            );
        }
    
        private function getRequest(string $method): ServerRequest
        {
            return new ServerRequest($method, '/instance/aspic', array(
                'Content-Type' => 'application/json'
            ));
        }
    
    
        /**
         * @return Instance|\PHPUnit\Framework\MockObject\MockObject
         */
        private function getInstanceMock()
        {
            return $this->createMock(Instance::class);
        }
    
    François Agneray's avatar
    François Agneray committed
    }