HEX
Server: Apache
System: Linux s198.coreserver.jp 5.15.0-151-generic #161-Ubuntu SMP Tue Jul 22 14:25:40 UTC 2025 x86_64
User: nagasaki (10062)
PHP: 7.1.33
Disabled: NONE
Upload Files
File: /virtual/nagasaki/public_html/ec/tests/Eccube/Tests/Repository/MemberRepositoryTest.php
<?php

namespace Eccube\Tests\Repository;

use Eccube\Tests\EccubeTestCase;
use Eccube\Application;
use Eccube\Common\Constant;
use Eccube\Entity\Member;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\Util\SecureRandom;
use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface;

/**
 * MemberRepository test cases.
 *
 * @author Kentaro Ohkouchi
 */
class MemberRepositoryTest extends EccubeTestCase
{

    protected $Member;
    public function setUp()
    {
        parent::setUp();
        $this->Member = $this->app['eccube.repository.member']->find(2);
        $Work = $this->app['orm.em']->getRepository('Eccube\Entity\Master\Work')
            ->find(\Eccube\Entity\Master\Work::WORK_ACTIVE_ID);

        for ($i = 0; $i < 3; $i++) {
            $Member = new Member();
            $Member
                ->setLoginId('member-'.$i)
                ->setPassword('password')
                ->setSalt($this->app['eccube.repository.member']->createSalt(5))
                ->setRank($i)
                ->setWork($Work)
                ->setDelFlg(Constant::DISABLED);
            $Member->setPassword($this->app['eccube.repository.member']->encryptPassword($Member));
            $this->app['orm.em']->persist($Member);
        }
        $this->app['orm.em']->flush();
    }

    public function testLoadUserByUsername()
    {
        $this->actual = $this->Member;
        $this->expected = $this->app['eccube.repository.member']->loadUserByUsername('admin');
        $this->verify();
    }

    public function testLoadUserByUsernameWithException()
    {
        $username = 'aaaaa';
        try {
            $Member = $this->app['eccube.repository.member']->loadUserByUsername($username);
            $this->fail();
        } catch (UsernameNotFoundException $e) {
            $this->expected = sprintf('Username "%s" does not exist.', $username);
            $this->actual = $e->getMessage();
        }
        $this->verify();
    }

    /**
     * loadUserByUsername内のgetNullOrSingleResultが正しい値を返却するかを確認する
     * ※getNullOrSingleResultは「NonUniqueResultException」をスローするが >
     * > 同一IDのデーターを投入→取得した際にエラーがでないか確認を行う
     * 投入データーは、同一レコード2件
     * 2件のデータを投入しょうとしているが、本ケースでは、LoginIdがプライマリーキーのために >
     * > 重複データーは作成されない
     * 重複データーが作成されなければ、getNullOrSingleResultは「NonUniqueResultException」を >
     * > スローしないため、重複データーが登録されない事、同一プライマリーをflushしてもエラーが >
     * > 発生しない事を確認
     * 結果としては、一件のレコードをかえされる事を期待
     *
     */
    public function testLoadUserByUsernameSetSameRecord()
    {
        $this->Member = $this->app['eccube.repository.member']->find(2);
        $Work = $this->app['orm.em']->getRepository('Eccube\Entity\Master\Work')
            ->find(\Eccube\Entity\Master\Work::WORK_ACTIVE_ID);

        for ($i = 0; $i < 3; $i++) {
            $Member = new Member();
            $Member
                ->setLoginId('member-1')
                ->setPassword('password')
                ->setSalt($this->app['eccube.repository.member']->createSalt(5))
                ->setRank($i)
                ->setWork($Work)
                ->setDelFlg(Constant::DISABLED);
            $Member->setPassword($this->app['eccube.repository.member']->encryptPassword($Member));
            $this->app['orm.em']->persist($Member);
        }
        $this->app['orm.em']->flush();

        $this->actual = 1;

        $this->expected = count($this->app['eccube.repository.member']->loadUserByUsername('admin'));
        $this->verify();
    }

    public function testRefreshUser()
    {
        $this->expected = $this->Member;
        $this->actual = $this->app['eccube.repository.member']->refreshUser($this->Member);
        $this->verify();
    }

