1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-04-23 09:07:43 +02:00

Merge pull request from Dragooon/ticket/12514

[ticket/12514] Add tests for profile fields

* Dragooon/ticket/12514: (28 commits)
  [ticket/12514] Fix array formatting for tests
  [ticket/12514] Fix indention for type_url_test.php
  [ticket/12514] Missed a few spaces in comments
  [ticket/12514] Convert spaces to tabs
  [ticket/12514] Add a few additional tests for type_dropdown
  [ticket/12514] Add a few additional tests for type_int
  [ticket/12514] Fix some formatting for tests
  [ticket/12514] Add a few more tests for type_date
  [ticket/12514] Remove spaces in header blocks
  [ticket/12514] Use generic domain name for URL test
  [ticket/12514] Update file headers to represent the current format
  [ticket/12514] Remove get_ prefix from data providers
  [ticket/12514] Add a few more validation cases for type_string_test
  [ticket/12514] Minor fault in type_bool_test.php
  [ticket/12514] Remove tests/profiles as they're no longer required
  [ticket/12514] Fix type_int_test to correctly respect boundaries
  [ticket/12514] Multi value GET parameters are invalid for phpBB
  [ticket/12514] Add unit test for type_url custom profile field
  [ticket/12514] Add unit test for type_date custom profile field
  [ticket/12514] Add unit test for type_bool custom profile field
  ...
This commit is contained in:
Joas Schilling 2014-06-20 12:14:23 +02:00
commit 70d4ede9b2
10 changed files with 1021 additions and 272 deletions

@ -1,120 +0,0 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/utf/utf_tools.php';
class phpbb_profile_custom_string_test extends phpbb_database_test_case
{
public function getDataSet()
{
return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/profile_fields.xml');
}
static public function string_fields()
{
return array(
// note, there is an offset of 1 between option_id (0-indexed)
// in the database and values (1-indexed) to avoid problems with
// transmitting 0 in an HTML form
// required, value, validation, expected, description
array(
1,
'H3110',
'[0-9]+',
'FIELD_INVALID_CHARS_NUMBERS_ONLY-field',
'Required field should reject characters in a numbers-only field',
),
array(
1,
'This string is too long',
'.*',
'FIELD_TOO_LONG-10-field',
'Required field should reject a field too long',
),
array(
0,
'&lt;&gt;&quot;&amp;%&amp;&gt;&lt;&gt;',
'.*',
false,
'Optional field should accept html entities',
),
array(
1,
'ö ä ü ß',
'.*',
false,
'Required field should accept UTF-8 string',
),
array(
1,
'This ö ä string has to b',
'.*',
'FIELD_TOO_LONG-10-field',
'Required field should reject an UTF-8 string which is too long',
),
array(
1,
'ö äö äö ä',
'[\w]+',
'FIELD_INVALID_CHARS_ALPHA_ONLY-field',
'Required field should reject UTF-8 in alpha only field',
),
array(
1,
'Hello',
'[\w]+',
false,
'Required field should accept a characters only field',
),
);
}
/**
* @dataProvider string_fields
*/
public function test_string_validate($field_required, $field_value, $field_validation, $expected, $description)
{
$db = $this->new_dbal();
$field_data = array(
'field_id' => 1,
'lang_id' => 1,
'lang_name' => 'field',
'field_novalue' => 1,
'field_required' => $field_required,
'field_maxlen' => 10,
'field_validation' => $field_validation,
);
$user = $this->getMock('\phpbb\user');
$user->expects($this->any())
->method('lang')
->will($this->returnCallback(array($this, 'return_callback_implode')));
$request = $this->getMock('\phpbb\request\request');
$template = $this->getMock('\phpbb\template\template');
$cp = new \phpbb\profilefields\type\type_string(
$request,
$template,
$user
);
$result = $cp->validate_profile_field($field_value, $field_data);
$this->assertEquals($expected, $result, $description);
}
public function return_callback_implode()
{
return implode('-', func_get_args());
}
}

