<?php
declare(strict_types=1);

namespace CakeProducts\Test\TestCase\Model\Table;

use Cake\TestSuite\TestCase;
use CakeProducts\Model\Table\ProductsTable;

/**
 * CakeProducts\Model\Table\ProductsTable Test Case
 */
class ProductsTableTest extends TestCase
{
    /**
     * Test subject
     *
     * @var ProductsTable
     */
    protected $Products;

    /**
     * Fixtures
     *
     * @var array<string>
     */
    protected array $fixtures = [
        'plugin.CakeProducts.Products',
        'plugin.CakeProducts.ProductCategories',
    ];

    /**
     * setUp method
     *
     * @return void
     */
    protected function setUp(): void
    {
        parent::setUp();
        $config = $this->getTableLocator()->exists('Products') ? [] : ['className' => ProductsTable::class];
        $this->Products = $this->getTableLocator()->get('Products', $config);
    }

    /**
     * tearDown method
     *
     * @return void
     */
    protected function tearDown(): void
    {
        unset($this->Products);

        parent::tearDown();
    }

    /**
    * TestInitialize method
    *
    * @return void
    * @uses ProductsTable::initialize
    */
    public function testInitialize(): void
    {
        // verify all associations loaded
        $expectedAssociations = [
            'ProductCategories',
        ];
        $associations = $this->Products->associations();

        $this->assertCount(count($expectedAssociations), $associations);
        foreach ($expectedAssociations as $expectedAssociation) {
            $this->assertTrue($this->Products->hasAssociation($expectedAssociation));
        }

        // verify all behaviors loaded
        $expectedBehaviors = [];
        $behaviors = $this->Products->behaviors();

        $this->assertCount(count($expectedBehaviors), $behaviors);
        foreach ($expectedBehaviors as $expectedBehavior) {
            $this->assertTrue($this->Products->hasBehavior($expectedBehavior));
        }
    }

    /**
    * Test validationDefault method
    *
    * @return void
    * @uses ProductsTable::validationDefault
    */
    public function testValidationDefault(): void
    {
        $this->markTestIncomplete('Not implemented yet.');
    }

    /**
    * Test buildRules method
    *
    * @return void
    * @uses ProductsTable::buildRules
    */
    public function testBuildRules(): void
    {
        $this->markTestIncomplete('Not implemented yet.');
    }
}