Some automatic tests for server-side customfields

This commit is contained in:
nathan 2023-10-23 14:21:59 -06:00
parent 9c1dd164a1
commit fb32fbf819
2 changed files with 224 additions and 0 deletions

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE overlay PUBLIC "-//EGroupware GmbH//eTemplate 2.0//EN" "https://www.egroupware.org/etemplate2.0.dtd">
<!-- This template is used in automated testing -->
<overlay>
<template id="api.customfields_test" template="test" lang="" group="0" version="16.1">
<customfields-list id="widget" private="@private"></customfields-list>
</template>
</overlay>

View File

@ -0,0 +1,216 @@
<?php
/**
* Test for Customfields widget
*
* @link http://www.egroupware.org
* @author Nathan Gray
* @package api
* @subpackage etemplate
* @copyright (c) 2017 Nathan Gray
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
*/
namespace EGroupware\Api\Etemplate\Widget;
require_once realpath(__DIR__ . '/../WidgetBaseTest.php');
use EGroupware\Api\Etemplate;
class CustomfieldsTest extends \EGroupware\Api\Etemplate\WidgetBaseTest
{
const TEST_TEMPLATE = 'api.customfields_test';
/**
* Mocked customfields used throughout.
*/
const cf_list = [
'text' => array(
'id' => '1',
'app' => 'infolog',
'name' => 'text',
'label' => 'text',
'type' => 'text',
'needed' => false,
'private' => [],
),
'required' => array(
'id' => '2',
'app' => 'infolog',
'name' => 'required',
'label' => 'required',
'type' => 'text',
'needed' => true,
'private' => [],
),
'private' => array(
'id' => '3',
'app' => 'infolog',
'name' => 'private',
'label' => 'private',
'type' => 'text',
'needed' => false,
'private' => ['-1'],
),
'type_limited' => array(
'id' => '4',
'app' => 'infolog',
'name' => 'type_limited',
'label' => 'type limited',
'type' => 'text',
'type2' => ['subtype'],
'needed' => false,
)
];
/**
* Test the widget's basic functionality - we put data in, it comes back
* unchanged.
*
* @dataProvider validProvider
*/
public function testBasic($content)
{
// Instanciate the template
$etemplate = new Etemplate();
$etemplate->read(static::TEST_TEMPLATE, 'test');
// Set CFs
$etemplate->setElementAttribute('widget', 'customfields', self::cf_list);
// Send it around
$result = $this->mockedRoundTrip($etemplate, array('widget' => $content));
// Test it
$this->validateTest($result, array('widget' => $content));
}
/**
* Test that the widget does not return a value if readonly
*
* @dataProvider validProvider
*
* It's the client that removes them here, so we can't really test without.
*
* public function testReadonly($content)
* {
* // Instanciate the template
* $etemplate = new Etemplate();
* $etemplate->read(static::TEST_TEMPLATE, 'test');
*
* // Set CFs
* $etemplate->setElementAttribute('widget', 'customfields', self::cf_list);
*
* // Exec
* $result = $this->mockedRoundTrip($etemplate, ['widget' => $content], array(), array('widget' => true));
*
* // Check
* $this->assertEquals(array(), $result);
* }
*/
/**
* @dataProvider validProvider
* @return void
* @throws \Exception
*/
public function testPrivateFilter($content)
{
// Instanciate the template
$etemplate = new Etemplate();
$etemplate->read(static::TEST_TEMPLATE, 'test');
// Set CFs
$etemplate->setElementAttribute('widget', 'customfields', self::cf_list);
// Exec
$result = $this->mockedRoundTrip($etemplate, ['private' => true, 'widget' => $content]);
// Check for only the private field
$this->assertSame(['widget' => ['#private' => 'private']], $result);
// Now the opposite, only non-private
unset($content['#private']);
// Exec
$etemplate->setElementAttribute('widget', 'customfields', self::cf_list);
$result = $this->mockedRoundTrip($etemplate, ['private' => '0', 'widget' => $content]);
// Check for all but the private field
$this->assertSame(['widget' => $content], $result);
}
/**
* Check field filtering
*
* @param type $content
* @param type $validation_errors
*
* @dataProvider fieldFilterProvider
*/
public function testFieldFilter($content, $fields, $expected)
{
// Instanciate the template
$etemplate = new Etemplate();
$etemplate->read(static::TEST_TEMPLATE, 'test');
// Set CFs
$etemplate->setElementAttribute('widget', 'customfields', self::cf_list);
// Filter
$etemplate->setElementAttribute('widget', 'fields', $fields);
$content = array('widget' => $content);
$result = $this->mockedExec($etemplate, $content);
// Check for the load
$data = array();
foreach($result as $command)
{
if($command['type'] == 'et2_load')
{
$data = $command['data'];
break;
}
}
// Make sure we're sending what is expected
$this->assertContains(key($expected), array_keys($data['data']['content']['widget']), "Filtered field missing");
$this->assertEquals(current($expected), $data['data']['content']['widget'][key($expected)], "Filtered field's value missing");
}
/**
* These are all valid, since fields are all text.
* The individual widgets to their own type validation.
*/
public static function validProvider()
{
return array(
[['#text' => 'text', '#required' => 'required', '#private' => 'private', '#type_limited' => 'type_limited']]
);
}
/**
* Check filtering each field individually, then filtering to allow all fields
*/
public function fieldFilterProvider()
{
$field_values = CustomfieldsTest::validProvider()[0][0];
$field_filters = array();
foreach(CustomfieldsTest::cf_list as $field_name => $field)
{
$field_filters[] = array(
$field_values,
$field_name,
['#' . $field_name => $field_values['#' . $field_name]]
);
}
$field_filters[] = array(
$field_values,
array_keys(CustomfieldsTest::cf_list),
$field_values
);
return $field_filters;
}
}