fix:更新已知bug,优化代码

This commit is contained in:
Ying
2022-11-28 19:11:12 +08:00
parent f6aee95cfc
commit 9445b206a2
1378 changed files with 53759 additions and 20789 deletions

View File

@@ -0,0 +1,246 @@
<?php
namespace Providers;
use GuzzleHttp\Client;
use GuzzleHttp\Handler\MockHandler;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Psr7\Response;
use Overtrue\Socialite\Exceptions\FeiShu\InvalidTicketException;
use Overtrue\Socialite\Exceptions\InvalidTokenException;
use Overtrue\Socialite\Providers\FeiShu;
use PHPUnit\Framework\TestCase;
class FeiShuTest extends TestCase
{
public function testProviderCanCreateCorrect()
{
// one way
$config = [
'app_id' => 'xxxxx',
'app_secret' => 'yyyyy',
'app_mode' => 'internal',
];
$f = new FeiShu($config);
$rf = new \ReflectionObject($f);
$this->assertEquals('xxxxx', $f->getClientId());
$this->assertEquals('yyyyy', $f->getClientSecret());
$rfProperty = $rf->getProperty('isInternalApp');
$rfProperty->setAccessible(true);
$this->assertEquals(true, $rfProperty->getValue($f));
// diff filed way
$config = [
'client_id' => 'xxxxx',
'client_secret' => 'yyyyy',
'mode' => 'internal',
];
$f = new FeiShu($config);
$rf = new \ReflectionObject($f);
$this->assertEquals('xxxxx', $f->getClientId());
$this->assertEquals('yyyyy', $f->getClientSecret());
$rfProperty = $rf->getProperty('isInternalApp');
$rfProperty->setAccessible(true);
$this->assertEquals(true, $rfProperty->getValue($f));
// no mode config way
$config = [
'client_id' => 'xxxxx',
'client_secret' => 'yyyyy',
];
$f = new FeiShu($config);
$rf = new \ReflectionObject($f);
$this->assertEquals('xxxxx', $f->getClientId());
$this->assertEquals('yyyyy', $f->getClientSecret());
$rfProperty = $rf->getProperty('isInternalApp');
$rfProperty->setAccessible(true);
$this->assertEquals(false, $rfProperty->getValue($f));
}
public function testProviderWithInternalAppModeWork()
{
$config = [
'client_id' => 'xxxxx',
'client_secret' => 'yyyyy',
];
$f = new FeiShu($config);
$rf = new \ReflectionObject($f);
$rfProperty = $rf->getProperty('isInternalApp');
$rfProperty->setAccessible(true);
$f->withInternalAppMode();
$this->assertEquals(true, $rfProperty->getValue($f));
$f->withDefaultMode();
$this->assertEquals(false, $rfProperty->getValue($f));
}
public function testProviderWithAppTicketWork()
{
$config = [
'client_id' => 'xxxxx',
'client_secret' => 'yyyyy',
];
$f = new FeiShu($config);
$f->withAppTicket('app_ticket');
$this->assertEquals('app_ticket', $f->getConfig()->get('app_ticket'));
}
public function testConfigAppAccessTokenWithDefaultModeNoAppTicketWork()
{
$config = [
'client_id' => 'xxxxx',
'client_secret' => 'yyyyy',
];
$f = new FeiShu($config);
$fr = new \ReflectionObject($f);
$frClient = $fr->getProperty('httpClient');
$frClient->setAccessible(true);
$ff = new \ReflectionMethod(FeiShu::class, 'configAppAccessToken');
$mock = new MockHandler([
new Response(403, []),
new Response(200, [], \json_encode([
'app_access_token' => 'app_access_token',
])),
]);
$handler = HandlerStack::create($mock);
$client = new Client(['handler' => $handler]);
$frClient->setValue($f, $client);
$ff->setAccessible(true);
// 默认模式下没有 app_ticket
$this->expectException(InvalidTicketException::class);
$ff->invoke($f);
$ff->invoke($f);
$f->withAppTicket('app_ticket');
$this->assertEquals('app_access_token', $f->getConfig()->get('app_access_token'));
$this->expectException(InvalidTokenException::class);
$ff->invoke($f);
}
public function testConfigAppAccessTokenWithDefaultModeAndAppTicketWorkInBadResponse()
{
$config = [
'client_id' => 'xxxxx',
'client_secret' => 'yyyyy',
];
$f = new FeiShu($config);
$fr = new \ReflectionObject($f);
$frClient = $fr->getProperty('httpClient');
$frClient->setAccessible(true);
$ff = new \ReflectionMethod(FeiShu::class, 'configAppAccessToken');
$mock = new MockHandler([
new Response(200, [], '{}'),
]);
$handler = HandlerStack::create($mock);
$client = new Client(['handler' => $handler]);
$frClient->setValue($f, $client);
$ff->setAccessible(true);
$this->expectException(InvalidTokenException::class);
$ff->invoke($f->withAppTicket('app_ticket'));
}
public function testConfigAppAccessTokenWithDefaultModeAndAppTicketWorkInGoodResponse()
{
$config = [
'client_id' => 'xxxxx',
'client_secret' => 'yyyyy',
];
$f = new FeiShu($config);
$fr = new \ReflectionObject($f);
$frClient = $fr->getProperty('httpClient');
$frClient->setAccessible(true);
$ff = new \ReflectionMethod(FeiShu::class, 'configAppAccessToken');
$mock = new MockHandler([
new Response(200, [], \json_encode([
'app_access_token' => 'app_access_token',
])),
]);
$handler = HandlerStack::create($mock);
$client = new Client(['handler' => $handler]);
$frClient->setValue($f, $client);
$ff->setAccessible(true);
$this->assertEquals(null, $f->getConfig()->get('app_access_token'));
$ff->invoke($f->withAppTicket('app_ticket'));
$this->assertEquals('app_access_token', $f->getConfig()->get('app_access_token'));
}
public function testConfigAppAccessTokenWithInternalInBadResponse()
{
$config = [
'client_id' => 'xxxxx',
'client_secret' => 'yyyyy',
'mode' => 'internal',
];
$f = new FeiShu($config);
$fr = new \ReflectionObject($f);
$frClient = $fr->getProperty('httpClient');
$frClient->setAccessible(true);
$ff = new \ReflectionMethod(FeiShu::class, 'configAppAccessToken');
$mock = new MockHandler([
new Response(200, [], '{}'),
]);
$handler = HandlerStack::create($mock);
$client = new Client(['handler' => $handler]);
$frClient->setValue($f, $client);
$ff->setAccessible(true);
$this->expectException(InvalidTokenException::class);
$ff->invoke($f);
}
public function testConfigAppAccessTokenWithInternalInGoodResponse()
{
$config = [
'client_id' => 'xxxxx',
'client_secret' => 'yyyyy',
'mode' => 'internal',
];
$f = new FeiShu($config);
$fr = new \ReflectionObject($f);
$frClient = $fr->getProperty('httpClient');
$frClient->setAccessible(true);
$ff = new \ReflectionMethod(FeiShu::class, 'configAppAccessToken');
$mock = new MockHandler([
new Response(200, [], \json_encode([
'app_access_token' => 'app_access_token',
])),
]);
$handler = HandlerStack::create($mock);
$client = new Client(['handler' => $handler]);
$frClient->setValue($f, $client);
$ff->setAccessible(true);
$this->assertEquals(null, $f->getConfig()->get('app_access_token'));
$ff->invoke($f);
$this->assertEquals('app_access_token', $f->getConfig()->get('app_access_token'));
}
}

