<?php

namespace SilverStripe\ORM\Tests\Search;

use SilverStripe\Assets\File;
use SilverStripe\ORM\Connect\MySQLSchemaManager;
use SilverStripe\Core\Config\Config;
use SilverStripe\Dev\SapphireTest;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\Search\FulltextSearchable;

class FulltextSearchableTest extends SapphireTest
{

    protected function setUp()
    {
        parent::setUp();

        FulltextSearchable::enable(File::class);
    }

    /**
     * FulltextSearchable::enable() leaves behind remains that don't get cleaned up
     * properly at the end of the test. This becomes apparent when a later test tries to
     * ALTER TABLE File and add fulltext indexes with the InnoDB table type.
     */
    protected function tearDown()
    {
        parent::tearDown();

        File::remove_extension(FulltextSearchable::class);
        Config::modify()->merge(
            File::class,
            'create_table_options',
            [
            MySQLSchemaManager::ID => 'ENGINE=InnoDB']
        );
    }

    public function testEnable()
    {
        $this->assertTrue(File::has_extension(FulltextSearchable::class));
    }

    public function testEnableWithCustomClasses()
    {
        FulltextSearchable::enable([File::class]);
        $this->assertTrue(File::has_extension(FulltextSearchable::class));

        File::remove_extension(FulltextSearchable::class);
        $this->assertFalse(File::has_extension(FulltextSearchable::class));
    }

    public function testIndexesAdded()
    {
        $indexes = DataObject::getSchema()->databaseIndexes(File::class);
        $this->assertArrayHasKey('SearchFields', $indexes);
        $this->assertCount(2, $indexes['SearchFields']['columns']);
        $this->assertContains('Name', $indexes['SearchFields']['columns']);
        $this->assertContains('Title', $indexes['SearchFields']['columns']);
    }
}