@ -1,75 +0,0 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
class phpbb_profile_custom_test extends phpbb_database_test_case
{
public function getDataSet()
{
return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/profile_fields.xml');
}
static public function dropdown_fields()
{
return array(
// note, there is an offset of 1 between option_id (0-indexed)
// in the database and values (1-indexed) to avoid problems with
// transmitting 0 in an HTML form
// required, value, expected
array(1, '0', 'FIELD_INVALID_VALUE-field', 'Required field should throw error for out-of-range value'),
array(1, '1', 'FIELD_REQUIRED-field', 'Required field should throw error for default value'),
array(1, '2', false, 'Required field should accept non-default value'),
array(0, '0', 'FIELD_INVALID_VALUE-field', 'Optional field should throw error for out-of-range value'),
array(0, '1', false, 'Optional field should accept default value'),
array(0, '2', false, 'Optional field should accept non-default value'),
);
}
/**
* @dataProvider dropdown_fields
*/
public function test_dropdown_validate($field_required, $field_value, $expected, $description)
{
global $db, $table_prefix;
$db = $this->new_dbal();
$field_data = array(
'field_id' => 1,
'lang_id' => 1,
'lang_name' => 'field',
'field_novalue' => 1,
'field_required' => $field_required,
);
$user = $this->getMock('\phpbb\user');
$user->expects($this->any())
->method('lang')
->will($this->returnCallback(array($this, 'return_callback_implode')));
$request = $this->getMock('\phpbb\request\request');
$template = $this->getMock('\phpbb\template\template');
$cp = new \phpbb\profilefields\type\type_dropdown(
new \phpbb\profilefields\lang_helper($db, $table_prefix . 'profile_fields_lang'),
$request,
$template,
$user
);
$result = $cp->validate_profile_field($field_value, $field_data);
$this->assertEquals($expected, $result, $description);
}
public function return_callback_implode()
{
return implode('-', func_get_args());
}
}

@ -1,31 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<dataset>
<table name="phpbb_profile_fields_lang">
<column>field_id</column>
<column>lang_id</column>
<column>option_id</column>
<column>field_type</column>
<column>lang_value</column>
<row>
<value>1</value>
<value>1</value>
<value>0</value>
<value>profilefields.type.dropdown</value>
<value>Default Option</value>
</row>
<row>
<value>1</value>
<value>1</value>
<value>1</value>
<value>profilefields.type.dropdown</value>
<value>First Alternative</value>
</row>
<row>
<value>1</value>
<value>1</value>
<value>2</value>
<value>profilefields.type.dropdown</value>
<value>Third Alternative</value>
</row>
</table>
</dataset>

@ -1,46 +0,0 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
class phpbb_profile_get_profile_value_test extends phpbb_test_case
{
static public function get_profile_value_int_data()
{
return array(
array('\phpbb\profilefields\type\type_int', '10', true, 10),
array('\phpbb\profilefields\type\type_int', '0', true, 0),
array('\phpbb\profilefields\type\type_int', '', true, 0),
array('\phpbb\profilefields\type\type_int', null, true, 0),
array('\phpbb\profilefields\type\type_int', '10', false, 10),
array('\phpbb\profilefields\type\type_int', '0', false, 0),
array('\phpbb\profilefields\type\type_int', '', false, null),
array('\phpbb\profilefields\type\type_int', null, false, null),
);
}
/**
* @dataProvider get_profile_value_int_data
*/
public function test_get_profile_value_int($type, $value, $show_novalue, $expected)
{
$cp = new $type(
$this->getMock('\phpbb\request\request'),
$this->getMock('\phpbb\template\template'),
$this->getMock('\phpbb\user')
);
$this->assertSame($expected, $cp->get_profile_value($value, array(
'field_type' => $type,
'field_show_novalue' => $show_novalue,
)));
}
}

