first commit
This commit is contained in:
commit
c08202d8cf
2
.gitattributes
vendored
Normal file
2
.gitattributes
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
/tests export-ignore
|
||||
/.github export-ignore
|
25
.github/workflows/release.yml
vendored
Normal file
25
.github/workflows/release.yml
vendored
Normal file
|
@ -0,0 +1,25 @@
|
|||
on:
|
||||
push:
|
||||
# Sequence of patterns matched against refs/tags
|
||||
tags:
|
||||
- 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10
|
||||
|
||||
name: Release
|
||||
|
||||
jobs:
|
||||
release:
|
||||
name: Release
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v2
|
||||
- name: Create Release
|
||||
id: create_release
|
||||
uses: actions/create-release@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
tag_name: ${{ github.ref }}
|
||||
release_name: Release ${{ github.ref }}
|
||||
draft: false
|
||||
prerelease: false
|
73
.github/workflows/test.yml
vendored
Normal file
73
.github/workflows/test.yml
vendored
Normal file
|
@ -0,0 +1,73 @@
|
|||
name: PHPUnit
|
||||
|
||||
on: [ push, pull_request ]
|
||||
|
||||
env:
|
||||
SWOOLE_VERSION: '4.8.10'
|
||||
SWOW_VERSION: 'develop'
|
||||
|
||||
jobs:
|
||||
ci:
|
||||
name: Test PHP ${{ matrix.php-version }} on ${{ matrix.engine }}
|
||||
runs-on: "${{ matrix.os }}"
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ ubuntu-latest ]
|
||||
php-version: [ '7.3', '7.4', '8.0' ]
|
||||
engine: [ 'none', 'swoole', 'swow' ]
|
||||
exclude:
|
||||
- php-version: '7.3'
|
||||
engine: 'swow'
|
||||
- php-version: '7.4'
|
||||
engine: 'swow'
|
||||
max-parallel: 5
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Setup PHP
|
||||
uses: shivammathur/setup-php@v2
|
||||
with:
|
||||
php-version: ${{ matrix.php-version }}
|
||||
tools: phpize
|
||||
ini-values: opcache.enable_cli=0
|
||||
coverage: none
|
||||
- name: Setup Swoole
|
||||
if: ${{ matrix.engine == 'swoole' }}
|
||||
run: |
|
||||
cd /tmp
|
||||
sudo apt-get update
|
||||
sudo apt-get install libcurl4-openssl-dev
|
||||
wget https://github.com/swoole/swoole-src/archive/v${SWOOLE_VERSION}.tar.gz -O swoole.tar.gz
|
||||
mkdir -p swoole
|
||||
tar -xf swoole.tar.gz -C swoole --strip-components=1
|
||||
rm swoole.tar.gz
|
||||
cd swoole
|
||||
phpize
|
||||
./configure --enable-openssl --enable-http2 --enable-swoole-curl --enable-swoole-json
|
||||
make -j$(nproc)
|
||||
sudo make install
|
||||
sudo sh -c "echo extension=swoole > /etc/php/${{ matrix.php-version }}/cli/conf.d/swoole.ini"
|
||||
php --ri swoole
|
||||
- name: Setup Swow
|
||||
if: ${{ matrix.engine == 'swow' }}
|
||||
run: |
|
||||
cd /tmp
|
||||
wget https://github.com/swow/swow/archive/"${SWOW_VERSION}".tar.gz -O swow.tar.gz
|
||||
mkdir -p swow
|
||||
tar -xf swow.tar.gz -C swow --strip-components=1
|
||||
rm swow.tar.gz
|
||||
cd swow/ext || exit
|
||||
|
||||
phpize
|
||||
./configure --enable-debug
|
||||
make -j "$(nproc)"
|
||||
sudo make install
|
||||
sudo sh -c "echo extension=swow > /etc/php/${{ matrix.php-version }}/cli/conf.d/swow.ini"
|
||||
php --ri swow
|
||||
- name: Setup Packages
|
||||
run: composer update -o --no-scripts
|
||||
- name: Run Test Cases
|
||||
run: |
|
||||
vendor/bin/php-cs-fixer fix --dry-run
|
||||
composer analyse
|
||||
composer test
|
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
/.idea
|
||||
/vendor/
|
||||
composer.lock
|
||||
*.cache
|
||||
*.log
|
89
.php-cs-fixer.php
Normal file
89
.php-cs-fixer.php
Normal file
|
@ -0,0 +1,89 @@
|
|||
<?php
|
||||
|
||||
$header = <<<'EOF'
|
||||
This file is part of Hyperf.
|
||||
|
||||
@link https://www.hyperf.io
|
||||
@document https://hyperf.wiki
|
||||
@contact group@hyperf.io
|
||||
@license https://github.com/hyperf/hyperf/blob/master/LICENSE
|
||||
EOF;
|
||||
|
||||
return (new PhpCsFixer\Config())
|
||||
->setRiskyAllowed(true)
|
||||
->setRules([
|
||||
'@PSR2' => true,
|
||||
'@Symfony' => true,
|
||||
'@DoctrineAnnotation' => true,
|
||||
'@PhpCsFixer' => true,
|
||||
'header_comment' => [
|
||||
'comment_type' => 'PHPDoc',
|
||||
'header' => $header,
|
||||
'separate' => 'none',
|
||||
'location' => 'after_declare_strict',
|
||||
],
|
||||
'array_syntax' => [
|
||||
'syntax' => 'short'
|
||||
],
|
||||
'list_syntax' => [
|
||||
'syntax' => 'short'
|
||||
],
|
||||
'concat_space' => [
|
||||
'spacing' => 'one'
|
||||
],
|
||||
'blank_line_before_statement' => [
|
||||
'statements' => [
|
||||
'declare',
|
||||
],
|
||||
],
|
||||
'general_phpdoc_annotation_remove' => [
|
||||
'annotations' => [
|
||||
'author'
|
||||
],
|
||||
],
|
||||
'ordered_imports' => [
|
||||
'imports_order' => [
|
||||
'class', 'function', 'const',
|
||||
],
|
||||
'sort_algorithm' => 'alpha',
|
||||
],
|
||||
'single_line_comment_style' => [
|
||||
'comment_types' => [
|
||||
],
|
||||
],
|
||||
'yoda_style' => [
|
||||
'always_move_variable' => false,
|
||||
'equal' => false,
|
||||
'identical' => false,
|
||||
],
|
||||
'phpdoc_align' => [
|
||||
'align' => 'left',
|
||||
],
|
||||
'multiline_whitespace_before_semicolons' => [
|
||||
'strategy' => 'no_multi_line',
|
||||
],
|
||||
'constant_case' => [
|
||||
'case' => 'lower',
|
||||
],
|
||||
'class_attributes_separation' => true,
|
||||
'combine_consecutive_unsets' => true,
|
||||
'declare_strict_types' => true,
|
||||
'linebreak_after_opening_tag' => true,
|
||||
'lowercase_static_reference' => true,
|
||||
'no_useless_else' => true,
|
||||
'no_unused_imports' => true,
|
||||
'not_operator_with_successor_space' => true,
|
||||
'not_operator_with_space' => false,
|
||||
'ordered_class_elements' => true,
|
||||
'php_unit_strict' => false,
|
||||
'phpdoc_separation' => false,
|
||||
'single_quote' => true,
|
||||
'standardize_not_equals' => true,
|
||||
'multiline_comment_opening_closing' => true,
|
||||
])
|
||||
->setFinder(
|
||||
PhpCsFixer\Finder::create()
|
||||
->exclude('vendor')
|
||||
->in(__DIR__)
|
||||
)
|
||||
->setUsingCache(false);
|
6
.phpstorm.meta.php
Normal file
6
.phpstorm.meta.php
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?php
|
||||
|
||||
namespace PHPSTORM_META {
|
||||
// Reflect
|
||||
override(\Psr\Container\ContainerInterface::get(0), map('@'));
|
||||
}
|
21
LICENSE
Normal file
21
LICENSE
Normal file
|
@ -0,0 +1,21 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) Hyperf
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
5
README.md
Normal file
5
README.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
# component-creator
|
||||
|
||||
```
|
||||
composer create-project hyperf/component-creator
|
||||
```
|
57
composer.json
Normal file
57
composer.json
Normal file
|
@ -0,0 +1,57 @@
|
|||
{
|
||||
"name": "zyimm/hyperf-mmds-oss",
|
||||
"type": "library",
|
||||
"license": "MIT",
|
||||
"keywords": [
|
||||
"php",
|
||||
"hyperf",
|
||||
"oss"
|
||||
],
|
||||
"description": "",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Zyimm\\MmdsOss\\": "src/"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"HyperfTest\\": "tests"
|
||||
}
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.4",
|
||||
"ext-json": "*",
|
||||
"ext-fileinfo": "*",
|
||||
"hyperf/framework": "~2.2.0",
|
||||
"hyperf/guzzle": "~2.2.0",
|
||||
"hyperf/http-server": "~2.2.0",
|
||||
"hyperf/json-rpc": "^2.2",
|
||||
"hyperf/logger": "~2.2.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"friendsofphp/php-cs-fixer": "^3.0",
|
||||
"mockery/mockery": "^1.0",
|
||||
"phpstan/phpstan": "^1.0",
|
||||
"phpunit/phpunit": ">=7.0",
|
||||
"swoole/ide-helper": "^4.5"
|
||||
},
|
||||
"suggest": {
|
||||
"swow/swow": "Required to create swow components."
|
||||
},
|
||||
"minimum-stability": "dev",
|
||||
"prefer-stable": true,
|
||||
"config": {
|
||||
"optimize-autoloader": true,
|
||||
"sort-packages": true
|
||||
},
|
||||
"scripts": {
|
||||
"test": "phpunit -c phpunit.xml --colors=always",
|
||||
"analyse": "phpstan analyse --memory-limit 1024M -l 0 ./src",
|
||||
"cs-fix": "php-cs-fixer fix $1"
|
||||
},
|
||||
"extra": {
|
||||
"hyperf": {
|
||||
"config": "Zyimm\\MmdsOss\\ConfigProvider"
|
||||
}
|
||||
}
|
||||
}
|
15
phpunit.xml
Normal file
15
phpunit.xml
Normal file
|
@ -0,0 +1,15 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<phpunit bootstrap="tests/bootstrap.php"
|
||||
backupGlobals="false"
|
||||
backupStaticAttributes="false"
|
||||
verbose="true"
|
||||
colors="true"
|
||||
convertErrorsToExceptions="true"
|
||||
convertNoticesToExceptions="true"
|
||||
convertWarningsToExceptions="true"
|
||||
processIsolation="false"
|
||||
stopOnFailure="false">
|
||||
<testsuite name="Testsuite">
|
||||
<directory>./tests/</directory>
|
||||
</testsuite>
|
||||
</phpunit>
|
7
publish/mmds_oss.php
Normal file
7
publish/mmds_oss.php
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?php
|
||||
return [
|
||||
'xy_oss_service_name' => env('XY_OSS_SERVICE', 'mmds'),
|
||||
'xy_oss_group_name' => env('XY_OSS_GROUP', 'mmds-hoge'),
|
||||
'xy_oss_url' => env('XY_OSS_URL', 'https://static-mmds.aihoge.com'),
|
||||
'xy_oss_bucket_name' => env('XY_OOS_BUCKET_NAME', 'mmdsstatic')
|
||||
];
|
40
src/ConfigProvider.php
Normal file
40
src/ConfigProvider.php
Normal file
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
/**
|
||||
* This file is part of Hyperf.
|
||||
*
|
||||
* @link https://www.hyperf.io
|
||||
* @document https://doc.hyperf.io
|
||||
* @contact group@hyperf.io
|
||||
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
|
||||
*/
|
||||
namespace Zyimm\MmdsOss;
|
||||
|
||||
class ConfigProvider
|
||||
{
|
||||
public function __invoke(): array
|
||||
{
|
||||
return [
|
||||
'dependencies' => [
|
||||
],
|
||||
'publish' => [
|
||||
[
|
||||
'id' => 'MmdsOss',
|
||||
'description' => 'The config for oss.',
|
||||
'source' => __DIR__ . '/../publish/mmds_oss.php',
|
||||
'destination' => BASE_PATH . '/config/autoload/mmds_oss.php',
|
||||
],
|
||||
],
|
||||
'commands' => [
|
||||
],
|
||||
'annotations' => [
|
||||
'scan' => [
|
||||
'paths' => [
|
||||
__DIR__,
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
10
src/Exception/OssException.php
Normal file
10
src/Exception/OssException.php
Normal file
|
@ -0,0 +1,10 @@
|
|||
<?php
|
||||
|
||||
namespace Zyimm\MmdsOss\Exception;
|
||||
|
||||
use RuntimeException;
|
||||
|
||||
class OssException extends RuntimeException
|
||||
{
|
||||
|
||||
}
|
230
src/Oss.php
Normal file
230
src/Oss.php
Normal file
|
@ -0,0 +1,230 @@
|
|||
<?php
|
||||
|
||||
namespace Zyimm\MmdsOss;
|
||||
|
||||
|
||||
use Carbon\Carbon;
|
||||
use finfo;
|
||||
use GuzzleHttp\Exception\GuzzleException;
|
||||
use Hyperf\Contract\ConfigInterface;
|
||||
use Hyperf\Di\Annotation\Inject;
|
||||
use Hyperf\Guzzle\ClientFactory;
|
||||
use Hyperf\HttpServer\Contract\RequestInterface;
|
||||
use Hyperf\Logger\LoggerFactory;
|
||||
use Hyperf\Utils\ApplicationContext;
|
||||
use Psr\Container\ContainerExceptionInterface;
|
||||
use Psr\Container\NotFoundExceptionInterface;
|
||||
use Psr\Log\LoggerInterface;
|
||||
use Zyimm\MmdsOss\Exception\OssException;
|
||||
|
||||
class Oss
|
||||
{
|
||||
public array $oss = [];
|
||||
|
||||
public ?string $authorization = null;
|
||||
/**
|
||||
* @Inject()
|
||||
* @var ClientFactory
|
||||
*/
|
||||
public ClientFactory $clientFactory;
|
||||
|
||||
/**
|
||||
* @Inject
|
||||
* @var RequestInterface
|
||||
*/
|
||||
public RequestInterface $request;
|
||||
|
||||
|
||||
/**
|
||||
* @Inject
|
||||
*
|
||||
* @var ConfigInterface
|
||||
*/
|
||||
public ConfigInterface $config;
|
||||
|
||||
|
||||
/**
|
||||
* upload
|
||||
*
|
||||
* @return array
|
||||
* @throws ContainerExceptionInterface
|
||||
* @throws GuzzleException
|
||||
* @throws NotFoundExceptionInterface
|
||||
*/
|
||||
public function upload(): array
|
||||
{
|
||||
$file = $this->request->file('file');
|
||||
$file_content = file_get_contents($file->getPathname());
|
||||
$fInfo = new finfo(FILEINFO_MIME_TYPE);
|
||||
$mimeType = $fInfo->buffer($file_content);
|
||||
$file_info = [
|
||||
'name' => 'file',
|
||||
'contents' => fopen($file->getPathname(), 'r'),
|
||||
'filename' => Carbon::now()->getTimestampMs().uniqid().'.'.$file->getExtension(),
|
||||
|
||||
];
|
||||
$result = $this->getSecretKey()->bucket()->ossUpload($file_info);
|
||||
return [
|
||||
'url' => $result['file_url'] ?? '',
|
||||
'size' => $result['file_size'] ?? 0,
|
||||
'mime_type' => $mimeType
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* getUploadAttr
|
||||
*
|
||||
* @return array
|
||||
* @throws ContainerExceptionInterface
|
||||
* @throws GuzzleException
|
||||
* @throws NotFoundExceptionInterface
|
||||
*/
|
||||
public function getUploadAttr(): array
|
||||
{
|
||||
$this->getSecretKey()->bucket();
|
||||
return [
|
||||
'timestamp' => time(),
|
||||
'filestorage-authorization' => $this->authorization,
|
||||
'bucket' => $this->getBucketName()
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* ossUpload
|
||||
*
|
||||
* @param $file_info
|
||||
* @return array
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
private function ossUpload($file_info): array
|
||||
{
|
||||
$client = $this->clientFactory->create([
|
||||
'base_uri' => $this->getBaseUri(),
|
||||
'headers' => array_merge($this->request->getHeaders(), [
|
||||
'filestorage-authorization' => $this->authorization,
|
||||
'timestamp' => time()
|
||||
])
|
||||
]);
|
||||
$path = 'backend/normalUpload';
|
||||
|
||||
$response = $client->request($this->request->getMethod(), $path, [
|
||||
'multipart' => [
|
||||
$file_info,
|
||||
[
|
||||
'name' => 'object_key',
|
||||
'contents' => $file_info['filename']
|
||||
],
|
||||
[
|
||||
'name' => 'bucket',
|
||||
'contents' => $this->getBucketName()
|
||||
]
|
||||
]
|
||||
]);
|
||||
|
||||
$data = json_decode($response->getBody()->getContents(), true);
|
||||
if (isset($data['error_code']) && (int) $data['error_code'] == 200) {
|
||||
return $data['result'] ?? [];
|
||||
} else {
|
||||
throw new OssException($data['error_message'] ?? 'oss upload error',
|
||||
$data['error_code'] ?? __LINE__);
|
||||
}
|
||||
}
|
||||
|
||||
private function getBaseUri()
|
||||
{
|
||||
return $this->config->get('mmds_oss.xy_oss_url');
|
||||
}
|
||||
|
||||
private function getBucketName()
|
||||
{
|
||||
return $this->config->get('mmds_oss.xy_oss_bucket_name');
|
||||
}
|
||||
|
||||
/**
|
||||
* getSecretKey
|
||||
*
|
||||
* @return Oss
|
||||
* @throws ContainerExceptionInterface
|
||||
* @throws GuzzleException
|
||||
* @throws NotFoundExceptionInterface
|
||||
*/
|
||||
private function bucket(): Oss
|
||||
{
|
||||
$this->getSecretKey();
|
||||
$time = time();
|
||||
$this->authorization = $this->oss['access_key_id'].':'.base64_encode(
|
||||
hash_hmac('sha1',
|
||||
$this->oss['secret_key'],
|
||||
(string) $time, true));
|
||||
$bucket = $this->getBucketName();
|
||||
$client = $this->clientFactory->create([
|
||||
'base_uri' => $this->getBaseUri(),
|
||||
'headers' => [
|
||||
'filestorage-authorization' => $this->authorization,
|
||||
'timestamp' => $time,
|
||||
'Content-Type' => 'application/json'
|
||||
]
|
||||
]);
|
||||
$path = '/backend/bucket';
|
||||
$response = $client->request('POST', $path, [
|
||||
'json' => [
|
||||
'bucket_name' => $bucket
|
||||
],
|
||||
]);
|
||||
$data = json_decode($response->getBody()->getContents(), true);
|
||||
if (isset($data['error_code']) && (int) $data['error_code'] == 200) {
|
||||
$this->logger()->info('oss', $data);
|
||||
} else {
|
||||
throw new OssException($data['error_message'] ?? 'oss upload error',
|
||||
$data['error_code'] ?? __LINE__);
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* getSecretKey
|
||||
*
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
private function getSecretKey(): Oss
|
||||
{
|
||||
|
||||
if (!$this->oss) {
|
||||
$client = $this->clientFactory->create([
|
||||
'base_uri' => $this->getBaseUri(),
|
||||
'headers' => $this->request->getHeaders()
|
||||
]);
|
||||
$path = '/backend/secretKey?'.http_build_query([
|
||||
'service_name' => $this->config->get('mmds_oss.xy_oss_service_name'),
|
||||
'group_name' => $this->config->get('mmds_oss.xy_oss_group_name'),
|
||||
]);
|
||||
|
||||
$response = $client->request('GET', $path);
|
||||
$data = json_decode($response->getBody()->getContents(), true);
|
||||
if (isset($data['error_code']) && (int) $data['error_code'] == 200) {
|
||||
$this->oss = [
|
||||
'access_key_id' => $data['result']['accessKeyId'] ?? null,
|
||||
'secret_key' => $data['result']['secretKey'] ?? null
|
||||
];
|
||||
|
||||
} else {
|
||||
throw new OssException($data['error_message'] ?? 'oss error',
|
||||
$data['error_code'] ?? __LINE__);
|
||||
}
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* logger
|
||||
*
|
||||
* @return LoggerInterface
|
||||
* @throws ContainerExceptionInterface
|
||||
* @throws NotFoundExceptionInterface
|
||||
*/
|
||||
public function logger(): LoggerInterface
|
||||
{
|
||||
return ApplicationContext::getContainer()->get(LoggerFactory::class)->get('oss');
|
||||
}
|
||||
}
|
21
tests/Cases/AbstractTestCase.php
Normal file
21
tests/Cases/AbstractTestCase.php
Normal file
|
@ -0,0 +1,21 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
/**
|
||||
* This file is part of Hyperf.
|
||||
*
|
||||
* @link https://www.hyperf.io
|
||||
* @document https://hyperf.wiki
|
||||
* @contact group@hyperf.io
|
||||
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
|
||||
*/
|
||||
namespace HyperfTest\Cases;
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
* Class AbstractTestCase.
|
||||
*/
|
||||
abstract class AbstractTestCase extends TestCase
|
||||
{
|
||||
}
|
24
tests/Cases/ExampleTest.php
Normal file
24
tests/Cases/ExampleTest.php
Normal file
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
/**
|
||||
* This file is part of Hyperf.
|
||||
*
|
||||
* @link https://www.hyperf.io
|
||||
* @document https://hyperf.wiki
|
||||
* @contact group@hyperf.io
|
||||
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
|
||||
*/
|
||||
namespace HyperfTest\Cases;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* @coversNothing
|
||||
*/
|
||||
class ExampleTest extends AbstractTestCase
|
||||
{
|
||||
public function testExample()
|
||||
{
|
||||
$this->assertTrue(true);
|
||||
}
|
||||
}
|
12
tests/bootstrap.php
Normal file
12
tests/bootstrap.php
Normal file
|
@ -0,0 +1,12 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
/**
|
||||
* This file is part of Hyperf.
|
||||
*
|
||||
* @link https://www.hyperf.io
|
||||
* @document https://hyperf.wiki
|
||||
* @contact group@hyperf.io
|
||||
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
|
||||
*/
|
||||
require_once dirname(dirname(__FILE__)) . '/vendor/autoload.php';
|
Loading…
Reference in New Issue
Block a user