<?php

namespace SilverStripe\RestfulServer\Tests;

use SilverStripe\RestfulServer\RestfulServer;
use SilverStripe\RestfulServer\Tests\Stubs\JSONDataFormatterTypeTestObject;
use SilverStripe\Dev\SapphireTest;
use SilverStripe\RestfulServer\DataFormatter\JSONDataFormatter;

/**
 *
 * @todo Test Relation getters
 * @todo Test filter and limit through GET params
 * @todo Test DELETE verb
 *
 */
class JSONDataFormatterTest extends SapphireTest
{
    protected static $fixture_file = 'JSONDataFormatterTest.yml';

    protected static $extra_dataobjects = [
        JSONDataFormatterTypeTestObject::class,
    ];

    public function testJSONTypes()
    {
        $formatter = new JSONDataFormatter();
        $parent = $this->objFromFixture(JSONDataFormatterTypeTestObject::class, 'parent');
        $json = $formatter->convertDataObject($parent);
        $this->assertMatchesRegularExpression('/"ID":\d+/', $json, 'PK casted to integer');
        $this->assertMatchesRegularExpression(
            '/"Created":"\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}"/',
            $json,
            'Datetime casted to string'
        );
        $this->assertStringContainsString('"Name":"Parent"', $json, 'String casted to string');
        $this->assertStringContainsString('"Active":true', $json, 'Boolean casted to boolean');
        $this->assertStringContainsString('"Sort":17', $json, 'Integer casted to integer');
        $this->assertStringContainsString('"Average":1.2345', $json, 'Float casted to float');
        $this->assertStringContainsString('"ParentID":0', $json, 'Empty FK is 0');

        $child3 = $this->objFromFixture(JSONDataFormatterTypeTestObject::class, 'child3');
        $json = $formatter->convertDataObject($child3);
        $this->assertStringContainsString('"Name":null', $json, 'Empty string is null');
        $this->assertStringContainsString('"Active":false', $json, 'Empty boolean is false');
        $this->assertStringContainsString('"Sort":0', $json, 'Empty integer is 0');
        $this->assertStringContainsString('"Average":0', $json, 'Empty float is 0');
        $this->assertMatchesRegularExpression('/"ParentID":\d+/', $json, 'FK casted to integer');
    }
}