@ -0,0 +1,147 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
class phpbb_profilefield_type_bool_test extends phpbb_test_case
{
protected $cp;
protected $field_options = array();
protected $options = array();
/**
* Sets up basic test objects
*
* @access public
* @return void
*/
public function setUp()
{
$user = $this->getMock('\phpbb\user');
$user->expects($this->any())
->method('lang')
->will($this->returnCallback(array($this, 'return_callback_implode')));
$lang = $this->getMock('\phpbb\profilefields\lang_helper', array(), array(null, null));
$lang->expects($this->any())
->method('get_options_lang');
$lang->expects($this->any())
->method('is_set')
->will($this->returnCallback(array($this, 'is_set_callback')));
$lang->expects($this->any())
->method('get')
->will($this->returnCallback(array($this, 'get')));
$request = $this->getMock('\phpbb\request\request');
$template = $this->getMock('\phpbb\template\template');
$this->cp = new \phpbb\profilefields\type\type_bool(
$lang,
$request,
$template,
$user
);
$this->field_options = array(
'field_type' => '\phpbb\profilefields\type\type_bool',
'field_name' => 'field',
'field_id' => 1,
'lang_id' => 1,
'lang_name' => 'field',
'field_required' => false,
'field_default_value' => 1,
'field_length' => 1,
);
$this->options = array(
0 => 'Yes',
1 => 'No',
);
}
public function validate_profile_field_data()
{
return array(
array(
false,
array('field_required' => true),
'FIELD_REQUIRED-field',
'Field should not accept empty values for required fields',
),
);
}
/**
* @dataProvider validate_profile_field_data
*/
public function test_validate_profile_field($value, $field_options, $expected, $description)
{
$field_options = array_merge($this->field_options, $field_options);
$result = $this->cp->validate_profile_field($value, $field_options);
$this->assertSame($expected, $result, $description);
}
public function profile_value_data()
{
return array(
array(
false,
array('field_show_novalue' => true),
'No',
'Field should output the default value',
),
array(
false,
array('field_show_novalue' => false, 'field_length' => 2),
null,
'Field should not show anything for empty value',
),
array(
0,
array(),
'Yes',
'Field should show the set value',
),
);
}
/**
* @dataProvider profile_value_data
*/
public function test_get_profile_value($value, $field_options, $expected, $description)
{
$field_options = array_merge($this->field_options, $field_options);
$result = $this->cp->get_profile_value($value, $field_options);
$this->assertSame($expected, $result, $description);
}
public function is_set_callback($field_id, $lang_id, $field_value)
{
return isset($this->options[$field_value]);
}
public function get($field_id, $lang_id, $field_value)
{
return $this->options[$field_value];
}
public function return_callback_implode()
{
return implode('-', func_get_args());
}
}

