View source  
  <?php
namespace Drupal\Tests\fillpdf\Functional;
use Drupal\Core\Url;
use Drupal\Tests\BrowserTestBase;
use Drupal\Tests\fillpdf\Traits\TestFillPdfTrait;
class FillPdfSettingsFormTest extends BrowserTestBase {
  
  public static $modules = [
    'fillpdf_test',
    'file_test',
  ];
  use TestFillPdfTrait;
  
  protected $strictConfigSchema = FALSE;
  
  protected function setUp() {
    parent::setUp();
    $this
      ->initializeUser();
  }
  
  public function testSettingsFormDefaults() {
    
    $this
      ->drupalGet(Url::fromRoute('fillpdf.settings'));
    $this
      ->assertSession()
      ->pageTextContains('Public files (site default)');
    $this
      ->assertSession()
      ->checkboxChecked('edit-template-scheme-public');
    $this
      ->assertSession()
      ->checkboxChecked('edit-backend-fillpdf-service');
    
    $config = $this->container
      ->get('config.factory')
      ->getEditable('system.file')
      ->set('default_scheme', 'private');
    $config
      ->save();
    
    $this
      ->drupalGet(Url::fromRoute('fillpdf.settings'));
    $this
      ->assertSession()
      ->pageTextContains('Private files (site default)');
    $this
      ->assertSession()
      ->checkboxChecked('edit-template-scheme-private');
    $this
      ->assertSession()
      ->checkboxChecked('edit-backend-fillpdf-service');
  }
  
  public function testTemplateSchemeDummyRemote() {
    
    $this
      ->drupalGet(Url::fromRoute('fillpdf.settings'));
    $this
      ->assertSession()
      ->elementExists('css', '#edit-template-scheme-dummy-remote');
    
    $this
      ->configureFillPdf([
      'template_scheme' => 'dummy_remote',
    ]);
    
    $this
      ->assertTrue(\Drupal::service('module_installer')
      ->uninstall([
      'file_test',
    ]), "Module 'file_test' has been uninstalled.");
    $this
      ->assertFalse(\Drupal::moduleHandler()
      ->moduleExists('file_test'), "Module 'file_test' is no longer present.");
    
    $this
      ->drupalGet(Url::fromRoute('fillpdf.settings'));
    $this
      ->assertSession()
      ->elementNotExists('css', '#edit-template-scheme-dummy-remote');
    $this
      ->assertSession()
      ->pageTextContains('Your previously used file storage dummy_remote:// is no longer available');
  }
  
  public function testTemplateSchemePrivate() {
    
    $this
      ->configureFillPdf();
    
    $this
      ->drupalPostForm(Url::fromRoute('fillpdf.settings'), [
      'template_scheme' => 'private',
    ], 'Save configuration');
    
    $this
      ->assertSession()
      ->pageTextContains('The configuration options have been saved.');
    $this
      ->assertSession()
      ->fieldValueEquals('template_scheme', 'private');
    $this
      ->assertEqual($this
      ->config('fillpdf.settings')
      ->get('template_scheme'), 'private');
    
    $this
      ->writeSettings([
      'settings' => [
        'file_private_path' => (object) [
          'value' => '',
          'required' => TRUE,
        ],
      ],
    ]);
    $this
      ->rebuildContainer();
    
    $this
      ->drupalGet(Url::fromRoute('fillpdf.settings'));
    $this
      ->assertSession()
      ->elementNotExists('css', '#edit-template-scheme-private');
    $this
      ->assertSession()
      ->pageTextContains('Your previously used file storage private:// is no longer available');
    
    $this
      ->assertSession()
      ->fieldValueEquals('template_scheme', $this
      ->config('system.file')
      ->get('default_scheme'));
    $this
      ->assertEqual($this
      ->config('fillpdf.settings')
      ->get('template_scheme'), 'private');
  }
  