View File

@@ -1,60 +0,0 @@
<?php
/*
* This file is part of the overtrue/socialite.
*
* (c) overtrue <i@overtrue.me>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
use Overtrue\Socialite\Providers\WeWorkProvider;
use PHPUnit\Framework\TestCase;
use Symfony\Component\HttpFoundation\Request;
class WeWorkProviderTest extends TestCase
{
public function testQrConnect()
{
$response = (new WeWorkProvider(Request::create('foo'), [
'client_id' => 'ww100000a5f2191',
'client_secret' => 'client_secret',
'redirect' => 'http://www.oa.com',
]))
->setAgentId('1000000')
->stateless()
->redirect();
$this->assertSame('https://open.work.weixin.qq.com/wwopen/sso/qrConnect?appid=ww100000a5f2191&agentid=1000000&redirect_uri=http%3A%2F%2Fwww.oa.com', $response->getTargetUrl());
}
public function testOAuthWithAgentId()
{
$response = (new WeWorkProvider(Request::create('foo'), [
'client_id' => 'CORPID',
'client_secret' => 'client_secret',
'redirect' => 'REDIRECT_URI',
]))
->scopes(['snsapi_base'])
->setAgentId('1000000')
->stateless()
->redirect();
$this->assertSame('https://open.weixin.qq.com/connect/oauth2/authorize?appid=CORPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&agentid=1000000#wechat_redirect', $response->getTargetUrl());
}
public function testOAuthWithoutAgentId()
{
$response = (new WeWorkProvider(Request::create('foo'), [
'client_id' => 'CORPID',
'client_secret' => 'client_secret',
'redirect' => 'REDIRECT_URI',
]))
->scopes(['snsapi_base'])
->stateless()
->redirect();
$this->assertSame('https://open.weixin.qq.com/connect/oauth2/authorize?appid=CORPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base#wechat_redirect', $response->getTargetUrl());
}
}

View File

@@ -0,0 +1,20 @@
<?php
use Overtrue\Socialite\Providers\WeWork;
use PHPUnit\Framework\TestCase;
class WeWorkTest extends TestCase
{
public function testOAuthUrl()
{
$response = (new WeWork([
'client_id' => 'CORPID',
'client_secret' => 'client_secret',
'redirect' => 'REDIRECT_URI',
]))
->scopes(['snsapi_base'])
->redirect();
$this->assertSame('https://open.weixin.qq.com/connect/oauth2/authorize?appid=CORPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base#wechat_redirect', $response);
}
}

View File

@@ -0,0 +1,120 @@
<?php
use Overtrue\Socialite\Providers\WeChat;
use PHPUnit\Framework\TestCase;
// here we need loaded the symbols first.
\class_exists(\Overtrue\Socialite\Contracts\FactoryInterface::class);
class WechatTest extends TestCase
{
public function testWeChatProviderHasCorrectlyRedirectResponse()
{
$response = (new WeChat([
'client_id' => 'client_id',
'client_secret' => 'client_secret',
'redirect_url' => 'http://localhost/socialite/callback.php',
]))->redirect();
$this->assertStringStartsWith('https://open.weixin.qq.com/connect/qrconnect', $response);
$this->assertMatchesRegularExpression('/redirect_uri=http%3A%2F%2Flocalhost%2Fsocialite%2Fcallback.php/', $response);
}
public function testWeChatProviderTokenUrlAndRequestFields()
{
$provider = new WeChat([
'client_id' => 'client_id',
'client_secret' => 'client_secret',
'redirect_url' => 'http://localhost/socialite/callback.php',
]);
$getTokenUrl = new ReflectionMethod(WeChat::class, 'getTokenUrl');
$getTokenUrl->setAccessible(true);
$getTokenFields = new ReflectionMethod(WeChat::class, 'getTokenFields');
$getTokenFields->setAccessible(true);
$getCodeFields = new ReflectionMethod(WeChat::class, 'getCodeFields');
$getCodeFields->setAccessible(true);
$this->assertSame('https://api.weixin.qq.com/sns/oauth2/access_token', $getTokenUrl->invoke($provider));
$this->assertSame([
'appid' => 'client_id',
'secret' => 'client_secret',
'code' => 'iloveyou',
'grant_type' => 'authorization_code',
], $getTokenFields->invoke($provider, 'iloveyou'));
$this->assertSame([
'appid' => 'client_id',
'redirect_uri' => 'http://localhost/socialite/callback.php',
'response_type' => 'code',
'scope' => 'snsapi_login',
'state' => 'wechat-state',
'connect_redirect' => 1,
], $getCodeFields->invoke($provider->withState('wechat-state')));
}
public function testOpenPlatformComponent()
{
$provider = new WeChat([
'client_id' => 'client_id',
'client_secret' => null,
'redirect' => 'redirect-url',
'component' => [
'id' => 'component-app-id',
'token' => 'token',
],
]);
$getTokenUrl = new ReflectionMethod(WeChat::class, 'getTokenUrl');
$getTokenUrl->setAccessible(true);
$getTokenFields = new ReflectionMethod(WeChat::class, 'getTokenFields');
$getTokenFields->setAccessible(true);
$getCodeFields = new ReflectionMethod(WeChat::class, 'getCodeFields');
$getCodeFields->setAccessible(true);
$this->assertSame([
'appid' => 'client_id',
'redirect_uri' => 'redirect-url',
'response_type' => 'code',
'scope' => 'snsapi_base',
'state' => 'state',
'connect_redirect' => 1,
'component_appid' => 'component-app-id',
], $getCodeFields->invoke($provider->withState('state')));
$this->assertSame([
'appid' => 'client_id',
'component_appid' => 'component-app-id',
'component_access_token' => 'token',
'code' => 'simcode',
'grant_type' => 'authorization_code',
], $getTokenFields->invoke($provider, 'simcode'));
$this->assertSame('https://api.weixin.qq.com/sns/oauth2/component/access_token', $getTokenUrl->invoke($provider));
}
public function testOpenPlatformComponentWithCustomParameters()
{
$provider = new WeChat([
'client_id' => 'client_id',
'client_secret' => null,
'redirect' => 'redirect-url',
'component' => [
'id' => 'component-app-id',
'token' => 'token',
],
]);
$getCodeFields = new ReflectionMethod(WeChat::class, 'getCodeFields');
$getCodeFields->setAccessible(true);
$provider->with(['foo' => 'bar']);
$fields = $getCodeFields->invoke($provider->withState('wechat-state'));
$this->assertArrayHasKey('foo', $fields);
$this->assertSame('bar', $fields['foo']);
}
}