@ -0,0 +1,192 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
class phpbb_profilefield_type_date_test extends phpbb_test_case
{
protected $cp;
protected $field_options;
protected $user;
/**
* Sets up basic test objects
*
* @access public
* @return null
*/
public function setUp()
{
$this->user = $this->getMock('\phpbb\user');
$this->user->expects($this->any())
->method('lang')
->will($this->returnCallback(array($this, 'return_callback_implode')));
$this->user->expects($this->any())
->method('create_datetime')
->will($this->returnCallback(array($this, 'create_datetime_callback')));
$this->user->timezone = new DateTimeZone('UTC');
$this->user->lang = array(
'datetime' => array(),
'DATE_FORMAT' => 'm/d/Y',
);
$request = $this->getMock('\phpbb\request\request');
$template = $this->getMock('\phpbb\template\template');
$this->cp = new \phpbb\profilefields\type\type_date(
$request,
$template,
$this->user
);
$this->field_options = array(
'field_type' => '\phpbb\profilefields\type\type_date',
'field_name' => 'field',
'field_id' => 1,
'lang_id' => 1,
'lang_name' => 'field',
'field_required' => false,
);
}
public function profile_value_data()
{
return array(
array(
'01-01-2009',
array('field_show_novalue' => true),
'01/01/2009',
'Field should output the correctly formatted date',
),
array(
null,
array('field_show_novalue' => false),
null,
'Field should leave empty value as is',
),
array(
'None',
array('field_show_novalue' => true),
'None',
'Field should leave invalid value as is',
),
);
}
/**
* @dataProvider profile_value_data
*/
public function test_get_profile_value($value, $field_options, $expected, $description)
{
$field_options = array_merge($this->field_options, $field_options);
$result = $this->cp->get_profile_value($value, $field_options);
$this->assertSame($expected, $result, $description);
}
public function validate_profile_field_data()
{
return array(
array(
'',
array('field_required' => true),
'FIELD_REQUIRED-field',
'Field should reject value for being empty',
),
array(
'0125',
array('field_required' => true),
'FIELD_REQUIRED-field',
'Field should reject value for being invalid',
),
array(
'01-01-2012',
array(),
false,
'Field should accept a valid value',
),
array(
'40-05-2009',
array(),
'FIELD_INVALID_DATE-field',
'Field should reject value for being invalid',
),
array(
'12-30-2012',
array(),
'FIELD_INVALID_DATE-field',
'Field should reject value for being invalid',
),
array(
'string',
array(),
false,
'Field should reject value for being invalid',
),
array(
'string',
array('field_required' => true),
'FIELD_REQUIRED-field',
'Field should reject value for being invalid',
),
array(
100,
array(),
false,
'Field should reject value for being invalid',
),
array(
100,
array('field_required' => true),
'FIELD_REQUIRED-field',
'Field should reject value for being invalid',
),
array(
null,
array('field_required' => true),
'FIELD_REQUIRED-field',
'Field should reject value for being empty',
),
array(
true,
array('field_required' => true),
'FIELD_REQUIRED-field',
'Field should reject value for being empty',
),
);
}
/**
* @dataProvider validate_profile_field_data
*/
public function test_validate_profile_field($value, $field_options, $expected, $description)
{
$field_options = array_merge($this->field_options, $field_options);
$result = $this->cp->validate_profile_field($value, $field_options);
$this->assertSame($expected, $result, $description);
}
public function return_callback_implode()
{
return implode('-', func_get_args());
}
public function create_datetime_callback($time = 'now', \DateTimeZone $timezone = null)
{
$timezone = $timezone ?: $this->user->timezone;
return new \phpbb\datetime($this->user, $time, $timezone);
}
}