    public function testRefreshUserWithException()
    {
        try {
            $Member = $this->app['eccube.repository.member']->refreshUser(new DummyMember());
            $this->fail();
        } catch (UnsupportedUserException $e) {
            $this->expected = 'Instances of "Eccube\Tests\Repository\DummyMember" are not supported.';
            $this->actual = $e->getMessage();
        }
        $this->verify();
    }

    public function testSupportedClass()
    {
        $this->assertTrue($this->app['eccube.repository.member']->supportsClass(get_class($this->Member)));
    }

    public function testUp()
    {
        $rank = $this->Member->getRank();
        $result = $this->app['eccube.repository.member']->up($this->Member);
        $this->assertTrue($result);

        $this->expected = $rank + 1;
        $this->actual = $this->Member->getRank();
        $this->verify();
    }

    public function testUpWithException()
    {
        $this->Member->setRank(999);
        $this->app['orm.em']->flush();

        $result = $this->app['eccube.repository.member']->up($this->Member);
        $this->assertFalse($result);
    }

    public function testDown()
    {
        $rank = $this->Member->getRank();
        $result = $this->app['eccube.repository.member']->down($this->Member);
        $this->assertTrue($result);

        $this->expected = $rank - 1;
        $this->actual = $this->Member->getRank();
        $this->verify();
    }

    public function testDownWithException()
    {
        $this->Member->setRank(0);
        $this->app['orm.em']->flush();

        $result = $this->app['eccube.repository.member']->down($this->Member);
        $this->assertFalse($result);
    }

    public function testSave()
    {
        $Member = new Member();
        $Member
            ->setLoginId('member-100')
            ->setPassword('password')
            ->setSalt($this->app['eccube.repository.member']->createSalt(5))
            ->setRank(100)
            ->setDelFlg(Constant::DISABLED);
        $Member->setPassword($this->app['eccube.repository.member']->encryptPassword($Member));
        $result = $this->app['eccube.repository.member']->save($Member);
        $this->assertTrue($result);
    }

    public function testSaveWithRankNull()
    {
        $Members = $this->app['eccube.repository.member']->findAll();
        foreach ($Members as $Member) {
            $this->app['orm.em']->remove($Member);
        }
        $this->app['orm.em']->flush();

        $Member = new Member();
        $Member
            ->setLoginId('member-100')
            ->setPassword('password')
            ->setSalt($this->app['eccube.repository.member']->createSalt(5))
            ->setRank(100)
            ->setDelFlg(Constant::DISABLED);
        $Member->setPassword($this->app['eccube.repository.member']->encryptPassword($Member));
        $result = $this->app['eccube.repository.member']->save($Member);
        $this->assertTrue($result);

        $this->expected = 1;
        $this->actual = $Member->getRank();
        $this->verify();
    }


    public function testSaveWithException()
    {
        $Member = new Member(); // 空のインスタンスなので例外になる
        $result = $this->app['eccube.repository.member']->save($Member);
        $this->assertFalse($result);
    }

    public function testDelete()
    {
        $result = $this->app['eccube.repository.member']->delete($this->Member);
        $this->assertTrue($result);

        $this->expected = 1;
        $this->actual = $this->Member->getDelFlg();
        $this->verify();
    }

    public function testDeleteWithException()
    {
        $Member = new Member(); // 空のインスタンスなので例外になる
        $result = $this->app['eccube.repository.member']->delete($Member);
        $this->assertFalse($result);
    }

    public function testCreateSalt()
    {
        $result = $this->app['eccube.repository.member']->createSalt(5);

        $this->expected = 5;
        $this->actual = strlen(pack('H*', ($result))); // PHP5.4以降なら hex2bin が使える
        $this->verify();
    }

    public function testEncryptPassword()
    {
        $Members = $this->app['eccube.repository.member']->findAll();
        $Member = $this->app['eccube.repository.member']->loadUserByUsername('member-2');
        $this->expected = $Member->getPassword();
        $Member->setPassword('password');

        $this->actual = $this->app['eccube.repository.member']->encryptPassword($Member);
        $this->verify();
    }
}

class DummyMember implements UserInterface
{
    public function getRoles()
    {
        return array('ROLE_USER');
    }

    public function getPassword()
    {
        return 'password';
    }
    public function getSalt()
    {
        return 'salt';
    }
    public function getUsername()
    {
        return 'user';
    }
    public function eraseCredentials()
    {
        return;
    }
}