<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
declare(strict_types=1);

namespace Magento\Customer\Block\Form;

use Magento\Framework\ObjectManagerInterface;
use Magento\Framework\View\LayoutInterface;
use Magento\Framework\View\Element\ButtonLockManager;
use Magento\TestFramework\Helper\Bootstrap;
use Magento\TestFramework\Helper\Xpath;
use PHPUnit\Framework\TestCase;

/**
 * Class checks login form view
 *
 * @magentoAppArea frontend
 */
class LoginTest extends TestCase
{
    private const EMAIL_LABEL_XPATH = "//label[@for='email']/span[contains(text(), 'Email')]";
    private const PASSWORD_LABEL_XPATH = "//label[@for='pass' ]/span[contains(text(), 'Password')]";
    private const EMAIL_INPUT_XPATH = "//input[@name ='login[username]' and contains(@data-validate,'required:true')"
    . "and contains(@data-validate, \"'validate-email':true\")]";
    private const PASSWORD_INPUT_XPATH = "//input[@name='login[password]'"
    . "and contains(@data-validate,'required:true')]";
    private const SIGN_IN_BUTTON_XPATH = "//button[@type='submit']/span[contains(text(), 'Sign In')]";
    private const FORGOT_PASSWORD_LINK_PATH = "//a[contains(@href, 'customer/account/forgotpassword')]"
    . "/span[contains(text(), 'Forgot Your Password?')] ";

    /** @var ObjectManagerInterface */
    private $objectManager;

    /** @var LayoutInterface */
    private $layout;

    /** @var Login */
    private $block;

    /**
     * @inheritdoc
     */
    protected function setUp(): void
    {
        $this->objectManager = Bootstrap::getObjectManager();
        $this->layout = $this->objectManager->get(LayoutInterface::class);

        $code = 'customer_login_form_submit';
        $buttonLock = $this->getMockBuilder(\Magento\ReCaptchaUi\Model\ButtonLock::class)
            ->disableOriginalConstructor()
            ->disableAutoload()
            ->onlyMethods(['isDisabled', 'getCode'])
            ->getMock();
        $buttonLock->expects($this->any())->method('getCode')->willReturn($code);
        $buttonLock->expects($this->any())->method('isDisabled')->willReturn(false);
        $buttonLockManager = $this->objectManager->create(
            ButtonLockManager::class,
            ['buttonLockPool' => [$code => $buttonLock]]
        );

        $this->block = $this->layout->createBlock(Login::class);
        $this->block->setTemplate('Magento_Customer::form/login.phtml');
        $this->block->setButtonLockManager($buttonLockManager);

        parent::setUp();
    }

    /**
     * @return void
     */
    public function testLoginForm(): void
    {
        $result = $this->block->toHtml();
        $this->assertEquals(
            1,
            Xpath::getElementsCountForXpath(self::EMAIL_LABEL_XPATH, $result),
            'Email label does not exist on the page'
        );
        $this->assertEquals(
            1,
            Xpath::getElementsCountForXpath(self::PASSWORD_LABEL_XPATH, $result),
            'Password label does not exist on the page'
        );
        $this->assertEquals(
            1,
            Xpath::getElementsCountForXpath(self::EMAIL_INPUT_XPATH, $result),
            'Email input does not exist on the page'
        );
        $this->assertEquals(
            1,
            Xpath::getElementsCountForXpath(self::PASSWORD_INPUT_XPATH, $result),
            'Password input does not exist on the page'
        );
        $this->assertEquals(
            1,
            Xpath::getElementsCountForXpath(self::SIGN_IN_BUTTON_XPATH, $result),
            'Sign in button does not exist on the page'
        );
        $this->assertEquals(
            1,
            Xpath::getElementsCountForXpath(self::FORGOT_PASSWORD_LINK_PATH, $result),
            'Forgot password link does not exist on the page'
        );
    }

    /**
     * @magentoConfigFixture current_store customer/password/autocomplete_on_storefront 1
     *
     * @return void
     */
    public function testAutocompletePasswordEnabled(): void
    {
        $this->assertFalse($this->block->isAutocompleteDisabled());
    }

    /**
     * @magentoConfigFixture current_store customer/password/autocomplete_on_storefront 0
     *
     * @return void
     */
    public function testAutocompletePasswordDisabled(): void
    {
        $this->assertTrue($this->block->isAutocompleteDisabled());
    }
}