  public function testTemplateSchemePublic() {
    
    $this
      ->configureFillPdf();
    
    $this
      ->drupalGet(Url::fromRoute('fillpdf.settings'));
    $this
      ->assertSession()
      ->fieldValueEquals('template_scheme', 'public');
    $this
      ->assertEqual($this
      ->config('fillpdf.settings')
      ->get('template_scheme'), 'public');
    
    $directory = 'public://fillpdf';
    $this
      ->assertFalse(is_dir($directory), 'Directory does not exist prior to testing.');
    
    $this
      ->drupalPostForm(NULL, [], 'Save configuration');
    $this
      ->assertSession()
      ->pageTextContains('The configuration options have been saved.');
    $this
      ->assertTrue(is_dir($directory), 'Directory exists now.');
    $this
      ->assertTrue(\Drupal::service('file_system')
      ->prepareDirectory($directory), 'Directory is writeable.');
    
    
    $file_system = $this->container
      ->get('file_system');
    $file_system
      ->rmdir($directory);
    \Drupal::service('file_system')
      ->copy('public://.htaccess', $directory);
    $this
      ->drupalPostForm(NULL, [], 'Save configuration');
    $this
      ->assertSession()
      ->pageTextNotContains('The configuration options have been saved.');
    $this
      ->assertSession()
      ->pageTextContains('Could not automatically create the subdirectory');
  }
  
  public function testBackendFillPdfService() {
    
    $this
      ->drupalPostForm(Url::fromRoute('fillpdf.settings'), NULL, 'Save configuration');
    
    $this
      ->assertSession()
      ->pageTextContains('The configuration options have been saved.');
    $this
      ->assertSession()
      ->fieldValueEquals('backend', 'fillpdf_service');
    $this
      ->assertEqual($this
      ->config('fillpdf.settings')
      ->get('backend'), 'fillpdf_service');
    
    $this
      ->drupalPostForm(NULL, [
      'fillpdf_service_api_key' => 'Invalid, just playing around.',
    ], 'Save configuration');
    
    $this
      ->assertSession()
      ->pageTextContains('The configuration options have been saved.');
    $this
      ->assertSession()
      ->fieldValueEquals('fillpdf_service_api_key', 'Invalid, just playing around.');
    $this
      ->assertEqual($this
      ->config('fillpdf.settings')
      ->get('fillpdf_service_api_key'), 'Invalid, just playing around.');
  }
  
  public function testBackendPdftk() {
    
    $edit = [
      'template_scheme' => 'private',
      'backend' => 'pdftk',
      'pdftk_path' => 'xyz',
    ];
    $this
      ->drupalPostForm(Url::fromRoute('fillpdf.settings'), $edit, 'Save configuration');
    
    $this
      ->assertSession()
      ->pageTextNotContains('The configuration options have been saved.');
    $this
      ->assertSession()
      ->pageTextContains('The path you have entered for pdftk is invalid. Please enter a valid path.');
    
    foreach ($edit as $field => $value) {
      $this
        ->assertSession()
        ->fieldValueEquals($field, $value);
      $this
        ->assertEqual($this
        ->config('fillpdf.settings')
        ->get($field), NULL);
    }
  }
  
  public function testBackendTest() {
    
    $this
      ->drupalGet(Url::fromRoute('fillpdf.settings'));
    $this
      ->assertSession()
      ->pageTextContainsOnce('plugin for testing');
    $this
      ->assertSession()
      ->pageTextContains('Form-altered pass-through plugin for testing');
    
    $edit = [
      'template_scheme' => 'private',
      'backend' => 'test',
      'example_setting' => 'x',
      'fillpdf_service_api_key' => 'Invalid, just playing around.',
    ];
    $this
      ->drupalPostForm(NULL, $edit, 'Save configuration');
    
    $this
      ->assertSession()
      ->pageTextNotContains('An illegal choice has been detected.');
    
    $this
      ->assertSession()
      ->pageTextNotContains('The configuration options have been saved.');
    $this
      ->assertSession()
      ->pageTextContains('Not a valid value.');
    
    foreach ($edit as $field => $value) {
      $this
        ->assertSession()
        ->fieldValueEquals($field, $value);
      $this
        ->assertEqual($this
        ->config('fillpdf.settings')
        ->get($field), NULL);
    }
    
    $edit['example_setting'] = 'xyz';
    $this
      ->drupalPostForm(NULL, $edit, 'Save configuration');
    
    $this
      ->assertSession()
      ->pageTextNotContains('Not a valid value.');
    $this
      ->assertSession()
      ->pageTextContains('The configuration options have been saved.');
    
    $expected = [
      'fillpdf_service_api_key' => NULL,
    ] + $edit;
    foreach ($expected as $field => $value) {
      $this
        ->assertSession()
        ->fieldValueEquals($field, $value);
      $this
        ->assertEqual($this
        ->config('fillpdf.settings')
        ->get($field), $value);
    }
  }
}