@ -0,0 +1,187 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
class phpbb_profilefield_type_dropdown_test extends phpbb_test_case
{
protected $cp;
protected $field_options = array();
protected $dropdown_options = array();
/**
* Sets up basic test objects
*
* @access public
* @return null
*/
public function setUp()
{
$user = $this->getMock('\phpbb\user');
$user->expects($this->any())
->method('lang')
->will($this->returnCallback(array($this, 'return_callback_implode')));
$request = $this->getMock('\phpbb\request\request');
$template = $this->getMock('\phpbb\template\template');
$lang = $this->getMock('\phpbb\profilefields\lang_helper', array(), array(null, null));
$lang->expects($this->any())
->method('get_options_lang');
$lang->expects($this->any())
->method('is_set')
->will($this->returnCallback(array($this, 'is_set_callback')));
$lang->expects($this->any())
->method('get')
->will($this->returnCallback(array($this, 'get')));
$this->cp = new \phpbb\profilefields\type\type_dropdown(
$lang,
$request,
$template,
$user
);
$this->field_options = array(
'field_type' => '\phpbb\profilefields\type\type_dropdown',
'field_name' => 'field',
'field_id' => 1,
'lang_id' => 1,
'lang_name' => 'field',
'field_required' => false,
'field_validation' => '.*',
'field_novalue' => 0,
);
$this->dropdown_options = array(
0 => '<No Value>',
1 => 'Option 1',
2 => 'Option 2',
3 => 'Option 3',
4 => 'Option 4',
);
}
public function validate_profile_field_data()
{
return array(
array(
7,
array(),
'FIELD_INVALID_VALUE-field',
'Invalid value should throw error',
),
array(
true,
array('field_required' => true),
false,
'Boolean would evaluate to 1 and hence correct value',
),
array(
'string',
array('field_required' => true),
'FIELD_REQUIRED-field',
'String should be rejected for value',
),
array(
2,
array(),
false,
'Valid value should not throw error'
),
array(
0,
array(),
false,
'Empty value should be acceptible',
),
array(
0,
array('field_required' => true),
'FIELD_REQUIRED-field',
'Required field should not accept empty value',
),
);
}
/**
* @dataProvider validate_profile_field_data
*/
public function test_validate_profile_field($value, $field_options, $expected, $description)
{
$field_options = array_merge($this->field_options, $field_options);
$result = $this->cp->validate_profile_field($value, $field_options);
$this->assertSame($expected, $result, $description);
}
public function profile_value_data()
{
return array(
array(
1,
array('field_show_novalue' => true),
'Option 1',
'Field should output the given value',
),
array(
4,
array('field_show_novalue' => false),
'Option 4',
'Field should output the given value',
),
array(
'',
array('field_show_novalue' => true),
'<No Value>',
'Field should output nothing for empty value',
),
array(
'',
array('field_show_novalue' => false),
null,
'Field should simply output null for empty value',
),
);
}
/**
* @dataProvider profile_value_data
*/
public function test_get_profile_value($value, $field_options, $expected, $description)
{
$field_options = array_merge($this->field_options, $field_options);
$result = $this->cp->get_profile_value($value, $field_options);
$this->assertSame($expected, $result, $description);
}
public function is_set_callback($field_id, $lang_id, $field_value)
{
return isset($this->dropdown_options[$field_value]);
}
public function get($field_id, $lang_id, $field_value)
{
return $this->dropdown_options[$field_value];
}
public function return_callback_implode()
{
return implode('-', func_get_args());
}
}

@ -0,0 +1,176 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
class phpbb_profilefield_type_int_test extends phpbb_test_case
{
protected $cp;
protected $field_options;
/**
* Sets up basic test objects
*
* @access public
* @return null
*/
public function setUp()
{
$user = $this->getMock('\phpbb\user');
$user->expects($this->any())
->method('lang')
->will($this->returnCallback(array($this, 'return_callback_implode')));
$request = $this->getMock('\phpbb\request\request');
$template = $this->getMock('\phpbb\template\template');
$this->cp = new \phpbb\profilefields\type\type_int(
$request,
$template,
$user
);
$this->field_options = array(
'field_type' => '\phpbb\profilefields\type\type_int',
'field_name' => 'field',
'field_id' => 1,
'lang_id' => 1,
'lang_name' => 'field',
'field_required' => false,
);
}
public function profile_value_data()
{
return array(
array(
'10',
array('field_show_novalue' => true),
10,
'Field should output integer value of given input',
),
array(
'0',
array('field_show_novalue' => true),
0,
'Field should output integer value of given input',
),
array(
'',
array('field_show_novalue' => true),
0,
'Field should translate empty value to 0 as integer',
false,
),
array(
null,
array('field_show_novalue' => true),
0,
'Field should translate null value to 0 as integer',
),
array(
'10',
array('field_show_novalue' => false),
10,
'Field should output integer value of given input',
),
array(
'0',
array('field_show_novalue' => false),
0,
'Field should output integer value of given input',
),
array(
'',
array('field_show_novalue' => false),
null,
'Field should leave empty value as is',
),
array(
null,
array('field_show_novalue' => false),
null,
'Field should leave empty value as is',
),
);
}
/**
* @dataProvider profile_value_data
*/
public function test_get_profile_value($value, $field_options, $expected, $description)
{
$field_options = array_merge($this->field_options, $field_options);
$result = $this->cp->get_profile_value($value, $field_options);
$this->assertSame($expected, $result, $description);
}
public function validate_profile_field_data()
{
return array(
array(
'15',
array('field_minlen' => 10, 'field_maxlen' => 20, 'field_required' => true),
false,
'Field should accept input of correct boundaries',
),
array(
'556476',
array('field_maxlen' => 50000, 'field_required' => true),
'FIELD_TOO_LARGE-50000-field',
'Field should reject value of greater value than max',
),
array(
'9',
array('field_minlen' => 10, 'field_required' => true),
'FIELD_TOO_SMALL-10-field',
'Field should reject value which is less than defined minimum',
),
array(
true,
array('field_maxlen' => 20),
false,
'Field should accept correct boolean value',
),
array(
'string',
array('field_maxlen' => 10, 'field_required' => true),
false,
'Field should accept correct string value',
),
array(
null,
array('field_minlen' => 1, 'field_maxlen' => 10, 'field_required' => true),
'FIELD_TOO_SMALL-1-field',
'Field should not accept an empty value',
),
);
}
/**
* @dataProvider validate_profile_field_data
*/
public function test_validate_profile_field($value, $field_options, $expected, $description)
{
$field_options = array_merge($this->field_options, $field_options);
$result = $this->cp->validate_profile_field($value, $field_options);
$this->assertSame($expected, $result, $description);
}
public function return_callback_implode()
{
return implode('-', func_get_args());
}
}

