Files
framework/tests/CookieTest.php
2026-01-06 12:44:28 +08:00

347 lines
11 KiB
PHP

<?php
namespace think\tests;
use DateTime;
use Mockery as m;
use Mockery\MockInterface;
use PHPUnit\Framework\TestCase;
use think\Config;
use think\Cookie;
use think\Request;
class CookieTest extends TestCase
{
/** @var Cookie */
protected $cookie;
/** @var Request|MockInterface */
protected $request;
/** @var Config|MockInterface */
protected $config;
protected function setUp(): void
{
$this->request = m::mock(Request::class);
$this->config = m::mock(Config::class);
$this->cookie = new Cookie($this->request, [
'expire' => 3600,
'path' => '/',
'domain' => 'test.com',
'secure' => false,
'httponly' => true,
'samesite' => 'lax'
]);
}
protected function tearDown(): void
{
m::close();
}
public function testMakeMethod()
{
$this->config->shouldReceive('get')
->with('cookie')
->andReturn(['expire' => 7200]);
$cookie = Cookie::__make($this->request, $this->config);
$this->assertInstanceOf(Cookie::class, $cookie);
}
public function testGet()
{
$this->request->shouldReceive('cookie')
->with('test_cookie', 'default')
->andReturn('cookie_value');
$result = $this->cookie->get('test_cookie', 'default');
$this->assertEquals('cookie_value', $result);
}
public function testGetAll()
{
$this->request->shouldReceive('cookie')
->with('', null)
->andReturn(['cookie1' => 'value1', 'cookie2' => 'value2']);
$result = $this->cookie->get();
$this->assertEquals(['cookie1' => 'value1', 'cookie2' => 'value2'], $result);
}
public function testHas()
{
$this->request->shouldReceive('has')
->with('test_cookie', 'cookie')
->andReturn(true);
$result = $this->cookie->has('test_cookie');
$this->assertTrue($result);
}
public function testHasReturnsFalse()
{
$this->request->shouldReceive('has')
->with('nonexistent_cookie', 'cookie')
->andReturn(false);
$result = $this->cookie->has('nonexistent_cookie');
$this->assertFalse($result);
}
public function testSetBasic()
{
$this->request->shouldReceive('setCookie')
->with('test_cookie', 'test_value');
$this->cookie->set('test_cookie', 'test_value');
$cookies = $this->cookie->getCookie();
$this->assertArrayHasKey('test_cookie', $cookies);
$this->assertEquals('test_value', $cookies['test_cookie'][0]);
}
public function testSetWithNumericExpire()
{
$this->request->shouldReceive('setCookie')
->with('test_cookie', 'test_value');
$this->cookie->set('test_cookie', 'test_value', 7200);
$cookies = $this->cookie->getCookie();
$this->assertArrayHasKey('test_cookie', $cookies);
$this->assertGreaterThan(time(), $cookies['test_cookie'][1]);
}
public function testSetWithDateTimeExpire()
{
$expire = new DateTime('+1 hour');
$this->request->shouldReceive('setCookie')
->with('test_cookie', 'test_value');
$this->cookie->set('test_cookie', 'test_value', $expire);
$cookies = $this->cookie->getCookie();
$this->assertEquals($expire->getTimestamp(), $cookies['test_cookie'][1]);
}
public function testSetWithArrayOptions()
{
$options = [
'expire' => 1800,
'path' => '/test',
'domain' => 'example.com',
'secure' => true,
'httponly' => false,
'samesite' => 'strict'
];
$this->request->shouldReceive('setCookie')
->with('test_cookie', 'test_value');
$this->cookie->set('test_cookie', 'test_value', $options);
$cookies = $this->cookie->getCookie();
$cookieData = $cookies['test_cookie'];
$this->assertEquals('test_value', $cookieData[0]);
$this->assertGreaterThan(time(), $cookieData[1]);
$this->assertEquals('/test', $cookieData[2]['path']);
$this->assertEquals('example.com', $cookieData[2]['domain']);
$this->assertTrue($cookieData[2]['secure']);
$this->assertFalse($cookieData[2]['httponly']);
$this->assertEquals('strict', $cookieData[2]['samesite']);
}
public function testSetWithDateTimeInOptions()
{
$expire = new DateTime('+2 hours');
$options = ['expire' => $expire];
$this->request->shouldReceive('setCookie')
->with('test_cookie', 'test_value');
$this->cookie->set('test_cookie', 'test_value', $options);
$cookies = $this->cookie->getCookie();
$this->assertEquals($expire->getTimestamp(), $cookies['test_cookie'][1]);
}
public function testForever()
{
$this->request->shouldReceive('setCookie')
->with('forever_cookie', 'forever_value');
$this->cookie->forever('forever_cookie', 'forever_value');
$cookies = $this->cookie->getCookie();
$this->assertArrayHasKey('forever_cookie', $cookies);
$this->assertEquals('forever_value', $cookies['forever_cookie'][0]);
$this->assertGreaterThan(time() + 315360000 - 10, $cookies['forever_cookie'][1]);
}
public function testForeverWithOptions()
{
$options = ['path' => '/forever', 'secure' => true];
$this->request->shouldReceive('setCookie')
->with('forever_cookie', 'forever_value');
$this->cookie->forever('forever_cookie', 'forever_value', $options);
$cookies = $this->cookie->getCookie();
$cookieData = $cookies['forever_cookie'];
$this->assertEquals('/forever', $cookieData[2]['path']);
$this->assertTrue($cookieData[2]['secure']);
$this->assertGreaterThan(time() + 315360000 - 10, $cookieData[1]);
}
public function testForeverWithNullOptions()
{
$this->request->shouldReceive('setCookie')
->with('forever_cookie', 'forever_value');
$this->cookie->forever('forever_cookie', 'forever_value', null);
$cookies = $this->cookie->getCookie();
$this->assertArrayHasKey('forever_cookie', $cookies);
}
public function testForeverWithNumericOptions()
{
$this->request->shouldReceive('setCookie')
->with('forever_cookie', 'forever_value');
$this->cookie->forever('forever_cookie', 'forever_value', 123);
$cookies = $this->cookie->getCookie();
$this->assertArrayHasKey('forever_cookie', $cookies);
}
public function testDelete()
{
$this->request->shouldReceive('setCookie')
->with('test_cookie', null);
$this->cookie->delete('test_cookie');
$cookies = $this->cookie->getCookie();
$this->assertArrayHasKey('test_cookie', $cookies);
$this->assertEquals('', $cookies['test_cookie'][0]);
$this->assertLessThan(time(), $cookies['test_cookie'][1]);
}
public function testDeleteWithOptions()
{
$options = ['path' => '/test', 'domain' => 'example.com'];
$this->request->shouldReceive('setCookie')
->with('test_cookie', null);
$this->cookie->delete('test_cookie', $options);
$cookies = $this->cookie->getCookie();
$cookieData = $cookies['test_cookie'];
$this->assertEquals('', $cookieData[0]);
$this->assertEquals('/test', $cookieData[2]['path']);
$this->assertEquals('example.com', $cookieData[2]['domain']);
}
public function testGetCookie()
{
$this->request->shouldReceive('setCookie')
->with('cookie1', 'value1');
$this->request->shouldReceive('setCookie')
->with('cookie2', 'value2');
$this->cookie->set('cookie1', 'value1');
$this->cookie->set('cookie2', 'value2');
$cookies = $this->cookie->getCookie();
$this->assertArrayHasKey('cookie1', $cookies);
$this->assertArrayHasKey('cookie2', $cookies);
$this->assertEquals('value1', $cookies['cookie1'][0]);
$this->assertEquals('value2', $cookies['cookie2'][0]);
}
public function testSave()
{
// Mock the protected saveCookie method by extending the class
$cookie = new class($this->request) extends Cookie {
public $savedCookies = [];
protected function saveCookie(string $name, string $value, int $expire, string $path, string $domain, bool $secure, bool $httponly, string $samesite): void
{
$this->savedCookies[] = [
'name' => $name,
'value' => $value,
'expire' => $expire,
'path' => $path,
'domain' => $domain,
'secure' => $secure,
'httponly' => $httponly,
'samesite' => $samesite,
];
}
};
$this->request->shouldReceive('setCookie')
->with('test_cookie', 'test_value');
$cookie->set('test_cookie', 'test_value');
$cookie->save();
$this->assertCount(1, $cookie->savedCookies);
$this->assertEquals('test_cookie', $cookie->savedCookies[0]['name']);
$this->assertEquals('test_value', $cookie->savedCookies[0]['value']);
}
public function testCaseInsensitiveConfig()
{
$cookie = new Cookie($this->request, [
'EXPIRE' => 1800,
'PATH' => '/test',
'DOMAIN' => 'TEST.COM'
]);
$this->request->shouldReceive('setCookie')
->with('test_cookie', 'test_value');
$cookie->set('test_cookie', 'test_value');
$cookies = $cookie->getCookie();
$cookieData = $cookies['test_cookie'];
$this->assertEquals('/test', $cookieData[2]['path']);
$this->assertEquals('TEST.COM', $cookieData[2]['domain']);
}
public function testDefaultConfig()
{
$cookie = new Cookie($this->request);
$this->request->shouldReceive('setCookie')
->with('test_cookie', 'test_value');
$cookie->set('test_cookie', 'test_value');
$cookies = $cookie->getCookie();
$cookieData = $cookies['test_cookie'];
$this->assertEquals('/', $cookieData[2]['path']);
$this->assertEquals('', $cookieData[2]['domain']);
$this->assertFalse($cookieData[2]['secure']);
$this->assertFalse($cookieData[2]['httponly']);
}
}