mirror of
https://github.com/silverstripe/silverstripe-restfulserver
synced 2024-10-22 14:05:58 +02:00
FIX Make sure the href
attribute is constructed correctly when trailing slash is used
Prior to the fix, when trailing slash is enabled the url output is incorrect; the second test fails because the href output contains: `/api/v1/SilverStripe-ORM-DataObject/1/.xml`.
This commit is contained in:
parent
3a3fd02367
commit
4acfe9d1d8
@ -117,9 +117,9 @@ class XMLDataFormatter extends DataFormatter
|
||||
{
|
||||
$className = $this->sanitiseClassName(get_class($obj));
|
||||
$id = $obj->ID;
|
||||
$objHref = Director::absoluteURL($this->config()->api_base . "$className/$obj->ID");
|
||||
$objHref = Director::absoluteURL($this->config()->api_base . "$className/$obj->ID" . ".xml");
|
||||
|
||||
$xml = "<$className href=\"$objHref.xml\">\n";
|
||||
$xml = "<$className href=\"$objHref\">\n";
|
||||
foreach ($this->getFieldsForObj($obj) as $fieldName => $fieldType) {
|
||||
// Field filtering
|
||||
if ($fields && !in_array($fieldName, $fields ?? [])) {
|
||||
|
@ -5,6 +5,8 @@ namespace SilverStripe\RestfulServer\Tests;
|
||||
use SilverStripe\Dev\SapphireTest;
|
||||
use SilverStripe\RestfulServer\DataFormatter\XMLDataFormatter;
|
||||
use Exception;
|
||||
use SilverStripe\Control\Controller;
|
||||
use SilverStripe\ORM\DataObject;
|
||||
|
||||
class XMLDataFormatterTest extends SapphireTest
|
||||
{
|
||||
@ -74,4 +76,71 @@ XML
|
||||
$formatter = new XMLDataFormatter();
|
||||
$formatter->convertStringToArray($inputXML);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests wrapper output of {@link XMLDataFormatter::convertDataObjectWithoutHeader()}
|
||||
*/
|
||||
public function testConvertDataObjectWithoutHeaderClassNameAttribute(): void
|
||||
{
|
||||
// Create a mock object
|
||||
$mock = DataObject::create();
|
||||
$mock->ID = 1;
|
||||
|
||||
// Disable trailing slash by default
|
||||
Controller::config()->set('add_trailing_slash', false);
|
||||
|
||||
// Create a formatter
|
||||
$formatter = new XMLDataFormatter();
|
||||
|
||||
// Test the output
|
||||
$expectedClass = 'SilverStripe-ORM-DataObject';
|
||||
$expectedHref = sprintf('http://localhost/api/v1/%s/%d.xml', $expectedClass, $mock->ID);
|
||||
$expectedOutput = sprintf(
|
||||
'<%s href="%s"><ID>%d</ID></%s>',
|
||||
$expectedClass,
|
||||
$expectedHref,
|
||||
$mock->ID,
|
||||
$expectedClass
|
||||
);
|
||||
|
||||
$actualOutput = $formatter->convertDataObjectWithoutHeader($mock);
|
||||
|
||||
// remove line breaks and compare
|
||||
$actualOutput = str_replace(["\n", "\r"], '', $actualOutput);
|
||||
$this->assertEquals($expectedOutput, $actualOutput);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests wrapper output of {@link XMLDataFormatter::convertDataObjectWithoutHeader()} when
|
||||
* used with a forced trailing slash
|
||||
*/
|
||||
public function testConvertDataObjectWithoutHeaderClassNameAttributeWithTrailingSlash(): void
|
||||
{
|
||||
// Create a mock object
|
||||
$mock = DataObject::create();
|
||||
$mock->ID = 1;
|
||||
|
||||
// Enable trailing slash by default
|
||||
Controller::config()->set('add_trailing_slash', true);
|
||||
|
||||
// Create a formatter
|
||||
$formatter = new XMLDataFormatter();
|
||||
|
||||
// Test the output
|
||||
$expectedClass = 'SilverStripe-ORM-DataObject';
|
||||
$expectedHref = sprintf('http://localhost/api/v1/%s/%d.xml', $expectedClass, $mock->ID);
|
||||
$expectedOutput = sprintf(
|
||||
'<%s href="%s"><ID>%d</ID></%s>',
|
||||
$expectedClass,
|
||||
$expectedHref,
|
||||
$mock->ID,
|
||||
$expectedClass
|
||||
);
|
||||
|
||||
$actualOutput = $formatter->convertDataObjectWithoutHeader($mock);
|
||||
|
||||
// remove line breaks and compare
|
||||
$actualOutput = str_replace(["\n", "\r"], '', $actualOutput);
|
||||
$this->assertEquals($expectedOutput, $actualOutput);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user