@ -0,0 +1,208 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
require_once dirname(__FILE__) . '/../../phpBB/includes/functions_content.php';
require_once dirname(__FILE__) . '/../../phpBB/includes/utf/utf_tools.php';
class phpbb_profilefield_type_string_test extends phpbb_test_case
{
protected $cp;
protected $field_options;
/**
* Sets up basic test objects
*
* @access public
* @return null
*/
public function setUp()
{
global $request, $user, $cache;
$user = $this->getMock('\phpbb\user');
$cache = new phpbb_mock_cache;
$user->expects($this->any())
->method('lang')
->will($this->returnCallback(array($this, 'return_callback_implode')));
$request = $this->getMock('\phpbb\request\request');
$template = $this->getMock('\phpbb\template\template');
$this->cp = new \phpbb\profilefields\type\type_string(
$request,
$template,
$user
);
$this->field_options = array(
'field_type' => '\phpbb\profilefields\type\type_string',
'field_name' => 'field',
'field_id' => 1,
'lang_id' => 1,
'lang_name' => 'field',
'field_required' => false,
'field_validation' => '.*',
);
}
public function validate_profile_field_data()
{
return array(
array(
'',
array('field_required' => true),
'FIELD_REQUIRED-field',
'Field should not accept empty values for required fields',
),
array(
null,
array('field_required' => true),
'FIELD_REQUIRED-field',
'Field should not accept empty values for required field',
),
array(
0,
array('field_required' => true),
false,
'Field should accept a non-empty input',
),
array(
'false',
array('field_required' => true),
false,
'Field should accept a non-empty input',
),
array(
10,
array('field_required' => true),
false,
'Field should accept a non-empty input',
),
array(
'tas',
array('field_minlen' => 2, 'field_maxlen' => 5),
false,
'Field should accept value of correct length',
),
array(
't',
array('field_minlen' => 2, 'field_maxlen' => 5),
'FIELD_TOO_SHORT-2-field',
'Field should reject value of incorrect length',
),
array(
'this is a long string',
array('field_minlen' => 2, 'field_maxlen' => 5),
'FIELD_TOO_LONG-5-field',
'Field should reject value of incorrect length',
),
array(
'H3110',
array('field_validation' => '[0-9]+'),
'FIELD_INVALID_CHARS_NUMBERS_ONLY-field',
'Required field should reject characters in a numbers-only field',
),
array(
'&lt;&gt;&quot;&amp;%&amp;&gt;&lt;&gt;',
array('field_maxlen' => 10, 'field_minlen' => 2),
false,
'Optional field should accept html entities',
),
array(
'ö ä ü ß',
array(),
false,
'Required field should accept UTF-8 string',
),
array(
'This ö ä string has to b',
array('field_maxlen' => 10),
'FIELD_TOO_LONG-10-field',
'Required field should reject an UTF-8 string which is too long',
),
array(
'ö äö äö ä',
array('field_validation' => '[\w]+'),
'FIELD_INVALID_CHARS_ALPHA_ONLY-field',
'Required field should reject UTF-8 in alpha only field',
),
array(
'Hello',
array('field_validation' => '[\w]+'),
false,
'Required field should accept a characters only field',
),
);
}
/**
* @dataProvider validate_profile_field_data
*/
public function test_validate_profile_field($value, $field_options, $expected, $description)
{
$field_options = array_merge($this->field_options, $field_options);
$result = $this->cp->validate_profile_field($value, $field_options);
$this->assertSame($expected, $result, $description);
}
public function profile_value_data()
{
return array(
array(
'test',
array('field_show_novalue' => true),
'test',
'Field should output the given value',
),
array(
'test',
array('field_show_novalue' => false),
'test',
'Field should output the given value',
),
array(
'',
array('field_show_novalue' => true),
'',
'Field should output nothing for empty value',
),
array(
'',
array('field_show_novalue' => false),
null,
'Field should simply output null for empty vlaue',
),
);
}
/**
* @dataProvider profile_value_data
*/
public function test_get_profile_value($value, $field_options, $expected, $description)
{
$field_options = array_merge($this->field_options, $field_options);
$result = $this->cp->get_profile_value($value, $field_options);
$this->assertSame($expected, $result, $description);
}
public function return_callback_implode()
{
return implode('-', func_get_args());
}
}

@ -0,0 +1,111 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions.php';
class phpbb_profilefield_type_url_test extends phpbb_test_case
{
protected $cp;
protected $field_options;
/**
* Sets up basic test objects
*
* @access public
* @return null
*/
public function setUp()
{
$user = $this->getMock('\phpbb\user');
$user->expects($this->any())
->method('lang')
->will($this->returnCallback(array($this, 'return_callback_implode')));
$request = $this->getMock('\phpbb\request\request');
$template = $this->getMock('\phpbb\template\template');
$this->cp = new \phpbb\profilefields\type\type_url(
$request,
$template,
$user
);
$this->field_options = array(
'field_type' => '\phpbb\profilefields\type\type_url',
'field_name' => 'field',
'field_id' => 1,
'lang_id' => 1,
'lang_name' => 'field',
'field_required' => false,
);
}
public function validate_profile_field_data()
{
return array(
array(
'',
array('field_required' => true),
'FIELD_INVALID_URL-field',
'Field should reject empty field that is required',
),
array(
'invalidURL',
array(),
'FIELD_INVALID_URL-field',
'Field should reject invalid input',
),
array(
'http://onetwothree.example.io',
array(),
false,
'Field should accept valid URL',
),
array(
'http://example.com/index.html?param1=test&param2=awesome',
array(),
false,
'Field should accept valid URL',
),
array(
'http://example.com/index.html/test/path?document=get',
array(),
false,
'Field should accept valid URL',
),
array(
'http://example.com/index.html/test/path?document[]=DocType%20test&document[]=AnotherDoc',
array(),
'FIELD_INVALID_URL-field',
'Field should reject invalid URL having multi value parameters',
),
);
}
/**
* @dataProvider validate_profile_field_data
*/
public function test_validate_profile_field($value, $field_options, $expected, $description)
{
$field_options = array_merge($this->field_options, $field_options);
$result = $this->cp->validate_profile_field($value, $field_options);
$this->assertSame($expected, $result, $description);
}
public function return_callback_implode()
{
return implode('-', func_get_args());
}
}